work on logon edits

ulab-original
jsorg71 20 years ago
parent b4b62a619a
commit b95482e729

@ -1,8 +1,8 @@
XRDPOBJ = xrdp.o os_calls.o xrdp_tcp.o xrdp_iso.o xrdp_mcs.o xrdp_sec.o xrdp_rdp.o \ XRDPOBJ = xrdp.o os_calls.o xrdp_tcp.o xrdp_iso.o xrdp_mcs.o xrdp_sec.o \
xrdp_process.o xrdp_listen.o xrdp_orders.o xrdp_bitmap.o xrdp_wm.o \ xrdp_rdp.o xrdp_process.o xrdp_listen.o xrdp_orders.o \
xrdp_painter.o xrdp_list.o xrdp_region.o xrdp_cache.o xrdp_font.o \ xrdp_bitmap.o xrdp_wm.o xrdp_painter.o xrdp_list.o \
funcs.o xrdp_region.o xrdp_cache.o xrdp_font.o funcs.o
#CFLAGS = -Wall -O2 -DXRDP_DEBUG #CFLAGS = -Wall -O2 -DXRDP_DEBUG
CFLAGS = -Wall -O2 CFLAGS = -Wall -O2
LDFLAGS = -L /usr/gnu/lib LDFLAGS = -L /usr/gnu/lib

@ -268,3 +268,47 @@ char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
} }
return rv; return rv;
} }
/*****************************************************************************/
/* add a ch at index position in text, index starts at 0 */
/* if index = -1 add it to the end */
int add_char_at(char* text, char ch, int index)
{
int len;
int i;
len = g_strlen(text);
if (index >= len || index < 0)
{
text[len] = ch;
text[len + 1] = 0;
return 0;
}
for (i = len - 1; i >= index; i--)
text[i + 1] = text[i];
text[i + 1] = ch;
text[len + 1] = 0;
return 0;
}
/*****************************************************************************/
/* remove a ch at index position in text, index starts at 0 */
/* if index = -1 remove it from the end */
int remove_char_at(char* text, int index)
{
int len;
int i;
len = g_strlen(text);
if (len <= 0)
return 0;
if (index >= len - 1 || index < 0)
{
text[len - 1] = 0;
return 0;
}
for (i = index; i < len - 1; i++)
text[i] = text[i + 1];
text[len - 1] = 0;
return 0;
}

@ -55,7 +55,7 @@ static int g_term = 0;
#ifdef MEMLEAK #ifdef MEMLEAK
static int g_memsize = 0; static int g_memsize = 0;
static int g_memid = 0; static int g_memid = 0;
struct xrdp_list* g_memlist = 0; static struct xrdp_list* g_memlist = 0;
#endif #endif
/*****************************************************************************/ /*****************************************************************************/
@ -254,9 +254,9 @@ int g_tcp_set_non_blocking(int sck)
#ifdef _WIN32 #ifdef _WIN32
i = 1; i = 1;
ioctlsocket(sck, FIONBIO, &i); ioctlsocket(sck, FIONBIO, &i);
#else #else
i = fcntl(sck, F_GETFL); i = fcntl(sck, F_GETFL);
i = i | O_NONBLOCK; i = i | O_NONBLOCK;
fcntl(sck, F_SETFL, i); fcntl(sck, F_SETFL, i);
#endif #endif
@ -633,6 +633,16 @@ char* g_strcpy(char* dest, char* src)
return strcpy(dest, src); return strcpy(dest, src);
} }
/*****************************************************************************/
char* g_strncpy(char* dest, char* src, int len)
{
char* rv;
rv = strncpy(dest, src, len);
dest[len] = 0;
return rv;
}
/*****************************************************************************/ /*****************************************************************************/
char* g_strcat(char* dest, char* src) char* g_strcat(char* dest, char* src)
{ {

@ -36,45 +36,7 @@
#include "parse.h" #include "parse.h"
#include "xrdp_types.h" #include "xrdp_types.h"
#include "constants.h" #include "constants.h"
/* check for debug */ #include "xrdp_defines.h"
#ifdef XRDP_DEBUG
#define DEBUG(args) g_printf args;
#else
#define DEBUG(args)
#endif
/* other macros */
#define MIN(x1, x2) ((x1) < (x2) ? (x1) : (x2))
#define MAX(x1, x2) ((x1) > (x2) ? (x1) : (x2))
#define HIWORD(in) (((in) & 0xffff0000) >> 16)
#define LOWORD(in) ((in) & 0x0000ffff)
#define MAKELONG(hi, lo) ((((hi) & 0xffff) << 16) | ((lo) & 0xffff))
#define MAKERECT(r, x, y, cx, cy) \
{ (r).left = x; (r).top = y; (r).right = (x) + (cx); (r).bottom = (y) + (cy); }
#define ISRECTEMPTY(r) (((r).right <= (r).left) || ((r).bottom <= (r).top))
#define RECTOFFSET(r, dx, dy) \
{ (r).left += dx; (r).top += dy; (r).right += dx; (r).bottom += dy; }
#define GETPIXEL8(d, x, y, w) (*(((unsigned char*)d) + ((y) * (w) + (x))))
#define GETPIXEL16(d, x, y, w) (*(((unsigned short*)d) + ((y) * (w) + (x))))
#define GETPIXEL32(d, x, y, w) (*(((unsigned long*)d) + ((y) * (w) + (x))))
#define SETPIXEL8(d, x, y, w, v) \
(*(((unsigned char*)d) + ((y) * (w) + (x))) = (v))
#define SETPIXEL16(d, x, y, w, v) \
(*(((unsigned short*)d) + ((y) * (w) + (x))) = (v))
#define SETPIXEL32(d, x, y, w, v) \
(*(((unsigned long*)d) + ((y) * (w) + (x))) = (v))
#define COLOR15(r, g, b) ((((r) >> 3) << 10) | (((g) >> 3) << 5) | ((b) >> 3))
#define COLOR16(r, g, b) ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))
#define COLOR24(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
/* font macros */
#define FONT_DATASIZE(f) ((((f)->height * (((f)->width + 7) / 8)) + 3) & ~3);
#ifdef _WIN32
#define THREAD_RV unsigned long
#define THREAD_CC __stdcall
#else
#define THREAD_RV void*
#define THREAD_CC
#endif
/* os_calls.c */ /* os_calls.c */
int g_init_system(void); int g_init_system(void);
@ -128,6 +90,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_strncpy(char* dest, char* src, int len);
char* g_strcat(char* dest, char* src); char* g_strcat(char* dest, char* src);
/* xrdp_tcp.c */ /* xrdp_tcp.c */
@ -330,3 +293,6 @@ int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
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, char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
int caps_lock, int num_lock, int scroll_lock); 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);

@ -359,6 +359,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
struct xrdp_rect r1; struct xrdp_rect r1;
struct xrdp_rect r2; struct xrdp_rect r2;
struct xrdp_painter* painter; struct xrdp_painter* painter;
char text[256];
if (self == 0) /* if no bitmap */ if (self == 0) /* if no bitmap */
return 0; return 0;
@ -533,6 +534,20 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
/* draw text */ /* draw text */
painter->fg_color = self->wm->black; painter->fg_color = self->wm->black;
xrdp_painter_draw_text(painter, self, 4, 2, self->caption); xrdp_painter_draw_text(painter, self, 4, 2, self->caption);
/* draw xor box */
if (self->parent != 0)
{
if (self->parent->focused_control == self)
{
g_strncpy(text, self->caption, self->edit_pos);
w = xrdp_painter_text_width(painter, text);
painter->fg_color = self->wm->black;
painter->rop = 0x5a;
xrdp_painter_fill_rect(painter, self, 4 + w, 3, 2, self->height - 6);
}
}
/* reset rop back */
painter->rop = 0xcc;
} }
else if (self->type == WND_TYPE_LABEL) /* 6 */ else if (self->type == WND_TYPE_LABEL) /* 6 */
{ {
@ -569,11 +584,13 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
int param1, int param2) int param1, int param2)
{ {
char c; char c;
char a[2];
int n; int n;
int i; int i;
int shift; int shift;
int ext;
int scan_code;
struct xrdp_bitmap* b; struct xrdp_bitmap* b;
struct xrdp_bitmap* focus_out_control;
if (self == 0) if (self == 0)
return 0; return 0;
@ -583,7 +600,8 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
{ {
if (msg == WM_KEYDOWN) if (msg == WM_KEYDOWN)
{ {
if (param1 == 15) /* tab */ scan_code = param1 % 128;
if (scan_code == 15) /* tab */
{ {
/* move to next tab stop */ /* move to next tab stop */
shift = self->wm->keys[42] || self->wm->keys[54]; shift = self->wm->keys[42] || self->wm->keys[54];
@ -609,7 +627,10 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
n--; n--;
if (b->tab_stop) if (b->tab_stop)
{ {
focus_out_control = self->focused_control;
self->focused_control = b; self->focused_control = b;
xrdp_bitmap_invalidate(focus_out_control, 0);
xrdp_bitmap_invalidate(b, 0);
break; break;
} }
if (shift) if (shift)
@ -637,26 +658,87 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
{ {
if (msg == WM_KEYDOWN) if (msg == WM_KEYDOWN)
{ {
if (param1 == 14) /* backspace */ scan_code = param1 % 128;
ext = param2 & 0x0100;
/* left or up arrow */
if ((scan_code == 75 || scan_code == 72) &&
(ext || self->wm->num_lock == 0))
{
if (self->edit_pos > 0)
{
self->edit_pos--;
xrdp_bitmap_invalidate(self, 0);
}
}
/* right or down arrow */
else if ((scan_code == 77 || scan_code == 80) &&
(ext || self->wm->num_lock == 0))
{
if (self->edit_pos < g_strlen(self->caption))
{
self->edit_pos++;
xrdp_bitmap_invalidate(self, 0);
}
}
/* backspace */
else if (scan_code == 14)
{
n = g_strlen(self->caption);
if (n > 0)
{
if (self->edit_pos > 0)
{
self->edit_pos--;
remove_char_at(self->caption, self->edit_pos);
xrdp_bitmap_invalidate(self, 0);
}
}
}
/* delete */
else if (scan_code == 83 &&
(ext || self->wm->num_lock == 0))
{ {
n = g_strlen(self->caption); n = g_strlen(self->caption);
if (n > 0) if (n > 0)
{ {
self->caption[n - 1] = 0; if (self->edit_pos < n)
{
remove_char_at(self->caption, self->edit_pos);
xrdp_bitmap_invalidate(self, 0);
}
}
}
/* end */
else if (scan_code == 79 &&
(ext || self->wm->num_lock == 0))
{
n = g_strlen(self->caption);
if (self->edit_pos < n)
{
self->edit_pos = n;
xrdp_bitmap_invalidate(self, 0);
}
}
/* home */
else if (scan_code == 71 &&
(ext || self->wm->num_lock == 0))
{
if (self->edit_pos > 0)
{
self->edit_pos = 0;
xrdp_bitmap_invalidate(self, 0); xrdp_bitmap_invalidate(self, 0);
} }
} }
else else
{ {
c = get_char_from_scan_code(param2, param1, self->wm->keys, c = get_char_from_scan_code(param2, scan_code, self->wm->keys,
self->wm->caps_lock, self->wm->caps_lock,
self->wm->num_lock, self->wm->num_lock,
self->wm->scroll_lock); self->wm->scroll_lock);
if (c != 0) if (c != 0)
{ {
a[0] = c; add_char_at(self->caption, c, self->edit_pos);
a[1] = 0; self->edit_pos++;
g_strcat(self->caption, a);
xrdp_bitmap_invalidate(self, 0); xrdp_bitmap_invalidate(self, 0);
} }
} }

@ -347,7 +347,7 @@ int xrdp_painter_text_width(struct xrdp_painter* self, char* text)
len = g_strlen(text); len = g_strlen(text);
for (index = 0; index < len; index++) for (index = 0; index < len; index++)
{ {
font_item = self->font->font_items + text[index]; font_item = self->font->font_items + (unsigned char)text[index];
rv = rv + font_item->incby; rv = rv + font_item->incby;
} }
return rv; return rv;
@ -365,7 +365,7 @@ int xrdp_painter_text_height(struct xrdp_painter* self, char* text)
len = g_strlen(text); len = g_strlen(text);
for (index = 0; index < len; index++) for (index = 0; index < len; index++)
{ {
font_item = self->font->font_items + text[index]; font_item = self->font->font_items + (unsigned char)text[index];
rv = MAX(rv, font_item->height); rv = MAX(rv, font_item->height);
} }
return rv; return rv;
@ -412,7 +412,7 @@ int xrdp_painter_draw_text(struct xrdp_painter* self,
data = (char*)g_malloc(len * 4, 1); data = (char*)g_malloc(len * 4, 1);
for (index = 0; index < len; index++) for (index = 0; index < len; index++)
{ {
font_item = font->font_items + text[index]; font_item = font->font_items + (unsigned char)text[index];
i = xrdp_cache_add_char(self->wm->cache, font_item); i = xrdp_cache_add_char(self->wm->cache, font_item);
f = HIWORD(i); f = HIWORD(i);
c = LOWORD(i); c = LOWORD(i);

@ -369,31 +369,39 @@ struct xrdp_painter
/* window or bitmap */ /* window or bitmap */
struct xrdp_bitmap struct xrdp_bitmap
{ {
int type; /* 0 = bitmap 1 = window 2 = screen 3 = button 4 = image 5 = edit 6 = label */ /* 0 = bitmap 1 = window 2 = screen 3 = button 4 = image 5 = edit
int state; /* for button 0 = normal 1 = down */ 6 = label */
int id; int type;
char* data;
int width; int width;
int height; int height;
struct xrdp_wm* wm;
/* msg 1 = click 2 = mouse move 3 = paint 100 = modal result */
/* see messages in constants.h */
int (*notify)(struct xrdp_bitmap* wnd, struct xrdp_bitmap* sender,
int msg, int param1, int param2);
/* for bitmap */
int bpp; int bpp;
int line_size; /* in bytes */
char* data;
/* for all but bitmap */
int left; int left;
int top; int top;
int cursor;
int bg_color; int bg_color;
int line_size; /* in bytes */
int focused;
int tab_stop; int tab_stop;
int focused;
int id;
char caption[256]; char caption[256];
/* for window or screen */
struct xrdp_bitmap* modal_dialog; struct xrdp_bitmap* modal_dialog;
struct xrdp_bitmap* focused_control; 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;
struct xrdp_wm* wm; /* for edit */
int cursor;
int edit_pos; int edit_pos;
/* msg 1 = click 2 = mouse move 3 = paint 100 = modal result */ /* for button */
int (*notify)(struct xrdp_bitmap* wnd, struct xrdp_bitmap* sender, int state; /* for button 0 = normal 1 = down */
int msg, int param1, int param2);
}; };
/* font */ /* font */

@ -16,7 +16,6 @@
xrdp: A Remote Desktop Protocol server. xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2004 Copyright (C) Jay Sorg 2004
xrdp: A Remote Desktop Protocol server.
simple window manager simple window manager
*/ */
@ -469,7 +468,7 @@ 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->caption, "Logon to xrdp"); g_strcpy(self->login_window->caption, "Logon to xrdp");
/* image */ /* image */
but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE); but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE);
@ -861,6 +860,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_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
{ {
struct xrdp_bitmap* control; struct xrdp_bitmap* control;
struct xrdp_bitmap* focus_out_control;
struct xrdp_bitmap* wnd; struct xrdp_bitmap* wnd;
int newx; int newx;
int newy; int newy;
@ -903,7 +903,12 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down)
if (control == wnd) if (control == wnd)
wnd->focused_control = 0; wnd->focused_control = 0;
else else
{
focus_out_control = wnd->focused_control;
wnd->focused_control = control; wnd->focused_control = control;
xrdp_bitmap_invalidate(focus_out_control, 0);
}
xrdp_bitmap_invalidate(control, 0);
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;
} }

Loading…
Cancel
Save