added early keyboard work and some other fixes
This commit is contained in:
parent
82eb62e0cc
commit
330a4ffb98
@ -410,3 +410,8 @@
|
|||||||
/* button states */
|
/* button states */
|
||||||
#define BUTTON_STATE_UP 0
|
#define BUTTON_STATE_UP 0
|
||||||
#define BUTTON_STATE_DOWN 1
|
#define BUTTON_STATE_DOWN 1
|
||||||
|
|
||||||
|
/* messages */
|
||||||
|
#define WM_PAINT 3
|
||||||
|
#define WM_KEYDOWN 15
|
||||||
|
#define WM_KEYUP 16
|
||||||
|
195
xrdp/funcs.c
195
xrdp/funcs.c
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -61,21 +60,6 @@ int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
int color16(int r, int g, int b)
|
|
||||||
{
|
|
||||||
r = r >> 3;
|
|
||||||
g = g >> 2;
|
|
||||||
b = b >> 3;
|
|
||||||
return (r << 11) | (g << 5) | b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
int color24(int r, int g, int b)
|
|
||||||
{
|
|
||||||
return r | (g << 8) | (b << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* adjust the bounds to fit in the bitmap */
|
/* adjust the bounds to fit in the bitmap */
|
||||||
/* return false if there is nothing to draw else return true */
|
/* return false if there is nothing to draw else return true */
|
||||||
@ -105,3 +89,182 @@ int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy)
|
|||||||
*cy = b->height - *y;
|
*cy = b->height - *y;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* scan codes
|
||||||
|
1 esc
|
||||||
|
2 1 or ?
|
||||||
|
3 2 or @
|
||||||
|
4 3 or #
|
||||||
|
5 4 or $
|
||||||
|
6 5 or %
|
||||||
|
7 6 or ^
|
||||||
|
8 7 or &
|
||||||
|
9 8 or *
|
||||||
|
10 9 or (
|
||||||
|
11 10 or )
|
||||||
|
12 11 or _
|
||||||
|
13 12 or +
|
||||||
|
14 backspace
|
||||||
|
15 tab
|
||||||
|
16 q or Q
|
||||||
|
17 w or W
|
||||||
|
18 e or E
|
||||||
|
19 r or R
|
||||||
|
20 t or T
|
||||||
|
21 y or Y
|
||||||
|
22 u or U
|
||||||
|
23 i or I
|
||||||
|
24 o or O
|
||||||
|
25 p or P
|
||||||
|
26 [ or {
|
||||||
|
27 ] or }
|
||||||
|
28 enter, keypad if ext
|
||||||
|
29 left or right ctrl, ext flag is right
|
||||||
|
30 a or A
|
||||||
|
31 s or S
|
||||||
|
32 d or D
|
||||||
|
33 f or F
|
||||||
|
34 g or G
|
||||||
|
35 h or H
|
||||||
|
36 j or J
|
||||||
|
37 k or K
|
||||||
|
38 l or L
|
||||||
|
39 ; or :
|
||||||
|
40 ' or "
|
||||||
|
41 ~
|
||||||
|
42 left shift
|
||||||
|
43 \
|
||||||
|
44 z or Z
|
||||||
|
45 x or X
|
||||||
|
46 c or C
|
||||||
|
47 v or V
|
||||||
|
48 b or B
|
||||||
|
49 n or N
|
||||||
|
50 m or M
|
||||||
|
51 , or <
|
||||||
|
52 . or >
|
||||||
|
53 / can be / on keypad, ext flag is keypad
|
||||||
|
54 right shift
|
||||||
|
55 * on keypad or print screen if ext
|
||||||
|
56 left or right alt, ext flag is right
|
||||||
|
57 space
|
||||||
|
58 caps lock
|
||||||
|
59 F1
|
||||||
|
60 F2
|
||||||
|
61 F3
|
||||||
|
62 F4
|
||||||
|
63 F5
|
||||||
|
64 F6
|
||||||
|
65 F7
|
||||||
|
66 F8
|
||||||
|
67 F9
|
||||||
|
68 F10
|
||||||
|
69 num lock
|
||||||
|
70 scroll lock
|
||||||
|
71 7 or home on keypad, ext flag is not keypad
|
||||||
|
72 8 or arrow up on keypad, ext flag is not keypad
|
||||||
|
73 9 or page up
|
||||||
|
74 -(minus) on keypad
|
||||||
|
75 4 or arrow left on keypad, ext flag is not keypad
|
||||||
|
76 middle(5 key) of keypad
|
||||||
|
77 6 or arrow right, can be on keypad, ext flag in not keypad
|
||||||
|
78 + on keypad
|
||||||
|
79 1 or end
|
||||||
|
80 2 or arrow down, can be on keypad, ext flag in not keypad
|
||||||
|
81 3 or page down
|
||||||
|
82 0 or insert on keypad, ext flag is not keypad
|
||||||
|
83 . or delete on keypad, ext flag is not keypad
|
||||||
|
87 F11
|
||||||
|
88 F12
|
||||||
|
91 left win key ext always on
|
||||||
|
92 right win key ext always on
|
||||||
|
93 menu key ext always on
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* non shift chars */
|
||||||
|
char chars1[] = {'\0', '\0', '1', '2', '3', '4', '5', '6',
|
||||||
|
'7', '8', '9', '0', '-', '=', '\0', '\0',
|
||||||
|
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
|
||||||
|
'o', 'p', '[', ']', '\0', '\0', 'a', 's',
|
||||||
|
'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
|
||||||
|
'\'', '`', '\0', '\\', 'z', 'x', 'c', 'v',
|
||||||
|
'b', 'n', 'm', ',', '.', '/', '\0', '*',
|
||||||
|
'\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '7',
|
||||||
|
'8', '9', '-', '4', '5', '6', '+', '1',
|
||||||
|
'2', '3', '0', '.', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
|
||||||
|
/* shift chars */
|
||||||
|
char chars2[] = {'\0', '\0', '!', '@', '#', '$', '%', '^',
|
||||||
|
'&', '*', '(', ')', '_', '+', '\0', '\0',
|
||||||
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
|
||||||
|
'O', 'P', '{', '}', '\0', '\0', 'A', 'S',
|
||||||
|
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
|
||||||
|
'"', '~', '\0', '|', 'Z', 'X', 'C', 'V',
|
||||||
|
'B', 'N', 'M', '<', '>', '?', '\0', '*',
|
||||||
|
'\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '7',
|
||||||
|
'8', '9', '-', '4', '5', '6', '+', '1',
|
||||||
|
'2', '3', '0', '.', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||||
|
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
|
||||||
|
int caps_lock, int num_lock, int scroll_lock)
|
||||||
|
{
|
||||||
|
char rv;
|
||||||
|
int shift;
|
||||||
|
int ext;
|
||||||
|
|
||||||
|
shift = keys[42] || keys[54];
|
||||||
|
ext = device_flags & 0x0100;
|
||||||
|
rv = 0;
|
||||||
|
if (scan_code >= 128)
|
||||||
|
{
|
||||||
|
scan_code = scan_code % 128;
|
||||||
|
num_lock = 0;
|
||||||
|
}
|
||||||
|
if (!num_lock)
|
||||||
|
{
|
||||||
|
switch (scan_code)
|
||||||
|
{
|
||||||
|
case 71: /* 7 */
|
||||||
|
case 72: /* 8 */
|
||||||
|
case 73: /* 9 */
|
||||||
|
case 75: /* 4 */
|
||||||
|
case 76: /* 5 */
|
||||||
|
case 77: /* 6 */
|
||||||
|
case 79: /* 1 */
|
||||||
|
case 80: /* 2 */
|
||||||
|
case 81: /* 3 */
|
||||||
|
case 82: /* 0 */
|
||||||
|
case 83: /* . */
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ext)
|
||||||
|
{
|
||||||
|
if (scan_code == 53)
|
||||||
|
rv = '/';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (shift)
|
||||||
|
rv = chars2[scan_code];
|
||||||
|
else
|
||||||
|
rv = chars1[scan_code];
|
||||||
|
if (rv >= 'a' && rv <= 'z' && caps_lock)
|
||||||
|
rv = rv - ('a' - 'A');
|
||||||
|
else if (rv >= 'A' && rv <= 'Z' && caps_lock)
|
||||||
|
rv = rv + ('a' - 'A');
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@ -536,3 +536,9 @@ char* g_strcpy(char* dest, char* src)
|
|||||||
{
|
{
|
||||||
return strcpy(dest, src);
|
return strcpy(dest, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
char* g_strcat(char* dest, char* src)
|
||||||
|
{
|
||||||
|
return strcat(dest, src);
|
||||||
|
}
|
||||||
|
@ -120,6 +120,7 @@ int g_file_seek(int fd, int offset);
|
|||||||
int g_file_lock(int fd, int start, int len);
|
int g_file_lock(int fd, int start, int len);
|
||||||
int g_strlen(char* text);
|
int g_strlen(char* text);
|
||||||
char* g_strcpy(char* dest, char* src);
|
char* g_strcpy(char* dest, char* src);
|
||||||
|
char* g_strcat(char* dest, char* src);
|
||||||
|
|
||||||
/* xrdp_tcp.c */
|
/* xrdp_tcp.c */
|
||||||
struct xrdp_tcp* xrdp_tcp_create(struct xrdp_iso* owner);
|
struct xrdp_tcp* xrdp_tcp_create(struct xrdp_iso* owner);
|
||||||
@ -234,6 +235,8 @@ int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
|
|||||||
struct xrdp_region* region);
|
struct xrdp_region* region);
|
||||||
int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y);
|
int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y);
|
||||||
int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down);
|
int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down);
|
||||||
|
int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code);
|
||||||
|
int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags);
|
||||||
|
|
||||||
/* xrdp_process.c */
|
/* xrdp_process.c */
|
||||||
struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner);
|
struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner);
|
||||||
@ -269,6 +272,8 @@ int xrdp_bitmap_copy_box(struct xrdp_bitmap* self, struct xrdp_bitmap* dest,
|
|||||||
int x, int y, int cx, int cy);
|
int x, int y, int cx, int cy);
|
||||||
int xrdp_bitmap_compare(struct xrdp_bitmap* self, struct xrdp_bitmap* b);
|
int xrdp_bitmap_compare(struct xrdp_bitmap* self, struct xrdp_bitmap* b);
|
||||||
int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect);
|
int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect);
|
||||||
|
int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
|
||||||
|
int param1, int param2);
|
||||||
|
|
||||||
/* xrdp_painter.c */
|
/* xrdp_painter.c */
|
||||||
struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wn);
|
struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wn);
|
||||||
@ -315,3 +320,5 @@ int rect_contains_pt(struct xrdp_rect* in, int x, int y);
|
|||||||
int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
|
int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
|
||||||
struct xrdp_rect* out);
|
struct xrdp_rect* out);
|
||||||
int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy);
|
int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy);
|
||||||
|
char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
|
||||||
|
int caps_lock, int num_lock, int scroll_lock);
|
||||||
|
@ -56,6 +56,11 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self)
|
|||||||
return;
|
return;
|
||||||
if (self->wm != 0)
|
if (self->wm != 0)
|
||||||
{
|
{
|
||||||
|
if (self->wm->focused_window != 0)
|
||||||
|
{
|
||||||
|
if (self->wm->focused_window->focused_control == self)
|
||||||
|
self->wm->focused_window->focused_control = 0;
|
||||||
|
}
|
||||||
if (self->wm->focused_window == self)
|
if (self->wm->focused_window == self)
|
||||||
self->wm->focused_window = 0;
|
self->wm->focused_window = 0;
|
||||||
if (self->wm->dragging_window == self)
|
if (self->wm->dragging_window == self)
|
||||||
@ -98,7 +103,7 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused)
|
|||||||
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
|
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
|
||||||
painter->font->color = self->wm->black;
|
painter->font->color = self->wm->black;
|
||||||
}
|
}
|
||||||
xrdp_painter_draw_text(painter, self, 4, 4, self->title);
|
xrdp_painter_draw_text(painter, self, 4, 4, self->caption);
|
||||||
xrdp_painter_end_update(painter);
|
xrdp_painter_end_update(painter);
|
||||||
xrdp_painter_delete(painter);
|
xrdp_painter_delete(painter);
|
||||||
return 0;
|
return 0;
|
||||||
@ -415,7 +420,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
|
|||||||
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
|
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
|
||||||
painter->font->color = self->wm->black;
|
painter->font->color = self->wm->black;
|
||||||
}
|
}
|
||||||
xrdp_painter_draw_text(painter, self, 4, 4, self->title);
|
xrdp_painter_draw_text(painter, self, 4, 4, self->caption);
|
||||||
}
|
}
|
||||||
else if (self->type == WND_TYPE_SCREEN) /* 2 */
|
else if (self->type == WND_TYPE_SCREEN) /* 2 */
|
||||||
{
|
{
|
||||||
@ -449,11 +454,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
|
|||||||
/* black right line */
|
/* black right line */
|
||||||
painter->fg_color = self->wm->black;
|
painter->fg_color = self->wm->black;
|
||||||
xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height);
|
xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height);
|
||||||
w = xrdp_painter_text_width(painter, self->title);
|
w = xrdp_painter_text_width(painter, self->caption);
|
||||||
h = xrdp_painter_text_height(painter, self->title);
|
h = xrdp_painter_text_height(painter, self->caption);
|
||||||
painter->font->color = self->wm->black;
|
painter->font->color = self->wm->black;
|
||||||
xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2,
|
xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2,
|
||||||
self->height / 2 - h / 2, self->title);
|
self->height / 2 - h / 2, self->caption);
|
||||||
}
|
}
|
||||||
else if (self->state == BUTTON_STATE_DOWN) /* 1 */
|
else if (self->state == BUTTON_STATE_DOWN) /* 1 */
|
||||||
{
|
{
|
||||||
@ -486,11 +491,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
|
|||||||
/* black right line */
|
/* black right line */
|
||||||
painter->fg_color = self->wm->black;
|
painter->fg_color = self->wm->black;
|
||||||
xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height);
|
xrdp_painter_fill_rect(painter, self, self->width - 1, 0, 1, self->height);
|
||||||
w = xrdp_painter_text_width(painter, self->title);
|
w = xrdp_painter_text_width(painter, self->caption);
|
||||||
h = xrdp_painter_text_height(painter, self->title);
|
h = xrdp_painter_text_height(painter, self->caption);
|
||||||
painter->font->color = self->wm->black;
|
painter->font->color = self->wm->black;
|
||||||
xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1,
|
xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1,
|
||||||
(self->height / 2 - h / 2) + 1, self->title);
|
(self->height / 2 - h / 2) + 1, self->caption);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (self->type == WND_TYPE_IMAGE) /* 4 */
|
else if (self->type == WND_TYPE_IMAGE) /* 4 */
|
||||||
@ -525,15 +530,19 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
|
|||||||
/* black top line */
|
/* black top line */
|
||||||
painter->fg_color = self->wm->black;
|
painter->fg_color = self->wm->black;
|
||||||
xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 2, 1);
|
xrdp_painter_fill_rect(painter, self, 1, 1, self->width - 2, 1);
|
||||||
|
/* draw text */
|
||||||
|
painter->fg_color = self->wm->black;
|
||||||
|
xrdp_painter_draw_text(painter, self, 2, 2, self->caption);
|
||||||
|
// xrdp_painter_draw_text(painter, self, 2, 2, "hi");
|
||||||
}
|
}
|
||||||
else if (self->type == WND_TYPE_LABEL) /* 6 */
|
else if (self->type == WND_TYPE_LABEL) /* 6 */
|
||||||
{
|
{
|
||||||
painter->font->color = self->wm->black;
|
painter->font->color = self->wm->black;
|
||||||
xrdp_painter_draw_text(painter, self, 0, 0, self->title);
|
xrdp_painter_draw_text(painter, self, 0, 0, self->caption);
|
||||||
}
|
}
|
||||||
/* notify */
|
/* notify */
|
||||||
if (self->notify != 0)
|
if (self->notify != 0)
|
||||||
self->notify(self, self, 3, (int)painter, 0);
|
self->notify(self, self, WM_PAINT, (int)painter, 0); /* 3 */
|
||||||
/* draw any child windows in the area */
|
/* draw any child windows in the area */
|
||||||
for (i = 0; i < self->child_list->count; i++)
|
for (i = 0; i < self->child_list->count; i++)
|
||||||
{
|
{
|
||||||
@ -554,3 +563,105 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
|
|||||||
xrdp_painter_delete(painter);
|
xrdp_painter_delete(painter);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* returns error */
|
||||||
|
int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
|
||||||
|
int param1, int param2)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
char a[2];
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
|
int shift;
|
||||||
|
struct xrdp_bitmap* b;
|
||||||
|
|
||||||
|
if (self == 0)
|
||||||
|
return 0;
|
||||||
|
if (self->wm == 0)
|
||||||
|
return 0;
|
||||||
|
if (self->type == WND_TYPE_WND)
|
||||||
|
{
|
||||||
|
if (msg == WM_KEYDOWN)
|
||||||
|
{
|
||||||
|
if (param1 == 15) /* tab */
|
||||||
|
{
|
||||||
|
/* move to next tab stop */
|
||||||
|
shift = self->wm->keys[42] || self->wm->keys[54];
|
||||||
|
i = -1;
|
||||||
|
if (self->child_list != 0)
|
||||||
|
i = xrdp_list_index_of(self->child_list, (int)self->focused_control);
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (i < 0)
|
||||||
|
i = self->child_list->count - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
if (i >= self->child_list->count)
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
n = self->child_list->count;
|
||||||
|
b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i);
|
||||||
|
while (b != self->focused_control && b != 0 && n > 0)
|
||||||
|
{
|
||||||
|
n--;
|
||||||
|
if (b->tab_stop)
|
||||||
|
{
|
||||||
|
self->focused_control = b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (i < 0)
|
||||||
|
i = self->child_list->count - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
if (i >= self->child_list->count)
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self->focused_control != 0)
|
||||||
|
{
|
||||||
|
xrdp_bitmap_def_proc(self->focused_control, msg, param1, param2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (self->type == WND_TYPE_EDIT)
|
||||||
|
{
|
||||||
|
if (msg == WM_KEYDOWN)
|
||||||
|
{
|
||||||
|
if (param1 == 14) /* backspace */
|
||||||
|
{
|
||||||
|
n = g_strlen(self->caption);
|
||||||
|
if (n > 0)
|
||||||
|
{
|
||||||
|
self->caption[n - 1] = 0;
|
||||||
|
xrdp_bitmap_invalidate(self, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c = get_char_from_scan_code(param2, param1, self->wm->keys,
|
||||||
|
self->wm->caps_lock,
|
||||||
|
self->wm->num_lock,
|
||||||
|
self->wm->scroll_lock);
|
||||||
|
if (c != 0)
|
||||||
|
{
|
||||||
|
a[0] = c;
|
||||||
|
a[1] = 0;
|
||||||
|
g_strcat(self->caption, a);
|
||||||
|
xrdp_bitmap_invalidate(self, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -104,6 +104,9 @@ int xrdp_orders_force_send(struct xrdp_orders* self)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/* check if the current order will fix in packet size of 8192, if not */
|
||||||
|
/* send what we got and init a new one */
|
||||||
|
/* returns error */
|
||||||
int xrdp_orders_check(struct xrdp_orders* self, int max_size)
|
int xrdp_orders_check(struct xrdp_orders* self, int max_size)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
@ -127,6 +130,7 @@ int xrdp_orders_check(struct xrdp_orders* self, int max_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/* check if rect is the same as the last one sent */
|
||||||
/* returns boolean */
|
/* returns boolean */
|
||||||
int xrdp_orders_last_bounds(struct xrdp_orders* self,
|
int xrdp_orders_last_bounds(struct xrdp_orders* self,
|
||||||
struct xrdp_rect* rect)
|
struct xrdp_rect* rect)
|
||||||
@ -140,6 +144,7 @@ int xrdp_orders_last_bounds(struct xrdp_orders* self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
/* check if all coords are withing 256 bytes */
|
||||||
/* returns boolean */
|
/* returns boolean */
|
||||||
int xrdp_orders_send_delta(struct xrdp_orders* self, int* vals, int count)
|
int xrdp_orders_send_delta(struct xrdp_orders* self, int* vals, int count)
|
||||||
{
|
{
|
||||||
|
@ -213,13 +213,13 @@ int xrdp_rdp_parse_client_mcs_data(struct xrdp_rdp* self)
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
int xrdp_rdp_incoming(struct xrdp_rdp* self)
|
int xrdp_rdp_incoming(struct xrdp_rdp* self)
|
||||||
{
|
{
|
||||||
DEBUG(("in xrdp_rdp_incoming\n"));
|
DEBUG(("in xrdp_rdp_incoming\n\r"));
|
||||||
if (xrdp_sec_incoming(self->sec_layer) != 0)
|
if (xrdp_sec_incoming(self->sec_layer) != 0)
|
||||||
return 1;
|
return 1;
|
||||||
self->mcs_channel = self->sec_layer->mcs_layer->userid +
|
self->mcs_channel = self->sec_layer->mcs_layer->userid +
|
||||||
MCS_USERCHANNEL_BASE;
|
MCS_USERCHANNEL_BASE;
|
||||||
xrdp_rdp_parse_client_mcs_data(self);
|
xrdp_rdp_parse_client_mcs_data(self);
|
||||||
DEBUG(("out xrdp_rdp_incoming mcs channel %d\n", self->mcs_channel));
|
DEBUG(("out xrdp_rdp_incoming mcs channel %d\n\r", self->mcs_channel));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,9 +375,10 @@ int xrdp_rdp_process_data_pointer(struct xrdp_rdp* self, struct stream* s)
|
|||||||
int xrdp_rdp_process_input_sync(struct xrdp_rdp* self, int device_flags,
|
int xrdp_rdp_process_input_sync(struct xrdp_rdp* self, int device_flags,
|
||||||
int key_flags)
|
int key_flags)
|
||||||
{
|
{
|
||||||
DEBUG(("sync event flags %d key %d\n\r", device_flags, key_flags))
|
DEBUG(("sync event flags %d key %d\n\r", device_flags, key_flags));
|
||||||
if (!self->up_and_running)
|
if (!self->up_and_running)
|
||||||
return 0;
|
return 0;
|
||||||
|
xrdp_wm_key_sync(self->pro_layer->wm, device_flags, key_flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,9 +387,10 @@ int xrdp_rdp_process_input_sync(struct xrdp_rdp* self, int device_flags,
|
|||||||
int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags,
|
int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags,
|
||||||
int scan_code)
|
int scan_code)
|
||||||
{
|
{
|
||||||
DEBUG(("key event flags %d scan_code %d\n\r", device_flags, scan_code))
|
DEBUG(("key event flags %4.4x scan_code %d\n\r", device_flags, scan_code));
|
||||||
if (!self->up_and_running)
|
if (!self->up_and_running)
|
||||||
return 0;
|
return 0;
|
||||||
|
xrdp_wm_key(self->pro_layer->wm, device_flags, scan_code);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,7 +399,7 @@ int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags,
|
|||||||
int xrdp_rdp_process_input_mouse(struct xrdp_rdp* self, int device_flags,
|
int xrdp_rdp_process_input_mouse(struct xrdp_rdp* self, int device_flags,
|
||||||
int x, int y)
|
int x, int y)
|
||||||
{
|
{
|
||||||
DEBUG(("mouse event flags %4.4x x - %d y - %d\n\r", device_flags, x, y));
|
DEBUG(("mouse event flags %4.4x x %d y %d\n\r", device_flags, x, y));
|
||||||
if (!self->up_and_running)
|
if (!self->up_and_running)
|
||||||
return 0;
|
return 0;
|
||||||
if (device_flags & MOUSE_FLAG_MOVE) /* 0x0800 */
|
if (device_flags & MOUSE_FLAG_MOVE) /* 0x0800 */
|
||||||
@ -432,7 +434,7 @@ int xrdp_rdp_process_data_input(struct xrdp_rdp* self, struct stream* s)
|
|||||||
|
|
||||||
in_uint16_le(s, num_events);
|
in_uint16_le(s, num_events);
|
||||||
in_uint8s(s, 2); /* pad */
|
in_uint8s(s, 2); /* pad */
|
||||||
DEBUG(("xrdp_rdp_process_data_input %d events\n\r", num_events))
|
DEBUG(("xrdp_rdp_process_data_input %d events\n\r", num_events));
|
||||||
for (index = 0; index < num_events; index++)
|
for (index = 0; index < num_events; index++)
|
||||||
{
|
{
|
||||||
in_uint8s(s, 4); /* time */
|
in_uint8s(s, 4); /* time */
|
||||||
|
@ -315,6 +315,10 @@ struct xrdp_wm
|
|||||||
struct xrdp_bitmap* focused_window;
|
struct xrdp_bitmap* focused_window;
|
||||||
/* cursor */
|
/* cursor */
|
||||||
int current_cursor;
|
int current_cursor;
|
||||||
|
int keys[256]; /* key states 0 up 1 down*/
|
||||||
|
int caps_lock;
|
||||||
|
int scroll_lock;
|
||||||
|
int num_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* rdp process */
|
/* rdp process */
|
||||||
@ -377,8 +381,10 @@ struct xrdp_bitmap
|
|||||||
int bg_color;
|
int bg_color;
|
||||||
int line_size; /* in bytes */
|
int line_size; /* in bytes */
|
||||||
int focused;
|
int focused;
|
||||||
char title[256];
|
int tab_stop;
|
||||||
|
char caption[256];
|
||||||
struct xrdp_bitmap* modal_dialog;
|
struct xrdp_bitmap* modal_dialog;
|
||||||
|
struct xrdp_bitmap* focused_control;
|
||||||
struct xrdp_bitmap* owner; /* window that created us */
|
struct xrdp_bitmap* owner; /* window that created us */
|
||||||
struct xrdp_bitmap* parent; /* window contained in */
|
struct xrdp_bitmap* parent; /* window contained in */
|
||||||
struct xrdp_list* child_list;
|
struct xrdp_list* child_list;
|
||||||
|
101
xrdp/xrdp_wm.c
101
xrdp/xrdp_wm.c
@ -154,7 +154,7 @@ int xrdp_wm_login_help_notify(struct xrdp_bitmap* wnd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (msg == 3) /* paint */
|
else if (msg == WM_PAINT) /* 3 */
|
||||||
{
|
{
|
||||||
p = (struct xrdp_painter*)param1;
|
p = (struct xrdp_painter*)param1;
|
||||||
if (p != 0)
|
if (p != 0)
|
||||||
@ -227,7 +227,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
|
|||||||
help->left = wnd->wm->screen->width / 2 - help->width / 2;
|
help->left = wnd->wm->screen->width / 2 - help->width / 2;
|
||||||
help->top = wnd->wm->screen->height / 2 - help->height / 2;
|
help->top = wnd->wm->screen->height / 2 - help->height / 2;
|
||||||
help->notify = xrdp_wm_login_help_notify;
|
help->notify = xrdp_wm_login_help_notify;
|
||||||
g_strcpy(help->title, "Logon help");
|
g_strcpy(help->caption, "Logon help");
|
||||||
/* ok button */
|
/* ok button */
|
||||||
but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, 3);
|
but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, 3);
|
||||||
xrdp_list_insert_item(help->child_list, 0, (int)but);
|
xrdp_list_insert_item(help->child_list, 0, (int)but);
|
||||||
@ -237,7 +237,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
|
|||||||
but->left = 120;
|
but->left = 120;
|
||||||
but->top = 260;
|
but->top = 260;
|
||||||
but->id = 1;
|
but->id = 1;
|
||||||
g_strcpy(but->title, "OK");
|
g_strcpy(but->caption, "OK");
|
||||||
/* draw it */
|
/* draw it */
|
||||||
xrdp_bitmap_invalidate(help, 0);
|
xrdp_bitmap_invalidate(help, 0);
|
||||||
xrdp_wm_set_focused(wnd->wm, help);
|
xrdp_wm_set_focused(wnd->wm, help);
|
||||||
@ -457,7 +457,8 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
self->green = COLOR24(0x00, 0xff, 0x00);
|
self->green = COLOR24(0x00, 0xff, 0x00);
|
||||||
}
|
}
|
||||||
/* draw login window */
|
/* draw login window */
|
||||||
self->login_window = xrdp_bitmap_create(400, 200, self->screen->bpp, 1);
|
self->login_window = xrdp_bitmap_create(400, 200, self->screen->bpp,
|
||||||
|
WND_TYPE_WND);
|
||||||
xrdp_list_add_item(self->screen->child_list, (int)self->login_window);
|
xrdp_list_add_item(self->screen->child_list, (int)self->login_window);
|
||||||
self->login_window->parent = self->screen;
|
self->login_window->parent = self->screen;
|
||||||
self->login_window->owner = self->screen;
|
self->login_window->owner = self->screen;
|
||||||
@ -468,10 +469,10 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
self->login_window->top = self->screen->height / 2 -
|
self->login_window->top = self->screen->height / 2 -
|
||||||
self->login_window->height / 2;
|
self->login_window->height / 2;
|
||||||
self->login_window->notify = xrdp_wm_login_notify;
|
self->login_window->notify = xrdp_wm_login_notify;
|
||||||
strcpy(self->login_window->title, "Logon to xrdp");
|
strcpy(self->login_window->caption, "Logon to xrdp");
|
||||||
|
|
||||||
/* image */
|
/* image */
|
||||||
but = xrdp_bitmap_create(4, 4, self->screen->bpp, 4);
|
but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE);
|
||||||
xrdp_bitmap_load(but, "xrdp256.bmp", self->palette);
|
xrdp_bitmap_load(but, "xrdp256.bmp", self->palette);
|
||||||
but->parent = self->screen;
|
but->parent = self->screen;
|
||||||
but->owner = self->screen;
|
but->owner = self->screen;
|
||||||
@ -481,7 +482,7 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
xrdp_list_add_item(self->screen->child_list, (int)but);
|
xrdp_list_add_item(self->screen->child_list, (int)but);
|
||||||
|
|
||||||
/* image */
|
/* image */
|
||||||
but = xrdp_bitmap_create(4, 4, self->screen->bpp, 4);
|
but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE);
|
||||||
xrdp_bitmap_load(but, "ad256.bmp", self->palette);
|
xrdp_bitmap_load(but, "ad256.bmp", self->palette);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -491,7 +492,7 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
|
|
||||||
/* button */
|
/* button */
|
||||||
but = xrdp_bitmap_create(60, 25, self->screen->bpp, 3);
|
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -499,10 +500,11 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
but->left = 320;
|
but->left = 320;
|
||||||
but->top = 160;
|
but->top = 160;
|
||||||
but->id = 1;
|
but->id = 1;
|
||||||
g_strcpy(but->title, "Help");
|
g_strcpy(but->caption, "Help");
|
||||||
|
but->tab_stop = 1;
|
||||||
|
|
||||||
/* button */
|
/* button */
|
||||||
but = xrdp_bitmap_create(60, 25, self->screen->bpp, 3);
|
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -510,10 +512,11 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
but->left = 250;
|
but->left = 250;
|
||||||
but->top = 160;
|
but->top = 160;
|
||||||
but->id = 2;
|
but->id = 2;
|
||||||
g_strcpy(but->title, "Cancel");
|
g_strcpy(but->caption, "Cancel");
|
||||||
|
but->tab_stop = 1;
|
||||||
|
|
||||||
/* button */
|
/* button */
|
||||||
but = xrdp_bitmap_create(60, 25, self->screen->bpp, 3);
|
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -521,20 +524,21 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
but->left = 180;
|
but->left = 180;
|
||||||
but->top = 160;
|
but->top = 160;
|
||||||
but->id = 3;
|
but->id = 3;
|
||||||
g_strcpy(but->title, "OK");
|
g_strcpy(but->caption, "OK");
|
||||||
|
but->tab_stop = 1;
|
||||||
|
|
||||||
/* label */
|
/* label */
|
||||||
but = xrdp_bitmap_create(60, 20, self->screen->bpp, 6); /* label */
|
but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
but->wm = self;
|
but->wm = self;
|
||||||
but->left = 155;
|
but->left = 155;
|
||||||
but->top = 50;
|
but->top = 50;
|
||||||
g_strcpy(but->title, "Username");
|
g_strcpy(but->caption, "Username");
|
||||||
|
|
||||||
/* edit */
|
/* edit */
|
||||||
but = xrdp_bitmap_create(140, 20, self->screen->bpp, 5);
|
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -543,19 +547,20 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
but->top = 50;
|
but->top = 50;
|
||||||
but->id = 4;
|
but->id = 4;
|
||||||
but->cursor = 1;
|
but->cursor = 1;
|
||||||
|
but->tab_stop = 1;
|
||||||
|
|
||||||
/* label */
|
/* label */
|
||||||
but = xrdp_bitmap_create(60, 20, self->screen->bpp, 6); /* label */
|
but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
but->wm = self;
|
but->wm = self;
|
||||||
but->left = 155;
|
but->left = 155;
|
||||||
but->top = 80;
|
but->top = 80;
|
||||||
g_strcpy(but->title, "Password");
|
g_strcpy(but->caption, "Password");
|
||||||
|
|
||||||
/* edit */
|
/* edit */
|
||||||
but = xrdp_bitmap_create(140, 20, self->screen->bpp, 5);
|
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT);
|
||||||
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
xrdp_list_add_item(self->login_window->child_list, (int)but);
|
||||||
but->parent = self->login_window;
|
but->parent = self->login_window;
|
||||||
but->owner = self->login_window;
|
but->owner = self->login_window;
|
||||||
@ -564,6 +569,7 @@ int xrdp_wm_init(struct xrdp_wm* self)
|
|||||||
but->top = 80;
|
but->top = 80;
|
||||||
but->id = 5;
|
but->id = 5;
|
||||||
but->cursor = 1;
|
but->cursor = 1;
|
||||||
|
but->tab_stop = 1;
|
||||||
|
|
||||||
/* clear screen */
|
/* clear screen */
|
||||||
self->screen->bg_color = self->black;
|
self->screen->bg_color = self->black;
|
||||||
@ -893,9 +899,15 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
|
|||||||
if (control != 0)
|
if (control != 0)
|
||||||
{
|
{
|
||||||
if (wnd != 0)
|
if (wnd != 0)
|
||||||
|
{
|
||||||
|
if (control == wnd)
|
||||||
|
wnd->focused_control = 0;
|
||||||
|
else
|
||||||
|
wnd->focused_control = control;
|
||||||
if (wnd->modal_dialog != 0) /* if window has a modal dialog */
|
if (wnd->modal_dialog != 0) /* if window has a modal dialog */
|
||||||
return 0;
|
return 0;
|
||||||
if (control->type == 3 && but == 1 &&
|
}
|
||||||
|
if (control->type == WND_TYPE_BUTTON && but == 1 &&
|
||||||
!down && self->button_down == control)
|
!down && self->button_down == control)
|
||||||
{ /* if clicking up on a button that was clicked down */
|
{ /* if clicking up on a button that was clicked down */
|
||||||
self->button_down = 0;
|
self->button_down = 0;
|
||||||
@ -906,7 +918,7 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
|
|||||||
/* control can be invalid after this */
|
/* control can be invalid after this */
|
||||||
control->parent->notify(control->owner, control, 1, x, y);
|
control->parent->notify(control->owner, control, 1, x, y);
|
||||||
}
|
}
|
||||||
else if (control->type == 3 && but == 1 && down)
|
else if (control->type == WND_TYPE_BUTTON && but == 1 && down)
|
||||||
{ /* if clicking down on a button */
|
{ /* if clicking down on a button */
|
||||||
self->button_down = control;
|
self->button_down = control;
|
||||||
control->state = 1;
|
control->state = 1;
|
||||||
@ -915,7 +927,7 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
|
|||||||
else if (but == 1 && down)
|
else if (but == 1 && down)
|
||||||
{
|
{
|
||||||
xrdp_wm_set_focused(self, wnd);
|
xrdp_wm_set_focused(self, wnd);
|
||||||
if (control->type == 1 && y < (control->top + 21))
|
if (control->type == WND_TYPE_WND && y < (control->top + 21))
|
||||||
{ /* if dragging */
|
{ /* if dragging */
|
||||||
if (self->dragging) /* rarely happens */
|
if (self->dragging) /* rarely happens */
|
||||||
{
|
{
|
||||||
@ -947,3 +959,48 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
|
|||||||
self->button_down = 0;
|
self->button_down = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code)
|
||||||
|
{
|
||||||
|
int msg;
|
||||||
|
|
||||||
|
if (device_flags & 0x8000) /* key up */
|
||||||
|
{
|
||||||
|
self->keys[scan_code % 128] = 0;
|
||||||
|
msg = WM_KEYUP;
|
||||||
|
}
|
||||||
|
else /* key down */
|
||||||
|
{
|
||||||
|
self->keys[scan_code % 128] = 1;
|
||||||
|
msg = WM_KEYDOWN;
|
||||||
|
switch (scan_code)
|
||||||
|
{
|
||||||
|
case 58: self->caps_lock = !self->caps_lock; break; /* caps lock */
|
||||||
|
case 69: self->num_lock = !self->num_lock; break; /* num lock */
|
||||||
|
case 70: self->scroll_lock = !self->scroll_lock; break; /* scroll lock */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self->focused_window != 0)
|
||||||
|
{
|
||||||
|
xrdp_bitmap_def_proc(self->focused_window,
|
||||||
|
msg, scan_code, device_flags);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* happens when client gets focus and sends key modifier info */
|
||||||
|
int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags)
|
||||||
|
{
|
||||||
|
self->num_lock = 0;
|
||||||
|
self->scroll_lock = 0;
|
||||||
|
self->caps_lock = 0;
|
||||||
|
if (key_flags & 1)
|
||||||
|
self->scroll_lock = 1;
|
||||||
|
if (key_flags & 2)
|
||||||
|
self->num_lock = 1;
|
||||||
|
if (key_flags & 4)
|
||||||
|
self->caps_lock = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user