void Client::showhide()
{
- if (!_iconic &&
- (_desktop == openbox->screen(_screen)->desktop() ||
- _desktop == 0xffffffff))
- frame->show();
- else
- frame->hide();
+ 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();
}
assert(screen >= 0); assert(screen < ScreenCount(**otk::display));
_info = otk::display->screenInfo(screen);
+ _showing_desktop = false;
+
::running = false;
XErrorHandler old = XSetErrorHandler(::anotherWMRunning);
XSelectInput(**otk::display, _info->rootWindow(),
otk::Property::atoms.net_client_list_stacking,
otk::Property::atoms.net_desktop_names,
otk::Property::atoms.net_close_window,
+ otk::Property::atoms.net_desktop_layout,
+ otk::Property::atoms.net_showing_desktop,
otk::Property::atoms.net_wm_name,
otk::Property::atoms.net_wm_visible_name,
otk::Property::atoms.net_wm_icon_name,
otk::Property::atoms.net_wm_visible_icon_name,
-/*
otk::Property::atoms.net_wm_desktop,
-*/
otk::Property::atoms.net_wm_strut,
otk::Property::atoms.net_wm_window_type,
otk::Property::atoms.net_wm_window_type_desktop,
XUninstallColormap(**otk::display, _info->colormap());
}
+void Screen::showDesktop(bool show)
+{
+ if (show == _showing_desktop) return; // no change
+
+ _showing_desktop = show;
+ ClientList::iterator it, end = clients.end();
+ for (it = clients.begin(); it != end; ++it)
+ (*it)->showhide();
+}
void Screen::propertyHandler(const XPropertyEvent &e)
{
changeDesktop(e.data.l[0]);
} else if (e.message_type == otk::Property::atoms.net_number_of_desktops) {
changeNumDesktops(e.data.l[0]);
+ } else if (e.message_type == otk::Property::atoms.net_showing_desktop) {
+ showDesktop(e.data.l[0] != 0);
}
}
#ifdef DEBUG
printf("DEBUG: MAP REQUEST CAUGHT IN SCREEN. IGNORED.\n");
#endif
- } else
+ } else {
+ if (_showing_desktop)
+ showDesktop(false); // leave showing-the-desktop mode
manageWindow(e.window);
+ }
}
}
//! The names of all desktops
otk::Property::StringVect _desktop_names;
+ //! The layout of the desktops as specified by an EWMH compliant pager
DesktopLayout _layout;
+ //! True when the window manager is in 'showing desktop' mode
+ bool _showing_desktop;
+
//! Calculate the Screen::_area member
void calcArea();
//! Set the list of supported NETWM atoms on the root window
*/
void changeNumDesktops(unsigned int num);
+ //! Shows and focuses the desktop and hides all the client windows, or
+ //! returns to the normal state, showing client windows.
+ void showDesktop(bool show);
+
public:
#ifndef SWIG
//! Constructs a new Screen object
inline unsigned int desktop() const { return _desktop; }
//! Returns the number of desktops
inline unsigned int numDesktops() const { return _num_desktops; }
+ //! When true, the desktop is being shown and all clients are hidden
+ inline bool showingDesktop() const { return _showing_desktop; }
//! Returns the area of the screen not reserved by applications' Struts
/*!