button press/releases WORK

This commit is contained in:
Dana Jansens 2002-12-04 07:55:52 +00:00
parent 925262bee2
commit 56d7b547ae
5 changed files with 46 additions and 48 deletions

View file

@ -11,7 +11,7 @@
namespace otk { namespace otk {
OtkEventDispatcher::OtkEventDispatcher() OtkEventDispatcher::OtkEventDispatcher()
: _fallback(0) : _fallback(0), _master(0)
{ {
} }
@ -57,6 +57,9 @@ void OtkEventDispatcher::dispatchEvents(void)
if (handler) if (handler)
handler->handle(e); handler->handle(e);
if (_master)
_master->handle(e);
} }
} }

View file

@ -24,9 +24,16 @@ public:
{ _fallback = fallback; } { _fallback = fallback; }
OtkEventHandler *getFallbackHandler(void) const { return _fallback; } OtkEventHandler *getFallbackHandler(void) const { return _fallback; }
//! Sets an event handler that gets all events for all handlers after
//! any specific handlers have received them
inline void setMasterHandler(OtkEventHandler *master)
{ _master = master; }
OtkEventHandler *getMasterHandler(void) const { return _master; }
private: private:
OtkEventMap _map; OtkEventMap _map;
OtkEventHandler *_fallback; OtkEventHandler *_fallback;
OtkEventHandler *_master;
//! The time at which the last XEvent with a time was received //! The time at which the last XEvent with a time was received
Time _lasttime; // XXX: store this! also provide an accessor! Time _lasttime; // XXX: store this! also provide an accessor!

View file

@ -10,14 +10,13 @@
namespace ob { namespace ob {
const unsigned int OBActions::DOUBLECLICKDELAY; const unsigned int OBActions::DOUBLECLICKDELAY = 300;
OBActions::OBActions() OBActions::OBActions()
: _button(0), _enter_win(0) : _button(0), _enter_win(0)
{ {
_presses[0] = new MousePressAction(); _presses[0] = new MousePressAction();
_presses[1] = new MousePressAction(); _presses[1] = new MousePressAction();
_presses[2] = new MousePressAction();
// XXX: load a configuration out of somewhere // XXX: load a configuration out of somewhere
@ -40,49 +39,51 @@ void OBActions::insertPress(Window win, unsigned int button, Time time)
} }
void OBActions::bpress(Window win, unsigned int modifiers, unsigned int button, void OBActions::buttonPressHandler(const XButtonEvent &e)
Time time)
{ {
(void)modifiers;
// XXX: run the PRESS guile hook // XXX: run the PRESS guile hook
printf("GUILE: PRESS: win %lx modifiers %ux button %ud time %lx", printf("GUILE: PRESS: win %lx modifiers %u button %u time %lx\n",
(long)win, modifiers, button, time); (long)e.window, e.state, e.button, e.time);
if (_button) return; // won't count toward CLICK events if (_button) return; // won't count toward CLICK events
_button = button; _button = e.button;
insertPress(win, button, time); insertPress(e.window, e.button, e.time);
} }
void OBActions::brelease(Window win, const otk::Rect &area, void OBActions::buttonReleaseHandler(const XButtonEvent &e)
const otk::Point &mpos,
unsigned int modifiers, unsigned int button,
Time time)
{ {
(void)modifiers;
// XXX: run the RELEASE guile hook // XXX: run the RELEASE guile hook
printf("GUILE: RELEASE: win %lx modifiers %ux button %ud time %lx", printf("GUILE: RELEASE: win %lx modifiers %u button %u time %lx\n",
(long)win, modifiers, button, time); (long)e.window, e.state, e.button, e.time);
if (_button && _button != button) return; // not for the button we're watchin // not for the button we're watching?
if (_button && _button != e.button) return;
_button = 0; _button = 0;
if (!area.contains(mpos)) return; // not on the window any more // find the area of the window
XWindowAttributes attr;
if (!XGetWindowAttributes(otk::OBDisplay::display, e.window, &attr)) return;
// if not on the window any more, it isnt a CLICK
if (!(e.same_screen && e.x >= 0 && e.y >= 0 &&
e.x < attr.width && e.y < attr.height))
return;
// XXX: run the CLICK guile hook // XXX: run the CLICK guile hook
printf("GUILE: CLICK: win %lx modifiers %ux button %ud time %lx", printf("GUILE: CLICK: win %lx modifiers %u button %u time %lx\n",
(long)win, modifiers, button, time); (long)e.window, e.state, e.button, e.time);
if (_presses[0]->win == _presses[1]->win && if (_presses[0]->win == _presses[1]->win &&
_presses[0]->button == _presses[1]->button && _presses[0]->button == _presses[1]->button &&
time - _presses[1]->time < DOUBLECLICKDELAY) { e.time - _presses[1]->time < DOUBLECLICKDELAY) {
// XXX: run the DOUBLECLICK guile hook // XXX: run the DOUBLECLICK guile hook
printf("GUILE: DOUBLECLICK: win %lx modifiers %ux button %ud time %lx", printf("GUILE: DOUBLECLICK: win %lx modifiers %u button %u time %lx\n",
(long)win, modifiers, button, time); (long)e.window, e.state, e.button, e.time);
} }
} }
@ -94,7 +95,7 @@ void OBActions::enter(Window win, unsigned int modifiers)
(void)modifiers; (void)modifiers;
// XXX: run the ENTER guile hook // XXX: run the ENTER guile hook
printf("GUILE: ENTER: win %lx modifiers %ux", (long)win, modifiers); printf("GUILE: ENTER: win %lx modifiers %u\n", (long)win, modifiers);
} }
@ -103,7 +104,7 @@ void OBActions::leave(unsigned int modifiers)
{ {
(void)modifiers; (void)modifiers;
// XXX: run the LEAVE guile hook // XXX: run the LEAVE guile hook
printf("GUILE: LEAVE: win %lx modifiers %ux", (long)_enter_win, modifiers); printf("GUILE: LEAVE: win %lx modifiers %u\n", (long)_enter_win, modifiers);
_enter_win = 0; _enter_win = 0;
} }

