can tell where events are coming from!
@@ -34,8 +34,6 @@ {
_map.erase(id); } -//#include <stdio.h> -#include <stdio.h> void OtkEventDispatcher::dispatchEvents(void) { XEvent e;@@ -45,7 +43,7 @@
while (XPending(OBDisplay::display)) { XNextEvent(OBDisplay::display, &e); -#if defined(DEBUG) && 0 +#if 0 printf("Event %d window %lx\n", e.type, e.xany.window); #endif@@ -89,6 +87,14 @@
if (_master) _master->handle(e); } +} + +OtkEventHandler *OtkEventDispatcher::findHandler(Window win) +{ + OtkEventMap::iterator it = _map.find(win); + if (it != _map.end()) + return it->second; + return 0; } }
@@ -29,6 +29,8 @@ //! any specific handlers have received them
inline void setMasterHandler(OtkEventHandler *master) { _master = master; } OtkEventHandler *getMasterHandler(void) const { return _master; } + + OtkEventHandler *findHandler(Window win); private: OtkEventMap _map;
@@ -5,6 +5,8 @@ # include "../config.h"
#endif #include "actions.hh" +#include "widget.hh" +#include "openbox.hh" #include "otk/display.hh" #include <stdio.h>@@ -63,8 +65,11 @@ OtkEventHandler::buttonPressHandler(e);
insertPress(e); // XXX: run the PRESS guile hook - printf("GUILE: PRESS: win %lx modifiers %u button %u time %lx\n", - (long)e.window, e.state, e.button, e.time); + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + + printf("GUILE: PRESS: win %lx type %d modifiers %u button %u time %lx\n", + (long)e.window, (w ? w->type():-1), e.state, e.button, e.time); if (_button) return; // won't count toward CLICK events@@ -78,8 +83,11 @@ OtkEventHandler::buttonReleaseHandler(e);
removePress(e); // XXX: run the RELEASE guile hook - printf("GUILE: RELEASE: win %lx modifiers %u button %u time %lx\n", - (long)e.window, e.state, e.button, e.time); + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + + printf("GUILE: RELEASE: win %lx type %d, modifiers %u button %u time %lx\n", + (long)e.window, (w ? w->type():-1), e.state, e.button, e.time); // not for the button we're watching? if (_button != e.button) return;@@ -96,15 +104,15 @@ e.x < attr.width && e.y < attr.height))
return; // XXX: run the CLICK guile hook - printf("GUILE: CLICK: win %lx modifiers %u button %u time %lx\n", - (long)e.window, e.state, e.button, e.time); + printf("GUILE: CLICK: win %lx type %d modifiers %u button %u time %lx\n", + (long)e.window, (w ? w->type():-1), e.state, e.button, e.time); if (e.time - _release.time < DOUBLECLICKDELAY && _release.win == e.window && _release.button == e.button) { // XXX: run the DOUBLECLICK guile hook - printf("GUILE: DOUBLECLICK: win %lx modifiers %u button %u time %lx\n", - (long)e.window, e.state, e.button, e.time); + printf("GUILE: DOUBLECLICK: win %lx type %d modifiers %u button %u time %lx\n", + (long)e.window, (w ? w->type():-1), e.state, e.button, e.time); // reset so you cant triple click for 2 doubleclicks _release.win = 0;@@ -124,7 +132,11 @@ {
OtkEventHandler::enterHandler(e); // XXX: run the ENTER guile hook - printf("GUILE: ENTER: win %lx modifiers %u\n", (long)e.window, e.state); + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + + printf("GUILE: ENTER: win %lx type %d modifiers %u\n", + (long)e.window, (w ? w->type():-1), e.state); }@@ -133,15 +145,22 @@ {
OtkEventHandler::leaveHandler(e); // XXX: run the LEAVE guile hook - printf("GUILE: LEAVE: win %lx modifiers %u\n", (long)e.window, e.state); + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + + printf("GUILE: LEAVE: win %lx type %d modifiers %u\n", + (long)e.window, (w ? w->type():-1), e.state); } void OBActions::keyPressHandler(const XKeyEvent &e) { // XXX: run the KEY guile hook - printf("GUILE: KEY: win %lx modifiers %u keycode %u\n", - (long)e.window, e.state, e.keycode); + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + + printf("GUILE: KEY: win %lx type %d modifiers %u keycode %u\n", + (long)e.window, (w ? w->type():-1), e.state, e.keycode); }@@ -149,12 +168,15 @@ void OBActions::motionHandler(const XMotionEvent &e)
{ if (!e.same_screen) return; // this just gets stupid + OBWidget *w = dynamic_cast<OBWidget*> + (Openbox::instance->findHandler(e.window)); + _dx = e.x - _posqueue[0]->pos.x(); _dy = e.y - _posqueue[0]->pos.y(); // XXX: i can envision all sorts of crazy shit with this.. gestures, etc - printf("GUILE: MOTION: win %lx modifiers %u x %d y %d\n", - (long)e.window, e.state, _dx, _dy); + printf("GUILE: MOTION: win %lx type %d modifiers %u x %d y %d\n", + (long)e.window, (w ? w->type():-1), e.state, _dx, _dy); }
@@ -26,6 +26,7 @@ namespace ob {
OBClient::OBClient(int screen, Window window) : otk::OtkEventHandler(), + OBWidget(OBWidget::Type_Client), frame(0), _screen(screen), _window(window) { assert(screen >= 0);
@@ -21,6 +21,7 @@ #include "otk/point.hh"
#include "otk/strut.hh" #include "otk/rect.hh" #include "otk/eventhandler.hh" +#include "widget.hh" namespace ob {@@ -38,7 +39,7 @@ client, it will call the ActionHandler (for client messages) or update the
class' member variables and call whatever is nessary to complete the change (such as causing a redraw of the titlebar after the title is changed). */ -class OBClient : public otk::OtkEventHandler { +class OBClient : public otk::OtkEventHandler, public OBWidget { public: //! The frame window which decorates around the client window
@@ -23,6 +23,7 @@ const long OBFrame::event_mask;
OBFrame::OBFrame(OBClient *client, otk::Style *style) : otk::OtkWidget(Openbox::instance, style), + OBWidget(Type_Frame), _client(client), _screen(otk::OBDisplay::screenInfo(client->screen())), _plate(this, OBWidget::Type_Plate),
@@ -29,11 +29,13 @@ The frame is responsible for calling XSelectInput on the client window's new
parent with the SubstructureRedirectMask so that structure events for the client are sent to the window manager. */ -class OBFrame : public otk::OtkWidget { +class OBFrame : public otk::OtkWidget, public OBWidget { public: //! The event mask to grab on frame windows - static const long event_mask = EnterWindowMask | LeaveWindowMask; + static const long event_mask = EnterWindowMask | LeaveWindowMask | + ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask; private: OBClient *_client;
@@ -7,6 +7,7 @@
class OBWidget { public: enum WidgetType { + Type_Frame, Type_Titlebar, Type_Handle, Type_Plate,@@ -16,7 +17,8 @@ Type_CloseButton,
Type_IconifyButton, Type_StickyButton, Type_LeftGrip, - Type_RightGrip + Type_RightGrip, + Type_Client }; private: