#include "config.h"
+#include "screen.hh"
+#include "client.hh"
+#include "openbox.hh"
+#include "frame.hh"
+#include "bindings.hh"
+#include "python.hh"
+#include "otk/display.hh"
+#include "otk/property.hh"
+#include "otk/util.hh"
+
extern "C" {
#ifdef HAVE_UNISTD_H
# include <sys/types.h>
#define _(str) gettext(str)
}
-#include "screen.hh"
-#include "client.hh"
-#include "openbox.hh"
-#include "frame.hh"
-#include "bindings.hh"
-#include "python.hh"
-#include "otk/display.hh"
-#include "otk/property.hh"
-
#include <vector>
#include <algorithm>
#include <cstdio>
Screen::Screen(int screen)
- : _number(screen)
+ : _number(screen),
+ _config(screen)
{
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(),
XDefineCursor(**otk::display, _info->rootWindow(),
openbox->cursors().session);
- // XXX: initialize the screen's style
- /*
- otk::ustring stylepath;
- python_get_string("THEME", &stylepath);
- otk::Configuration sconfig(false);
- sconfig.setFile(otk::expandTilde(stylepath.c_str()));
- if (!sconfig.load()) {
- sconfig.setFile(otk::expandTilde(DEFAULTSTYLE));
- if (!sconfig.load()) {
- printf(_("Unable to load default style: %s. Aborting.\n"), DEFAULTSTYLE);
- ::exit(1);
- }
- }
- _style.load(sconfig);
- */
- otk::display->renderControl(_number)->
- drawRoot(*otk::RenderStyle::style(_number)->rootColor());
-
// set up notification of netwm support
changeSupportedAtoms();
otk::Property::atoms.net_desktop_geometry,
otk::Property::atoms.cardinal, geometry, 2);
- // Set the net_desktop_names property
- std::vector<otk::ustring> names;
- python_get_stringlist("DESKTOP_NAMES", &names);
- otk::Property::set(_info->rootWindow(),
- otk::Property::atoms.net_desktop_names,
- otk::Property::utf8, names);
- // the above set() will cause the updateDesktopNames to fire right away so
- // we have a list of desktop names
-
_desktop = 0;
-
- if (!python_get_long("NUMBER_OF_DESKTOPS", (long*)&_num_desktops))
- _num_desktops = 1;
- changeNumDesktops(_num_desktops); // set the hint
+ changeNumDesktops(1); // set the hint
changeDesktop(0); // set the hint
+ // don't start in showing-desktop mode
+ _showing_desktop = false;
+ otk::Property::set(_info->rootWindow(),
+ otk::Property::atoms.net_showing_desktop,
+ otk::Property::atoms.cardinal, 0);
+
// create the window which gets focus when no clients get it
XSetWindowAttributes attr;
attr.override_redirect = true;
for (sit = _struts.begin(); sit != send; ++sit)
sit->left = sit->right = sit->top = sit->bottom = 0;
- ClientList::const_iterator it, end = clients.end();
+ std::list<Client*>::const_iterator it, end = clients.end();
for (it = clients.begin(); it != end; ++it) {
if ((*it)->iconic()) continue; // these dont count in the strut
*/
if (old_area != _area[i]) {
// the area has changed, adjust all the maximized windows
- ClientList::iterator it, end = clients.end();
+ std::list<Client*>::iterator it, end = clients.end();
for (it = clients.begin(); it != end; ++it)
if (i < _num_desktops) {
if ((*it)->desktop() == i)
windows = new Window[size];
win_it = windows;
- ClientList::const_iterator it = clients.begin();
- const ClientList::const_iterator end = clients.end();
+ std::list<Client*>::const_iterator it = clients.begin();
+ const std::list<Client*>::const_iterator end = clients.end();
for (; it != end; ++it, ++win_it)
*win_it = (*it)->window();
} else
windows = new Window[size];
win_it = windows;
- ClientList::const_reverse_iterator it = _stacking.rbegin();
- const ClientList::const_reverse_iterator end = _stacking.rend();
+ std::list<Client*>::const_reverse_iterator it = _stacking.rbegin();
+ const std::list<Client*>::const_reverse_iterator end = _stacking.rend();
for (; it != end; ++it, ++win_it)
*win_it = (*it)->window();
} else
client->_modal = false;
// unfocus the client (calls the focus callbacks)
- client->unfocus();
+ if (client->focused()) client->unfocus();
#ifdef DEBUG
printf("Unmanaged window 0x%lx frame 0x%lx\n", client->window(), framewin);
assert(!_stacking.empty()); // this would be bad
- ClientList::iterator it = --_stacking.end();
- const ClientList::iterator end = _stacking.begin();
+ std::list<Client*>::iterator it = --_stacking.end();
+ const std::list<Client*>::iterator end = _stacking.begin();
if (client->modal() && client->transientFor()) {
// don't let a modal window lower below its transient_for
assert(it != _stacking.end());
wins[0] = (it == _stacking.begin() ? _focuswindow :
- ((*(--ClientList::const_iterator(it)))->frame->window()));
+ ((*(--std::list<Client*>::const_iterator(it)))->
+ frame->window()));
wins[1] = client->frame->window();
if (wins[0] == wins[1]) return; // already right above the window
// remove the client before looking so we can't run into ourselves
_stacking.remove(client);
- ClientList::iterator it = _stacking.begin();
- const ClientList::iterator end = _stacking.end();
+ std::list<Client*>::iterator it = _stacking.begin();
+ const std::list<Client*>::iterator end = _stacking.end();
// the stacking list is from highest to lowest
for (; it != end && ((*it)->layer() > client->layer() || m == *it); ++it);
otherwise, we want to stack under the previous window in the stack.
*/
wins[0] = (it == _stacking.begin() ? _focuswindow :
- ((*(--ClientList::const_iterator(it)))->frame->window()));
+ ((*(--std::list<Client*>::const_iterator(it)))->frame->window()));
wins[1] = client->frame->window();
_stacking.insert(it, client);
if (old == _desktop) return;
- ClientList::iterator it, end = clients.end();
+ std::list<Client*>::iterator it, end = clients.end();
for (it = clients.begin(); it != end; ++it)
(*it)->showhide();
if (!(num > 0)) return;
// move windows on desktops that will no longer exist!
- ClientList::iterator it, end = clients.end();
+ std::list<Client*>::iterator it, end = clients.end();
for (it = clients.begin(); it != end; ++it) {
unsigned int d = (*it)->desktop();
if (d >= num && d != 0xffffffff) {
ce.xclient.window = (*it)->window();
ce.xclient.format = 32;
ce.xclient.data.l[0] = num - 1;
- XSendEvent(**otk::display, _info->rootWindow(), False,
+ XSendEvent(**otk::display, _info->rootWindow(), false,
SubstructureNotifyMask | SubstructureRedirectMask, &ce);
}
}
}
-void Screen::setDesktopName(unsigned int i, const otk::ustring &name)
+otk::ustring Screen::desktopName(unsigned int i) const
{
- if (i >= _num_desktops) return;
-
- otk::Property::StringVect newnames = _desktop_names;
- newnames[i] = name;
- otk::Property::set(_info->rootWindow(),
- otk::Property::atoms.net_desktop_names,
- otk::Property::utf8, newnames);
+ if (i >= _num_desktops) return "";
+ return _desktop_names[i];
}
-
const otk::Rect& Screen::area(unsigned int desktop) const {
assert(desktop < _num_desktops || desktop == 0xffffffff);
if (desktop < _num_desktops)
if (show) {
Client *c = openbox->focusedClient();
if (c) saved_focus = c->window();
- } else {
- Client *c = openbox->findClient(saved_focus);
- if (c) c->focus();
}
_showing_desktop = show;
- ClientList::iterator it, end = clients.end();
+
+ std::list<Client*>::iterator it, end = clients.end();
for (it = clients.begin(); it != end; ++it) {
if ((*it)->type() == Client::Type_Desktop) {
if (show)
} else
(*it)->showhide();
}
+
+ if (!show) {
+ Client *f = openbox->focusedClient();
+ if (!f || f->type() == Client::Type_Desktop) {
+ Client *c = openbox->findClient(saved_focus);
+ if (c) c->focus();
+ }
+ }
+
+ otk::Property::set(_info->rootWindow(),
+ otk::Property::atoms.net_showing_desktop,
+ otk::Property::atoms.cardinal,
+ show ? 1 : 0);
}
void Screen::propertyHandler(const XPropertyEvent &e)