all repos — openbox @ 4ef15148365c223b8e810611a10dc27dc5fba355

openbox fork - make it a bit more like ryudo

stop using a desktop number for iconic windows. woot!
Dana Jansens danakj@orodu.net
commit

4ef15148365c223b8e810611a10dc27dc5fba355

parent

12108e16e166034cd1840627502280d9a1ab0b9e

5 files changed, 104 insertions(+), 105 deletions(-)

jump to
M scripts/focus.pyscripts/focus.py

@@ -29,6 +29,7 @@

def _focusable(client, desktop): if not client.normal(): return 0 if not (client.canFocus() or client.focusNotify()): return 0 + if client.iconic(): return 0 if AVOID_SKIP_TASKBAR and client.skipTaskbar(): return 0 desk = client.desktop()
M src/client.ccsrc/client.cc

@@ -45,7 +45,7 @@ _urgent = false;

_positioned = false; _disabled_decorations = 0; _group = None; - _desktop = _old_desktop = 0; + _desktop = 0; getArea(); getDesktop();

@@ -730,62 +730,46 @@ if (state == _wmstate) return; // no change

switch (state) { case IconicState: - setDesktop(ICONIC_DESKTOP); + iconify(true); break; case NormalState: - setDesktop(openbox->screen(_screen)->desktop()); + iconify(false); break; } } -void Client::setDesktop(long target) +void Client::setDesktop(unsigned int target) { if (target == _desktop) return; - printf("Setting desktop %ld\n", target); + printf("Setting desktop %u\n", target); - if (!(target >= 0 || target == (signed)0xffffffff || - target == ICONIC_DESKTOP)) + if (!(target < openbox->screen(_screen)->numDesktops() || + target == 0xffffffff)) return; - _old_desktop = _desktop; _desktop = target; - // set the desktop hint, but not if we're iconifying - if (_desktop != ICONIC_DESKTOP) - otk::Property::set(_window, otk::Property::atoms.net_wm_desktop, - otk::Property::atoms.cardinal, (unsigned)_desktop); + // set the desktop hint + otk::Property::set(_window, otk::Property::atoms.net_wm_desktop, + otk::Property::atoms.cardinal, _desktop); // 'move' the window to the new desktop - if (_desktop == openbox->screen(_screen)->desktop() || - _desktop == (signed)0xffffffff) + showhide(); + + openbox->screen(_screen)->updateStruts(); +} + + +void Client::showhide() +{ + if (!_iconic && + (_desktop == openbox->screen(_screen)->desktop() || + _desktop == 0xffffffff)) frame->show(); else frame->hide(); - - // Handle Iconic state. Iconic state is maintained by the client being a - // member of the ICONIC_DESKTOP, so this is where we make iconifying and - // uniconifying happen. - bool i = _desktop == ICONIC_DESKTOP; - if (i != _iconic) { // has the state changed? - _iconic = i; - if (_iconic) { - _wmstate = IconicState; - ignore_unmaps++; - // we unmap the client itself so that we can get MapRequest events, and - // because the ICCCM tells us to! - XUnmapWindow(**otk::display, _window); - } else { - _wmstate = NormalState; - XMapWindow(**otk::display, _window); - } - changeState(); - } - - changeAllowedActions(); - frame->adjustState(); - openbox->screen(_screen)->updateStruts(); }

@@ -1029,14 +1013,14 @@ #ifdef DEBUG

printf("net_active_window for 0x%lx\n", _window); #endif if (_iconic) - setDesktop(openbox->screen(_screen)->desktop()); + iconify(false); if (_shaded) shade(false); focus(); openbox->screen(_screen)->raiseWindow(this); } else if (e.message_type == otk::Property::atoms.openbox_active_window) { if (_iconic) - setDesktop(openbox->screen(_screen)->desktop()); + iconify(false); if (e.data.l[0] && _shaded) shade(false); focus();

@@ -1325,7 +1309,7 @@ // these are in a carefully crafted order..

if (_iconic) { _iconic = false; - setDesktop(ICONIC_DESKTOP); + iconify(true); } if (_fullscreen) { _fullscreen = false;

@@ -1395,8 +1379,7 @@ if (dir == 1 && !_max_horz) return;

if (dir == 2 && !_max_vert) return; } - const otk::Rect &a = openbox->screen(_screen)->area(_iconic ? - _old_desktop : _desktop); + const otk::Rect &a = openbox->screen(_screen)->area(_desktop); int x = frame->area().x(), y = frame->area().y(), w = _area.width(), h = _area.height();

@@ -1541,9 +1524,7 @@ }

