// 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);
+ // 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();
- }
-
- frame->adjustState();
}
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();
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
+
+ _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;
for (it = node->_transients.begin(); it != end; ++it) {
if (*it == skip) continue; // circular?
- printf("recursing\n");
if ((ret = searchModalTree(*it, skip))) return ret; // got one
- printf("trying this window\n");
- if ((*it)->_modal) {
- printf("found it\n");
- return *it; // got one
- }
+ if ((*it)->_modal) return *it; // got one
}
- printf("found none\n");
return 0;
}
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)
}