1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
// -*- mode: C++; indent-tabs-mode: nil; -*-
#ifdef HAVE_CONFIG_H
# include "../config.h"
#endif
#include "actions.hh"
#include <stdio.h>
namespace ob {
const unsigned int OBActions::DOUBLECLICKDELAY = 300;
OBActions::OBActions()
: _button(0), _enter_win(0)
{
_presses[0] = new MousePressAction();
_presses[1] = new MousePressAction();
// XXX: load a configuration out of somewhere
}
OBActions::~OBActions()
{
}
void OBActions::insertPress(Window win, unsigned int button, Time time)
{
MousePressAction *a = _presses[1];
_presses[1] = _presses[0];
_presses[0] = a;
a->win = win;
a->button = button;
a->time = time;
}
void OBActions::buttonPressHandler(const XButtonEvent &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);
if (_button) return; // won't count toward CLICK events
_button = e.button;
insertPress(e.window, e.button, e.time);
}
void OBActions::buttonReleaseHandler(const XButtonEvent &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);
// not for the button we're watching?
if (_button && _button != e.button) return;
_button = 0;
// 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
printf("GUILE: CLICK: win %lx modifiers %u button %u time %lx\n",
(long)e.window, e.state, e.button, e.time);
if (_presses[0]->win == _presses[1]->win &&
_presses[0]->button == _presses[1]->button &&
e.time - _presses[1]->time < DOUBLECLICKDELAY) {
// 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);
}
}
void OBActions::enter(Window win, unsigned int modifiers)
{
_enter_win = win;
(void)modifiers;
// XXX: run the ENTER guile hook
printf("GUILE: ENTER: win %lx modifiers %u\n", (long)win, modifiers);
}
void OBActions::leave(unsigned int modifiers)
{
(void)modifiers;
// XXX: run the LEAVE guile hook
printf("GUILE: LEAVE: win %lx modifiers %u\n", (long)_enter_win, modifiers);
_enter_win = 0;
}
void OBActions::drag(Window win, otk::Point delta, unsigned int modifiers,
unsigned int button, Time time)
{
(void)win;(void)delta;(void)modifiers;(void)button;(void)time;
// XXX: some guile shit...
}
void OBActions::key(Window win, unsigned int modifiers, unsigned int keycode)
{
(void)win;(void)modifiers;(void)keycode;
// XXX: some guile shit...
}
}
|