diff options
Diffstat (limited to 'src/screen.hh')
| -rw-r--r-- | src/screen.hh | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/src/screen.hh b/src/screen.hh new file mode 100644 index 00000000..53fdffdd --- /dev/null +++ b/src/screen.hh @@ -0,0 +1,432 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +// Screen.hh for Blackbox - an X11 Window manager +// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry <shaleh@debian.org> +// 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 __Screen_hh +#define __Screen_hh + +extern "C" { +#include <X11/Xlib.h> + +#ifdef TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else // !TIME_WITH_SYS_TIME +# ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +# else // !HAVE_SYS_TIME_H +# include <time.h> +# endif // HAVE_SYS_TIME_H +#endif // TIME_WITH_SYS_TIME +} + +#include <list> +#include <vector> + +#include "color.hh" +#include "texture.hh" +#include "image.hh" +#include "configmenu.hh" +#include "iconmenu.hh" +#include "netizen.hh" +#include "rootmenu.hh" +#include "timer.hh" +#include "workspace.hh" +#include "workspacemenu.hh" +#include "blackbox.hh" + +class Slit; // forward reference +class BFont; +class XAtom; +struct Strut; + +enum TextJustify { LeftJustify = 1, RightJustify, CenterJustify }; + +#ifdef BITMAPBUTTONS +struct PixmapMask { + Pixmap mask; + unsigned int w, h; +}; +#endif // BITMAPBUTTONS + +struct WindowStyle { + BColor l_text_focus, l_text_unfocus, b_pic_focus, + b_pic_unfocus; + BTexture f_focus, f_unfocus, t_focus, t_unfocus, l_focus, l_unfocus, + h_focus, h_unfocus, b_focus, b_unfocus, b_pressed, b_pressed_focus, + b_pressed_unfocus, g_focus, g_unfocus; + +#ifdef BITMAPBUTTONS + PixmapMask close_button, max_button, icon_button, stick_button; +#endif // BITMAPBUTTONS + BFont *font; + + TextJustify justify; + + void doJustify(const std::string &text, int &start_pos, + unsigned int max_length, unsigned int modifier) const; +}; + +struct ToolbarStyle { + BColor l_text, w_text, c_text, b_pic; + BTexture toolbar, label, window, button, pressed, clock; + +#ifdef BITMAPBUTTONS + PixmapMask left_button, right_button; +#endif // BITMAPBUTTONS + + BFont *font; + + TextJustify justify; + + void doJustify(const std::string &text, int &start_pos, + unsigned int max_length, unsigned int modifier) const; +}; + +struct MenuStyle { + BColor t_text, f_text, h_text, d_text; + BTexture title, frame, hilite; + +#ifdef BITMAPBUTTONS + PixmapMask bullet_image, tick_image; +#endif // BITMAPBUTTONS + + BFont *t_font, *f_font; + + TextJustify t_justify, f_justify; + int bullet, bullet_pos; +}; + +class BScreen : public ScreenInfo { +private: + bool root_colormap_installed, managed, geom_visible; + GC opGC; + Pixmap geom_pixmap; + Window geom_window; + + Blackbox *blackbox; + BImageControl *image_control; + Configmenu *configmenu; + Iconmenu *iconmenu; + Rootmenu *rootmenu; + Configuration *config; + XAtom *xatom; + + typedef std::list<Rootmenu*> RootmenuList; + RootmenuList rootmenuList; + + typedef std::list<Netizen*> NetizenList; + NetizenList netizenList; + BlackboxWindowList iconList, windowList; + + typedef std::vector<Window> WindowList; + WindowList specialWindowList, desktopWindowList, systrayWindowList; + + Slit *slit; + Toolbar *toolbar; + Workspace *current_workspace; + Workspacemenu *workspacemenu; + + unsigned int geom_w, geom_h; + unsigned long event_mask; + + Rect usableArea; +#ifdef XINERAMA + RectList xineramaUsableArea; +#endif // XINERAMA + + typedef std::list<Strut*> StrutList; + StrutList strutList; + typedef std::vector<Workspace*> WorkspaceList; + WorkspaceList workspacesList; + + struct screen_resource { + WindowStyle wstyle; + ToolbarStyle tstyle; + MenuStyle mstyle; + + bool sloppy_focus, auto_raise, auto_edge_balance, ordered_dither, + opaque_move, full_max, focus_new, focus_last, click_raise, + allow_scroll_lock, hide_toolbar, window_corner_snap, aa_fonts, + ignore_shaded, ignore_maximized, workspace_warping, shadow_fonts; + + int snap_to_windows, snap_to_edges; + unsigned int snap_offset; + + BColor border_color; + + unsigned int workspaces; + int toolbar_placement, toolbar_width_percent, placement_policy, + snap_threshold, row_direction, col_direction, root_scroll, + resistance_size; + + unsigned int handle_width, bevel_width, frame_width, border_width, + resize_zones; + + unsigned int root_menu_button, workspace_menu_button; + +#ifdef HAVE_STRFTIME + std::string strftime_format; +#else // !HAVE_STRFTIME + bool clock24hour; + int date_format; +#endif // HAVE_STRFTIME + + } resource; + std::string screenstr; + + BScreen(const BScreen&); + BScreen& operator=(const BScreen&); + + bool parseMenuFile(FILE *file, Rootmenu *menu); + +#ifdef BITMAPBUTTONS + void readDatabaseMask(const std::string &rname, + PixmapMask &pixmapMask, + const Configuration &style); +#endif // BITMAPBUTTONS + + BTexture readDatabaseTexture(const std::string &rname, + const std::string &default_color, + const Configuration &style, + bool allowNoTexture = false); + BColor readDatabaseColor(const std::string &rname, + const std::string &default_color, + const Configuration &style); + BFont *readDatabaseFont(const std::string &rbasename, + const Configuration &style); + + void InitMenu(void); + void LoadStyle(void); + + void updateWorkArea(void); +public: + enum { WindowNoSnap = 0, WindowSnap, WindowResistance }; + enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement, + UnderMousePlacement, ClickMousePlacement, LeftRight, RightLeft, + TopBottom, BottomTop, IgnoreShaded, IgnoreMaximized }; + enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet }; + enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure, + WindowShade, WindowIconify, WindowMaximize, WindowClose, WindowRaise, + WindowLower, WindowStick, WindowKill, SetStyle }; + enum FocusModel { SloppyFocus, ClickToFocus }; + enum RootScrollDirection { NoScroll = 0, NormalScroll, ReverseScroll }; + + BScreen(Blackbox *bb, unsigned int scrn); + ~BScreen(void); + + inline bool isSloppyFocus(void) const { return resource.sloppy_focus; } + inline bool isRootColormapInstalled(void) const + { return root_colormap_installed; } + inline bool doAutoRaise(void) const { return resource.auto_raise; } + inline bool doClickRaise(void) const { return resource.click_raise; } + inline bool isScreenManaged(void) const { return managed; } + inline bool doShadowFonts(void) const { return resource.shadow_fonts; } + inline bool doAAFonts(void) const { return resource.aa_fonts; } + inline bool doImageDither(void) const { return image_control->doDither(); } + inline bool doOrderedDither(void) const { return resource.ordered_dither; } + inline bool doOpaqueMove(void) const { return resource.opaque_move; } + inline bool doFullMax(void) const { return resource.full_max; } + inline bool doFocusNew(void) const { return resource.focus_new; } + inline bool doFocusLast(void) const { return resource.focus_last; } + inline bool doHideToolbar(void) const { return resource.hide_toolbar; } + inline int getWindowToWindowSnap(void) const + { return resource.snap_to_windows; } + inline int getWindowToEdgeSnap(void) const + { return resource.snap_to_edges; } + inline bool getWindowCornerSnap(void) const + { return resource.window_corner_snap; } + inline bool allowScrollLock(void) const { return resource.allow_scroll_lock; } + inline bool doWorkspaceWarping(void) const + { return resource.workspace_warping; } + inline int rootScrollDirection(void) const { return resource.root_scroll; } + inline unsigned int rootMenuButton(void) const + { return resource.root_menu_button; } + inline unsigned int workspaceMenuButton(void) const + { return resource.workspace_menu_button; } + + inline const GC &getOpGC(void) const { return opGC; } + + inline Blackbox *getBlackbox(void) { return blackbox; } + inline BColor *getBorderColor(void) { return &resource.border_color; } + inline BImageControl *getImageControl(void) { return image_control; } + inline Rootmenu *getRootmenu(void) { return rootmenu; } + + inline Slit *getSlit(void) { return slit; } + inline Toolbar *getToolbar(void) { return toolbar; } + + Workspace *getWorkspace(unsigned int index) const; + + inline Workspace *getCurrentWorkspace(void) { return current_workspace; } + + inline Workspacemenu *getWorkspacemenu(void) { return workspacemenu; } + + inline unsigned int getHandleWidth(void) const + { return resource.handle_width; } + inline unsigned int getBevelWidth(void) const + { return resource.bevel_width; } + inline unsigned int getFrameWidth(void) const + { return resource.frame_width; } + inline unsigned int getBorderWidth(void) const + { return resource.border_width; } + inline unsigned int getResizeZones(void) const + { return resource.resize_zones; } + inline bool getPlaceIgnoreShaded(void) const + { return resource.ignore_shaded; } + inline bool getPlaceIgnoreMaximized(void) const + { return resource.ignore_maximized; } + + inline unsigned int getCurrentWorkspaceID(void) const + { return current_workspace->getID(); } + inline unsigned int getWorkspaceCount(void) const + { return workspacesList.size(); } + inline unsigned int getIconCount(void) const { return iconList.size(); } + inline unsigned int getNumberOfWorkspaces(void) const + { return resource.workspaces; } + inline int getPlacementPolicy(void) const + { return resource.placement_policy; } + inline int getSnapOffset(void) const + { return resource.snap_offset; } + inline int getSnapThreshold(void) const + { return resource.snap_threshold; } + inline int getResistanceSize(void) const + { return resource.resistance_size; } + inline int getRowPlacementDirection(void) const + { return resource.row_direction; } + inline int getColPlacementDirection(void) const + { return resource.col_direction; } + + void changeWorkspaceCount(unsigned int new_count); + + inline void setRootColormapInstalled(bool r) { root_colormap_installed = r; } + void saveSloppyFocus(bool s); + void saveAutoRaise(bool a); + void saveClickRaise(bool c); + void saveWorkspaces(unsigned int w); + void savePlacementPolicy(int p); + void saveRowPlacementDirection(int d); + void saveColPlacementDirection(int d); + void saveSnapThreshold(int t); + void saveSnapOffset(int o); + void saveResistanceSize(int s); + void saveImageDither(bool d); + void saveShadowFonts(bool f); + void saveAAFonts(bool f); + void saveOpaqueMove(bool o); + void saveFullMax(bool f); + void saveFocusNew(bool f); + void saveFocusLast(bool f); + void saveHideToolbar(bool h); + void saveWindowToEdgeSnap(int s); + void saveWindowToWindowSnap(int s); + void saveWindowCornerSnap(bool s); + void saveResizeZones(unsigned int z); + void savePlaceIgnoreShaded(bool i); + void savePlaceIgnoreMaximized(bool i); + void saveAllowScrollLock(bool a); + void saveWorkspaceWarping(bool w); + void saveRootScrollDirection(int d); + void saveRootMenuButton(unsigned int b); + void saveWorkspaceMenuButton(unsigned int b); + inline void iconUpdate(void) { iconmenu->update(); } + +#ifdef HAVE_STRFTIME + inline const char *getStrftimeFormat(void) + { return resource.strftime_format.c_str(); } + void saveStrftimeFormat(const std::string& format); +#else // !HAVE_STRFTIME + inline int getDateFormat(void) { return resource.date_format; } + inline void saveDateFormat(int f); + inline bool isClock24Hour(void) { return resource.clock24hour; } + inline void saveClock24Hour(bool c); +#endif // HAVE_STRFTIME + + inline WindowStyle *getWindowStyle(void) { return &resource.wstyle; } + inline MenuStyle *getMenuStyle(void) { return &resource.mstyle; } + inline ToolbarStyle *getToolbarStyle(void) { return &resource.tstyle; } + + BlackboxWindow *getIcon(unsigned int index); + + // allAvailableAreas should be used whenever possible instead of this function + // as then Xinerama will work correctly. + const Rect& availableArea(void) const; +#ifdef XINERAMA + const RectList& allAvailableAreas(void) const; +#endif // XINERAMA + void updateAvailableArea(void); + void addStrut(Strut *strut); + void removeStrut(Strut *strut); + + unsigned int addWorkspace(void); + unsigned int removeLastWorkspace(void); + void changeWorkspaceID(unsigned int id); + void saveWorkspaceNames(void); + + void addNetizen(Netizen *n); + void removeNetizen(Window w); + + void addSystrayWindow(Window window); + void removeSystrayWindow(Window window); + + void addIcon(BlackboxWindow *w); + void removeIcon(BlackboxWindow *w); + + void updateClientList(void); + void updateStackingList(void); + void manageWindow(Window w); + void unmanageWindow(BlackboxWindow *w, bool remap); + void raiseWindows(Window *workspace_stack, unsigned int num); + void lowerWindows(Window *workspace_stack, unsigned int num); + void reassociateWindow(BlackboxWindow *w, unsigned int wkspc_id, + bool ignore_sticky); + void propagateWindowName(const BlackboxWindow *bw); + void prevFocus(void) const; + void nextFocus(void) const; + void raiseFocus(void) const; + void load_rc(void); + void save_rc(void); + void reconfigure(void); + void toggleFocusModel(FocusModel model); + void rereadMenu(void); + void shutdown(void); + void showPosition(int x, int y); + void showGeometry(unsigned int gx, unsigned int gy); + void hideGeometry(void); + + void showWorkspaceMenu(int x, int y); + void showRootMenu(int x, int y); + + void buttonPressEvent(const XButtonEvent *xbutton); + void propertyNotifyEvent(const XPropertyEvent *pe); + + void updateNetizenCurrentWorkspace(void); + void updateNetizenWorkspaceCount(void); + void updateNetizenWindowFocus(void); + void updateNetizenWindowAdd(Window w, unsigned long p); + void updateNetizenWindowDel(Window w); + void updateNetizenConfigNotify(XEvent *e); + void updateNetizenWindowRaise(Window w); + void updateNetizenWindowLower(Window w); +}; + + +#endif // __Screen_hh |
