From 7b7ae097a0d389a35967fdab4ea310effcfc42c2 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 23 Jan 2003 04:49:42 +0000 Subject: [PATCH] make the 'toggle all desktops' button work --- scripts/builtins.py | 22 ++++++++++++------- scripts/config.py | 2 +- src/buttonwidget.cc | 51 ++++++++++++++++++++++++++++++++++++++++----- src/buttonwidget.hh | 9 +++++++- src/client.cc | 5 +++++ src/frame.cc | 19 +++++++++++------ src/frame.hh | 3 +++ src/openbox.py | 1 + src/openbox_wrap.cc | 17 +++++++++++++++ 9 files changed, 109 insertions(+), 20 deletions(-) diff --git a/scripts/builtins.py b/scripts/builtins.py index 9b759e7b..b783fd63 100644 --- a/scripts/builtins.py +++ b/scripts/builtins.py @@ -141,19 +141,26 @@ def prev_desktop(data, no_wrap=0): d = n - 1 change_desktop(data, d) -def send_to_all_desktops(data): - """Sends a client to all desktops""" - if not data.client: return - send_client_msg(display.screenInfo(data.screen).rootWindow(), - Property_atoms().net_wm_desktop, data.client.window(), - 0xffffffff) - def send_to_desktop(data, num): """Sends a client to a specified desktop""" if not data.client: return send_client_msg(display.screenInfo(data.screen).rootWindow(), Property_atoms().net_wm_desktop, data.client.window(), num) +def toggle_all_desktops(data): + """Toggles between sending a client to all desktops and to the current + desktop.""" + if not data.client: return + if not data.client.desktop() == 0xffffffff: + send_to_desktop(data, 0xffffffff) + else: + send_to_desktop(data, openbox.screen(data.screen).desktop()) + +def send_to_all_desktops(data): + """Sends a client to all desktops""" + if not data.client: return + send_to_desktop(data, 0xffffffff) + def send_to_next_desktop(data, no_wrap=0, follow=1): """Sends a window to the next desktop, optionally (by default) cycling around to the first when going past the last. Also optionally moving to @@ -255,6 +262,7 @@ def setup_window_clicks(): def setup_window_buttons(): """Sets up the default behaviors for the buttons in the window titlebar.""" + mbind("Left", MC_StickyButton, MouseClick, toggle_all_desktops) mbind("Left", MC_CloseButton, MouseClick, close) def setup_scroll(): diff --git a/scripts/config.py b/scripts/config.py index 7ffe1519..1320c581 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -17,7 +17,7 @@ theme = "/usr/local/share/openbox/styles/fieron2" # S - sticky button, C - close button # If no 'L' is included in the string, one will be added to # the end by Openbox. -titlebar_layout = "ILC" +titlebar_layout = "ILMC" # double_click_delay - the number of milliseconds in which 2 clicks are # perceived as a double-click. diff --git a/src/buttonwidget.cc b/src/buttonwidget.cc index eb864ba2..c6677861 100644 --- a/src/buttonwidget.cc +++ b/src/buttonwidget.cc @@ -5,16 +5,19 @@ #endif #include "buttonwidget.hh" -#include "otk/gccache.hh" // otk::BPen +#include "client.hh" namespace ob { ButtonWidget::ButtonWidget(otk::Widget *parent, - WidgetBase::WidgetType type) + WidgetBase::WidgetType type, + Client *client) : otk::Widget(parent), WidgetBase(type), + _client(client), _pressed(false), - _button(0) + _button(0), + _state(false) { } @@ -26,6 +29,21 @@ ButtonWidget::~ButtonWidget() void ButtonWidget::setTextures() { + bool p = _pressed; + + switch (type()) { + case Type_StickyButton: + if (_client->desktop() == (signed)0xffffffff) + p = true; + break; + case Type_MaximizeButton: + if (_client->maxHorz() || _client->maxVert()) + p = true; + break; + default: + break; + } + switch (type()) { case Type_LeftGrip: case Type_RightGrip: @@ -35,10 +53,10 @@ void ButtonWidget::setTextures() setTexture(_style->gripUnfocusBackground()); break; case Type_StickyButton: - case Type_CloseButton: case Type_MaximizeButton: + case Type_CloseButton: case Type_IconifyButton: - if (_pressed) { + if (p) { if (_focused) setTexture(_style->buttonPressFocusBackground()); else @@ -77,6 +95,29 @@ void ButtonWidget::setStyle(otk::RenderStyle *style) } +void ButtonWidget::update() +{ + switch (type()) { + case Type_StickyButton: + if ((_client->desktop() == (signed)0xffffffff) != _state) { + _state = !_state; + setTextures(); + } + break; + case Type_MaximizeButton: + if ((_client->maxHorz() || _client->maxVert()) != _state) { + _state = !_state; + setTextures(); + } + break; + default: + break; + } + + otk::Widget::update(); +} + + void ButtonWidget::renderForeground() { otk::PixmapMask *pm; diff --git a/src/buttonwidget.hh b/src/buttonwidget.hh index a888a3d5..0d546f73 100644 --- a/src/buttonwidget.hh +++ b/src/buttonwidget.hh @@ -7,21 +7,28 @@ namespace ob { +class Client; + class ButtonWidget : public otk::Widget, public WidgetBase { private: void setTextures(); + Client *_client; bool _pressed; unsigned int _button; + bool _state; public: - ButtonWidget(otk::Widget *parent, WidgetBase::WidgetType type); + ButtonWidget(otk::Widget *parent, WidgetBase::WidgetType type, + Client *client); virtual ~ButtonWidget(); virtual void setStyle(otk::RenderStyle *style); virtual void adjust(); + virtual void update(); + virtual void renderForeground(); virtual void focus(); diff --git a/src/client.cc b/src/client.cc index 4f6fe4a2..54afbc9a 100644 --- a/src/client.cc +++ b/src/client.cc @@ -655,6 +655,8 @@ void Client::setDesktop(long target) frame->show(); else frame->hide(); + + frame->adjustState(); } @@ -1072,6 +1074,9 @@ void Client::changeState() otk::Property::atoms.atom, netstate, num); calcLayer(); + + if (frame) + frame->adjustState(); } diff --git a/src/frame.cc b/src/frame.cc index cd73f29a..531db48d 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -30,14 +30,14 @@ Frame::Frame(Client *client, otk::RenderStyle *style) _screen(otk::display->screenInfo(client->screen())), _plate(this, WidgetBase::Type_Plate), _titlebar(this, WidgetBase::Type_Titlebar), - _button_close(&_titlebar, WidgetBase::Type_CloseButton), - _button_iconify(&_titlebar, WidgetBase::Type_IconifyButton), - _button_max(&_titlebar, WidgetBase::Type_MaximizeButton), - _button_stick(&_titlebar, WidgetBase::Type_StickyButton), + _button_close(&_titlebar, WidgetBase::Type_CloseButton, client), + _button_iconify(&_titlebar, WidgetBase::Type_IconifyButton, client), + _button_max(&_titlebar, WidgetBase::Type_MaximizeButton, client), + _button_stick(&_titlebar, WidgetBase::Type_StickyButton, client), _label(&_titlebar, WidgetBase::Type_Label), _handle(this, WidgetBase::Type_Handle), - _grip_left(&_handle, WidgetBase::Type_LeftGrip), - _grip_right(&_handle, WidgetBase::Type_RightGrip), + _grip_left(&_handle, WidgetBase::Type_LeftGrip, client), + _grip_right(&_handle, WidgetBase::Type_RightGrip, client), _decorations(client->decorations()) { assert(client); @@ -399,6 +399,13 @@ void Frame::adjustShape() } +void Frame::adjustState() +{ + _button_stick.update(); + _button_max.update(); +} + + void Frame::grabClient() { // reparent the client to the frame diff --git a/src/frame.hh b/src/frame.hh index 35c884fa..40c08199 100644 --- a/src/frame.hh +++ b/src/frame.hh @@ -102,6 +102,9 @@ public: void adjustPosition(); //! Shape the frame window to the client window void adjustShape(); + //! Update the frame to match the client's new state (for things like toggle + //! buttons) + void adjustState(); //! Applies gravity to the client's position to find where the frame should //! be positioned. diff --git a/src/openbox.py b/src/openbox.py index 2a7a8c38..ac8b0c6c 100644 --- a/src/openbox.py +++ b/src/openbox.py @@ -860,6 +860,7 @@ class Frame(_object): def adjustSize(*args): return apply(_openbox.Frame_adjustSize,args) def adjustPosition(*args): return apply(_openbox.Frame_adjustPosition,args) def adjustShape(*args): return apply(_openbox.Frame_adjustShape,args) + def adjustState(*args): return apply(_openbox.Frame_adjustState,args) def clientGravity(*args): return apply(_openbox.Frame_clientGravity,args) def frameGravity(*args): return apply(_openbox.Frame_frameGravity,args) def plate(*args): return apply(_openbox.Frame_plate,args) diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc index 5143dd1e..523e8451 100644 --- a/src/openbox_wrap.cc +++ b/src/openbox_wrap.cc @@ -9801,6 +9801,22 @@ static PyObject *_wrap_Frame_adjustShape(PyObject *self, PyObject *args) { } +static PyObject *_wrap_Frame_adjustState(PyObject *self, PyObject *args) { + PyObject *resultobj; + ob::Frame *arg1 = (ob::Frame *) 0 ; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:Frame_adjustState",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__Frame,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + (arg1)->adjustState(); + + Py_INCREF(Py_None); resultobj = Py_None; + return resultobj; + fail: + return NULL; +} + + static PyObject *_wrap_Frame_clientGravity(PyObject *self, PyObject *args) { PyObject *resultobj; ob::Frame *arg1 = (ob::Frame *) 0 ; @@ -11699,6 +11715,7 @@ static PyMethodDef SwigMethods[] = { { (char *)"Frame_adjustSize", _wrap_Frame_adjustSize, METH_VARARGS }, { (char *)"Frame_adjustPosition", _wrap_Frame_adjustPosition, METH_VARARGS }, { (char *)"Frame_adjustShape", _wrap_Frame_adjustShape, METH_VARARGS }, + { (char *)"Frame_adjustState", _wrap_Frame_adjustState, METH_VARARGS }, { (char *)"Frame_clientGravity", _wrap_Frame_clientGravity, METH_VARARGS }, { (char *)"Frame_frameGravity", _wrap_Frame_frameGravity, METH_VARARGS }, { (char *)"Frame_plate", _wrap_Frame_plate, METH_VARARGS }, -- 2.44.0