// // WindowManager.hh for pekwm // Copyright (C) 2003-2005 Claes Nasten // // windowmanager.hh for aewm++ // Copyright (C) 2000 Frank Hale // http://sapphire.sourceforge.net/ // // This program is licensed under the GNU GPL. // See the LICENSE file for more information. // #include "../config.h" #ifndef _WINDOWMANAGER_HH_ #define _WINDOWMANAGER_HH_ #include "pekwm.hh" #include "Action.hh" #include "Atoms.hh" #include #include #ifdef HAVE_XRANDR extern "C" { #include } #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 PMenu; // used together with Focus actions class AutoProperty; // for findGroup class CmdDialog; class StatusWindow; class KeyGrabber; #ifdef HARBOUR class Harbour; #endif // HARBOUR void sigHandler(int signal); int handleXError(Display *dpy, XErrorEvent *e); class WindowManager { public: class EdgeWO : public PWinObj { public: EdgeWO(Display *dpy, Window root, EdgeType edge); virtual ~EdgeWO(void); virtual void mapWindow(void); virtual ActionEvent *handleButtonPress(XButtonEvent *ev); virtual ActionEvent *handleButtonRelease(XButtonEvent *ev); virtual ActionEvent *handleEnterEvent(XCrossingEvent *ev); inline EdgeType getEdge(void) const { return _edge; } private: EdgeType _edge; }; class RootWO : public PWinObj { public: RootWO(Display *dpy, Window root); virtual ~RootWO(void); virtual void resize(uint width, uint height) { _gm.width = width; _gm.height = height; } virtual ActionEvent *handleButtonPress(XButtonEvent *ev); virtual ActionEvent *handleButtonRelease(XButtonEvent *ev); virtual ActionEvent *handleMotionEvent(XMotionEvent *ev); virtual ActionEvent *handleEnterEvent(XCrossingEvent *ev); virtual ActionEvent *handleLeaveEvent(XCrossingEvent *ev); }; WindowManager(const std::string &command_line, const std::string &config_file); ~WindowManager(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; } // 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; } #ifdef HARBOUR inline Harbour *getHarbour(void) const { return _harbour; } #endif //HARBOUR inline const std::string &getRestartCommand(void) const { return _restart_command; } inline bool isStartup(void) const { return _startup; } // list iterators inline std::list::iterator client_begin(void) { return _client_list.begin(); } inline std::list::reverse_iterator client_rbegin(void) { return _client_list.rbegin(); } inline std::list::iterator client_end(void) { return _client_list.end(); } inline std::list::reverse_iterator client_rend(void) { return _client_list.rend(); } inline std::list::iterator frame_begin(void) { return _frame_list.begin(); } inline std::list::reverse_iterator frame_rbegin(void) { return _frame_list.rbegin(); } inline std::list::iterator frame_end(void) { return _frame_list.end(); } inline std::list::reverse_iterator frame_rend(void) { return _frame_list.rend(); } inline std::list::iterator mru_begin(void) { return _mru_list.begin(); } inline std::list::reverse_iterator mru_rbegin(void) { return _mru_list.rbegin(); } inline std::list::iterator mru_end(void) { return _mru_list.end(); } inline std::list::reverse_iterator mru_rend(void) { return _mru_list.rend(); } // menus #ifdef MENUS inline PMenu* getMenu(MenuType type) { std::map::iterator it = _menus.find(type); if (it != _menus.end()) return it->second; return NULL; } #endif // MENUS // adds inline void addToClientList(Client *c) { if (c) _client_list.push_back(c); } inline void addToFrameList(Frame *frame) { if (frame) { _frame_list.push_back(frame); _mru_list.remove(frame); _mru_list.push_front(frame); } } // removes void removeFromClientList(Client *client); void removeFromFrameList(Frame *frame); PWinObj *findPWinObj(Window win); Client *findClient(Window win); Client *findClientFromWindow(Window win); Frame *findFrameFromWindow(Window win); // If a window unmaps and has transients lets unmap them too! // true = hide | false = unhide void findFamily(std::list &client_list, Window win); void findTransientsToMapOrUnmap(Window win, bool hide); void familyRaiseLower(Client *client, bool raise); Client* findClient(const ClassHint* class_hint); Frame* findGroup(AutoProperty *property); Frame* findTaggedFrame(bool &activate); Frame* findFrameFromId(uint id); uint findUniqueFrameId(void); void setupFrameIds(void); inline Frame* getTaggedFrame(void) { return _tagged_frame; } void setTaggedFrame(Frame *frame, bool activate); inline bool isAllowGrouping(void) const { return _allow_grouping; } inline void setStateGlobalGrouping(StateAction sa) { if (((_allow_grouping == true) && (sa == STATE_SET)) || ((_allow_grouping == false) && (sa == STATE_UNSET))) { return; } _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); #ifdef MENUS void hideAllMenus(void); #endif // MENUS inline CmdDialog *getCmdDialog(void) { return _cmd_dialog; } inline StatusWindow *getStatusWindow(void) { return _status_window; } // Methods for the various hints inline Atom getMwmHintsAtom(void) { return _atom_mwm_hints; } // Extended Window Manager hints function prototypes void setEwmhSupported(void); void setEwmhActiveWindow(Window w); // public event handlers used when doing grabbed actions void handleKeyEvent(XKeyEvent *ev); void handleButtonPressEvent(XButtonEvent *ev); void handleButtonReleaseEvent(XButtonEvent *ev); private: void setupDisplay(void); void scanWindows(void); void execStartFile(void); void doReload(void); void cleanup(void); // screen edge related void screenEdgeCreate(void); void screenEdgeDestroy(void); void screenEdgeResize(void); void screenEdgeMapUnmap(void); // event handling void doEventLoop(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 handleExposeEvent(XExposeEvent *ev); void handleMotionEvent(XMotionEvent *ev); void handleEnterNotify(XCrossingEvent *ev); void handleLeaveNotify(XCrossingEvent *ev); void handleFocusInEvent(XFocusChangeEvent *ev); void handleFocusOutEvent(XFocusChangeEvent *ev); #ifdef HAVE_XRANDR void handleXRandrEvent(XRRScreenChangeNotifyEvent *ev); #endif // HAVE_XRANDR // private methods for the hints void initHints(void); 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; #ifdef HARBOUR Harbour *_harbour; #endif // HARBOUR CmdDialog *_cmd_dialog; StatusWindow *_status_window; #ifdef MENUS std::map _menus; #endif // MENUS static const std::string _wm_name; 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 _frame_list; std::list _client_list; std::list _mru_list; std::list _frameid_list; // stores removed frame id's Frame *_tagged_frame; bool _tag_activate, _allow_grouping; std::list _screen_edge_list; PWinObj *_root_wo; // Atoms and hints follow under here PekwmAtoms *_pekwm_atoms; IcccmAtoms *_icccm_atoms; EwmhAtoms *_ewmh_atoms; // Atom for motif hints Atom _atom_mwm_hints; // Windows for the different hints Window _extended_hints_win; }; #endif // _WINDOWMANAGER_HH_