added connection log

ulab-original
jsorg71 20 years ago
parent 8e807eefd2
commit d5dea39baf

@ -141,7 +141,9 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
/* just send tab and if the shift modifier is down */ /* just send tab and if the shift modifier is down */
/* the server will know */ /* the server will know */
/* for now, sending left tab, I don't know which is best */ /* for now, sending left tab, I don't know which is best */
key = (v->shift_state) ? 0xfe20 : 0xff09; /* nope, sending tab always */
/* key = (v->shift_state) ? 0xfe20 : 0xff09; */
key = 0xff09;
break; break;
case 0x001c: /* enter */ case 0x001c: /* enter */
key = 0xff0d; key = 0xff0d;
@ -692,20 +694,13 @@ int lib_mod_start(struct vnc* v, int w, int h, int bpp)
/******************************************************************************/ /******************************************************************************/
/* /*
return error return error
these are wrong.....
1 - authentation failed
2 - authentation failed
3 - server name length received from server too long
4 - server and client bpp do not match
5 - no more available X desktops when spawning a new session
6 - no ip
7 - sck closed
*/ */
int lib_mod_connect(struct vnc* v) int lib_mod_connect(struct vnc* v)
{ {
char cursor_data[32 * (32 * 3)]; char cursor_data[32 * (32 * 3)];
char cursor_mask[32 * (32 / 8)]; char cursor_mask[32 * (32 / 8)];
char con_port[256]; char con_port[256];
char text[256];
struct stream* s; struct stream* s;
struct stream* pixel_format; struct stream* pixel_format;
int error; int error;
@ -717,24 +712,29 @@ int lib_mod_connect(struct vnc* v)
int ok; int ok;
int display; int display;
v->server_msg(v, "started connecting");
check_sec_result = 1; check_sec_result = 1;
/* only support 8 and 16 bpp connections from rdp client */ /* only support 8 and 16 bpp connections from rdp client */
if (v->server_bpp != 8 && v->server_bpp != 16) if (v->server_bpp != 8 && v->server_bpp != 16)
{ {
v->server_msg(v, "error - only supporting 8 and 16 bpp rdp connections");
return 1; return 1;
} }
if (g_strcmp(v->ip, "") == 0) if (g_strcmp(v->ip, "") == 0)
{ {
return 6; v->server_msg(v, "error - no ip set");
return 1;
} }
make_stream(s); make_stream(s);
/* if port = -1, use sesman to get port / desktop */
if (g_strcmp(v->port, "-1") == 0) if (g_strcmp(v->port, "-1") == 0)
{ {
i = 0; display = 0;
error = 0; error = 0;
init_stream(s, 8192); init_stream(s, 8192);
v->sck = g_tcp_socket(); v->sck = g_tcp_socket();
v->sck_closed = 0; v->sck_closed = 0;
v->server_msg(v, "connecting to sesman");
if (g_tcp_connect(v->sck, v->ip, "3350") == 0) if (g_tcp_connect(v->sck, v->ip, "3350") == 0)
{ {
g_tcp_set_non_blocking(v->sck); g_tcp_set_non_blocking(v->sck);
@ -754,10 +754,12 @@ int lib_mod_connect(struct vnc* v)
s_pop_layer(s, channel_hdr); s_pop_layer(s, channel_hdr);
out_uint32_be(s, 0); // version out_uint32_be(s, 0); // version
out_uint32_be(s, s->end - s->data); // size out_uint32_be(s, s->end - s->data); // size
v->server_msg(v, "sending login info to sesman");
error = lib_send(v, s->data, s->end - s->data); error = lib_send(v, s->data, s->end - s->data);
if (error == 0) if (error == 0)
{ {
init_stream(s, 8192); init_stream(s, 8192);
v->server_msg(v, "receiving sesman header");
error = lib_recv(v, s->data, 8); error = lib_recv(v, s->data, 8);
} }
if (error == 0) if (error == 0)
@ -765,6 +767,7 @@ int lib_mod_connect(struct vnc* v)
in_uint32_be(s, version); in_uint32_be(s, version);
in_uint32_be(s, size); in_uint32_be(s, size);
init_stream(s, 8192); init_stream(s, 8192);
v->server_msg(v, "receiving sesman data");
error = lib_recv(v, s->data, size - 8); error = lib_recv(v, s->data, size - 8);
} }
if (error == 0) if (error == 0)
@ -775,23 +778,33 @@ int lib_mod_connect(struct vnc* v)
if (code == 3) if (code == 3)
{ {
in_uint16_be(s, ok); in_uint16_be(s, ok);
in_uint16_be(s, display);
if (ok) if (ok)
{ {
i = display; in_uint16_be(s, display);
}
else
{
in_uint8s(s, 2);
v->server_msg(v, "error - sesman returned no");
} }
} }
} }
} }
} }
else
{
v->server_msg(v, "error - connecting to sesman");
}
g_tcp_close(v->sck); g_tcp_close(v->sck);
if (error != 0 || i == 0) if (error != 0 || display == 0)
{ {
v->server_msg(v, "error - connection failed");
free_stream(s); free_stream(s);
return 5; return 1;
} }
g_sprintf(con_port, "%d", 5900 + i); v->server_msg(v, "sesman started a session");
v->vnc_desktop = i; g_sprintf(con_port, "%d", 5900 + display);
v->vnc_desktop = display;
} }
else else
{ {
@ -800,9 +813,12 @@ int lib_mod_connect(struct vnc* v)
make_stream(pixel_format); make_stream(pixel_format);
v->sck = g_tcp_socket(); v->sck = g_tcp_socket();
v->sck_closed = 0; v->sck_closed = 0;
g_sprintf(text, "connecting to %s %s", v->ip, con_port);
v->server_msg(v, text);
error = g_tcp_connect(v->sck, v->ip, con_port); error = g_tcp_connect(v->sck, v->ip, con_port);
if (error == 0) if (error == 0)
{ {
v->server_msg(v, "tcp connected");
g_tcp_set_non_blocking(v->sck); g_tcp_set_non_blocking(v->sck);
g_tcp_set_no_delay(v->sck); g_tcp_set_no_delay(v->sck);
/* protocal version */ /* protocal version */
@ -821,6 +837,8 @@ int lib_mod_connect(struct vnc* v)
if (error == 0) if (error == 0)
{ {
in_uint32_be(s, i); in_uint32_be(s, i);
g_sprintf(text, "security level is %d (1 = none, 2 = standard)", i);
v->server_msg(v, text);
if (i == 1) /* none */ if (i == 1) /* none */
{ {
check_sec_result = 0; check_sec_result = 0;
@ -851,18 +869,25 @@ int lib_mod_connect(struct vnc* v)
in_uint32_be(s, i); in_uint32_be(s, i);
if (i != 0) if (i != 0)
{ {
v->server_msg(v, "password failed");
error = 2; error = 2;
} }
else
{
v->server_msg(v, "password ok");
}
} }
} }
if (error == 0) if (error == 0)
{ {
v->server_msg(v, "sending share flag");
init_stream(s, 8192); init_stream(s, 8192);
s->data[0] = 1; s->data[0] = 1;
error = lib_send(v, s->data, 1); /* share flag */ error = lib_send(v, s->data, 1); /* share flag */
} }
if (error == 0) if (error == 0)
{ {
v->server_msg(v, "receiving server init");
error = lib_recv(v, s->data, 4); /* server init */ error = lib_recv(v, s->data, 4); /* server init */
} }
if (error == 0) if (error == 0)
@ -870,12 +895,14 @@ int lib_mod_connect(struct vnc* v)
in_uint16_be(s, v->mod_width); in_uint16_be(s, v->mod_width);
in_uint16_be(s, v->mod_height); in_uint16_be(s, v->mod_height);
init_stream(pixel_format, 8192); init_stream(pixel_format, 8192);
v->server_msg(v, "receiving pixel format");
error = lib_recv(v, pixel_format->data, 16); error = lib_recv(v, pixel_format->data, 16);
} }
if (error == 0) if (error == 0)
{ {
v->mod_bpp = v->server_bpp; v->mod_bpp = v->server_bpp;
init_stream(s, 8192); init_stream(s, 8192);
v->server_msg(v, "receiving name length");
error = lib_recv(v, s->data, 4); /* name len */ error = lib_recv(v, s->data, 4); /* name len */
} }
if (error == 0) if (error == 0)
@ -887,6 +914,7 @@ int lib_mod_connect(struct vnc* v)
} }
else else
{ {
v->server_msg(v, "receiving name");
error = lib_recv(v, v->mod_name, i); error = lib_recv(v, v->mod_name, i);
v->mod_name[i] = 0; v->mod_name[i] = 0;
} }
@ -930,6 +958,7 @@ int lib_mod_connect(struct vnc* v)
out_uint8s(pixel_format, 3); /* pad */ out_uint8s(pixel_format, 3); /* pad */
} }
out_uint8a(s, pixel_format->data, 16); out_uint8a(s, pixel_format->data, 16);
v->server_msg(v, "sending pixel format");
error = lib_send(v, s->data, 20); error = lib_send(v, s->data, 20);
} }
if (error == 0) if (error == 0)
@ -942,6 +971,7 @@ int lib_mod_connect(struct vnc* v)
out_uint32_be(s, 0); /* raw */ out_uint32_be(s, 0); /* raw */
out_uint32_be(s, 1); /* copy rect */ out_uint32_be(s, 1); /* copy rect */
out_uint32_be(s, 0xffffff11); /* cursor */ out_uint32_be(s, 0xffffff11); /* cursor */
v->server_msg(v, "sending encodings");
error = lib_send(v, s->data, 4 + 3 * 4); error = lib_send(v, s->data, 4 + 3 * 4);
} }
if (error == 0) if (error == 0)
@ -954,28 +984,38 @@ int lib_mod_connect(struct vnc* v)
out_uint16_be(s, 0); out_uint16_be(s, 0);
out_uint16_be(s, v->mod_width); out_uint16_be(s, v->mod_width);
out_uint16_be(s, v->mod_height); out_uint16_be(s, v->mod_height);
v->server_msg(v, "sending framebuffer update request");
error = lib_send(v, s->data, 10); error = lib_send(v, s->data, 10);
} }
if (error == 0) if (error == 0)
{ {
v->server_error_popup(v, "hi", "Hi");
if (v->server_bpp != v->mod_bpp) if (v->server_bpp != v->mod_bpp)
{ {
error = 4; v->server_msg(v, "error - server and client bpp don't match");
error = 1;
} }
} }
if (error == 0) if (error == 0)
{ {
/* set almost null cursor */ /* set almost null cursor, this is the little dot cursor */
g_memset(cursor_data, 0, 32 * (32 * 3)); g_memset(cursor_data, 0, 32 * (32 * 3));
g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9); g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9);
g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9); g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9);
g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9); g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9);
g_memset(cursor_mask, 0xff, 32 * (32 / 8)); g_memset(cursor_mask, 0xff, 32 * (32 / 8));
v->server_msg(v, "sending cursor");
error = v->server_set_cursor(v, 3, 3, cursor_data, cursor_mask); error = v->server_set_cursor(v, 3, 3, cursor_data, cursor_mask);
} }
free_stream(s); free_stream(s);
free_stream(pixel_format); free_stream(pixel_format);
if (error == 0)
{
v->server_msg(v, "connection complete, connected ok");
}
else
{
v->server_msg(v, "error - problem connecting");
}
return error; return error;
} }
@ -1011,7 +1051,7 @@ int lib_mod_set_param(struct vnc* v, char* name, char* value)
} }
/******************************************************************************/ /******************************************************************************/
int mod_init() struct vnc* mod_init(void)
{ {
struct vnc* v; struct vnc* v;
@ -1025,7 +1065,7 @@ int mod_init()
v->mod_signal = lib_mod_signal; v->mod_signal = lib_mod_signal;
v->mod_end = lib_mod_end; v->mod_end = lib_mod_end;
v->mod_set_param = lib_mod_set_param; v->mod_set_param = lib_mod_set_param;
return (int)v; return v;
} }
/******************************************************************************/ /******************************************************************************/

