// any changes we've made here
otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
otk::Property::atoms.cardinal, (unsigned)_desktop);
-
changeState();
}
// updating here is pointless while we're being mapped cuz we're not in
// the screen's client list yet
if (frame)
- openbox->screen(_screen)->updateStrut();
+ openbox->screen(_screen)->updateStruts();
}
delete [] data;
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;
-
- _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);
-
+ _desktop = target;
+ // set the desktop hint
+ otk::Property::set(_window, otk::Property::atoms.net_wm_desktop,
+ otk::Property::atoms.cardinal, _desktop);
+ frame->adjustState(); // the frame can display the current desktop state
// 'move' the window to the new desktop
- if (_desktop == openbox->screen(_screen)->desktop() ||
- _desktop == (signed)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();
- }
-
- frame->adjustState();
+ showhide();
+ openbox->screen(_screen)->updateStruts();
+}
+
+
+void Client::showhide()
+{
+ bool show;
+ Screen *s = openbox->screen(_screen);
+
+ if (_iconic) show = false;
+ else if (!(_desktop == s->desktop() ||
+ _desktop == 0xffffffff)) show = false;
+ else if (normal() && s->showingDesktop()) show = false;
+ else show = true;
+
+ if (show) frame->show();
+ else frame->hide();
}
#ifdef DEBUG
printf("net_active_window for 0x%lx\n", _window);
#endif
+ if (openbox->screen(_screen)->showingDesktop())
+ openbox->screen(_screen)->showDesktop(false);
if (_iconic)
- setDesktop(openbox->screen(_screen)->desktop());
+ iconify(false);
+ else if (!frame->visible()) // if its not visible for other reasons, then
+ return; // don't mess with it
if (_shaded)
shade(false);
focus();
openbox->screen(_screen)->raiseWindow(this);
} else if (e.message_type == otk::Property::atoms.openbox_active_window) {
+ if (openbox->screen(_screen)->showingDesktop())
+ openbox->screen(_screen)->showDesktop(false);
if (_iconic)
- setDesktop(openbox->screen(_screen)->desktop());
+ iconify(false);
+ else if (!frame->visible()) // if its not visible for other reasons, then
+ return; // don't mess with it
if (e.data.l[0] && _shaded)
shade(false);
focus();
if (_iconic) {
_iconic = false;
- setDesktop(ICONIC_DESKTOP);
+ iconify(true);
}
if (_fullscreen) {
_fullscreen = false;
if (dir == 2 && !_max_vert) return;
}
- const otk::Rect &a = openbox->screen(_screen)->area();
+ const otk::Rect &a = openbox->screen(_screen)->area(_desktop);
int x = frame->area().x(), y = frame->area().y(),
w = _area.width(), h = _area.height();
delete dimensions;
} else {
// pick some fallbacks...
- const otk::Rect &a = openbox->screen(_screen)->area();
+ 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;
}
+void Client::iconify(bool iconic, bool curdesk)
+{
+ if (_iconic == iconic) return; // nothing to do
+
+#ifdef DEBUG
+ printf("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), _window);
+#endif
+
+ _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;
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)
}