make the 'toggle all desktops' button work

This commit is contained in:
Dana Jansens 2003-01-23 04:49:42 +00:00
parent 7b9d92b2e7
commit 7b7ae097a0
9 changed files with 109 additions and 20 deletions

View file

@ -141,19 +141,26 @@ def prev_desktop(data, no_wrap=0):
d = n - 1 d = n - 1
change_desktop(data, d) 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): def send_to_desktop(data, num):
"""Sends a client to a specified desktop""" """Sends a client to a specified desktop"""
if not data.client: return if not data.client: return
send_client_msg(display.screenInfo(data.screen).rootWindow(), send_client_msg(display.screenInfo(data.screen).rootWindow(),
Property_atoms().net_wm_desktop, data.client.window(), num) 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): def send_to_next_desktop(data, no_wrap=0, follow=1):
"""Sends a window to the next desktop, optionally (by default) cycling """Sends a window to the next desktop, optionally (by default) cycling
around to the first when going past the last. Also optionally moving to 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(): def setup_window_buttons():
"""Sets up the default behaviors for the buttons in the window titlebar.""" """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) mbind("Left", MC_CloseButton, MouseClick, close)
def setup_scroll(): def setup_scroll():

View file

@ -17,7 +17,7 @@ theme = "/usr/local/share/openbox/styles/fieron2"
# S - sticky button, C - close button # S - sticky button, C - close button
# If no 'L' is included in the string, one will be added to # If no 'L' is included in the string, one will be added to
# the end by Openbox. # the end by Openbox.
titlebar_layout = "ILC" titlebar_layout = "ILMC"
# double_click_delay - the number of milliseconds in which 2 clicks are # double_click_delay - the number of milliseconds in which 2 clicks are
# perceived as a double-click. # perceived as a double-click.

View file

@ -5,16 +5,19 @@
#endif #endif
#include "buttonwidget.hh" #include "buttonwidget.hh"
#include "otk/gccache.hh" // otk::BPen #include "client.hh"
namespace ob { namespace ob {
ButtonWidget::ButtonWidget(otk::Widget *parent, ButtonWidget::ButtonWidget(otk::Widget *parent,
WidgetBase::WidgetType type) WidgetBase::WidgetType type,
Client *client)
: otk::Widget(parent), : otk::Widget(parent),
WidgetBase(type), WidgetBase(type),
_client(client),
_pressed(false), _pressed(false),
_button(0) _button(0),
_state(false)
{ {
} }
@ -26,6 +29,21 @@ ButtonWidget::~ButtonWidget()
void ButtonWidget::setTextures() 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()) { switch (type()) {
case Type_LeftGrip: case Type_LeftGrip:
case Type_RightGrip: case Type_RightGrip:
@ -35,10 +53,10 @@ void ButtonWidget::setTextures()
setTexture(_style->gripUnfocusBackground()); setTexture(_style->gripUnfocusBackground());
break; break;
case Type_StickyButton: case Type_StickyButton:
case Type_CloseButton:
case Type_MaximizeButton: case Type_MaximizeButton:
case Type_CloseButton:
case Type_IconifyButton: case Type_IconifyButton:
if (_pressed) { if (p) {
if (_focused) if (_focused)
setTexture(_style->buttonPressFocusBackground()); setTexture(_style->buttonPressFocusBackground());
else 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() void ButtonWidget::renderForeground()
{ {
otk::PixmapMask *pm; otk::PixmapMask *pm;

View file

@ -7,21 +7,28 @@
namespace ob { namespace ob {
class Client;
class ButtonWidget : public otk::Widget, public WidgetBase class ButtonWidget : public otk::Widget, public WidgetBase
{ {
private: private:
void setTextures(); void setTextures();
Client *_client;
bool _pressed; bool _pressed;
unsigned int _button; unsigned int _button;
bool _state;
public: public:
ButtonWidget(otk::Widget *parent, WidgetBase::WidgetType type); ButtonWidget(otk::Widget *parent, WidgetBase::WidgetType type,
Client *client);
virtual ~ButtonWidget(); virtual ~ButtonWidget();
virtual void setStyle(otk::RenderStyle *style); virtual void setStyle(otk::RenderStyle *style);
virtual void adjust(); virtual void adjust();
virtual void update();
virtual void renderForeground(); virtual void renderForeground();
virtual void focus(); virtual void focus();

View file

@ -655,6 +655,8 @@ void Client::setDesktop(long target)
frame->show(); frame->show();
else else
frame->hide(); frame->hide();
frame->adjustState();
} }
@ -1072,6 +1074,9 @@ void Client::changeState()
otk::Property::atoms.atom, netstate, num); otk::Property::atoms.atom, netstate, num);
calcLayer(); calcLayer();
if (frame)
frame->adjustState();
} }

View file

@ -30,14 +30,14 @@ Frame::Frame(Client *client, otk::RenderStyle *style)
_screen(otk::display->screenInfo(client->screen())), _screen(otk::display->screenInfo(client->screen())),
_plate(this, WidgetBase::Type_Plate), _plate(this, WidgetBase::Type_Plate),
_titlebar(this, WidgetBase::Type_Titlebar), _titlebar(this, WidgetBase::Type_Titlebar),
_button_close(&_titlebar, WidgetBase::Type_CloseButton), _button_close(&_titlebar, WidgetBase::Type_CloseButton, client),
_button_iconify(&_titlebar, WidgetBase::Type_IconifyButton), _button_iconify(&_titlebar, WidgetBase::Type_IconifyButton, client),
_button_max(&_titlebar, WidgetBase::Type_MaximizeButton), _button_max(&_titlebar, WidgetBase::Type_MaximizeButton, client),
_button_stick(&_titlebar, WidgetBase::Type_StickyButton), _button_stick(&_titlebar, WidgetBase::Type_StickyButton, client),
_label(&_titlebar, WidgetBase::Type_Label), _label(&_titlebar, WidgetBase::Type_Label),
_handle(this, WidgetBase::Type_Handle), _handle(this, WidgetBase::Type_Handle),
_grip_left(&_handle, WidgetBase::Type_LeftGrip), _grip_left(&_handle, WidgetBase::Type_LeftGrip, client),
_grip_right(&_handle, WidgetBase::Type_RightGrip), _grip_right(&_handle, WidgetBase::Type_RightGrip, client),
_decorations(client->decorations()) _decorations(client->decorations())
{ {
assert(client); assert(client);
@ -399,6 +399,13 @@ void Frame::adjustShape()
} }
void Frame::adjustState()
{
_button_stick.update();
_button_max.update();
}
void Frame::grabClient() void Frame::grabClient()
{ {
// reparent the client to the frame // reparent the client to the frame

View file

@ -102,6 +102,9 @@ public:
void adjustPosition(); void adjustPosition();
//! Shape the frame window to the client window //! Shape the frame window to the client window
void adjustShape(); 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 //! Applies gravity to the client's position to find where the frame should
//! be positioned. //! be positioned.

View file

@ -860,6 +860,7 @@ class Frame(_object):
def adjustSize(*args): return apply(_openbox.Frame_adjustSize,args) def adjustSize(*args): return apply(_openbox.Frame_adjustSize,args)
def adjustPosition(*args): return apply(_openbox.Frame_adjustPosition,args) def adjustPosition(*args): return apply(_openbox.Frame_adjustPosition,args)
def adjustShape(*args): return apply(_openbox.Frame_adjustShape,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 clientGravity(*args): return apply(_openbox.Frame_clientGravity,args)
def frameGravity(*args): return apply(_openbox.Frame_frameGravity,args) def frameGravity(*args): return apply(_openbox.Frame_frameGravity,args)
def plate(*args): return apply(_openbox.Frame_plate,args) def plate(*args): return apply(_openbox.Frame_plate,args)

View file

@ -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) { static PyObject *_wrap_Frame_clientGravity(PyObject *self, PyObject *args) {
PyObject *resultobj; PyObject *resultobj;
ob::Frame *arg1 = (ob::Frame *) 0 ; ob::Frame *arg1 = (ob::Frame *) 0 ;
@ -11699,6 +11715,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"Frame_adjustSize", _wrap_Frame_adjustSize, METH_VARARGS }, { (char *)"Frame_adjustSize", _wrap_Frame_adjustSize, METH_VARARGS },
{ (char *)"Frame_adjustPosition", _wrap_Frame_adjustPosition, METH_VARARGS }, { (char *)"Frame_adjustPosition", _wrap_Frame_adjustPosition, METH_VARARGS },
{ (char *)"Frame_adjustShape", _wrap_Frame_adjustShape, 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_clientGravity", _wrap_Frame_clientGravity, METH_VARARGS },
{ (char *)"Frame_frameGravity", _wrap_Frame_frameGravity, METH_VARARGS }, { (char *)"Frame_frameGravity", _wrap_Frame_frameGravity, METH_VARARGS },
{ (char *)"Frame_plate", _wrap_Frame_plate, METH_VARARGS }, { (char *)"Frame_plate", _wrap_Frame_plate, METH_VARARGS },