My favorites
▼
|
Sign in
upp-mirror
U++ is the C++ development platform
Project Home
Downloads
Source
Checkout
Browse
Changes
Source path:
svn
/
trunk
/
reference
/
LinuxFb
/
Proc.cpp
r5017
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include "LinuxFbLocal.h"
NAMESPACE_UPP
#define LLOG(x) //LOG(x)
bool GetMouseLeft() { return mouseb & (1<<0); }
bool GetMouseRight() { return mouseb & (1<<1); }
bool GetMouseMiddle() { return mouseb & (1<<2); }
void purgefd(int fd)
{
fd_set fdset;
struct timeval tv;
char temp[64];
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
tv.tv_sec = 0;
tv.tv_usec = 0;
while(select(fd+1, &fdset, 0, 0, &tv) > 0)
read(fd, temp, sizeof(temp));
}
int set_imps2(int fd, int b)
{
uint8 set[] = {0xf3, 200, 0xf3, 100, 0xf3, 80};
uint8 reset[] = {0xff};
int retval = 0;
if(b && write(fd, &set, sizeof(set)) != sizeof(set))
return 0;
//SDL says not to reset, some mice wont work with it
if(!b && write(fd, &reset, sizeof (reset)) != sizeof(reset))
return 0;
purgefd(fd);
return 1;
}
int has_imps2(int fd)
{
uint8 query = 0xF2;
purgefd(fd);
if(write(fd, &query, sizeof (query)) != sizeof(query))
return 0;
uint8 ch = 0;
fd_set fdset;
struct timeval tv;
while(1) {
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
tv.tv_sec = 1;
tv.tv_usec = 0;
if(select(fd+1, &fdset, 0, 0, &tv) < 1) break;
if(read(fd, &ch, sizeof(ch)) != sizeof(ch)) break;
switch(ch) {
case 0xFA:
case 0xAA: continue;
case 3:
case 4: return 1;
default: return 0;
}
}
return 0;
}
dword lastbdowntime[8] = {0};
dword isdblclick[8] = {0};
void handle_button(dword ct, dword mouseb, dword bm, int i,
dword df, dword rf, dword dbf, dword uf)
{
dword m = (1<<i);
if(bm & m)
{
if(mouseb & m) //down
{
if(isdblclick[i] && (abs(int(ct) - int(lastbdowntime[i])) < 400))
{
Ctrl::DoMouseFB(dbf, mousep);
isdblclick[i] = 0; //reset, to go ahead sending repeats
}
else if(!isdblclick[i])
{
//Ctrl::DoMouseFB(rf, mousep);
}
else
{
lastbdowntime[i] = ct;
isdblclick[i] = 0; //prepare for repeat
Ctrl::DoMouseFB(df, mousep);
}
}
else //up
{
isdblclick[i] = 1; //indicate maybe a dblclick
Ctrl::DoMouseFB(uf, mousep);
}
}
}
void handle_mouse()
{
static int offs = 0;
static unsigned char buf[BUFSIZ];
static int rel = 1;
int i, n;
int b = 0;
int dx = 0, dy = 0, dz = 0;
int rdsize = (!mouse_imps2)?(3):(4);
n = read(mouse_fd, &buf[offs], BUFSIZ-offs);
if(n < 0) return;
n += offs;
for(i=0; i<(n-(rdsize-1)); i += rdsize) {
if((buf[i] & 0xC0) != 0) {
i -= (rdsize-1);
continue;
}
if(!mouse_imps2)
{
b = (buf[i] & 0x07); /*MRL*/
dx = (buf[i] & 0x10) ? buf[i+1] - 256 : buf[i+1];
dy = (buf[i] & 0x20) ? -(buf[i+2] - 256) : -buf[i+2];
}
else
{
b = (buf[i] & 0xC7); /*54...MRL*/
dx = (buf[i] & 0x10) ? buf[i+1] - 256 : buf[i+1];
dy = (buf[i] & 0x20) ? -(buf[i+2] - 256) : -buf[i+2];
dz = (char)buf[i+3];
}
if(dx || dy)
{
mousep.x += dx;
mousep.y += dy;
mousep.x = minmax(mousep.x, 0, int(vinfo.xres));
mousep.y = minmax(mousep.y, 0, int(vinfo.yres));
Ctrl::DoMouseFB(Ctrl::MOUSEMOVE, mousep);
}
dword bm = b ^ mouseb;
mouseb = b; //for GetMouse*
dword ct = GetTickCount();
handle_button(ct, mouseb, bm, 0, Ctrl::LEFTDOWN, Ctrl::LEFTREPEAT, Ctrl::LEFTDOUBLE, Ctrl::LEFTUP);
handle_button(ct, mouseb, bm, 1, Ctrl::RIGHTDOWN, Ctrl::RIGHTREPEAT, Ctrl::RIGHTDOUBLE, Ctrl::RIGHTUP);
handle_button(ct, mouseb, bm, 2, Ctrl::MIDDLEDOWN, Ctrl::MIDDLEREPEAT, Ctrl::MIDDLEDOUBLE, Ctrl::MIDDLEUP);
if(dz) Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, mousep, dz*120);
}
if(i < n) {
memcpy(buf, &buf[i], (n-i));
offs = (n-i);
} else
offs = 0;
}
void handle_keyboard()
{
unsigned char buf[BUFSIZ];
int n;
int keyup;
int keycode;
n = read(keyb_fd, buf, BUFSIZ);
for(int i=0; i<n; ++i) {
keycode = buf[i] & 0x7F;
keyup = (buf[i] & 0x80)?(K_KEYUP):(0);
bool b;
SaveModKeys(keycode, !keyup);
//we dont support both sides, fall back to left
switch(keycode)
{
case SCANCODE_RIGHTALT: keycode = SCANCODE_LEFTALT; break;
case SCANCODE_RIGHTSHIFT: keycode = SCANCODE_LEFTSHIFT; break;
case SCANCODE_RIGHTCONTROL: keycode = SCANCODE_LEFTCONTROL; break;
}
dword uppcode = fbKEYtoK(keycode) | keyup;
if(!keyup && uppcode == K_SPACE)
uppcode = 0; //prevent double send with unicode
//vtswitch
int vtck = uppcode & (K_DELTA | 0xFFFF);
switch(vtck) {
case K_F11:
case K_F12:
vtck -= 18; //dirty hack: after F10 doesnt come F11, see vgakeyboard.h
case K_F1:
case K_F2:
case K_F3:
case K_F4:
case K_F5:
case K_F6:
case K_F7:
case K_F8:
case K_F9:
case K_F10:
if(GetCtrl() && GetAlt()) {
int ii = vtck - K_F1 + 1;
if(!keyup)
switchvt(ii);
return;
}
}
//first, the upp keycode
if(uppcode)
b = Ctrl::DoKeyFB(uppcode, 1);
//second, the unicode translation for a keypress
if(!keyup)
{
dword unicode = TranslateUnicode(keycode);
if(unicode >= 32 && unicode != 127)
b = Ctrl::DoKeyFB(unicode, 1);
}
//helper quit
if(uppcode == (K_SHIFT_CTRL | K_ESCAPE))
Ctrl::EndSession();
}
}
END_UPP_NAMESPACE
Show details
Hide details
Change log
r4176
by cxl on Nov 16, 2011
Diff
.reference: Rainbow example (RM #158)
Go to:
/trunk/reference/Framebuffer
...nk/reference/Framebuffer/After.h
...erence/Framebuffer/ChSysInit.cpp
...k/reference/Framebuffer/Clip.cpp
...k/reference/Framebuffer/Ctrl.cpp
/trunk/reference/Framebuffer/Ctrl.h
...nk/reference/Framebuffer/DnD.cpp
...k/reference/Framebuffer/Draw.cpp
.../reference/Framebuffer/Event.cpp
/trunk/reference/Framebuffer/FB.iml
/trunk/reference/Framebuffer/Fb.h
...erence/Framebuffer/Framebuffer.h
...ence/Framebuffer/Framebuffer.upp
/trunk/reference/Framebuffer/Gui.h
.../reference/Framebuffer/Image.cpp
...nk/reference/Framebuffer/Top.cpp
/trunk/reference/Framebuffer/Top.h
...ference/Framebuffer/TopFrame.cpp
...k/reference/Framebuffer/Util.cpp
...nk/reference/Framebuffer/Wnd.cpp
/trunk/reference/Framebuffer/init
/trunk/reference/LinuxFb
/trunk/reference/LinuxFb/Keys.h
/trunk/reference/LinuxFb/LinuxFb.h
...nk/reference/LinuxFb/LinuxFb.upp
...reference/LinuxFb/LinuxFbLocal.h
/trunk/reference/LinuxFb/Local.h
/trunk/reference/LinuxFb/Proc.cpp
/trunk/reference/LinuxFb/Win.cpp
/trunk/reference/LinuxFb/init
/trunk/reference/LinuxFb/keymap.cpp
.../reference/LinuxFb/vgakeyboard.h
/trunk/reference/UWord_FB
/trunk/reference/UWord_FB/UWord.cpp
/trunk/reference/UWord_FB/UWord.iml
.../reference/UWord_FB/UWord_FB.upp
/trunk/reference/UWord_FB/icon.ico
/trunk/reference/UWord_FB/init
/trunk/reference/WinFb
/trunk/reference/WinFb/Keys.h
/trunk/reference/WinFb/Local.h
/trunk/reference/WinFb/Proc.cpp
/trunk/reference/WinFb/Win.cpp
/trunk/reference/WinFb/WinFb.h
/trunk/reference/WinFb/WinFb.upp
/trunk/reference/WinFb/init
/trunk/reference/guiplatform.h
Project members,
sign in
to write a code review
Older revisions
All revisions of this file
File info
Size: 5250 bytes, 235 lines
View raw file
Powered by
Google Project Hosting