make the 'toggle all desktops' button work
This commit is contained in:
parent
7b9d92b2e7
commit
7b7ae097a0
9 changed files with 109 additions and 20 deletions
|
@ -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():
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
19
src/frame.cc
19
src/frame.cc
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
Loading…
Reference in a new issue