2007-11-12 21:59:43 +00:00
|
|
|
// FocusableList.hh
|
|
|
|
// Copyright (c) 2007 Fluxbox Team (fluxgen at fluxbox dot org)
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
// copy of this software and associated documentation files (the "Software"),
|
|
|
|
// to deal in the Software without restriction, including without limitation
|
|
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
// and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
// Software is furnished to do so, subject to the following conditions:
|
|
|
|
//
|
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
#ifndef FOCUSABLELIST_HH
|
|
|
|
#define FOCUSABLELIST_HH
|
|
|
|
|
|
|
|
#include "FbTk/NotCopyable.hh"
|
2011-05-03 21:48:24 +00:00
|
|
|
#include "FbTk/RefCount.hh"
|
2008-09-21 11:44:48 +00:00
|
|
|
#include "FbTk/Signal.hh"
|
2007-11-12 21:59:43 +00:00
|
|
|
|
|
|
|
#include "ClientPattern.hh"
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
#include <string>
|
2008-03-25 19:31:47 +00:00
|
|
|
#include <memory>
|
2007-11-12 21:59:43 +00:00
|
|
|
|
|
|
|
class BScreen;
|
|
|
|
class Focusable;
|
2008-09-28 08:46:49 +00:00
|
|
|
class WinClient;
|
|
|
|
class FluxboxWindow;
|
2007-11-12 21:59:43 +00:00
|
|
|
|
2011-05-06 20:26:20 +00:00
|
|
|
class FocusableList: private FbTk::NotCopyable,
|
2008-09-21 11:44:48 +00:00
|
|
|
private FbTk::SignalTracker {
|
2007-11-12 21:59:43 +00:00
|
|
|
public:
|
|
|
|
typedef std::list<Focusable *> Focusables;
|
|
|
|
|
|
|
|
/// list option bits
|
|
|
|
enum {
|
|
|
|
LIST_GROUPS = 0x01, //< list groups instead of clients
|
2008-04-21 22:43:10 +00:00
|
|
|
STATIC_ORDER = 0x02 ///< use creation order instead of focused order
|
2007-11-12 21:59:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
FocusableList(BScreen &scr): m_pat(0), m_parent(0), m_screen(scr) { }
|
2011-11-02 17:33:41 +00:00
|
|
|
FocusableList(BScreen &scr, const std::string & pat);
|
2007-11-12 21:59:43 +00:00
|
|
|
FocusableList(BScreen &scr, const FocusableList &parent,
|
2011-11-02 17:33:41 +00:00
|
|
|
const std::string & pat);
|
2007-11-12 21:59:43 +00:00
|
|
|
|
|
|
|
static void parseArgs(const std::string &in, int &opts, std::string &out);
|
|
|
|
static const FocusableList *getListFromOptions(BScreen &scr, int opts);
|
|
|
|
|
|
|
|
/// functions for modifying the list contents
|
|
|
|
void pushFront(Focusable &win);
|
|
|
|
void pushBack(Focusable &win);
|
|
|
|
void moveToFront(Focusable &win);
|
|
|
|
void moveToBack(Focusable &win);
|
|
|
|
void remove(Focusable &win);
|
|
|
|
|
|
|
|
/// accessor for list
|
|
|
|
Focusables &clientList() { return m_list; }
|
|
|
|
const Focusables &clientList() const { return m_list; }
|
|
|
|
|
|
|
|
/// does the list contain any windows?
|
|
|
|
bool empty() const { return m_list.empty(); }
|
|
|
|
/// does the list contain the given window?
|
|
|
|
bool contains(const Focusable &win) const;
|
2008-08-05 12:00:48 +00:00
|
|
|
/// find the first window matching the pattern
|
|
|
|
Focusable *find(const ClientPattern &pattern) const;
|
2007-11-12 21:59:43 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
@name signals
|
|
|
|
@{
|
|
|
|
*/
|
2011-08-08 11:31:25 +00:00
|
|
|
const FbTk::Signal<Focusable *> &orderSig() const { return m_ordersig; }
|
|
|
|
const FbTk::Signal<Focusable *> &addSig() const { return m_addsig; }
|
|
|
|
const FbTk::Signal<Focusable *> &removeSig() const { return m_removesig; }
|
|
|
|
const FbTk::Signal<> &resetSig() const { return m_resetsig; }
|
2007-11-12 21:59:43 +00:00
|
|
|
/** @} */ // end group signals
|
|
|
|
|
|
|
|
private:
|
|
|
|
void init();
|
|
|
|
void addMatching();
|
|
|
|
void checkUpdate(Focusable &win);
|
|
|
|
bool insertFromParent(Focusable &win);
|
|
|
|
void attachSignals(Focusable &win);
|
|
|
|
void reset();
|
2008-09-28 08:46:49 +00:00
|
|
|
void workspaceChanged(BScreen &screen);
|
|
|
|
void focusedWindowChanged(BScreen &screen, FluxboxWindow *win, WinClient *client);
|
2010-03-26 17:15:45 +00:00
|
|
|
/// Title has changed for a window
|
|
|
|
/// @param win The window that title changed for.
|
|
|
|
void updateTitle(Focusable& win);
|
2011-05-04 16:26:15 +00:00
|
|
|
void parentOrderChanged(Focusable* win);
|
|
|
|
void parentWindowAdded(Focusable* win);
|
|
|
|
void parentWindowRemoved(Focusable* win);
|
2011-05-06 16:18:20 +00:00
|
|
|
void windowUpdated(FluxboxWindow &fbwin);
|
2011-05-04 16:26:15 +00:00
|
|
|
|
2010-03-26 17:15:45 +00:00
|
|
|
|
2007-11-12 21:59:43 +00:00
|
|
|
std::auto_ptr<ClientPattern> m_pat;
|
|
|
|
const FocusableList *m_parent;
|
|
|
|
BScreen &m_screen;
|
|
|
|
std::list<Focusable *> m_list;
|
|
|
|
|
2011-08-08 11:31:25 +00:00
|
|
|
FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig;
|
|
|
|
FbTk::Signal<> m_resetsig;
|
2011-05-03 21:48:24 +00:00
|
|
|
typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap;
|
2010-03-26 17:15:45 +00:00
|
|
|
SignalMap m_signal_map;
|
2007-11-12 21:59:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // FOCUSABLELIST_HH
|