#include "client.hh"
#include "openbox.hh"
#include "frame.hh"
+#include "bindings.hh"
+#include "python.hh"
#include "otk/display.hh"
+#include <vector>
+
static bool running;
static int anotherWMRunning(Display *display, XErrorEvent *) {
printf(_("Another window manager already running on display %s.\n"),
namespace ob {
-OBScreen::OBScreen(int screen, const otk::Configuration &config)
+OBScreen::OBScreen(int screen)
: _number(screen),
_root(screen)
{
// initialize the screen's style
_style.setImageControl(_image_control);
- _style.load(config);
+ std::string stylepath;
+ python_get_string("theme", &stylepath);
+ otk::Configuration sconfig(false);
+ sconfig.setFile(otk::expandTilde(stylepath));
+ 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);
-
// Set the netwm atoms for geomtery and viewport
unsigned long geometry[] = { _info->width(),
_info->height() };
}
-void OBScreen::loadStyle(const otk::Configuration &config)
-{
- _style.load(config);
-
- // XXX: make stuff redraw!
-}
-
-
void OBScreen::manageWindow(Window window)
{
OBClient *client = 0;
// add to the screen's list
clients.push_back(client);
+ // this puts into the stacking order, then raises it
+ _stacking.push_back(client);
+ raise(client);
// update the root properties
setClientList();
+
+ Openbox::instance->bindings()->grabButtons(true, client);
}
{
OBFrame *frame = client->frame;
+ Openbox::instance->bindings()->grabButtons(false, client);
+
// XXX: pass around focus if this window was focused
// remove from the wm's map
delete client->frame;
client->frame = 0;
- // remove from the screen's list
+ // remove from the screen's lists
+ _stacking.remove(client);
clients.remove(client);
delete client;
setClientList();
}
+void OBScreen::raise(OBClient *client)
+{
+ const int layer = client->layer();
+ std::vector<Window> wins;
+
+ _stacking.remove(client);
+
+ // the stacking list is from highest to lowest
+
+ ClientList::iterator it = _stacking.begin(), end = _stacking.end();
+ // insert the windows above this window
+ for (; it != end; ++it) {
+ if ((*it)->layer() <= layer)
+ break;
+ wins.push_back((*it)->frame->window());
+ }
+ // insert our client
+ wins.push_back(client->frame->window());
+ _stacking.insert(it, client);
+ // insert the remaining below this window
+ for (; it != end; ++it)
+ wins.push_back((*it)->frame->window());
+
+ XRestackWindows(otk::OBDisplay::display, &wins[0], wins.size());
+}
+
+void OBScreen::lower(OBClient *client)
+{
+ const int layer = client->layer();
+ std::vector<Window> wins;
+
+ _stacking.remove(client);
+
+ // the stacking list is from highest to lowest
+
+ ClientList::iterator it = _stacking.begin(), end = _stacking.end();
+ // insert the windows above this window
+ for (; it != end; ++it) {
+ if ((*it)->layer() < layer)
+ break;
+ wins.push_back((*it)->frame->window());
+ }
+ // insert our client
+ wins.push_back(client->frame->window());
+ _stacking.insert(it, client);
+ // insert the remaining below this window
+ for (; it != end; ++it)
+ wins.push_back((*it)->frame->window());
+
+ XRestackWindows(otk::OBDisplay::display, &wins[0], wins.size());
+}
+
}