View file

@ -9,6 +9,7 @@
#include "otk/display.hh" #include "otk/display.hh"
#include "otk/point.hh" #include "otk/point.hh"
#include "otk/rect.hh" #include "otk/rect.hh"
#include "otk/eventhandler.hh"
namespace ob { namespace ob {
@ -17,7 +18,7 @@ namespace ob {
When these actions are fired, hooks to the guile engine are fired so that When these actions are fired, hooks to the guile engine are fired so that
guile code is run. guile code is run.
*/ */
class OBActions { class OBActions : public otk::OtkEventHandler {
public: public:
struct MousePressAction { struct MousePressAction {
Window win; Window win;
@ -28,7 +29,7 @@ public:
private: private:
// milliseconds XXX: config option // milliseconds XXX: config option
static const unsigned int DOUBLECLICKDELAY = 200; static const unsigned int DOUBLECLICKDELAY;
//! The last 2 button presses processed for CLICKs //! The last 2 button presses processed for CLICKs
/*! /*!
@ -46,27 +47,11 @@ public:
OBActions(); OBActions();
virtual ~OBActions(); virtual ~OBActions();
//! Notify that a mouse button press has occured on a window. virtual void buttonPressHandler(const XButtonEvent &e);
/*! virtual void buttonReleaseHandler(const XButtonEvent &e);
@param win The window on which the action was performed.
@param modifiers The modifier state for the action.
@param button The mouse button the action is for.
@param time The time at which the event occured (from the XEvent).
*/
void bpress(Window win, unsigned int modifiers, unsigned int button,
Time time);
//! Notify that a mouse button release has occured on a window.
/*!
@param win The window on which the action was performed.
@param area The area of the window on which the action was performed.
@param mpos The position of the mouse pointer relative to the root window.
@param modifiers The modifier state for the action.
@param button The mouse button the action is for.
@param time The time at which the event occured (from the XEvent).
*/
void brelease(Window win, const otk::Rect &area, const otk::Point &mpos,
unsigned int modifiers, unsigned int button, Time time);
//! Notify that a mouse enter action has occured on a window. //! Notify that a mouse enter action has occured on a window.
/*! /*!

View file

@ -126,6 +126,8 @@ Openbox::Openbox(int argc, char **argv)
Openbox::actions = new OBActions(); Openbox::actions = new OBActions();
setMasterHandler(Openbox::actions); // set as the master event handler
// create the mouse cursors we'll use // create the mouse cursors we'll use
_cursors.session = XCreateFontCursor(otk::OBDisplay::display, XC_left_ptr); _cursors.session = XCreateFontCursor(otk::OBDisplay::display, XC_left_ptr);
_cursors.move = XCreateFontCursor(otk::OBDisplay::display, XC_fleur); _cursors.move = XCreateFontCursor(otk::OBDisplay::display, XC_fleur);