#include <string>
#include <vector>
+#include <map>
#include "otk/screeninfo.hh"
#include "otk/timerqueuemanager.hh"
#include "otk/property.hh"
#include "xeventhandler.hh"
+#include "client.hh"
namespace ob {
State_Normal, //!< The window manager is running in its normal state
State_Exiting //!< The window manager is exiting (being destroyed)
};
+
+ //! A map for looking up a specific client class from the window id
+ typedef std::map<Window, OBClient *> ClientMap;
private:
// stuff that can be passed on the command line
//! The value of argv[0], i.e. how this application was executed
char *_argv0;
+ //! A list of all managed clients
+ ClientMap _clients;
+
//! Manages all timers for the application
/*!
Use of the otk::OBTimerQueueManager::fire funtion in this object ensures
*/
void eventLoop();
+ //! Adds an OBClient to the client list for lookups
+ void addClient(Window window, OBClient *client);
+
+ //! Removes an OBClient from the client list for lookups
+ void removeClient(Window window);
+
+ //! Finds an OBClient based on its window id
+ OBClient *findClient(Window window);
+
//! Requests that the window manager exit
/*!
Causes the Openbox::eventLoop function to stop looping, so that the window
// xatom->setSupported(this); // set-up netwm support
#ifdef HAVE_GETPID
- xatom->setValue(getRootWindow(), otk::OBProperty::blackbox_pid, otk::OBProperty::cardinal,
+ xatom->setValue(getRootWindow(), otk::OBProperty::blackbox_pid,
+ otk::OBProperty::Atom_Cardinal,
(unsigned long) getpid());
#endif // HAVE_GETPID
unsigned long geometry[] = { getWidth(),
}
-void BScreen::addStrut(Strut *strut) {
+void BScreen::addStrut(otk::Strut *strut) {
strutList.push_back(strut);
}
-void BScreen::removeStrut(Strut *strut) {
+void BScreen::removeStrut(otk::Strut *strut) {
strutList.remove(strut);
}
StrutList::const_iterator it = strutList.begin(), end = strutList.end();
for(; it != end; ++it) {
- Strut *strut = *it;
+ otk::Strut *strut = *it;
if (strut->left > current_left)
current_left = strut->left;
if (strut->top > current_top)
// -*- mode: C++; indent-tabs-mode: nil; -*-
#include "xeventhandler.hh"
+#include "client.hh"
+#include "openbox.hh"
#include "otk/display.hh"
#include "otk/rect.hh"
void OBXEventHandler::enterNotify(const XCrossingEvent &e)
{
_lasttime = e.time;
+
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
/*
BScreen *screen = (BScreen *) 0;
BlackboxWindow *win = (BlackboxWindow *) 0;
void OBXEventHandler::leaveNotify(const XCrossingEvent &e)
{
_lasttime = e.time;
+
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
/*
BlackboxWindow *win = (BlackboxWindow *) 0;
void OBXEventHandler::configureRequest(const XConfigureRequestEvent &e)
{
- (void)e;
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
/* BlackboxWindow *win = (BlackboxWindow *) 0;
if ((win = searchWindow(e->xconfigurerequest.window))) {
#ifdef DEBUG
printf("MapRequest for 0x%lx\n", e.window);
#endif // DEBUG
+
+ OBClient *client = Openbox::instance->findClient(e.window);
+
+ if (client) {
+ // XXX: uniconify and/or unshade the window
+ } else {
+ // XXX: manage the window, i.e. grab events n shit
+ Openbox::instance->addClient(e.window, new OBClient(e.window));
+ }
+
/*
BlackboxWindow *win = searchWindow(e->xmaprequest.window);
void OBXEventHandler::unmapNotify(const XUnmapEvent &e)
{
- (void)e;
-/*
- BlackboxWindow *win = (BlackboxWindow *) 0;
- BScreen *screen = (BScreen *) 0;
-
- if ((win = searchWindow(e->xunmap.window))) {
- win->unmapNotifyEvent(&e->xunmap);
- } else if ((screen = searchSystrayWindow(e->xunmap.window))) {
- screen->removeSystrayWindow(e->xunmap.window);
- }
-*/
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
+ // XXX: unmanage the window, i.e. ungrab events n reparent n shit
+ Openbox::instance->removeClient(e.window);
}
void OBXEventHandler::destroyNotify(const XDestroyWindowEvent &e)
{
- (void)e;
-/*
- BlackboxWindow *win = (BlackboxWindow *) 0;
- BScreen *screen = (BScreen *) 0;
- BWindowGroup *group = (BWindowGroup *) 0;
-
- if ((win = searchWindow(e->xdestroywindow.window))) {
- win->destroyNotifyEvent(&e->xdestroywindow);
- } else if ((group = searchGroup(e->xdestroywindow.window))) {
- delete group;
- } else if ((screen = searchSystrayWindow(e->xunmap.window))) {
- screen->removeSystrayWindow(e->xunmap.window);
- }
-*/
+ // XXX: window group leaders can come through here too!
+
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
+ // XXX: unmanage the window, i.e. ungrab events n reparent n shit
+ Openbox::instance->removeClient(e.window);
}
void OBXEventHandler::reparentNotify(const XReparentEvent &e)
{
- (void)e;
/*
this event is quite rare and is usually handled in unmapNotify
however, if the window is unmapped when the reparent event occurs
the window manager never sees it because an unmap event is not sent
to an already unmapped window.
*/
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
/*
BlackboxWindow *win = searchWindow(e->xreparent.window);
if (win)
void OBXEventHandler::propertyNotify(const XPropertyEvent &e)
{
_lasttime = e.time;
-/*
- BlackboxWindow *win = (BlackboxWindow *) 0;
- BScreen *screen = (BScreen *) 0;
- if ((win = searchWindow(e->xproperty.window)))
- win->propertyNotifyEvent(&e->xproperty);
- else if ((screen = searchScreen(e->xproperty.window)))
- screen->propertyNotifyEvent(&e->xproperty);
-*/
+ OBClient *client = Openbox::instance->findClient(e.window);
+ if (!client) return;
+
+ client->update(e);
}
void OBXEventHandler::expose(const XExposeEvent &first)
{
- // compress expose events
- XEvent e; e.xexpose = first;
- unsigned int i = 0;
- otk::Rect area(e.xexpose.x, e.xexpose.y, e.xexpose.width,
- e.xexpose.height);
- while (XCheckTypedWindowEvent(otk::OBDisplay::display,
- e.xexpose.window, Expose, &e)) {
- i++;
- // merge expose area
- area |= otk::Rect(e.xexpose.x, e.xexpose.y, e.xexpose.width,
- e.xexpose.height);
- }
- if ( i > 0 ) {
- // use the merged area
- e.xexpose.x = area.x();
- e.xexpose.y = area.y();
- e.xexpose.width = area.width();
- e.xexpose.height = area.height();
- }
-/*
- BlackboxWindow *win = (BlackboxWindow *) 0;
+ OBClient *client = Openbox::instance->findClient(first.window);
+ if (!client) return;
+
+ // compress expose events
+ XEvent e; e.xexpose = first;
+ unsigned int i = 0;
+ otk::Rect area(e.xexpose.x, e.xexpose.y, e.xexpose.width,
+ e.xexpose.height);
+ while (XCheckTypedWindowEvent(otk::OBDisplay::display,
+ e.xexpose.window, Expose, &e)) {
+ i++;
+ // merge expose area
+ area |= otk::Rect(e.xexpose.x, e.xexpose.y, e.xexpose.width,
+ e.xexpose.height);
+ }
+ if ( i > 0 ) {
+ // use the merged area
+ e.xexpose.x = area.x();
+ e.xexpose.y = area.y();
+ e.xexpose.width = area.width();
+ e.xexpose.height = area.height();
+ }
- if ((win = searchWindow(e->xexpose.window)))
- win->exposeEvent(&e->xexpose);
-*/
+ // XXX: make the decorations redraw!
}