can tell where events are coming from!

This commit is contained in:
Dana Jansens 2002-12-18 11:34:29 +00:00
parent db23fe0584
commit 77a8e11660
8 changed files with 58 additions and 21 deletions

View file

@ -34,8 +34,6 @@ void OtkEventDispatcher::clearHandler(Window id)
_map.erase(id);
}
//#include <stdio.h>
#include <stdio.h>
void OtkEventDispatcher::dispatchEvents(void)
{
XEvent e;
@ -45,7 +43,7 @@ void OtkEventDispatcher::dispatchEvents(void)
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
@ -91,4 +89,12 @@ void OtkEventDispatcher::dispatchEvents(void)
}
}
OtkEventHandler *OtkEventDispatcher::findHandler(Window win)
{
OtkEventMap::iterator it = _map.find(win);
if (it != _map.end())
return it->second;
return 0;
}
}

View file

@ -29,6 +29,8 @@ public:
inline void setMasterHandler(OtkEventHandler *master)
{ _master = master; }
OtkEventHandler *getMasterHandler(void) const { return _master; }
OtkEventHandler *findHandler(Window win);
private:
OtkEventMap _map;

View file

@ -5,6 +5,8 @@
#endif
#include "actions.hh"
#include "widget.hh"
#include "openbox.hh"
#include "otk/display.hh"
#include <stdio.h>
@ -63,8 +65,11 @@ void OBActions::buttonPressHandler(const XButtonEvent &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 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &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 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
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 @@ void OBActions::enterHandler(const XCrossingEvent &e)
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 @@ void OBActions::leaveHandler(const XCrossingEvent &e)
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);
}

View file

@ -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);

View file

@ -21,6 +21,7 @@ extern "C" {
#include "otk/strut.hh"
#include "otk/rect.hh"
#include "otk/eventhandler.hh"
#include "widget.hh"
namespace ob {
@ -38,7 +39,7 @@ class OBFrame;
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

View file

@ -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),

View file

@ -29,11 +29,13 @@ namespace ob {
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;

View file

@ -7,6 +7,7 @@ namespace ob {
class OBWidget {
public:
enum WidgetType {
Type_Frame,
Type_Titlebar,
Type_Handle,
Type_Plate,
@ -16,7 +17,8 @@ public:
Type_IconifyButton,
Type_StickyButton,
Type_LeftGrip,
Type_RightGrip
Type_RightGrip,
Type_Client
};
private: