more work on combo box

This commit is contained in:
jsorg71 2004-11-12 04:43:08 +00:00
parent ea265279ef
commit 0be4f03392
6 changed files with 253 additions and 36 deletions

View File

@ -399,20 +399,23 @@
#define RDP_ORDER_BMPCACHE2 5
/* drawable types */
#define WND_TYPE_BITMAP 0
#define WND_TYPE_WND 1
#define WND_TYPE_SCREEN 2
#define WND_TYPE_BUTTON 3
#define WND_TYPE_IMAGE 4
#define WND_TYPE_EDIT 5
#define WND_TYPE_LABEL 6
#define WND_TYPE_COMBO 7
#define WND_TYPE_BITMAP 0
#define WND_TYPE_WND 1
#define WND_TYPE_SCREEN 2
#define WND_TYPE_BUTTON 3
#define WND_TYPE_IMAGE 4
#define WND_TYPE_EDIT 5
#define WND_TYPE_LABEL 6
#define WND_TYPE_COMBO 7
#define WND_TYPE_SPECIAL 8
/* button states */
#define BUTTON_STATE_UP 0
#define BUTTON_STATE_DOWN 1
/* messages */
#define WM_PAINT 3
#define WM_KEYDOWN 15
#define WM_KEYUP 16
#define WM_PAINT 3
#define WM_KEYDOWN 15
#define WM_KEYUP 16
#define WM_MOUSEMOVE 100
#define WM_LBUTTONUP 101

View File

@ -312,3 +312,13 @@ int remove_char_at(char* text, int index)
text[len - 1] = 0;
return 0;
}
/*****************************************************************************/
int set_string(char** in_str, char* in)
{
if (in_str == 0)
return 0;
g_free(*in_str);
*in_str = g_strdup(in);
return 0;
}

View File

@ -209,6 +209,7 @@ 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_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);
int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control);
/* xrdp_process.c */
struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner);
@ -246,6 +247,10 @@ 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_def_proc(struct xrdp_bitmap* self, int msg,
int param1, int param2);
int xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x);
int xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y);
int xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x);
int xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y);
/* xrdp_painter.c */
struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wn);
@ -296,4 +301,5 @@ char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
int caps_lock, int num_lock, int scroll_lock);
int add_char_at(char* text, char ch, int index);
int remove_char_at(char* text, int index);
int set_string(char** in_str, char* in);

View File

@ -77,6 +77,8 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self)
self->wm->dragging_window = 0;
if (self->wm->button_down == self)
self->wm->button_down = 0;
if (self->wm->popup_wnd == self)
self->wm->popup_wnd = 0;
}
if (self->child_list != 0)
{
@ -473,6 +475,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
struct xrdp_rect r2;
struct xrdp_painter* painter;
char text[256];
char* p;
if (self == 0) /* if no bitmap */
return 0;
@ -693,6 +696,32 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
else
xrdp_bitmap_draw_button(self, painter, x, y, w, h, 1);
}
else if (self->type == WND_TYPE_SPECIAL) /* 8 special */
{
painter->fg_color = self->wm->white;
xrdp_painter_fill_rect(painter, self, 0, 0, self->width, self->height);
/* draw the list items */
if (self->popped_from != 0)
{
y = 0;
for (i = 0; i < self->popped_from->string_list->count; i++)
{
p = (char*)xrdp_list_get_item(self->popped_from->string_list, i);
h = xrdp_painter_text_height(painter, p);
self->item_height = h;
if (i == self->item_index)
{
painter->fg_color = self->wm->blue;
xrdp_painter_fill_rect(painter, self, 0, y, self->width, h);
painter->font->color = self->wm->white;
}
else
painter->font->color = self->wm->black;
xrdp_painter_draw_text(painter, self, 2, y, p);
y = y + h;
}
}
}
/* notify */
if (self->notify != 0)
self->notify(self, self, WM_PAINT, (int)painter, 0); /* 3 */
@ -911,5 +940,90 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
}
}
}
else if (self->type == WND_TYPE_SPECIAL)
{
if (msg == WM_MOUSEMOVE)
{
if (self->item_height > 0 && self->popped_from != 0)
{
i = param2;
i = i / self->item_height;
if (i != self->item_index &&
i < self->popped_from->string_list->count)
{
self->item_index = i;
xrdp_bitmap_invalidate(self, 0);
}
}
}
else if (msg == WM_LBUTTONUP)
{
if (self->popped_from != 0)
{
self->popped_from->item_index = self->item_index;
xrdp_bitmap_invalidate(self->popped_from, 0);
}
}
}
return 0;
}
/*****************************************************************************/
/* convert the controls coords to screen coords */
int xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x)
{
int i;
i = x;
while (self != 0)
{
i = i + self->left;
self = self->parent;
}
return i;
}
/*****************************************************************************/
/* convert the controls coords to screen coords */
int xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y)
{
int i;
i = y;
while (self != 0)
{
i = i + self->top;
self = self->parent;
}
return i;
}
/*****************************************************************************/
/* convert the screen coords to controls coords */
int xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x)
{
int i;
i = x;
while (self != 0)
{
i = i - self->left;
self = self->parent;
}
return i;
}
/*****************************************************************************/
/* convert the screen coords to controls coords */
int xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y)
{
int i;
i = y;
while (self != 0)
{
i = i - self->top;
self = self->parent;
}
return i;
}

View File

@ -312,6 +312,8 @@ struct xrdp_wm
struct xrdp_bitmap* dragging_window;
/* the down(clicked) button */
struct xrdp_bitmap* button_down;
/* popup for combo box */
struct xrdp_bitmap* popup_wnd;
/* focused window */
struct xrdp_bitmap* focused_window;
/* cursor */
@ -372,7 +374,7 @@ struct xrdp_painter
struct xrdp_bitmap
{
/* 0 = bitmap 1 = window 2 = screen 3 = button 4 = image 5 = edit
6 = label 7 = combo */
6 = label 7 = combo 8 = special */
int type;
int width;
int height;
@ -406,7 +408,11 @@ struct xrdp_bitmap
int state; /* for button 0 = normal 1 = down */
/* for combo */
struct xrdp_list* string_list;
/* for combo or popup */
int item_index;
/* for popup */
struct xrdp_bitmap* popped_from;
int item_height;
};
/* font */

View File

@ -574,10 +574,10 @@ int xrdp_wm_init(struct xrdp_wm* self)
but->top = 110;
but->id = 6;
but->tab_stop = 1;
xrdp_list_add_item(but->string_list, (int)g_strdup("X11 Session"));
xrdp_list_add_item(but->string_list, (int)g_strdup("VNC"));
xrdp_list_add_item(but->string_list, (int)g_strdup("Desktop"));
xrdp_list_add_item(but->string_list, (int)g_strdup("Test"));
xrdp_list_add_item(but->string_list, (int)g_strdup("VNC"));
xrdp_list_add_item(but->string_list, (int)g_strdup("X11"));
xrdp_list_add_item(but->string_list, (int)g_strdup("Console"));
/* button */
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON);
@ -892,6 +892,9 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y)
xrdp_set_cursor(self, b->cursor);
self->current_cursor = b->cursor;
}
xrdp_bitmap_def_proc(b, WM_MOUSEMOVE,
xrdp_bitmap_from_screenx(b, x),
xrdp_bitmap_from_screeny(b, y));
if (self->button_down == 0)
if (b->notify != 0)
b->notify(b->owner, b, 2, x, y);
@ -901,6 +904,28 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y)
return 0;
}
/*****************************************************************************/
int xrdp_wm_clear_popup(struct xrdp_wm* self)
{
int i;
struct xrdp_rect rect;
//struct xrdp_bitmap* b;
//b = 0;
if (self->popup_wnd != 0)
{
//b = self->popup_wnd->popped_from;
i = xrdp_list_index_of(self->screen->child_list, (int)self->popup_wnd);
xrdp_list_remove_item(self->screen->child_list, i);
MAKERECT(rect, self->popup_wnd->left, self->popup_wnd->top,
self->popup_wnd->width, self->popup_wnd->height);
xrdp_bitmap_invalidate(self->screen, &rect);
xrdp_bitmap_delete(self->popup_wnd);
}
//xrdp_wm_set_focused(self, b->parent);
return 0;
}
/*****************************************************************************/
int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
{
@ -941,6 +966,22 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
}
wnd = 0;
control = xrdp_wm_at_pos(self->screen, x, y, &wnd);
if (self->popup_wnd != 0)
{
if (self->popup_wnd == control && !down)
{
xrdp_bitmap_def_proc(self->popup_wnd, WM_LBUTTONUP, x, y);
xrdp_wm_clear_popup(self);
self->button_down = 0;
return 0;
}
else if (self->popup_wnd != control && down)
{
xrdp_wm_clear_popup(self);
self->button_down = 0;
return 0;
}
}
if (control != 0)
{
if (wnd != 0)
@ -976,31 +1017,36 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
self->button_down = control;
control->state = 1;
xrdp_bitmap_invalidate(control, 0);
if (control->type == WND_TYPE_COMBO)
xrdp_wm_pu(self, control);
}
else if (but == 1 && down)
{
xrdp_wm_set_focused(self, wnd);
if (control->type == WND_TYPE_WND && y < (control->top + 21))
{ /* if dragging */
if (self->dragging) /* rarely happens */
{
newx = self->draggingx - self->draggingdx;
newy = self->draggingy - self->draggingdy;
if (self->draggingxorstate)
xrdp_wm_xor_pat(self, newx, newy,
self->draggingcx, self->draggingcy);
self->draggingxorstate = 0;
if (self->popup_wnd == 0)
{
xrdp_wm_set_focused(self, wnd);
if (control->type == WND_TYPE_WND && y < (control->top + 21))
{ /* if dragging */
if (self->dragging) /* rarely happens */
{
newx = self->draggingx - self->draggingdx;
newy = self->draggingy - self->draggingdy;
if (self->draggingxorstate)
xrdp_wm_xor_pat(self, newx, newy,
self->draggingcx, self->draggingcy);
self->draggingxorstate = 0;
}
self->dragging = 1;
self->dragging_window = control;
self->draggingorgx = control->left;
self->draggingorgy = control->top;
self->draggingx = x;
self->draggingy = y;
self->draggingdx = x - control->left;
self->draggingdy = y - control->top;
self->draggingcx = control->width;
self->draggingcy = control->height;
}
self->dragging = 1;
self->dragging_window = control;
self->draggingorgx = control->left;
self->draggingorgy = control->top;
self->draggingx = x;
self->draggingy = y;
self->draggingdx = x - control->left;
self->draggingdy = y - control->top;
self->draggingcx = control->width;
self->draggingcy = control->height;
}
}
}
@ -1018,6 +1064,11 @@ int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code)
{
int msg;
if (self->popup_wnd != 0)
{
xrdp_wm_clear_popup(self);
return 0;
}
if (device_flags & 0x8000) /* key up */
{
self->keys[scan_code % 128] = 0;
@ -1057,3 +1108,30 @@ int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags)
self->caps_lock = 1;
return 0;
}
/*****************************************************************************/
int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control)
{
int x;
int y;
if (self == 0)
return 0;
if (control == 0)
return 0;
self->popup_wnd = xrdp_bitmap_create(control->width, 100,
self->screen->bpp,
WND_TYPE_SPECIAL);
self->popup_wnd->popped_from = control;
self->popup_wnd->parent = self->screen;
self->popup_wnd->owner = self->screen;
self->popup_wnd->wm = self;
x = xrdp_bitmap_to_screenx(control, 0);
y = xrdp_bitmap_to_screeny(control, 0);
self->popup_wnd->left = x;
self->popup_wnd->top = y + control->height;
self->popup_wnd->item_index = control->item_index;
xrdp_list_insert_item(self->screen->child_list, 0, (int)self->popup_wnd);
xrdp_bitmap_invalidate(self->popup_wnd, 0);
return 0;
}