@ -48,10 +48,10 @@ struct vnc
char* data); char* data);
int (*server_set_cursor)(struct vnc* v, int x, int y, char* data, char* mask); int (*server_set_cursor)(struct vnc* v, int x, int y, char* data, char* mask);
int (*server_palette)(struct vnc* v, int* palette); int (*server_palette)(struct vnc* v, int* palette);
int (*server_error_popup)(struct vnc* v, char* error, char* caption); int (*server_msg)(struct vnc* v, char* msg);
int (*server_is_term)(struct vnc* v); int (*server_is_term)(struct vnc* v);
/* common */ /* common */
long handle; /* pointer to self as int */ long handle; /* pointer to self as long */
long wm; long wm;
long painter; long painter;
int sck; int sck;

@ -23,16 +23,25 @@
#include "xrdp.h" #include "xrdp.h"
/*****************************************************************************/ /*****************************************************************************/
/* returns boolean */
int rect_contains_pt(struct xrdp_rect* in, int x, int y) int rect_contains_pt(struct xrdp_rect* in, int x, int y)
{ {
if (x < in->left) if (x < in->left)
{
return 0; return 0;
}
if (y < in->top) if (y < in->top)
{
return 0; return 0;
}
if (x >= in->right) if (x >= in->right)
{
return 0; return 0;
}
if (y >= in->bottom) if (y >= in->bottom)
{
return 0; return 0;
}
return 1; return 1;
} }
@ -44,19 +53,31 @@ int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
struct xrdp_rect dumby; struct xrdp_rect dumby;
if (out == 0) if (out == 0)
{
out = &dumby; out = &dumby;
}
*out = *in1; *out = *in1;
if (in2->left > in1->left) if (in2->left > in1->left)
{
out->left = in2->left; out->left = in2->left;
}
if (in2->top > in1->top) if (in2->top > in1->top)
{
out->top = in2->top; out->top = in2->top;
}
if (in2->right < in1->right) if (in2->right < in1->right)
{
out->right = in2->right; out->right = in2->right;
}
if (in2->bottom < in1->bottom) if (in2->bottom < in1->bottom)
{
out->bottom = in2->bottom; out->bottom = in2->bottom;
}
rv = !ISRECTEMPTY(*out); rv = !ISRECTEMPTY(*out);
if (!rv) if (!rv)
{
g_memset(out, 0, sizeof(struct xrdp_rect)); g_memset(out, 0, sizeof(struct xrdp_rect));
}
return rv; return rv;
} }
@ -66,9 +87,13 @@ 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)
{ {
if (*x >= b->width) if (*x >= b->width)
{
return 0; return 0;
}
if (*y >= b->height) if (*y >= b->height)
{
return 0; return 0;
}
if (*x < 0) if (*x < 0)
{ {
*cx += *x; *cx += *x;
@ -80,16 +105,25 @@ int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy)
*y = 0; *y = 0;
} }
if (*cx <= 0) if (*cx <= 0)
{
return 0; return 0;
}
if (*cy <= 0) if (*cy <= 0)
{
return 0; return 0;
}
if (*x + *cx > b->width) if (*x + *cx > b->width)
{
*cx = b->width - *x; *cx = b->width - *x;
}
if (*y + *cy > b->height) if (*y + *cy > b->height)
{
*cy = b->height - *y; *cy = b->height - *y;
}
return 1; return 1;
} }
/*****************************************************************************/
/* scan codes /* scan codes
1 esc 1 esc
2 1 or ? 2 1 or ?
@ -253,18 +287,28 @@ char get_char_from_scan_code(int device_flags, int scan_code, int* keys,
if (ext) if (ext)
{ {
if (scan_code == 53) if (scan_code == 53)
{
rv = '/'; rv = '/';
}
} }
else else
{ {
if (shift) if (shift)
{
rv = chars2[scan_code]; rv = chars2[scan_code];
}
else else
{
rv = chars1[scan_code]; rv = chars1[scan_code];
}
if (rv >= 'a' && rv <= 'z' && caps_lock) if (rv >= 'a' && rv <= 'z' && caps_lock)
{
rv = rv - ('a' - 'A'); rv = rv - ('a' - 'A');
}
else if (rv >= 'A' && rv <= 'Z' && caps_lock) else if (rv >= 'A' && rv <= 'Z' && caps_lock)
{
rv = rv + ('a' - 'A'); rv = rv + ('a' - 'A');
}
} }
return rv; return rv;
} }

@ -138,6 +138,9 @@ int xrdp_cache_add_char(struct xrdp_cache* self,
struct xrdp_font_item* font_item); struct xrdp_font_item* font_item);
int xrdp_cache_add_pointer(struct xrdp_cache* self, int xrdp_cache_add_pointer(struct xrdp_cache* self,
struct xrdp_pointer_item* pointer_item); struct xrdp_pointer_item* pointer_item);
int xrdp_cache_add_pointer_static(struct xrdp_cache* self,
struct xrdp_pointer_item* pointer_item,
int index);
/* xrdp_wm.c */ /* xrdp_wm.c */
struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner, struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner,
@ -292,6 +295,6 @@ int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy,
int server_set_pointer(struct xrdp_mod* mod, int x, int y, int server_set_pointer(struct xrdp_mod* mod, int x, int y,
char* data, char* mask); char* data, char* mask);
int server_palette(struct xrdp_mod* mod, int* palette); int server_palette(struct xrdp_mod* mod, int* palette);
int server_error_popup(struct xrdp_mod* mod, char* error, char* caption); int server_msg(struct xrdp_mod* mod, char* msg);
int server_is_term(struct xrdp_mod* mod); int server_is_term(struct xrdp_mod* mod);
#endif #endif

