// BaseDisplay.h for Openbox // Copyright (c) 2001 Sean 'Shaleh' Perry // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // // 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 __BaseDisplay_hh #define __BaseDisplay_hh #include #include // forward declaration class BaseDisplay; class ScreenInfo; #include "Timer.h" #include "Geometry.h" #include "Util.h" #include #include #define AttribShaded (1l << 0) #define AttribMaxHoriz (1l << 1) #define AttribMaxVert (1l << 2) #define AttribOmnipresent (1l << 3) #define AttribWorkspace (1l << 4) #define AttribStack (1l << 5) #define AttribDecoration (1l << 6) #define StackTop (0) #define StackNormal (1) #define StackBottom (2) #define DecorNone (0) #define DecorNormal (1) #define DecorTiny (2) #define DecorTool (3) typedef struct _openbox_hints { unsigned long flags, attrib, workspace, stack, decoration; } OpenboxHints; typedef struct _openbox_attributes { unsigned long flags, attrib, workspace, stack, decoration; int premax_x, premax_y; unsigned int premax_w, premax_h; } OpenboxAttributes; #define PropOpenboxHintsElements (5) #define PropOpenboxAttributesElements (9) #ifndef __EMX__ void bexec(const char *, char *); #endif // !__EMX__ char *bstrdup(const char *); class BaseDisplay { private: struct cursor { Cursor session, move, ll_angle, lr_angle, ul_angle, ur_angle; } cursor; struct shape { Bool extensions; int event_basep, error_basep; } shape; #ifndef NOCLOBBER unsigned int MaskList[8]; size_t MaskListLength; #endif // NOCLOBBER Atom xa_wm_colormap_windows, xa_wm_protocols, xa_wm_state, xa_wm_delete_window, xa_wm_take_focus, xa_wm_change_state, motif_wm_hints; // NETAttributes Atom openbox_attributes, openbox_change_attributes, openbox_hints; // NETStructureMessages Atom openbox_structure_messages, openbox_notify_startup, openbox_notify_window_add, openbox_notify_window_del, openbox_notify_window_focus, openbox_notify_current_workspace, openbox_notify_workspace_count, openbox_notify_window_raise, openbox_notify_window_lower; // message_types for client -> wm messages Atom openbox_change_workspace, openbox_change_window_focus, openbox_cycle_window_focus; #ifdef NEWWMSPEC // root window properties Atom net_supported, net_client_list, net_client_list_stacking, net_number_of_desktops, net_desktop_geometry, net_desktop_viewport, net_current_desktop, net_desktop_names, net_active_window, net_workarea, net_supporting_wm_check, net_virtual_roots; // root window messages Atom net_close_window, net_wm_moveresize; // application window properties Atom net_properties, net_wm_name, net_wm_desktop, net_wm_window_type, net_wm_state, net_wm_strut, net_wm_icon_geometry, net_wm_icon, net_wm_pid, net_wm_handled_icons; // application protocols Atom net_wm_ping; #endif // NEWWMSPEC Bool _startup, _shutdown; Display *display; typedef std::vector ScreenInfoList; ScreenInfoList screenInfoList; typedef std::list TimerList; TimerList timerList; char *display_name, *application_name; unsigned int server_grabs, colors_per_channel; protected: // pure virtual function... you must override this virtual void process_event(XEvent *) = 0; // the masks of the modifiers which are ignored in button events. int NumLockMask, ScrollLockMask; public: BaseDisplay(const char *, char * = 0); virtual ~BaseDisplay(); inline const Atom &getWMChangeStateAtom() const { return xa_wm_change_state; } inline const Atom &getWMStateAtom() const { return xa_wm_state; } inline const Atom &getWMDeleteAtom() const { return xa_wm_delete_window; } inline const Atom &getWMProtocolsAtom() const { return xa_wm_protocols; } inline const Atom &getWMTakeFocusAtom() const { return xa_wm_take_focus; } inline const Atom &getWMColormapAtom() const { return xa_wm_colormap_windows; } inline const Atom &getMotifWMHintsAtom() const { return motif_wm_hints; } // this atom is for normal app->WM hints about decorations, stacking, // starting workspace etc... inline const Atom &getOpenboxHintsAtom() const { return openbox_hints;} // these atoms are for normal app->WM interaction beyond the scope of the // ICCCM... inline const Atom &getOpenboxAttributesAtom() const { return openbox_attributes; } inline const Atom &getOpenboxChangeAttributesAtom() const { return openbox_change_attributes; } // these atoms are for window->WM interaction, with more control and // information on window "structure"... common examples are // notifying apps when windows are raised/lowered... when the user changes // workspaces... i.e. "pager talk" inline const Atom &getOpenboxStructureMessagesAtom() const { return openbox_structure_messages; } // *Notify* portions of the NETStructureMessages protocol inline const Atom &getOpenboxNotifyStartupAtom() const { return openbox_notify_startup; } inline const Atom &getOpenboxNotifyWindowAddAtom() const { return openbox_notify_window_add; } inline const Atom &getOpenboxNotifyWindowDelAtom() const { return openbox_notify_window_del; } inline const Atom &getOpenboxNotifyWindowFocusAtom() const { return openbox_notify_window_focus; } inline const Atom &getOpenboxNotifyCurrentWorkspaceAtom() const { return openbox_notify_current_workspace; } inline const Atom &getOpenboxNotifyWorkspaceCountAtom() const { return openbox_notify_workspace_count; } inline const Atom &getOpenboxNotifyWindowRaiseAtom() const { return openbox_notify_window_raise; } inline const Atom &getOpenboxNotifyWindowLowerAtom() const { return openbox_notify_window_lower; } // atoms to change that request changes to the desktop environment during // runtime... these messages can be sent by any client... as the sending // client window id is not included in the ClientMessage event... inline const Atom &getOpenboxChangeWorkspaceAtom() const { return openbox_change_workspace; } inline const Atom &getOpenboxChangeWindowFocusAtom() const { return openbox_change_window_focus; } inline const Atom &getOpenboxCycleWindowFocusAtom() const { return openbox_cycle_window_focus; } #ifdef NEWWMSPEC // root window properties inline const Atom &getNETSupportedAtom() const { return net_supported; } inline const Atom &getNETClientListAtom() const { return net_client_list; } inline const Atom &getNETClientListStackingAtom() const { return net_client_list_stacking; } inline const Atom &getNETNumberOfDesktopsAtom() const { return net_number_of_desktops; } inline const Atom &getNETDesktopGeometryAtom() const { return net_desktop_geometry; } inline const Atom &getNETDesktopViewportAtom() const { return net_desktop_viewport; } inline const Atom &getNETCurrentDesktopAtom() const { return net_current_desktop; } inline const Atom &getNETDesktopNamesAtom() const { return net_desktop_names; } inline const Atom &getNETActiveWindowAtom() const { return net_active_window; } inline const Atom &getNETWorkareaAtom() const { return net_workarea; } inline const Atom &getNETSupportingWMCheckAtom() const { return net_supporting_wm_check; } inline const Atom &getNETVirtualRootsAtom() const { return net_virtual_roots; } // root window messages inline const Atom &getNETCloseWindowAtom() const { return net_close_window; } inline const Atom &getNETWMMoveResizeAtom() const { return net_wm_moveresize; } // application window properties inline const Atom &getNETPropertiesAtom() const { return net_properties; } inline const Atom &getNETWMNameAtom() const { return net_wm_name; } inline const Atom &getNETWMDesktopAtom() const { return net_wm_desktop; } inline const Atom &getNETWMWindowTypeAtom() const { return net_wm_window_type; } inline const Atom &getNETWMStateAtom() const { return net_wm_state; } inline const Atom &getNETWMStrutAtom() const { return net_wm_strut; } inline const Atom &getNETWMIconGeometryAtom() const { return net_wm_icon_geometry; } inline const Atom &getNETWMIconAtom() const { return net_wm_icon; } inline const Atom &getNETWMPidAtom() const { return net_wm_pid; } inline const Atom &getNETWMHandledIconsAtom() const { return net_wm_handled_icons; } // application protocols inline const Atom &getNETWMPingAtom() const { return net_wm_ping; } #endif // NEWWMSPEC inline ScreenInfo *getScreenInfo(unsigned int s) { ASSERT(s < screenInfoList.size()); return screenInfoList[s]; } inline const Bool &hasShapeExtensions() const { return shape.extensions; } inline const Bool &doShutdown() const { return _shutdown; } inline const Bool &isStartup() const { return _startup; } inline const Cursor &getSessionCursor() const { return cursor.session; } inline const Cursor &getMoveCursor() const { return cursor.move; } inline const Cursor &getLowerLeftAngleCursor() const { return cursor.ll_angle; } inline const Cursor &getLowerRightAngleCursor() const { return cursor.lr_angle; } inline const Cursor &getUpperLeftAngleCursor() const { return cursor.ul_angle; } inline const Cursor &getUpperRightAngleCursor() const { return cursor.ur_angle; } inline Display *getXDisplay() { return display; } inline const char *getXDisplayName() const { return (const char *) display_name; } inline const char *getApplicationName() const { return (const char *) application_name; } inline const unsigned int numberOfScreens() const { return ScreenCount(display); } inline const int &getShapeEventBase() const { return shape.event_basep; } inline void shutdown() { _shutdown = True; } inline void run() { _startup = _shutdown = False; } const Bool validateWindow(Window); void grabButton(unsigned int, unsigned int, Window, Bool, unsigned int, int, int, Window, Cursor) const; void ungrabButton(unsigned int button, unsigned int modifiers, Window grab_window) const; void grab(); void ungrab(); void eventLoop(); void addTimer(BTimer *); void removeTimer(BTimer *); // another pure virtual... this is used to handle signals that BaseDisplay // doesn't understand itself virtual Bool handleSignal(int) = 0; }; class ScreenInfo { private: BaseDisplay &basedisplay; Visual *visual; Window root_window; Colormap colormap; int depth, screen_number; Size m_size; public: ScreenInfo(BaseDisplay &, int); inline BaseDisplay &getBaseDisplay() { return basedisplay; } inline Visual *getVisual() const { return visual; } inline const Window &getRootWindow() const { return root_window; } inline const Colormap &getColormap() const { return colormap; } inline const int &getDepth() const { return depth; } inline const int &getScreenNumber() const { return screen_number; } // inline const unsigned int &getWidth() const { return width; } // inline const unsigned int &getHeight() const { return height; } inline const Size &size() const { return m_size; } }; #endif // __BaseDisplay_hh