From d3b7c84d4c640face48dfb54d70de2bff1551429 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 6 Nov 2002 07:01:59 +0000 Subject: [PATCH] moving strut into its own .hh. adding OBClient class --- otk/property.cc | 1 + otk/property.hh | 3 +- otk/strut.hh | 28 +++++++ po/POTFILES.in | 3 +- src/Makefile.am | 2 +- src/client.hh | 189 ++++++++++++++++++++++++++++++++++++++++++ src/openbox.hh | 2 + src/util.hh | 6 -- src/xeventhandler.cc | 192 ------------------------------------------- 9 files changed, 225 insertions(+), 201 deletions(-) create mode 100644 otk/strut.hh create mode 100644 src/client.hh diff --git a/otk/property.cc b/otk/property.cc index 3ce90225..f76469d0 100644 --- a/otk/property.cc +++ b/otk/property.cc @@ -139,6 +139,7 @@ OBProperty::OBProperty() _atoms[net_wm_state_skip_pager] = create("_NET_WM_STATE_SKIP_PAGER"); _atoms[net_wm_state_hidden] = create("_NET_WM_STATE_HIDDEN"); _atoms[net_wm_state_fullscreen] = create("_NET_WM_STATE_FULLSCREEN"); + _atoms[net_wm_state_floating] = create("_NET_WM_STATE_FLOATING"); _atoms[kde_net_system_tray_windows] = create("_KDE_NET_SYSTEM_TRAY_WINDOWS"); _atoms[kde_net_wm_system_tray_window_for] = diff --git a/otk/property.hh b/otk/property.hh index 215f941f..6894c786 100644 --- a/otk/property.hh +++ b/otk/property.hh @@ -136,6 +136,7 @@ public: net_wm_state_skip_pager, net_wm_state_hidden, net_wm_state_fullscreen, + net_wm_state_floating, kde_net_system_tray_windows, kde_net_wm_system_tray_window_for, @@ -317,7 +318,7 @@ public: value to return @return The value of the specified Atom */ - inline Atom atom(Atoms a) { + inline Atom atom(Atoms a) const { assert(a >= 0 && a < NUM_ATOMS); Atom ret = _atoms[a]; assert(ret != 0); return ret; } diff --git a/otk/strut.hh b/otk/strut.hh new file mode 100644 index 00000000..494cc4f1 --- /dev/null +++ b/otk/strut.hh @@ -0,0 +1,28 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +#ifndef __strut_hh +#define __strut_hh + +/*! @file strut.hh + @brief The Strut struct defines a margin on 4 sides +*/ + +namespace otk { + +//! Defines a margin on 4 sides +struct Strut { + //! The margin on the top of the Strut + unsigned int top; + //! The margin on the bottom of the Strut + unsigned int bottom; + //! The margin on the left of the Strut + unsigned int left; + //! The margin on the right of the Strut + unsigned int right; + + //! Constructs a new Strut with no margins + Strut(void): top(0), bottom(0), left(0), right(0) {} +}; + +} + +#endif // __strut_hh diff --git a/po/POTFILES.in b/po/POTFILES.in index 07fc4208..5978a6bc 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,4 +1,5 @@ # List of source files containing translatable strings. src/openbox.cc -src/display.cc \ No newline at end of file +src/display.cc +src/client.cc \ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index 85479f69..a07d5289 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,7 @@ bin_PROGRAMS= openbox openbox_LDADD=../otk/libotk.a @LIBINTL@ -openbox_SOURCES= configuration.cc screen.cc openbox.cc \ +openbox_SOURCES= client.cc configuration.cc screen.cc openbox.cc \ util.cc bbwindow.cc workspace.cc blackbox.cc \ main.cc xeventhandler.cc diff --git a/src/client.hh b/src/client.hh new file mode 100644 index 00000000..fa441b6d --- /dev/null +++ b/src/client.hh @@ -0,0 +1,189 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +#ifndef __client_hh +#define __client_hh + +extern "C" { +#include +} + +#include + +#include "otk/strut.hh" +#include "otk/rect.hh" + +namespace ob { + +class BScreen; + +class OBClient { +public: + enum Max { Max_None, + Max_Horz, + Max_Vert, + Max_Full }; + + enum WindowType { Type_Desktop, + Type_Dock, + Type_Toolbar, + Type_Menu, + Type_Utility, + Type_Splash, + Type_Dialog, + Type_Normal }; + + enum MwmFlags { Functions = 1 << 0, + Decorations = 1 << 1 }; + + enum MwmFunctions { MwmFunc_All = 1 << 0, + MwmFunc_Resize = 1 << 1, + MwmFunc_Move = 1 << 2, + MwmFunc_Iconify = 1 << 3, + MwmFunc_Maximize = 1 << 4, + MwmFunc_Close = 1 << 5 }; + + enum MemDecorations { MemDecor_All = 1 << 0, + MemDecor_Border = 1 << 1, + MemDecor_Handle = 1 << 2, + MemDecor_Title = 1 << 3, + //MemDecor_Menu = 1 << 4, + MemDecor_Iconify = 1 << 5, + MemDecor_Maximize = 1 << 6 }; + + // this structure only contains 3 elements... the Motif 2.0 structure + // contains 5... we only need the first 3... so that is all we will define + typedef struct MwmHints { + static const int elements = 3; + unsigned long flags; + unsigned long functions; + unsigned long decorations; + }; + + enum StateAction { State_Remove = 0, // _NET_WM_STATE_REMOVE + State_Add, // _NET_WM_STATE_ADD + State_Toggle // _NET_WM_STATE_TOGGLE + }; + +private: + BScreen *_screen; + Window _window; + + //! The id of the group the window belongs to + XID _group; + + // XXX: transient_for, transients + + //! The desktop on which the window resides (0xffffffff for all desktops) + unsigned int _desktop; + + //! Normal window title + std::string _title; + //! Window title when iconifiged + std::string _icon_title; + + //! The application that created the window + std::string _app_name; + //! The class of the window, can used for grouping + std::string _app_class; + + //! The type of window (what its function is) + WindowType _type; + + //! Position and size of the window (relative to the root window) + otk::Rect _area; + + // size bounds + // if min > max, then the window is not resizable + int _min_x, _min_y; // minumum size + int _max_x, _max_y; // maximum size + int _inc_x, _inc_y; // resize increments + int _base_x, _base_y; // base size + + //! Where to place the decorated window in relation to the undecorated window + int _gravity; + + //! The state of the window, one of WithdrawnState, IconicState, or + //! NormalState + long _state; + + //! Can the window receive input focus? + bool _can_focus; + //! Urgency flag + bool _urgent; + //! Notify the window when it receives focus? + bool _focus_notify; + + //! The window uses shape extension to be non-rectangular? + bool _shaped; + + //! The window is modal, so it must be processed before any windows it is + //! related to can be focused + bool _modal; + //! Only the window's titlebar is displayed + bool _shaded; + //! The window is iconified + bool _iconic; + //! The window is maximized to fill the screen vertically + bool _max_vert; + //! The window is maximized to fill the screen horizontally + bool _max_horz; + //! The window is a 'fullscreen' window, and should be on top of all others + bool _fullscreen; + //! The window should be on top of other windows of the same type + bool _floating; + + // XXX: motif decoration hints! + + void setWMState(long state); + void setDesktop(long desktop); + void setState(StateAction action, long data1, long data2); + + void updateNormalHints(); + void updateWMHints(); + void updateTitle(); + void updateClass(); + +public: + OBClient(BScreen *screen, Window window); + virtual ~OBClient(); + + inline Window window() const { return _window; } + + inline WindowType type() const { return _type; } + inline unsigned int desktop() const { return _desktop; } + inline const std::string &title() const { return _title; } + inline const std::string &iconTitle() const { return _title; } + inline const std::string &appName() const { return _app_name; } + inline const std::string &appClass() const { return _app_class; } + inline bool canFocus() const { return _can_focus; } + inline bool urgent() const { return _urgent; } + inline bool focusNotify() const { return _focus_notify; } + inline bool shaped() const { return _shaped; } + inline int gravity() const { return _gravity; } + + // states + inline bool modal() const { return _modal; } + inline bool shaded() const { return _shaded; } + inline bool iconic() const { return _iconic; } + inline bool maxVert() const { return _max_vert; } + inline bool maxHorz() const { return _max_horz; } + inline bool fullscreen() const { return _fullscreen; } + inline bool floating() const { return _floating; } + + inline int minX() const { return _min_x; } + inline int minY() const { return _min_y; } + inline int maxX() const { return _max_x; } + inline int maxY() const { return _max_y; } + inline int incrementX() const { return _inc_x; } + inline int incrementY() const { return _inc_y; } + inline int baseX() const { return _base_x; } + inline int baseY() const { return _base_y; } + + inline const otk::Rect &area() const { return _area; } + + void update(const XPropertyEvent &e); + void update(const XClientMessageEvent &e); +}; + +} + +#endif // __client_hh diff --git a/src/openbox.hh b/src/openbox.hh index b5a47fde..baf9edeb 100644 --- a/src/openbox.hh +++ b/src/openbox.hh @@ -118,6 +118,8 @@ public: */ inline otk::OBTimerQueueManager *timerManager() { return &_timermanager; } + inline const otk::OBProperty *property() const { return _property; } + //! The main function of the Openbox class /*! This function should be called after instantiating the Openbox class. diff --git a/src/util.hh b/src/util.hh index b6da7520..303d2ffd 100644 --- a/src/util.hh +++ b/src/util.hh @@ -24,12 +24,6 @@ extern "C" { namespace ob { -struct Strut { - unsigned int top, bottom, left, right; - - Strut(void): top(0), bottom(0), left(0), right(0) {} -}; - /* XXX: this needs autoconf help */ const unsigned int BSENTINEL = 65535; diff --git a/src/xeventhandler.cc b/src/xeventhandler.cc index cbca039d..ba60edf7 100644 --- a/src/xeventhandler.cc +++ b/src/xeventhandler.cc @@ -389,15 +389,6 @@ void OBXEventHandler::clientMessage(const XClientMessageEvent &e) if (e.format != 32) return; /* - if (e->xclient.message_type == xatom->getAtom(XAtom::wm_change_state)) { - // WM_CHANGE_STATE message - BlackboxWindow *win = searchWindow(e->xclient.window); - if (! win || ! win->validateClient()) return; - - if (e->xclient.data.l[0] == IconicState) - win->iconify(); - if (e->xclient.data.l[0] == NormalState) - win->deiconify(); } else if (e->xclient.message_type == xatom->getAtom(XAtom::blackbox_change_workspace) || e->xclient.message_type == @@ -408,13 +399,6 @@ void OBXEventHandler::clientMessage(const XClientMessageEvent &e) unsigned int workspace = e->xclient.data.l[0]; if (screen && workspace < screen->getWorkspaceCount()) screen->changeWorkspaceID(workspace); - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_change_window_focus)) { - // TEMP HACK TO KEEP BBKEYS WORKING - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win && win->isVisible() && win->setInputFocus()) - win->installColormap(True); } else if (e->xclient.message_type == xatom->getAtom(XAtom::net_active_window)) { // NET_ACTIVE_WINDOW @@ -436,55 +420,6 @@ void OBXEventHandler::clientMessage(const XClientMessageEvent &e) win->installColormap(True); } } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_cycle_window_focus)) { - // BLACKBOX_CYCLE_WINDOW_FOCUS - BScreen *screen = searchScreen(e->xclient.window); - - if (screen) { - if (! e->xclient.data.l[0]) - screen->prevFocus(); - else - screen->nextFocus(); - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_wm_desktop)) { - // NET_WM_DESKTOP - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win) { - BScreen *screen = win->getScreen(); - unsigned long wksp = (unsigned) e->xclient.data.l[0]; - if (wksp < screen->getWorkspaceCount()) { - if (win->isIconic()) win->deiconify(False, True); - if (win->isStuck()) win->stick(); - if (wksp != screen->getCurrentWorkspaceID()) - win->withdraw(); - else - win->show(); - screen->reassociateWindow(win, wksp, True); - } else if (wksp == 0xfffffffe || // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!! - wksp == 0xffffffff) { - if (win->isIconic()) win->deiconify(False, True); - if (! win->isStuck()) win->stick(); - if (! win->isVisible()) win->show(); - } - } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::blackbox_change_attributes)) { - // BLACKBOX_CHANGE_ATTRIBUTES - BlackboxWindow *win = searchWindow(e->xclient.window); - - if (win && win->validateClient()) { - BlackboxHints net; - net.flags = e->xclient.data.l[0]; - net.attrib = e->xclient.data.l[1]; - net.workspace = e->xclient.data.l[2]; - net.stack = e->xclient.data.l[3]; - net.decoration = e->xclient.data.l[4]; - - win->changeBlackboxHints(&net); - } } else if (e->xclient.message_type == xatom->getAtom(XAtom::net_number_of_desktops)) { // NET_NUMBER_OF_DESKTOPS @@ -523,133 +458,6 @@ void OBXEventHandler::clientMessage(const XClientMessageEvent &e) win->beginResize(x_root, y_root, BlackboxWindow::BottomRight); } } - } else if (e->xclient.message_type == - xatom->getAtom(XAtom::net_wm_state)) { - // NET_WM_STATE - BlackboxWindow *win = searchWindow(e->xclient.window); - if (win && win->validateClient()) { - const Atom action = (Atom) e->xclient.data.l[0]; - const Atom state[] = { (Atom) e->xclient.data.l[1], - (Atom) e->xclient.data.l[2] }; - - for (int i = 0; i < 2; ++i) { - if (! state[i]) - continue; - - if ((Atom) e->xclient.data.l[0] == 1) { - // ADD - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else if (! win->isMaximized()) { - win->maximize(2); // vert - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else if (! win->isMaximized()) { - win->maximize(3); // horiz - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - if (! win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(True); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(True); - } - } else if (action == 0) { - // REMOVE - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(3); // horiz - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(2); // vert - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - if (win->isShaded()) - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(False); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(False); - } - } else if (action == 2) { - // TOGGLE - if (state[i] == xatom->getAtom(XAtom::net_wm_state_modal)) { - win->setModal(! win->isModal()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_vert)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(3); // horiz - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else { - win->maximize(2); // vert - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_maximized_horz)) { - if (win->isMaximizedFull()) { - win->maximize(0); // unmaximize - win->maximize(2); // vert - } else if (win->isMaximizedHoriz()) { - win->maximize(0); // unmaximize - } else if (win->isMaximizedVert()) { - win->maximize(0); // unmaximize - win->maximize(1); // full - } else { - win->maximize(3); // horiz - } - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_shaded)) { - win->shade(); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_taskbar)) { - win->setSkipTaskbar(! win->skipTaskbar()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_skip_pager)) { - win->setSkipPager(! win->skipPager()); - } else if (state[i] == - xatom->getAtom(XAtom::net_wm_state_fullscreen)) { - win->setFullscreen(! win->isFullscreen()); - } - } - } - } } */ } -- 2.45.2