delete dimensions; } else { // pick some fallbacks... - const otk::Rect &a = openbox->screen(_screen)->area(_iconic ? - _old_desktop : - _desktop); + const otk::Rect &a = openbox->screen(_screen)->area(_desktop); x = a.x() + a.width() / 4; y = a.y() + a.height() / 4; w = a.width() / 2;

@@ -1564,6 +1545,32 @@ if (fs) focus();

} +void Client::iconify(bool iconic, bool curdesk) +{ + if (_iconic == iconic) return; // nothing to do + + _iconic = iconic; + + if (_iconic) { + _wmstate = IconicState; + ignore_unmaps++; + // we unmap the client itself so that we can get MapRequest events, and + // because the ICCCM tells us to! + XUnmapWindow(**otk::display, _window); + } else { + if (curdesk) + setDesktop(openbox->screen(_screen)->desktop()); + _wmstate = NormalState; + XMapWindow(**otk::display, _window); + } + changeState(); + + showhide(); + + openbox->screen(_screen)->updateStruts(); +} + + void Client::disableDecorations(DecorationFlags flags) { _disabled_decorations = flags;

@@ -1856,7 +1863,7 @@

assert(_iconic); // we shouldn't be able to get this unless we're iconic // move to the current desktop (uniconify) - setDesktop(openbox->screen(_screen)->desktop()); + iconify(false); // XXX: should we focus/raise the window? (basically a net_wm_active_window) }
M src/client.hhsrc/client.hh

@@ -164,10 +164,6 @@ */

static const long no_propagate_mask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask; - //! The desktop value which indicated the window is iconified and not on any - //! desktop - static const long ICONIC_DESKTOP = 0xfffffffe; - //! The number of unmap events to ignore on the window int ignore_unmaps;

@@ -188,11 +184,7 @@ //! The clients which are transients (children) of this client

Client::List _transients; //! The desktop on which the window resides (0xffffffff for all desktops) - long _desktop; - - //! The last desktop to which the window belonged, mostly useful when the - //! window is iconified, to see where it used to be. - long _old_desktop; + unsigned int _desktop; //! Normal window title otk::ustring _title;

@@ -380,11 +372,7 @@ */

void setState(StateAction action, long data1, long data2); //! Sends the window to the specified desktop - /*! - A window is iconified by sending it to the ICONIC_DESKTOP, and restored - by sending it to any other valid desktop. - */ - void setDesktop(long desktop); + void setDesktop(unsigned int desktop); //! Calculates the stacking layer for the client window void calcLayer();

@@ -446,6 +434,16 @@ when restoring a window from fullscreen.

*/ void fullscreen(bool fs, bool savearea = true); + //! Iconifies or uniconifies the client window + /*! + @param iconic true if the window should be iconified; false if it should be + restored. + @param curdesk If iconic is false, then this determines if the window will + be uniconified to the current viewable desktop (true) or to + its previous desktop (false) + */ + void iconify(bool iconic, bool curdesk = true); + //! Maximize or unmaximize the client window /*! @param max true if the window should be maximized; false if it should be

@@ -532,7 +530,7 @@ /*!

This value is a 0-based index.<br> A value of 0xffffffff indicates that the window exists on all desktops. */ - inline long desktop() const { return _desktop; } + inline unsigned int desktop() const { return _desktop; } //! Returns the window's title inline const otk::ustring &title() const { return _title; } //! Returns the window's title when it is iconified

@@ -653,6 +651,12 @@ Use this to make the window readjust its maximized size to new

surroundings (struts, etc). */ void remaximize(); + + //! Shows the window if it should be shown, or hides it + /*! + Used when changing desktops, the window's state, etc. + */ + void showhide(); //! Choose a mask of decorations to not display on the client /*!
M src/screen.ccsrc/screen.cc

@@ -105,7 +105,7 @@ // we have a list of desktop names

_desktop = 0; - if (!python_get_long("NUMBER_OF_DESKTOPS", &_num_desktops)) + if (!python_get_long("NUMBER_OF_DESKTOPS", (long*)&_num_desktops)) _num_desktops = 1; changeNumDesktops(_num_desktops); // set the hint

@@ -217,16 +217,16 @@ sit->left = sit->right = sit->top = sit->bottom = 0;

ClientList::const_iterator it, end = clients.end(); for (it = clients.begin(); it != end; ++it) { - long desk = (*it)->desktop(); + if ((*it)->iconic()) continue; // these dont count in the strut + + unsigned int desk = (*it)->desktop(); const otk::Strut &s = (*it)->strut(); - if (desk == (signed) 0xffffffff) + if (desk == 0xffffffff) for (unsigned int i = 0, e = _struts.size(); i < e; ++i) apply(_struts[i], s); - else if ((unsigned)desk < _struts.size()) + else if (desk < _struts.size()) apply(_struts[desk], s); - else if (desk == Client::ICONIC_DESKTOP) - continue; // skip for the 'all desktops' strut else assert(false); // invalid desktop otherwise.. // apply to the 'all desktops' strut

@@ -239,7 +239,7 @@

void Screen::changeWorkArea() { unsigned long *dims = new unsigned long[4 * _num_desktops]; - for (long i = 0; i < _num_desktops + 1; ++i) { + for (unsigned int i = 0; i < _num_desktops + 1; ++i) { otk::Rect old_area = _area[i]; /* #ifdef XINERAMA

@@ -286,7 +286,7 @@ if ((*it)->desktop() == i)

(*it)->remaximize(); } else { // the 'all desktops' size - if ((*it)->desktop() == (signed) 0xffffffff) + if ((*it)->desktop() == 0xffffffff) (*it)->remaximize(); } }

@@ -537,11 +537,7 @@

EventData ddata(_number, client, EventAction::DisplayingWindow, 0); openbox->bindings()->fireEvent(&ddata); - // if on the current desktop.. (or all desktops) - if (client->desktop() == _desktop || - client->desktop() == (signed)0xffffffff) { - client->frame->show(); - } + client->showhide(); client->applyStartupState();

@@ -708,13 +704,13 @@

changeStackingList(); } -void Screen::changeDesktop(long desktop) +void Screen::changeDesktop(unsigned int desktop) { - if (!(desktop >= 0 && desktop < _num_desktops)) return; + if (desktop >= _num_desktops) return; - printf("Moving to desktop %ld\n", desktop); + printf("Moving to desktop %u\n", desktop); - long old = _desktop; + unsigned int old = _desktop; _desktop = desktop; otk::Property::set(_info->rootWindow(),

@@ -724,20 +720,15 @@

if (old == _desktop) return; ClientList::iterator it, end = clients.end(); - for (it = clients.begin(); it != end; ++it) { - if ((*it)->desktop() == old) { - (*it)->frame->hide(); - } else if ((*it)->desktop() == _desktop) { - (*it)->frame->show(); - } - } + for (it = clients.begin(); it != end; ++it) + (*it)->showhide(); // force the callbacks to fire if (!openbox->focusedClient()) openbox->setFocusedClient(0); } -void Screen::changeNumDesktops(long num) +void Screen::changeNumDesktops(unsigned int num) { assert(num > 0);

@@ -746,9 +737,8 @@

// move windows on desktops that will no longer exist! ClientList::iterator it, end = clients.end(); for (it = clients.begin(); it != end; ++it) { - int d = (*it)->desktop(); - if (d >= num && !(d == (signed) 0xffffffff || - d == Client::ICONIC_DESKTOP)) { + unsigned int d = (*it)->desktop(); + if (d >= num && d != 0xffffffff) { XEvent ce; ce.xclient.type = ClientMessage; ce.xclient.message_type = otk::Property::atoms.net_wm_desktop;

@@ -794,15 +784,13 @@ if (!otk::Property::get(_info->rootWindow(),

otk::Property::atoms.net_desktop_names, otk::Property::utf8, &num, &_desktop_names)) _desktop_names.clear(); - while ((long)_desktop_names.size() < _num_desktops) + while (_desktop_names.size() < _num_desktops) _desktop_names.push_back("Unnamed"); } -void Screen::setDesktopName(long i, const otk::ustring &name) +void Screen::setDesktopName(unsigned int i, const otk::ustring &name) { - assert(i >= 0); - if (i >= _num_desktops) return; otk::Property::StringVect newnames = _desktop_names;

@@ -813,10 +801,9 @@ otk::Property::utf8, newnames);

} -const otk::Rect& Screen::area(long desktop) const { - assert(desktop >= 0 || desktop == (signed) 0xffffffff); - assert(desktop < _num_desktops || desktop == (signed) 0xffffffff); - if (desktop >= 0 && desktop < _num_desktops) +const otk::Rect& Screen::area(unsigned int desktop) const { + assert(desktop < _num_desktops || desktop == 0xffffffff); + if (desktop < _num_desktops) return _area[desktop]; else return _area[_num_desktops];
M src/screen.hhsrc/screen.hh

@@ -80,10 +80,10 @@ //! A list of all managed clients on the screen, in their stacking order

ClientList _stacking; //! The desktop currently being displayed - long _desktop; + unsigned int _desktop; //! The number of desktops - long _num_desktops; + unsigned int _num_desktops; //! The names of all desktops otk::Property::StringVect _desktop_names;

@@ -118,14 +118,14 @@ /*!

@param desktop The number of the desktop to switch to (starts from 0). If the desktop is out of valid range, it is ignored. */ - void changeDesktop(long desktop); + void changeDesktop(unsigned int desktop); //! Changes the number of desktops. /*! @param num The number of desktops that should exist. This value must be greater than 0 or it will be ignored. */ - void changeNumDesktops(long num); + void changeNumDesktops(unsigned int num); public: #ifndef SWIG

@@ -146,9 +146,9 @@ inline bool managed() const { return _managed; }

//! An offscreen window which gets focus when nothing else has it inline Window focuswindow() const { return _focuswindow; } //! Returns the desktop being displayed - inline long desktop() const { return _desktop; } + inline unsigned int desktop() const { return _desktop; } //! Returns the number of desktops - inline long numDesktops() const { return _num_desktops; } + inline unsigned int numDesktops() const { return _num_desktops; } //! Returns the area of the screen not reserved by applications' Struts /*!

@@ -156,7 +156,7 @@ @param desktop The desktop number of the area to retrieve for. A value of

0xffffffff will return an area that combines all struts on all desktops. */ - const otk::Rect& area(long desktop) const; + const otk::Rect& area(unsigned int desktop) const; //! Update's the screen's combined strut of all the clients. /*!

@@ -198,7 +198,7 @@ @param i The index of the desktop to set the name for (starts at 0)

@param name The name to set for the desktop If the index is too large, it is simply ignored. */ - void setDesktopName(long i, const otk::ustring &name); + void setDesktopName(unsigned int i, const otk::ustring &name); void installColormap(bool install) const;