History

devmouse: provide absmousetrack() for os specific code instead of exposing te mouse info state

cinap_lenrek committed 9 years ago

Commit 09820aa1 parent ae6b4b45 files · +75 −136Browse files

Unified · Split

5 files
  1. gui-osx/screen.c +2 −25
  2. gui-win32/screen.c +1 −25
  3. gui-x11/x11.c +1 −21
  4. kern/devmouse.c +55 −48
  5. kern/screen.h +16 −17
gui-osx/screen.c+2−25
@@ -31,7 +31,6 @@ · 30 unmodified lines
3131 #define topLeft(r) (((Point *) &(r))[0])
3232 #define botRight(r) (((Point *) &(r))[1])
3333
34−extern int mousequeue;
3534 static int depth;
3635 Boolean gDone;
3736 RgnHandle gCursorRegionHdl;
@@ -269,32 +268,10 @@ static inline int convert_key(UInt32 key, UInt32 charcode) · 231 unmodified lines
269268 }
270269 }
271270
272−void
271+static void
273272 sendbuttons(int b, int x, int y)
274273 {
275− int i;
276− lock(&mouse.lk);
277− i = mouse.wi;
278− if(mousequeue) {
279− if(i == mouse.ri || mouse.lastb != b || mouse.trans) {
280− mouse.wi = (i+1)%Mousequeue;
281− if(mouse.wi == mouse.ri)
282− mouse.ri = (mouse.ri+1)%Mousequeue;
283− mouse.trans = mouse.lastb != b;
284− } else {
285− i = (i-1+Mousequeue)%Mousequeue;
286− }
287− } else {
288− mouse.wi = (i+1)%Mousequeue;
289− mouse.ri = i;
290− }
291− mouse.queue[i].xy.x = x;
292− mouse.queue[i].xy.y = y;
293− mouse.queue[i].buttons = b;
294− mouse.queue[i].msec = ticks();
295− mouse.lastb = b;
296− unlock(&mouse.lk);
297− wakeup(&mouse.r);
274+ absmousetrack(x, y, b, ticks());
298275 }
299276
300277 static Ptr fullScreenRestore;
gui-win32/screen.c+1−25
@@ -19,7 +19,6 @@ · 18 unmodified lines
1919 Memimage *gscreen;
2020 Screeninfo screen;
2121
22−extern int mousequeue;
2322 static int depth;
2423
2524 static HINSTANCE inst;
@@ -210,8 +209,6 @@ winproc(void *a) · 184 unmodified lines
210209 readybit = 1;
211210 wakeup(&rend);
212211
213− screen.reshaped = 0;
214−
215212 while(GetMessage(&msg, NULL, 0, 0)) {
216213 TranslateMessage(&msg);
217214 DispatchMessage(&msg);
@@ -387,28 +384,7 @@ WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) · 169 unmodified lines
387384 else
388385 b |= 4;
389386 }
390− lock(&mouse.lk);
391− i = mouse.wi;
392− if(mousequeue) {
393− if(i == mouse.ri || mouse.lastb != b || mouse.trans) {
394− mouse.wi = (i+1)%Mousequeue;
395− if(mouse.wi == mouse.ri)
396− mouse.ri = (mouse.ri+1)%Mousequeue;
397− mouse.trans = mouse.lastb != b;
398− } else {
399− i = (i-1+Mousequeue)%Mousequeue;
400− }
401− } else {
402− mouse.wi = (i+1)%Mousequeue;
403− mouse.ri = i;
404− }
405− mouse.queue[i].xy.x = x;
406− mouse.queue[i].xy.y = y;
407− mouse.queue[i].buttons = b;
408− mouse.queue[i].msec = ticks();
409− mouse.lastb = b;
410− unlock(&mouse.lk);
411− wakeup(&mouse.r);
387+ absmousetrack(x, y, b, ticks());
412388 break;
413389
414390 case WM_CHAR:
gui-x11/x11.c+1−21
@@ -112,8 +112,6 @@ static XColor map7[128]; /* Plan 9 colormap array */ · 111 unmodified lines
112112 static uchar map7to8[128][2];
113113 static Colormap xcmap; /* Default shared colormap */
114114
115−extern int mousequeue;
116−
117115 /* for copy/paste, lifted from plan9ports */
118116 static Atom clipboard;
119117 static Atom utf8string;
@@ -969,25 +967,7 @@ xmouse(XEvent *e) · 849 unmodified lines
969967 if(s & Button5Mask)
970968 ms.buttons |= 16;
971969
972− lock(&mouse.lk);
973− i = mouse.wi;
974− if(mousequeue) {
975− if(i == mouse.ri || mouse.lastb != ms.buttons || mouse.trans) {
976− mouse.wi = (i+1)%Mousequeue;
977− if(mouse.wi == mouse.ri)
978− mouse.ri = (mouse.ri+1)%Mousequeue;
979− mouse.trans = mouse.lastb != ms.buttons;
980− } else {
981− i = (i-1+Mousequeue)%Mousequeue;
982− }
983− } else {
984− mouse.wi = (i+1)%Mousequeue;
985− mouse.ri = i;
986− }
987− mouse.queue[i] = ms;
988− mouse.lastb = ms.buttons;
989− unlock(&mouse.lk);
990− wakeup(&mouse.r);
970+ absmousetrack(ms.x, ms.y, ms.buttons, ms.msec);
991971 }
992972
993973 void
kern/devmouse.c+55−48
@@ -8,8 +8,6 @@ · 7 unmodified lines
88 #include "memdraw.h"
99 #include "screen.h"
1010
11−int mousequeue = 1;
12−
1311 Mouseinfo mouse;
1412 Cursorinfo cursor;
1513 Cursorinfo arrow = {
@@ -96,13 +94,9 @@ mouseopen(Chan *c, int omode) · 80 unmodified lines
9694 error(Eperm);
9795 break;
9896 case Qmouse:
99− lock(&mouse.lk);
100− if(mouse.open){
101− unlock(&mouse.lk);
97+ if(tas(&mouse.open) != 0)
10298 error(Einuse);
103− }
104− mouse.open = 1;
105− unlock(&mouse.lk);
99+ mouse.lastcounter = mouse.state.counter;
106100 break;
107101 }
108102 c->mode = openmode(omode);
@@ -119,9 +113,7 @@ mouseclose(Chan *c) · 10 unmodified lines
119113
120114 switch((long)c->qid.path) {
121115 case Qmouse:
122− lock(&mouse.lk);
123116 mouse.open = 0;
124− unlock(&mouse.lk);
125117 cursor = arrow;
126118 setcursor();
127119 }
@@ -131,9 +123,9 @@ long · 3 unmodified lines
131123 mouseread(Chan *c, void *va, long n, vlong offset)
132124 {
133125 char buf[4*12+1];
126+ Mousestate m;
134127 uchar *p;
135− int i, nn, b;
136− ulong msec;
128+ int b;
137129
138130 p = va;
139131 switch((long)c->qid.path){
@@ -158,46 +150,27 @@ mouseread(Chan *c, void *va, long n, vlong offset) · 18 unmodified lines
158150 while(mousechanged(0) == 0)
159151 sleep(&mouse.r, mousechanged, 0);
160152
161− lock(&screen.lk);
162− if(screen.reshaped) {
163− screen.reshaped = 0;
164− sprint(buf, "t%11d %11d", 0, ticks());
165− if(n > 1+2*12)
166− n = 1+2*12;
167− memmove(va, buf, n);
168− unlock(&screen.lk);
169− return n;
170− }
171− unlock(&screen.lk);
172−
173153 lock(&mouse.lk);
174− i = mouse.ri;
175− nn = (mouse.wi + Mousequeue - i) % Mousequeue;
176− if(nn < 1)
177− panic("empty mouse queue");
178− msec = ticks();
179− while(nn > 1) {
180− if(mouse.queue[i].msec + Mousewindow > msec)
181− break;
182− i = (i+1)%Mousequeue;
183− nn--;
184− }
185− b = buttonmap[mouse.queue[i].buttons&7];
154+ if(mouse.ri != mouse.wi)
155+ m = mouse.queue[mouse.ri++ % nelem(mouse.queue)];
156+ else
157+ m = mouse.state;
158+ unlock(&mouse.lk);
159+
160+ b = buttonmap[m.buttons&7];
186161 /* put buttons 4 and 5 back in */
187− b |= mouse.queue[i].buttons & (3<<3);
188− if(scrollswap){
189− if(b == 8)
162+ b |= m.buttons & (3<<3);
163+ if (scrollswap) {
164+ if (b == 8)
190165 b = 16;
191− else if(b == 16)
166+ else if (b == 16)
192167 b = 8;
193168 }
194− sprint(buf, "m%11d %11d %11d %11d",
195− mouse.queue[i].xy.x,
196− mouse.queue[i].xy.y,
197− b,
198− mouse.queue[i].msec);
199− mouse.ri = (i+1)%Mousequeue;
200− unlock(&mouse.lk);
169+ sprint(buf, "m%11d %11d %11d %11lud ",
170+ m.xy.x, m.xy.y, b, m.msec);
171+
172+ mouse.lastcounter = m.counter;
173+
201174 if(n > 1+4*12)
202175 n = 1+4*12;
203176 memmove(va, buf, n);
@@ -335,8 +308,42 @@ int · 131 unmodified lines
335308 mousechanged(void *a)
336309 {
337310 USED(a);
311+ return mouse.lastcounter != mouse.state.counter;
312+}
313+
314+void
315+absmousetrack(int x, int y, int b, int msec)
316+{
317+ int lastb;
318+
319+ if(gscreen==nil)
320+ return;
338321
339− return mouse.ri != mouse.wi || screen.reshaped;
322+ if(x < gscreen->clipr.min.x)
323+ x = gscreen->clipr.min.x;
324+ if(x >= gscreen->clipr.max.x)
325+ x = gscreen->clipr.max.x-1;
326+ if(y < gscreen->clipr.min.y)
327+ y = gscreen->clipr.min.y;
328+ if(y >= gscreen->clipr.max.y)
329+ y = gscreen->clipr.max.y-1;
330+
331+ lock(&mouse.lk);
332+ mouse.state.xy = Pt(x, y);
333+ lastb = mouse.state.buttons;
334+ mouse.state.buttons = b;
335+ mouse.state.msec = msec;
336+ mouse.state.counter++;
337+
338+ /*
339+ * if the queue fills, don't queue any more events until a
340+ * reader polls the mouse.
341+ */
342+ if(b != lastb && (mouse.wi-mouse.ri) < nelem(mouse.queue))
343+ mouse.queue[mouse.wi++ % nelem(mouse.queue)] = mouse.state;
344+ unlock(&mouse.lk);
345+
346+ wakeup(&mouse.r);
340347 }
341348
342349 Dev mousedevtab = {
kern/screen.h+16−17
@@ -3,23 +3,22 @@ typedef struct Mousestate Mousestate; · 2 unmodified lines
33 typedef struct Cursorinfo Cursorinfo;
44 typedef struct Screeninfo Screeninfo;
55
6−#define Mousequeue 16 /* queue can only have Mousequeue-1 elements */
7−#define Mousewindow 500 /* mouse event window in millisec */
8−
96 struct Mousestate {
10− int buttons;
117 Point xy;
8+ int buttons;
9+ ulong counter;
1210 ulong msec;
1311 };
1412
1513 struct Mouseinfo {
16− Lock lk;
17− Mousestate queue[Mousequeue];
18− int ri, wi;
19− int lastb;
20− int trans;
21− int open;
22− Rendez r;
14+ Lock lk;
15+ Mousestate state;
16+ ulong lastcounter;
17+ Rendez r;
18+ int open;
19+ Mousestate queue[16]; /* circular buffer of click events */
20+ ulong ri; /* read index into queue */
21+ ulong wi; /* write index into queue */
2322 };
2423
2524 struct Cursorinfo {
@@ -30,11 +29,9 @@ struct Cursorinfo { · 4 unmodified lines
3029 };
3130
3231 struct Screeninfo {
33− Lock lk;
34− Memimage *newsoft;
35− int reshaped;
36− int depth;
37− int dibtype;
32+ Lock lk;
33+ int depth;
34+ int dibtype;
3835 };
3936
4037 extern Memimage *gscreen;
@@ -55,6 +52,8 @@ void flushmemscreen(Rectangle); · 14 unmodified lines
5552 uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*);
5653
5754 extern QLock drawlock;
58−#define ishwimage(i) 1
55+#define ishwimage(i) 0
5956
6057 void terminit(void);
58+
59+void absmousetrack(int, int, int, int);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t