@ -173,6 +173,10 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self)
{ {
self->wm->login_window = 0; self->wm->login_window = 0;
} }
if (self->wm->log_wnd == self)
{
self->wm->log_wnd = 0;
}
} }
if (self->child_list != 0) if (self->child_list != 0)
{ {
@ -825,14 +829,20 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
char* p; char* p;
if (self == 0) /* if no bitmap */ if (self == 0) /* if no bitmap */
{
return 0; return 0;
}
if (self->type == WND_TYPE_BITMAP) /* if 0, bitmap, leave */ if (self->type == WND_TYPE_BITMAP) /* if 0, bitmap, leave */
{
return 0; return 0;
}
painter = xrdp_painter_create(self->wm); painter = xrdp_painter_create(self->wm);
xrdp_painter_font_needed(painter); xrdp_painter_font_needed(painter);
painter->rop = 0xcc; /* copy */ painter->rop = 0xcc; /* copy */
if (rect == 0) if (rect == 0)
{
painter->use_clip = 0; painter->use_clip = 0;
}
else else
{ {
if (ISRECTEMPTY(*rect)) if (ISRECTEMPTY(*rect))
@ -899,8 +909,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
y = rect->top; y = rect->top;
w = rect->right - rect->left; w = rect->right - rect->left;
h = rect->bottom - rect->top; h = rect->bottom - rect->top;
self->wm->mod->mod_event(self->wm->mod, WM_INVALIDATE, /* 200 */ if (check_bounds(self->wm->screen, &x, &y, &w, &h))
MAKELONG(x, y), MAKELONG(w, h)); {
self->wm->mod->mod_event(self->wm->mod, WM_INVALIDATE,
MAKELONG(x, y), MAKELONG(w, h));
}
} }
} }
} }

@ -340,7 +340,7 @@ int xrdp_cache_add_pointer(struct xrdp_cache* self,
} }
self->pointer_stamp++; self->pointer_stamp++;
/* look for match */ /* look for match */
for (i = 0; i < self->pointer_cache_entries; i++) for (i = 2; i < self->pointer_cache_entries; i++)
{ {
if (self->pointer_items[i].x == pointer_item->x && if (self->pointer_items[i].x == pointer_item->x &&
self->pointer_items[i].y == pointer_item->y && self->pointer_items[i].y == pointer_item->y &&
@ -351,14 +351,15 @@ int xrdp_cache_add_pointer(struct xrdp_cache* self,
{ {
self->pointer_items[i].stamp = self->pointer_stamp; self->pointer_items[i].stamp = self->pointer_stamp;
xrdp_wm_set_pointer(self->wm, i); xrdp_wm_set_pointer(self->wm, i);
self->wm->current_pointer = i;
DEBUG(("found pointer at %d\n\r", i)); DEBUG(("found pointer at %d\n\r", i));
return i; return i;
} }
} }
/* look for oldest */ /* look for oldest */
index = 0; index = 2;
oldest = 0x7fffffff; oldest = 0x7fffffff;
for (i = 0; i < self->pointer_cache_entries; i++) for (i = 2; i < self->pointer_cache_entries; i++)
{ {
if (self->pointer_items[i].stamp < oldest) if (self->pointer_items[i].stamp < oldest)
{ {
@ -378,6 +379,34 @@ int xrdp_cache_add_pointer(struct xrdp_cache* self,
self->pointer_items[index].mask, self->pointer_items[index].mask,
self->pointer_items[index].x, self->pointer_items[index].x,
self->pointer_items[index].y); self->pointer_items[index].y);
self->wm->current_pointer = index;
DEBUG(("adding pointer at %d\n\r", index));
return index;
}
/*****************************************************************************/
int xrdp_cache_add_pointer_static(struct xrdp_cache* self,
struct xrdp_pointer_item* pointer_item,
int index)
{
if (self == 0)
{
return 0;
}
self->pointer_items[index].x = pointer_item->x;
self->pointer_items[index].y = pointer_item->y;
g_memcpy(self->pointer_items[index].data,
pointer_item->data, 32 * 32 * 3);
g_memcpy(self->pointer_items[index].mask,
pointer_item->mask, 32 * 32 / 8);
self->pointer_items[index].stamp = self->pointer_stamp;
xrdp_wm_send_pointer(self->wm, index,
self->pointer_items[index].data,
self->pointer_items[index].mask,
self->pointer_items[index].x,
self->pointer_items[index].y);
self->wm->current_pointer = index;
DEBUG(("adding pointer at %d\n\r", index)); DEBUG(("adding pointer at %d\n\r", index));
return index; return index;
} }

@ -215,6 +215,61 @@ int server_palette(int* palette)
#else #else
/*****************************************************************************/
/* this is the log windows nofity function */
int xrdp_wm_log_wnd_notify(struct xrdp_bitmap* wnd,
struct xrdp_bitmap* sender,
int msg, int param1, int param2)
{
struct xrdp_painter* painter;
struct xrdp_wm* wm;
struct xrdp_rect rect;
int index;
char* text;
if (wnd == 0)
{
return 0;
}
if (sender == 0)
{
return 0;
}
if (wnd->owner == 0)
{
return 0;
}
wm = wnd->wm;
if (msg == 1) /* click */
{
if (sender->id == 1) /* ok button */
{
/* close the log window */
MAKERECT(rect, wnd->left, wnd->top, wnd->width, wnd->height);
xrdp_bitmap_delete(wnd);
xrdp_bitmap_invalidate(wm->screen, &rect);
if (wm->mod_handle == 0)
{
wm->pro_layer->term = 1; /* kill session */
}
}
}
else if (msg == WM_PAINT) /* 3 */
{
painter = (struct xrdp_painter*)param1;
if (painter != 0)
{
painter->font->color = wnd->wm->black;
for (index = 0; index < wnd->wm->log->count; index++)
{
text = (char*)xrdp_list_get_item(wnd->wm->log, index);
xrdp_painter_draw_text(painter, wnd, 10, 30 + index * 15, text);
}
}
}
return 0;
}
/*****************************************************************************/ /*****************************************************************************/
int server_begin_update(struct xrdp_mod* mod) int server_begin_update(struct xrdp_mod* mod)
{ {
@ -308,39 +363,40 @@ int server_palette(struct xrdp_mod* mod, int* palette)
} }
/*****************************************************************************/ /*****************************************************************************/
int server_error_popup(struct xrdp_mod* mod, char* error, char* caption) int server_msg(struct xrdp_mod* mod, char* msg)
{ {
#if 0
struct xrdp_wm* wm; struct xrdp_wm* wm;
struct xrdp_bitmap* wnd;
struct xrdp_bitmap* but; struct xrdp_bitmap* but;
wm = (struct xrdp_wm*)mod->wm; wm = (struct xrdp_wm*)mod->wm;
wnd = xrdp_bitmap_create(400, 200, wm->screen->bpp, WND_TYPE_WND, wm); xrdp_list_add_item(wm->log, (long)g_strdup(msg));
xrdp_list_add_item(wm->screen->child_list, (int)wnd); if (wm->log_wnd == 0)
wnd->parent = wm->screen; {
wnd->owner = wm->screen; /* log window */
wnd->bg_color = wm->grey; wm->log_wnd = xrdp_bitmap_create(400, 400, wm->screen->bpp,
wnd->left = wm->screen->width / 2 - wnd->width / 2; WND_TYPE_WND, wm);
wnd->top = wm->screen->height / 2 - wnd->height / 2; xrdp_list_add_item(wm->screen->child_list, (long)wm->log_wnd);
wnd->notify = xrdp_wm_popup_notify; wm->log_wnd->parent = wm->screen;
g_strcpy(wnd->caption, caption); wm->log_wnd->owner = wm->screen;
wm->log_wnd->bg_color = wm->grey;
/* button */ wm->log_wnd->left = 10;
but = xrdp_bitmap_create(60, 25, wm->screen->bpp, WND_TYPE_BUTTON, wm); wm->log_wnd->top = 10;
xrdp_list_add_item(wnd->child_list, (int)but); set_string(&wm->log_wnd->caption1, "Connection Log");
but->parent = wnd; /* ok button */
but->owner = wnd; but = xrdp_bitmap_create(60, 25, wm->screen->bpp, WND_TYPE_BUTTON, wm);
but->left = 180; xrdp_list_insert_item(wm->log_wnd->child_list, 0, (long)but);
but->top = 160; but->parent = wm->log_wnd;
but->id = 1; but->owner = wm->log_wnd;
g_strcpy(but->caption, "OK"); but->left = (400 - 60) - 10;
but->tab_stop = 1; but->top = (400 - 25) - 10;
but->id = 1;
xrdp_bitmap_invalidate(wm->screen, 0); but->tab_stop = 1;
//xrdp_bitmap_invalidate(wnd, 0); set_string(&but->caption1, "OK");
g_sleep(2000); wm->log_wnd->focused_control = but;
#endif /* set notify function */
wm->log_wnd->notify = xrdp_wm_log_wnd_notify;
}
xrdp_bitmap_invalidate(wm->log_wnd, 0);
return 0; return 0;
} }

@ -31,11 +31,17 @@ int xrdp_wm_login_help_notify(struct xrdp_bitmap* wnd,
struct xrdp_painter* p; struct xrdp_painter* p;
if (wnd == 0) if (wnd == 0)
{
return 0; return 0;
}
if (sender == 0) if (sender == 0)
{
return 0; return 0;
}
if (wnd->owner == 0) if (wnd->owner == 0)
{
return 0; return 0;
}
if (msg == 1) /* click */ if (msg == 1) /* click */
{ {
if (sender->id == 1) /* ok button */ if (sender->id == 1) /* ok button */
@ -90,13 +96,13 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self,
self->mod_handle = g_load_library(mod_data->lib); self->mod_handle = g_load_library(mod_data->lib);
if (self->mod_handle != 0) if (self->mod_handle != 0)
{ {
self->mod_init = (int(*)()) self->mod_init = (struct xrdp_mod* (*)(void))
g_get_proc_address(self->mod_handle, "mod_init"); g_get_proc_address(self->mod_handle, "mod_init");
self->mod_exit = (int(*)(int)) self->mod_exit = (int (*)(struct xrdp_mod*))
g_get_proc_address(self->mod_handle, "mod_exit"); g_get_proc_address(self->mod_handle, "mod_exit");
if (self->mod_init != 0 && self->mod_exit != 0) if (self->mod_init != 0 && self->mod_exit != 0)
{ {
self->mod = (struct xrdp_mod*)self->mod_init(); self->mod = self->mod_init();
} }
} }
if (self->mod != 0) if (self->mod != 0)
@ -109,7 +115,7 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self,
self->mod->server_paint_rect = server_paint_rect; self->mod->server_paint_rect = server_paint_rect;
self->mod->server_set_pointer = server_set_pointer; self->mod->server_set_pointer = server_set_pointer;
self->mod->server_palette = server_palette; self->mod->server_palette = server_palette;
self->mod->server_error_popup= server_error_popup; self->mod->server_msg = server_msg;
self->mod->server_is_term = server_is_term; self->mod->server_is_term = server_is_term;
} }
} }
@ -159,8 +165,9 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
if (sender->id == 1) /* help button */ if (sender->id == 1) /* help button */
{ {
/* create help screen */ /* create help screen */
help = xrdp_bitmap_create(300, 300, wnd->wm->screen->bpp, 1, wnd->wm); help = xrdp_bitmap_create(300, 300, wnd->wm->screen->bpp,
xrdp_list_insert_item(wnd->wm->screen->child_list, 0, (int)help); WND_TYPE_WND, wnd->wm);
xrdp_list_insert_item(wnd->wm->screen->child_list, 0, (long)help);
help->parent = wnd->wm->screen; help->parent = wnd->wm->screen;
help->owner = wnd; help->owner = wnd;
wnd->modal_dialog = help; wnd->modal_dialog = help;
@ -170,8 +177,9 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
help->notify = xrdp_wm_login_help_notify; help->notify = xrdp_wm_login_help_notify;
set_string(&help->caption1, "Login help"); set_string(&help->caption1, "Login help");
/* ok button */ /* ok button */
but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, 3, wnd->wm); but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp,
xrdp_list_insert_item(help->child_list, 0, (int)but); WND_TYPE_BUTTON, wnd->wm);
xrdp_list_insert_item(help->child_list, 0, (long)but);
but->parent = help; but->parent = help;
but->owner = help; but->owner = help;
but->left = 120; but->left = 120;
@ -181,25 +189,29 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
set_string(&but->caption1, "OK"); set_string(&but->caption1, "OK");
/* draw it */ /* draw it */
help->focused_control = but; help->focused_control = but;
//wnd->wm->focused_window = help;
xrdp_bitmap_invalidate(help, 0); xrdp_bitmap_invalidate(help, 0);
xrdp_wm_set_focused(wnd->wm, help); xrdp_wm_set_focused(wnd->wm, help);
//xrdp_bitmap_invalidate(wnd->focused_control, 0);
} }
else if (sender->id == 2) /* cancel button */ else if (sender->id == 2) /* cancel button */
{ {
if (wnd != 0) if (wnd != 0)
{
if (wnd->wm != 0) if (wnd->wm != 0)
{
if (wnd->wm->pro_layer != 0) if (wnd->wm->pro_layer != 0)
{
wnd->wm->pro_layer->term = 1; wnd->wm->pro_layer->term = 1;
}
}
}
} }
else if (sender->id == 3) /* ok button */ else if (sender->id == 3) /* ok button */
{ {
combo = xrdp_bitmap_get_child_by_id(wnd, 6); combo = xrdp_bitmap_get_child_by_id(wnd, 6);
if (combo != 0) if (combo != 0)
{ {
mod = (struct xrdp_mod_data*)xrdp_list_get_item(combo->data_list, mod = (struct xrdp_mod_data*)
combo->item_index); xrdp_list_get_item(combo->data_list, combo->item_index);
if (mod != 0) if (mod != 0)
{ {
con_mod = *mod; con_mod = *mod;
@ -238,14 +250,24 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
wm->mod->mod_set_param(wm->mod, "password", con_mod.password); wm->mod->mod_set_param(wm->mod, "password", con_mod.password);
if (wm->mod->mod_connect(wm->mod) != 0) if (wm->mod->mod_connect(wm->mod) != 0)
{ {
wm->pro_layer->term = 1; /* kill session */ /* totaly free mod */
wm->mod_exit(wm->mod);
g_free_library(wm->mod_handle);
wm->mod = 0;
wm->mod_handle = 0;
wm->mod_init = 0;
wm->mod_exit = 0;
//wm->pro_layer->app_sck = 0;
} }
} }
if (!wm->pro_layer->term) if (!wm->pro_layer->term)
{ {
if (wm->mod->sck != 0) if (wm->mod != 0)
{ {
wm->pro_layer->app_sck = wm->mod->sck; if (wm->mod->sck != 0)
{
wm->pro_layer->app_sck = wm->mod->sck;
}
} }
} }
} }
@ -258,7 +280,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
} }
else if (msg == 100) /* modal result is done */ else if (msg == 100) /* modal result is done */
{ {
i = xrdp_list_index_of(wnd->wm->screen->child_list, (int)sender); i = xrdp_list_index_of(wnd->wm->screen->child_list, (long)sender);
if (i >= 0) if (i >= 0)
{ {
b = (struct xrdp_bitmap*) b = (struct xrdp_bitmap*)
@ -337,8 +359,8 @@ int xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b)
g_strcpy(mod_data->password, r); g_strcpy(mod_data->password, r);
} }
} }
xrdp_list_add_item(b->string_list, (int)g_strdup(mod_data->name)); xrdp_list_add_item(b->string_list, (long)g_strdup(mod_data->name));
xrdp_list_add_item(b->data_list, (int)mod_data); xrdp_list_add_item(b->data_list, (long)mod_data);
} }
} }
g_file_close(fd); g_file_close(fd);
@ -356,7 +378,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* draw login window */ /* draw login window */
self->login_window = xrdp_bitmap_create(400, 200, self->screen->bpp, self->login_window = xrdp_bitmap_create(400, 200, self->screen->bpp,
WND_TYPE_WND, self); WND_TYPE_WND, self);
xrdp_list_add_item(self->screen->child_list, (int)self->login_window); xrdp_list_add_item(self->screen->child_list, (long)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;
self->login_window->bg_color = self->grey; self->login_window->bg_color = self->grey;
@ -374,7 +396,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->owner = self->screen; but->owner = self->screen;
but->left = self->screen->width - but->width; but->left = self->screen->width - but->width;
but->top = self->screen->height - but->height; but->top = self->screen->height - but->height;
xrdp_list_add_item(self->screen->child_list, (int)but); xrdp_list_add_item(self->screen->child_list, (long)but);
/* image */ /* image */
but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self); but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self);
@ -383,11 +405,11 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->owner = self->login_window; but->owner = self->login_window;
but->left = 10; but->left = 10;
but->top = 30; but->top = 30;
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
/* label */ /* label */
but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self); but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 155; but->left = 155;
@ -396,7 +418,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* edit */ /* edit */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self); but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 220; but->left = 220;
@ -409,7 +431,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* label */ /* label */
but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self); but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 155; but->left = 155;
@ -418,7 +440,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* edit */ /* edit */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self); but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 220; but->left = 220;
@ -431,7 +453,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* label */ /* label */
but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self); but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 155; but->left = 155;
@ -440,7 +462,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* combo */ /* combo */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_COMBO, self); but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_COMBO, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 220; but->left = 220;
@ -451,7 +473,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* button */ /* button */
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 180; but->left = 180;
@ -462,7 +484,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* button */ /* button */
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 250; but->left = 250;
@ -473,7 +495,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
/* button */ /* button */
but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self);
xrdp_list_add_item(self->login_window->child_list, (int)but); xrdp_list_add_item(self->login_window->child_list, (long)but);
but->parent = self->login_window; but->parent = self->login_window;
but->owner = self->login_window; but->owner = self->login_window;
but->left = 320; but->left = 320;

