mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
248 lines
7.5 KiB
C++
248 lines
7.5 KiB
C++
|
//
|
||
|
// WindowManager.hh for pekwm
|
||
|
// Copyright © 2003-2009 Claes Nästén <me{@}pekdon{.}net>
|
||
|
//
|
||
|
// windowmanager.hh for aewm++
|
||
|
// Copyright (C) 2000 Frank Hale <frankhale@yahoo.com>
|
||
|
// http://sapphire.sourceforge.net/
|
||
|
//
|
||
|
// This program is licensed under the GNU GPL.
|
||
|
// See the LICENSE file for more information.
|
||
|
//
|
||
|
|
||
|
#ifdef HAVE_CONFIG_H
|
||
|
#include "config.h"
|
||
|
#endif // HAVE_CONFIG_H
|
||
|
|
||
|
#ifndef _WINDOWMANAGER_HH_
|
||
|
#define _WINDOWMANAGER_HH_
|
||
|
|
||
|
#include "pekwm.hh"
|
||
|
#include "Action.hh"
|
||
|
#include "Atoms.hh"
|
||
|
#include "PScreen.hh"
|
||
|
#include "Timer.hh"
|
||
|
#include "ManagerWindows.hh"
|
||
|
|
||
|
#include <list>
|
||
|
#include <map>
|
||
|
|
||
|
#ifdef HAVE_XRANDR
|
||
|
extern "C" {
|
||
|
#include <X11/extensions/Xrandr.h>
|
||
|
}
|
||
|
#endif // HAVE_XRANDR
|
||
|
|
||
|
class ActionHandler;
|
||
|
class AutoProperties;
|
||
|
class Config;
|
||
|
class ColorHandler;
|
||
|
class FontHandler;
|
||
|
class TextureHandler;
|
||
|
class Theme;
|
||
|
class Workspaces;
|
||
|
|
||
|
class PScreen;
|
||
|
class ScreenResources;
|
||
|
class PWinObj;
|
||
|
class PDecor;
|
||
|
class Frame;
|
||
|
class Client;
|
||
|
class ClassHint;
|
||
|
|
||
|
class AutoProperty; // for findGroup
|
||
|
class CmdDialog;
|
||
|
class SearchDialog;
|
||
|
class StatusWindow;
|
||
|
class WorkspaceIndicator;
|
||
|
|
||
|
class KeyGrabber;
|
||
|
class Harbour;
|
||
|
|
||
|
class WindowManager
|
||
|
{
|
||
|
public:
|
||
|
static WindowManager *start(const std::string &command_line,
|
||
|
const std::string &config_file, bool replace);
|
||
|
static void destroy(void);
|
||
|
inline static WindowManager *instance(void) { return _instance; }
|
||
|
|
||
|
void doEventLoop(void);
|
||
|
|
||
|
//! @brief Sets reload status, will reload from main loop.
|
||
|
void reload(void) { _reload = true; }
|
||
|
void restart(std::string command = "");
|
||
|
//! @brief Sets shutdown status, will shutdown from main loop.
|
||
|
void shutdown(void) { _shutdown = true; }
|
||
|
/**< Return shutdown flag, set to tru to shutdown window manager. */
|
||
|
bool *getShutdownFlag(void) { return &_shutdown; }
|
||
|
|
||
|
// get "base" classes
|
||
|
inline PScreen *getScreen(void) const { return _screen; }
|
||
|
inline Config *getConfig(void) const { return _config; }
|
||
|
inline Theme *getTheme(void) const { return _theme; }
|
||
|
inline ActionHandler *getActionHandler(void)
|
||
|
const { return _action_handler; }
|
||
|
inline AutoProperties* getAutoProperties(void) const {
|
||
|
return _autoproperties;
|
||
|
}
|
||
|
inline Workspaces *getWorkspaces(void) const { return _workspaces; }
|
||
|
inline KeyGrabber *getKeyGrabber(void) const { return _keygrabber; }
|
||
|
inline Harbour *getHarbour(void) const { return _harbour; }
|
||
|
|
||
|
inline const std::string &getRestartCommand(void) const { return _restart_command; }
|
||
|
inline bool isStartup(void) const { return _startup; }
|
||
|
|
||
|
// list iterators
|
||
|
inline std::list<PWinObj*>::iterator mru_begin(void) { return _mru_list.begin(); }
|
||
|
inline std::list<PWinObj*>::reverse_iterator mru_rbegin(void) { return _mru_list.rbegin(); }
|
||
|
inline std::list<PWinObj*>::iterator mru_end(void) { return _mru_list.end(); }
|
||
|
inline std::list<PWinObj*>::reverse_iterator mru_rend(void) { return _mru_list.rend(); }
|
||
|
|
||
|
// adds
|
||
|
inline void addToFrameList(Frame *frame) {
|
||
|
if (frame) {
|
||
|
_mru_list.remove(frame);
|
||
|
_mru_list.push_front(frame);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// removes
|
||
|
void removeFromFrameList(Frame *frame);
|
||
|
|
||
|
PWinObj *findPWinObj(Window win);
|
||
|
void familyRaiseLower(Client *client, bool raise);
|
||
|
|
||
|
Frame* findGroup(AutoProperty *property);
|
||
|
|
||
|
inline bool isAllowGrouping(void) const { return _allow_grouping; }
|
||
|
inline void setStateGlobalGrouping(StateAction sa) {
|
||
|
if (ActionUtil::needToggle(sa, _allow_grouping)) {
|
||
|
_allow_grouping = !_allow_grouping;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void attachMarked(Frame *frame);
|
||
|
void attachInNextPrevFrame(Client* client, bool frame, bool next);
|
||
|
|
||
|
Frame* getNextFrame(Frame* frame, bool mapped, uint mask = 0);
|
||
|
Frame* getPrevFrame(Frame* frame, bool mapped, uint mask = 0);
|
||
|
|
||
|
void findWOAndFocus(PWinObj *wo);
|
||
|
|
||
|
inline CmdDialog *getCmdDialog(void) { return _cmd_dialog; }
|
||
|
inline SearchDialog *getSearchDialog(void) { return _search_dialog; }
|
||
|
inline StatusWindow *getStatusWindow(void) { return _status_window; }
|
||
|
WorkspaceIndicator *getWorkspaceIndicator(void) { return _workspace_indicator; }
|
||
|
|
||
|
// Extended Window Manager hints function prototypes
|
||
|
void setEwmhSupported(void);
|
||
|
void setEwmhActiveWindow(Window w);
|
||
|
void setDesktopNames(void);
|
||
|
|
||
|
// public event handlers used when doing grabbed actions
|
||
|
void handleKeyEvent(XKeyEvent *ev);
|
||
|
void handleButtonPressEvent(XButtonEvent *ev);
|
||
|
void handleButtonReleaseEvent(XButtonEvent *ev);
|
||
|
|
||
|
private:
|
||
|
WindowManager(const std::string &command_line,
|
||
|
const std::string &config_file);
|
||
|
WindowManager(const WindowManager &); // not implemented to ensure singleton
|
||
|
~WindowManager(void);
|
||
|
|
||
|
bool setupDisplay(bool replace);
|
||
|
void scanWindows(void);
|
||
|
void execStartFile(void);
|
||
|
|
||
|
void doReload(void);
|
||
|
void doReloadConfig(void);
|
||
|
void doReloadTheme(void);
|
||
|
void doReloadMouse(void);
|
||
|
void doReloadKeygrabber(bool force=false);
|
||
|
void doReloadAutoproperties(void);
|
||
|
void doReloadHarbour(void);
|
||
|
|
||
|
void cleanup(void);
|
||
|
|
||
|
// screen edge related
|
||
|
void screenEdgeCreate(void);
|
||
|
void screenEdgeDestroy(void);
|
||
|
void screenEdgeResize(void);
|
||
|
void screenEdgeMapUnmap(void);
|
||
|
|
||
|
void handleMapRequestEvent(XMapRequestEvent *ev);
|
||
|
void handleUnmapEvent(XUnmapEvent *ev);
|
||
|
void handleDestroyWindowEvent(XDestroyWindowEvent *ev);
|
||
|
|
||
|
void handleConfigureRequestEvent(XConfigureRequestEvent *ev);
|
||
|
void handleClientMessageEvent(XClientMessageEvent *ev);
|
||
|
|
||
|
void handleColormapEvent(XColormapEvent *ev);
|
||
|
void handlePropertyEvent(XPropertyEvent *ev);
|
||
|
void handleMappingEvent(XMappingEvent *ev);
|
||
|
void handleExposeEvent(XExposeEvent *ev);
|
||
|
|
||
|
void handleMotionEvent(XMotionEvent *ev);
|
||
|
|
||
|
void handleEnterNotify(XCrossingEvent *ev);
|
||
|
void handleLeaveNotify(XCrossingEvent *ev);
|
||
|
void handleFocusInEvent(XFocusChangeEvent *ev);
|
||
|
void handleFocusOutEvent(XFocusChangeEvent *ev);
|
||
|
|
||
|
void handleShapeEvent(XAnyEvent *ev);
|
||
|
|
||
|
#ifdef HAVE_XRANDR
|
||
|
void handleXRandrEvent(XRRNotifyEvent *ev);
|
||
|
void handleXRandrScreenChangeEvent(XRRScreenChangeNotifyEvent *ev);
|
||
|
void handleXRandrCrtcChangeEvent(XRRCrtcChangeNotifyEvent *ev);
|
||
|
#endif // HAVE_XRANDR
|
||
|
|
||
|
void readDesktopNamesHint(void);
|
||
|
|
||
|
// private methods for the hints
|
||
|
void initHints(void);
|
||
|
|
||
|
bool findGroupMatchProperty(Frame *frame, AutoProperty *property);
|
||
|
Frame *findGroupMatch(AutoProperty *property);
|
||
|
|
||
|
private:
|
||
|
PScreen *_screen;
|
||
|
ScreenResources *_screen_resources;
|
||
|
KeyGrabber *_keygrabber;
|
||
|
Config *_config;
|
||
|
ColorHandler *_color_handler;
|
||
|
FontHandler *_font_handler;
|
||
|
TextureHandler *_texture_handler;
|
||
|
Theme *_theme;
|
||
|
ActionHandler *_action_handler;
|
||
|
AutoProperties *_autoproperties;
|
||
|
Workspaces *_workspaces;
|
||
|
Harbour *_harbour;
|
||
|
CmdDialog *_cmd_dialog;
|
||
|
SearchDialog *_search_dialog;
|
||
|
StatusWindow *_status_window;
|
||
|
|
||
|
WorkspaceIndicator *_workspace_indicator; //!< Window popping up when switching workspace
|
||
|
|
||
|
Timer<ActionPerformed> _timer_action;
|
||
|
|
||
|
std::string _command_line, _restart_command;
|
||
|
bool _startup; //!< Indicates startup status.
|
||
|
bool _shutdown; //!< Set to wheter we want to shutdown.
|
||
|
bool _reload; //!< Set to wheter we want to reload.
|
||
|
|
||
|
std::list<PWinObj*> _mru_list;
|
||
|
|
||
|
bool _allow_grouping; //<! Flag turning grouping on/off.
|
||
|
|
||
|
std::list<EdgeWO*> _screen_edge_list;
|
||
|
HintWO *_hint_wo; /**< Hint window object, communicates EWMH hints. */
|
||
|
RootWO *_root_wo; /**< Root window object, wrapper for root window. */
|
||
|
|
||
|
// pointer for singleton pattern
|
||
|
static WindowManager *_instance;
|
||
|
};
|
||
|
|
||
|
#endif // _WINDOWMANAGER_HH_
|