summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-23 04:49:42 +0000
committerDana Jansens <danakj@orodu.net>2003-01-23 04:49:42 +0000
commit7b7ae097a0d389a35967fdab4ea310effcfc42c2 (patch)
tree853d2ba50e8ef50754a26e33473c13ebb5e3ef55 /src
parent7b9d92b2e75cab137ca3bfaf48ce40b5cbbaacf4 (diff)
make the 'toggle all desktops' button work
Diffstat (limited to 'src')
-rw-r--r--src/buttonwidget.cc51
-rw-r--r--src/buttonwidget.hh9
-rw-r--r--src/client.cc5
-rw-r--r--src/frame.cc19
-rw-r--r--src/frame.hh3
-rw-r--r--src/openbox.py1
-rw-r--r--src/openbox_wrap.cc17
7 files changed, 93 insertions, 12 deletions
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 },