@ -42,7 +42,7 @@ struct xrdp_mod
char* data); char* data);
int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask); int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask);
int (*server_palette)(struct xrdp_mod* v, int* palette); int (*server_palette)(struct xrdp_mod* v, int* palette);
int (*server_error_popup)(struct xrdp_mod* v, char* error, char* caption); int (*server_msg)(struct xrdp_mod* v, char* msg);
int (*server_is_term)(struct xrdp_mod* v); int (*server_is_term)(struct xrdp_mod* v);
/* common */ /* common */
long handle; /* pointer to self as int */ long handle; /* pointer to self as int */
@ -398,12 +398,15 @@ struct xrdp_wm
int scroll_lock; int scroll_lock;
int num_lock; int num_lock;
/* mod vars */ /* mod vars */
int mod_handle; int mod_handle; /* returned from g_load_library */
int (*mod_init)(); struct xrdp_mod* (*mod_init)(void);
int (*mod_exit)(int); int (*mod_exit)(struct xrdp_mod*);
struct xrdp_mod* mod; struct xrdp_mod* mod;
/* client info */ /* client info */
struct xrdp_client_info* client_info; struct xrdp_client_info* client_info;
/* session log */
struct xrdp_list* log;
struct xrdp_bitmap* log_wnd;
}; };
/* rdp process */ /* rdp process */

@ -40,6 +40,8 @@ struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner,
self->painter = xrdp_painter_create(self); self->painter = xrdp_painter_create(self);
self->rdp_layer = owner->rdp_layer; self->rdp_layer = owner->rdp_layer;
self->cache = xrdp_cache_create(self, self->orders, self->client_info); self->cache = xrdp_cache_create(self, self->orders, self->client_info);
self->log = xrdp_list_create();
self->log->auto_free = 1;
return self; return self;
} }
@ -58,7 +60,7 @@ void xrdp_wm_delete(struct xrdp_wm* self)
{ {
if (self->mod_exit != 0) if (self->mod_exit != 0)
{ {
self->mod_exit((int)self->mod); self->mod_exit(self->mod);
} }
} }
if (self->mod_handle != 0) if (self->mod_handle != 0)
@ -236,7 +238,9 @@ int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
{ {
lines_sending = 4096 / (line_size + e * Bpp); lines_sending = 4096 / (line_size + e * Bpp);
if (i + lines_sending > total_lines) if (i + lines_sending > total_lines)
{
lines_sending = total_lines - i; lines_sending = total_lines - i;
}
p = p + line_size * lines_sending; p = p + line_size * lines_sending;
xrdp_rdp_init_data(self->rdp_layer, s); xrdp_rdp_init_data(self->rdp_layer, s);
out_uint16_le(s, RDP_UPDATE_BITMAP); out_uint16_le(s, RDP_UPDATE_BITMAP);
@ -340,7 +344,7 @@ int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y)
pointer_item.y = y; pointer_item.y = y;
g_memcpy(pointer_item.data, data, 32 * 32 * 3); g_memcpy(pointer_item.data, data, 32 * 32 * 3);
g_memcpy(pointer_item.mask, mask, 32 * 32 / 8); g_memcpy(pointer_item.mask, mask, 32 * 32 / 8);
xrdp_cache_add_pointer(self->cache, &pointer_item); self->screen->pointer = xrdp_cache_add_pointer(self->cache, &pointer_item);
return 0; return 0;
} }
@ -468,7 +472,6 @@ int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx)
out_uint16_le(s, RDP_POINTER_CACHED); out_uint16_le(s, RDP_POINTER_CACHED);
out_uint16_le(s, 0); /* pad */ out_uint16_le(s, 0); /* pad */
out_uint16_le(s, cache_idx); /* cache_idx */ out_uint16_le(s, cache_idx); /* cache_idx */
//g_printf("%d\n", cache_idx);
s_mark_end(s); s_mark_end(s);
xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER); xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER);
free_stream(s); free_stream(s);
@ -479,13 +482,10 @@ int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx)
int xrdp_wm_init(struct xrdp_wm* self) int xrdp_wm_init(struct xrdp_wm* self)
{ {
#ifndef XRDP_LIB /* if lib, dodn't create login screen */ #ifndef XRDP_LIB /* if lib, dodn't create login screen */
char data[32 * (32 * 3)];
char mask[32 * (32 / 8)];
int x;
int y;
int bindex; int bindex;
int gindex; int gindex;
int rindex; int rindex;
struct xrdp_pointer_item pointer_item;
if (self->screen->bpp == 8) if (self->screen->bpp == 8)
{ {
@ -547,12 +547,13 @@ int xrdp_wm_init(struct xrdp_wm* self)
self->green = COLOR24(0x00, 0xff, 0x00); self->green = COLOR24(0x00, 0xff, 0x00);
} }
DEBUG(("sending cursor\n\r")); DEBUG(("sending cursor\n\r"));
xrdp_wm_load_pointer(self, "cursor1.cur", data, mask, &x, &y); xrdp_wm_load_pointer(self, "cursor1.cur", pointer_item.data,
xrdp_wm_send_pointer(self, 1, data, mask, x, y); pointer_item.mask, &pointer_item.x, &pointer_item.y);
xrdp_cache_add_pointer_static(self->cache, &pointer_item, 1);
DEBUG(("sending cursor\n\r")); DEBUG(("sending cursor\n\r"));
xrdp_wm_load_pointer(self, "cursor0.cur", data, mask, &x, &y); xrdp_wm_load_pointer(self, "cursor0.cur", pointer_item.data,
xrdp_wm_send_pointer(self, 0, data, mask, x, y); pointer_item.mask, &pointer_item.x, &pointer_item.y);
xrdp_cache_add_pointer_static(self->cache, &pointer_item, 0);
xrdp_login_wnd_create(self); xrdp_login_wnd_create(self);
/* clear screen */ /* clear screen */
self->screen->bg_color = self->black; self->screen->bg_color = self->black;
@ -738,7 +739,7 @@ int xrdp_wm_is_rect_vis(struct xrdp_wm* self, struct xrdp_bitmap* wnd,
return 0; return 0;
} }
i = xrdp_list_index_of(self->screen->child_list, (int)wnd); i = xrdp_list_index_of(self->screen->child_list, (long)wnd);
i--; i--;
while (i >= 0) while (i >= 0)
{ {
@ -842,8 +843,13 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y)
return 0; return 0;
} }
b = xrdp_wm_at_pos(self->screen, x, y, 0); b = xrdp_wm_at_pos(self->screen, x, y, 0);
if (b == 0) if (b == 0) /* if b is null, the movment must be over the screen */
{ {
if (self->screen->pointer != self->current_pointer)
{
xrdp_wm_set_pointer(self, self->screen->pointer);
self->current_pointer = self->screen->pointer;
}
if (self->mod != 0) /* if screen is mod controled */ if (self->mod != 0) /* if screen is mod controled */
{ {
if (self->mod->mod_event != 0) if (self->mod->mod_event != 0)
@ -900,7 +906,7 @@ int xrdp_wm_clear_popup(struct xrdp_wm* self)
if (self->popup_wnd != 0) if (self->popup_wnd != 0)
{ {
//b = self->popup_wnd->popped_from; //b = self->popup_wnd->popped_from;
i = xrdp_list_index_of(self->screen->child_list, (int)self->popup_wnd); i = xrdp_list_index_of(self->screen->child_list, (long)self->popup_wnd);
xrdp_list_remove_item(self->screen->child_list, i); xrdp_list_remove_item(self->screen->child_list, i);
MAKERECT(rect, self->popup_wnd->left, self->popup_wnd->top, MAKERECT(rect, self->popup_wnd->left, self->popup_wnd->top,
self->popup_wnd->width, self->popup_wnd->height); self->popup_wnd->width, self->popup_wnd->height);
@ -1218,7 +1224,7 @@ int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control)
self->popup_wnd->left = x; self->popup_wnd->left = x;
self->popup_wnd->top = y + control->height; self->popup_wnd->top = y + control->height;
self->popup_wnd->item_index = control->item_index; self->popup_wnd->item_index = control->item_index;
xrdp_list_insert_item(self->screen->child_list, 0, (int)self->popup_wnd); xrdp_list_insert_item(self->screen->child_list, 0, (long)self->popup_wnd);
xrdp_bitmap_invalidate(self->popup_wnd, 0); xrdp_bitmap_invalidate(self->popup_wnd, 0);
return 0; return 0;
} }

Loading…
Cancel
Save