From c96dd8df2b4398ddbb8e931bdf673d43c4a77f51 Mon Sep 17 00:00:00 2001 From: Laxmikant Rashinkar Date: Tue, 28 Jan 2014 18:09:20 -0800 Subject: [PATCH] made login screen fully customizable --- xrdp/Makefile.am | 3 +- xrdp/xrdp.ini | 58 +++++- xrdp/xrdp_bitmap.c | 2 +- xrdp/xrdp_login_wnd.c | 427 +++++++++++++++++++++++++++++++++++------- xrdp/xrdp_logo.bmp | Bin 0 -> 100854 bytes xrdp/xrdp_types.h | 90 ++++++++- xrdp/xrdp_wm.c | 16 +- 7 files changed, 521 insertions(+), 75 deletions(-) create mode 100644 xrdp/xrdp_logo.bmp diff --git a/xrdp/Makefile.am b/xrdp/Makefile.am index 83d04a6c..71d84a33 100644 --- a/xrdp/Makefile.am +++ b/xrdp/Makefile.am @@ -1,4 +1,4 @@ -EXTRA_DIST = xrdp.ini ad24b.bmp ad256.bmp xrdp24b.bmp xrdp256.bmp sans-10.fv1 cursor0.cur cursor1.cur xrdp.h xrdp_types.h +EXTRA_DIST = xrdp.ini ad24b.bmp ad256.bmp xrdp24b.bmp xrdp256.bmp xrdp_logo.bmp sans-10.fv1 cursor0.cur cursor1.cur xrdp.h xrdp_types.h EXTRA_INCLUDES = EXTRA_LIBS = @@ -66,6 +66,7 @@ xrdppkgdata_DATA = \ ad256.bmp \ xrdp24b.bmp \ xrdp256.bmp \ + xrdp_logo.bmp \ sans-10.fv1 \ cursor0.cur \ cursor1.cur diff --git a/xrdp/xrdp.ini b/xrdp/xrdp.ini index 0e8d302b..771bc73b 100644 --- a/xrdp/xrdp.ini +++ b/xrdp/xrdp.ini @@ -1,5 +1,8 @@ [globals] +# xrdp.ini file version number +ini_version=1 + bitmap_cache=yes bitmap_compression=yes port=3389 @@ -7,16 +10,25 @@ crypt_level=high allow_channels=true max_bpp=24 fork=yes + # regulate if the listening socket use socket option tcp_nodelay # no buffering will be performed in the TCP stack tcp_nodelay=yes + # regulate if the listening socket use socket option keepalive # if the network connection disappear without close messages the connection will be closed tcp_keepalive=yes + #tcp_send_buffer_bytes=32768 #tcp_recv_buffer_bytes=32768 + +# +# colors used by windows in RGB format +# + +blue=009cb5 +grey=dedede #black=000000 -#grey=d6d3ce #dark_grey=808080 #blue=08246b #dark_blue=08246b @@ -31,12 +43,55 @@ tcp_keepalive=yes # require_credentials=yes #bulk_compression=yes + # You can set the PAM error text in a gateway setup (MAX 256 chars) #pamerrortxt=change your password according to policy at http://url #new_cursors=no #nego_sec_layer=0 allow_multimon=true +# +# configure login screen +# + +# top level window background color in BGR format (not RGB) +ls_top_window_bg_color=bf9c00 + +# width and height of login screen +ls_width=350 +ls_height=430 + +# login screen background color in BGR format (not RGB) +ls_bg_color=dedede + +# logo +ls_logo_filename= +ls_logo_x_pos=55 +ls_logo_y_pos=50 + +# for positioning labels such as username, password etc +ls_label_x_pos=30 +ls_label_width=60 + +# for positioning text and combo boxes next to above labels +ls_input_x_pos=110 +ls_input_width=210 + +# y pos for first label and combo box +ls_input_y_pos=220 + +# OK button +ls_btn_ok_x_pos=142 +ls_btn_ok_y_pos=370 +ls_btn_ok_width=85 +ls_btn_ok_height=30 + +# Cancel button +ls_btn_cancel_x_pos=237 +ls_btn_cancel_y_pos=370 +ls_btn_cancel_width=85 +ls_btn_cancel_height=30 + [Logging] LogFile=xrdp.log LogLevel=DEBUG @@ -122,6 +177,7 @@ ip=ask port=ask3389 username=ask password=ask + # You can override the common channel settings for each session type #channel.rdpdr=true #channel.rdpsnd=true diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index b3faea41..c3eef7a1 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -115,7 +115,7 @@ xrdp_bitmap_create(int width, int height, int bpp, self->child_list = list_create(); } - self->line_size = width *Bpp; + self->line_size = width * Bpp; if (self->type == WND_TYPE_COMBO) { diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index e7066798..8011b468 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -254,6 +254,9 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) char *value; struct xrdp_mod_data *mod; struct xrdp_bitmap *b; + struct xrdp_cfg_globals *globals; + + globals = &self->xrdp_config->cfg_globals; username_set = 0; @@ -289,11 +292,13 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) insert_index++; b->parent = self->login_window; b->owner = self->login_window; - b->left = self->login_window->width >= DEFAULT_WND_LOGIN_W ? 155 : 5; - b->top = DEFAULT_ELEMENT_TOP + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; + b->left = globals->ls_label_x_pos; + + b->top = globals->ls_input_y_pos + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; b->id = 100 + 2 * count; name = (char *)list_get_item(mod->names, index); set_string(&b->caption1, name); + /* edit */ b = xrdp_bitmap_create(DEFAULT_EDIT_W, DEFAULT_EDIT_H, self->screen->bpp, WND_TYPE_EDIT, self); @@ -302,8 +307,10 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) insert_index++; b->parent = self->login_window; b->owner = self->login_window; - b->left = self->login_window->width >= DEFAULT_WND_LOGIN_W ? DEFAULT_WND_LOGIN_W - DEFAULT_EDIT_W - 30 : 70; - b->top = DEFAULT_ELEMENT_TOP + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; + b->left = globals->ls_input_x_pos; + + b->top = globals->ls_input_y_pos + DEFAULT_COMBO_H + 5 + (DEFAULT_EDIT_H + 5) * count; + b->id = 100 + 2 * count + 1; b->pointer = 1; b->tab_stop = 1; @@ -506,15 +513,20 @@ xrdp_wm_login_fill_in_combo(struct xrdp_wm *self, struct xrdp_bitmap *b) int APP_CC xrdp_login_wnd_create(struct xrdp_wm *self) { - struct xrdp_bitmap *but; - struct xrdp_bitmap *combo; - char file_path[256]; + struct xrdp_bitmap *but; + struct xrdp_bitmap *combo; + struct xrdp_cfg_globals *globals; + + char buf[256]; + char buf1[256]; int log_width; int log_height; int regular; - log_width = DEFAULT_WND_LOGIN_W; - log_height = DEFAULT_WND_LOGIN_H; + globals = &self->xrdp_config->cfg_globals; + + log_width = globals->ls_width; + log_height = globals->ls_height; regular = 1; if (self->screen->width < log_width) @@ -537,115 +549,392 @@ xrdp_login_wnd_create(struct xrdp_wm *self) list_add_item(self->screen->child_list, (long)self->login_window); self->login_window->parent = self->screen; self->login_window->owner = self->screen; - self->login_window->bg_color = self->grey; + self->login_window->bg_color = globals->ls_bg_color; + self->login_window->left = self->screen->width / 2 - self->login_window->width / 2; + self->login_window->top = self->screen->height / 2 - self->login_window->height / 2; + self->login_window->notify = xrdp_wm_login_notify; - set_string(&self->login_window->caption1, "Login to xrdp"); + + gethostname(buf1, 256); + g_sprintf(buf, "Login to %s", buf1); + set_string(&self->login_window->caption1, buf); if (regular) { - /* image */ - but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self); + /* if logo image not specified, use default */ + if (globals->ls_logo_filename[0] == 0) + g_snprintf(globals->ls_logo_filename, 255, "%s/xrdp_logo.bmp", XRDP_SHARE_PATH); - if (self->screen->bpp > 8) - { - g_snprintf(file_path, 255, "%s/xrdp24b.bmp", XRDP_SHARE_PATH); - } - else - { - g_snprintf(file_path, 255, "%s/xrdp256.bmp", XRDP_SHARE_PATH); - } - - xrdp_bitmap_load(but, file_path, self->palette); - but->parent = self->screen; - but->owner = self->screen; - but->left = self->screen->width - but->width; - but->top = self->screen->height - but->height; - list_add_item(self->screen->child_list, (long)but); - - /* image */ + /* logo image */ but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self); - if (self->screen->bpp > 8) - { - g_snprintf(file_path, 255, "%s/ad24b.bmp", XRDP_SHARE_PATH); - } - else - { - g_snprintf(file_path, 255, "%s/ad256.bmp", XRDP_SHARE_PATH); - } + if (self->screen->bpp <= 8) + g_snprintf(globals->ls_logo_filename, 255, "%s/ad256.bmp", XRDP_SHARE_PATH); - xrdp_bitmap_load(but, file_path, self->palette); + xrdp_bitmap_load(but, globals->ls_logo_filename, self->palette); but->parent = self->login_window; but->owner = self->login_window; - but->left = 10; - but->top = 30; + but->left = globals->ls_logo_x_pos; + but->top = globals->ls_logo_y_pos; list_add_item(self->login_window->child_list, (long)but); } /* label */ - but = xrdp_bitmap_create(60, DEFAULT_EDIT_H, self->screen->bpp, WND_TYPE_LABEL, self); + but = xrdp_bitmap_create(globals->ls_label_width, DEFAULT_EDIT_H, self->screen->bpp, WND_TYPE_LABEL, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = regular ? 155 : 5; - but->top = DEFAULT_ELEMENT_TOP; - set_string(&but->caption1, "Module"); + but->left = globals->ls_label_x_pos; + but->top = globals->ls_input_y_pos; + set_string(&but->caption1, "Session"); /* combo */ - combo = xrdp_bitmap_create(DEFAULT_COMBO_W, DEFAULT_COMBO_H, self->screen->bpp, WND_TYPE_COMBO, self); + combo = xrdp_bitmap_create(globals->ls_input_width, DEFAULT_COMBO_H, + self->screen->bpp, WND_TYPE_COMBO, self); list_add_item(self->login_window->child_list, (long)combo); combo->parent = self->login_window; combo->owner = self->login_window; - combo->left = regular ? DEFAULT_WND_LOGIN_W - DEFAULT_COMBO_W - 30 : 70; - combo->top = DEFAULT_ELEMENT_TOP; + combo->left = globals->ls_input_x_pos; + combo->top = globals->ls_input_y_pos; combo->id = 6; combo->tab_stop = 1; xrdp_wm_login_fill_in_combo(self, combo); - /* button */ - but = xrdp_bitmap_create(DEFAULT_BUTTON_W, DEFAULT_BUTTON_H, self->screen->bpp, WND_TYPE_BUTTON, self); + /* OK button */ + but = xrdp_bitmap_create(globals->ls_btn_ok_width, globals->ls_btn_ok_height, + self->screen->bpp, WND_TYPE_BUTTON, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = regular ? DEFAULT_WND_LOGIN_W - ((DEFAULT_BUTTON_W + 10) * 3) - 10 : 30; - but->top = DEFAULT_WND_LOGIN_H - DEFAULT_BUTTON_H - 15; + but->left = globals->ls_btn_ok_x_pos; + but->top = globals->ls_btn_ok_y_pos; but->id = 3; set_string(&but->caption1, "OK"); but->tab_stop = 1; self->login_window->default_button = but; - /* button */ - but = xrdp_bitmap_create(DEFAULT_BUTTON_W, DEFAULT_BUTTON_H, self->screen->bpp, WND_TYPE_BUTTON, self); + /* Cancel button */ + but = xrdp_bitmap_create(globals->ls_btn_cancel_width, + globals->ls_btn_cancel_height, self->screen->bpp, + WND_TYPE_BUTTON, self); list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; - but->left = regular ? DEFAULT_WND_LOGIN_W - ((DEFAULT_BUTTON_W + 10) * 2) - 10 : ((log_width - 30) - DEFAULT_BUTTON_W); - but->top = DEFAULT_WND_LOGIN_H - DEFAULT_BUTTON_H - 15; + but->left = globals->ls_btn_cancel_x_pos; + but->top = globals->ls_btn_cancel_y_pos; but->id = 2; set_string(&but->caption1, "Cancel"); but->tab_stop = 1; self->login_window->esc_button = but; - if (regular) + /* labels and edits */ + xrdp_wm_show_edits(self, combo); + + return 0; +} + +/** + * Load configuration from xrdp.ini file + * + * @return 0 on success, -1 on failure + *****************************************************************************/ + +load_xrdp_config(struct xrdp_config *config) +{ + struct xrdp_cfg_globals *globals; + + struct list *names; + struct list *values; + + char *n; + char *v; + char buf[256]; + int fd; + int i; + + if (!config) + return -1; + + globals = &config->cfg_globals; + + /* set default values incase we can't get them from xrdp.ini file */ + globals->ini_version = 1; + globals->ls_top_window_bg_color = xrdp_wm_htoi("bf9c00"); + globals->ls_width = 350; + globals->ls_height = 350; + globals->ls_bg_color = 0xdedede; + globals->ls_logo_x_pos = 63; + globals->ls_logo_y_pos = 50; + globals->ls_label_x_pos = 30; + globals->ls_label_width = 60; + globals->ls_input_x_pos = 110; + globals->ls_input_width = 210; + globals->ls_input_y_pos = 150; + globals->ls_btn_ok_x_pos = 150; + globals->ls_btn_ok_y_pos = 300; + globals->ls_btn_ok_width = 85; + globals->ls_btn_ok_height =30; + globals->ls_btn_cancel_x_pos = 245; + globals->ls_btn_cancel_y_pos = 300; + globals->ls_btn_cancel_width = 85; + globals->ls_btn_cancel_height = 30; + + /* open xrdp.ini file */ + g_snprintf(buf, 255, "%s/xrdp.ini", XRDP_CFG_PATH); + if ((fd = g_file_open(buf)) < 0) { - /* button */ - but = xrdp_bitmap_create(DEFAULT_BUTTON_W, DEFAULT_BUTTON_H, self->screen->bpp, WND_TYPE_BUTTON, self); - list_add_item(self->login_window->child_list, (long)but); - but->parent = self->login_window; - but->owner = self->login_window; - but->left = DEFAULT_WND_LOGIN_W - (DEFAULT_BUTTON_W + 10) - 10; - but->top = DEFAULT_WND_LOGIN_H - DEFAULT_BUTTON_H - 15; - but->id = 1; - set_string(&but->caption1, "Help"); - but->tab_stop = 1; + log_message(LOG_LEVEL_ERROR,"load_config: Could not read " + "xrdp.ini file %s", buf); + return -1; + } - /* labels and edits */ - xrdp_wm_show_edits(self, combo); + names = list_create(); + values = list_create(); + names->auto_free = 1; + values->auto_free = 1; + + if (file_read_section(fd, "globals", names, values) != 0) + { + list_delete(names); + list_delete(values); + g_file_close(fd); + log_message(LOG_LEVEL_ERROR,"load_config: Could not read globals " + "section from xrdp.ini file %s", buf); + return -1; + } + + for (i = 0; i < names->count; i++) + { + n = (char *) list_get_item(names, i); + v = (char *) list_get_item(values, i); + + /* + * parse globals section + */ + + if (g_strncmp(n, "ini_version", 64) == 0) + globals->ini_version = g_atoi(v); + + else if (g_strncmp(n, "bitmap_cache", 64) == 0) + globals->use_bitmap_cache = g_text2bool(v); + + else if (g_strncmp(n, "bitmap_compression", 64) == 0) + globals->use_bitmap_compression = g_text2bool(v); + + else if (g_strncmp(n, "port", 64) == 0) + globals->port = g_atoi(v); + + else if (g_strncmp(n, "crypt_level", 64) == 0) + { + if (g_strcmp(v, "low") == 0) + globals->crypt_level = 1; + else if (g_strcmp(v, "medium") == 0) + globals->crypt_level = 2; + else + globals->crypt_level = 3; + } + + else if (g_strncmp(n, "allow_channels", 64) == 0) + globals->allow_channels = g_text2bool(v); + + else if (g_strncmp(n, "max_bpp", 64) == 0) + globals->max_bpp = g_atoi(v); + + else if (g_strncmp(n, "fork", 64) == 0) + globals->fork = g_text2bool(v); + + else if (g_strncmp(n, "tcp_nodelay", 64) == 0) + globals->tcp_nodelay = g_text2bool(v); + + else if (g_strncmp(n, "tcp_keepalive", 64) == 0) + globals->tcp_keepalive = g_text2bool(v); + + else if (g_strncmp(n, "tcp_send_buffer_bytes", 64) == 0) + globals->tcp_send_buffer_bytes = g_atoi(v); + + else if (g_strncmp(n, "tcp_recv_buffer_bytes", 64) == 0) + globals->tcp_recv_buffer_bytes = g_atoi(v); + + /* colors */ + + else if (g_strncmp(n, "grey", 64) == 0) + globals->grey = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "black", 64) == 0) + globals->black = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "dark_grey", 64) == 0) + globals->dark_grey = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "blue", 64) == 0) + globals->blue = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "dark_blue", 64) == 0) + globals->dark_blue = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "white", 64) == 0) + globals->white = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "red", 64) == 0) + globals->red = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "green", 64) == 0) + globals->green = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "background", 64) == 0) + globals->background = xrdp_wm_htoi(v); + + /* misc stuff */ + + else if (g_strncmp(n, "autorun", 255) == 0) + g_strncpy(globals->autorun, v, 255); + + else if (g_strncmp(n, "hidelogwindow", 64) == 0) + globals->hidelogwindow = g_text2bool(v); + + else if (g_strncmp(n, "require_credentials", 64) == 0) + globals->require_credentials = g_text2bool(v); + + else if (g_strncmp(n, "bulk_compression", 64) == 0) + globals->bulk_compression = g_text2bool(v); + + else if (g_strncmp(n, "new_cursors", 64) == 0) + globals->new_cursors = g_text2bool(v); + + else if (g_strncmp(n, "nego_sec_layer", 64) == 0) + globals->nego_sec_layer = g_atoi(v); + + else if (g_strncmp(n, "allow_multimon", 64) == 0) + globals->allow_multimon = g_text2bool(v); + /* login screen values */ + else if (g_strncmp(n, "ls_top_window_bg_color", 64) == 0) + globals->ls_top_window_bg_color = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "ls_width", 64) == 0) + globals->ls_width = g_atoi(v); + + else if (g_strncmp(n, "ls_height", 64) == 0) + globals->ls_height = g_atoi(v); + + else if (g_strncmp(n, "ls_bg_color", 64) == 0) + globals->ls_bg_color = xrdp_wm_htoi(v); + + else if (g_strncmp(n, "ls_logo_filename", 255) == 0) + { + g_strncpy(globals->ls_logo_filename, v, 255); + globals->ls_logo_filename[255] = 0; + } + + else if (g_strncmp(n, "ls_logo_x_pos", 64) == 0) + globals->ls_logo_x_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_logo_y_pos", 64) == 0) + globals->ls_logo_y_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_label_x_pos", 64) == 0) + globals->ls_label_x_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_label_width", 64) == 0) + globals->ls_label_width = g_atoi(v); + + else if (g_strncmp(n, "ls_input_x_pos", 64) == 0) + globals->ls_input_x_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_input_width", 64) == 0) + globals->ls_input_width = g_atoi(v); + + else if (g_strncmp(n, "ls_input_y_pos", 64) == 0) + globals->ls_input_y_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_ok_x_pos", 64) == 0) + globals->ls_btn_ok_x_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_ok_y_pos", 64) == 0) + globals->ls_btn_ok_y_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_ok_width", 64) == 0) + globals->ls_btn_ok_width = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_ok_height", 64) == 0) + globals->ls_btn_ok_height = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_cancel_x_pos", 64) == 0) + globals->ls_btn_cancel_x_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_cancel_y_pos", 64) == 0) + globals->ls_btn_cancel_y_pos = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_cancel_width", 64) == 0) + globals->ls_btn_cancel_width = g_atoi(v); + + else if (g_strncmp(n, "ls_btn_cancel_height", 64) == 0) + globals->ls_btn_cancel_height = g_atoi(v); + } + +#if 0 + g_writeln("ini_version: %d", globals->ini_version); + g_writeln("use_bitmap_cache: %d", globals->use_bitmap_cache); + g_writeln("use_bitmap_compression: %d", globals->use_bitmap_compression); + g_writeln("port: %d", globals->port); + g_writeln("crypt_level: %d", globals->crypt_level); + g_writeln("allow_channels: %d", globals->allow_channels); + g_writeln("max_bpp: %d", globals->max_bpp); + g_writeln("fork: %d", globals->fork); + g_writeln("tcp_nodelay: %d", globals->tcp_nodelay); + g_writeln("tcp_keepalive: %d", globals->tcp_keepalive); + g_writeln("tcp_send_buffer_bytes: %d", globals->tcp_send_buffer_bytes); + g_writeln("tcp_recv_buffer_bytes: %d", globals->tcp_recv_buffer_bytes); + g_writeln("new_cursors: %d", globals->new_cursors); + g_writeln("allow_multimon: %d", globals->allow_multimon); + + g_writeln("grey: %d", globals->grey); + g_writeln("black: %d", globals->black); + g_writeln("dark_grey: %d", globals->dark_grey); + g_writeln("blue: %d", globals->blue); + g_writeln("dark_blue: %d", globals->dark_blue); + g_writeln("white: %d", globals->white); + g_writeln("red: %d", globals->red); + g_writeln("green: %d", globals->green); + g_writeln("background: %d", globals->background); + + g_writeln("autorun: %s", globals->autorun); + g_writeln("hidelogwindow: %d", globals->hidelogwindow); + g_writeln("require_credentials: %d", globals->require_credentials); + g_writeln("bulk_compression: %d", globals->bulk_compression); + g_writeln("new_cursors: %d", globals->new_cursors); + g_writeln("nego_sec_layer: %d", globals->nego_sec_layer); + g_writeln("allow_multimon: %d", globals->allow_multimon); + + g_writeln("ls_top_window_bg_color: %x", globals->ls_top_window_bg_color); + g_writeln("ls_width: %d", globals->ls_width); + g_writeln("ls_height: %d", globals->ls_height); + g_writeln("ls_bg_color: %x", globals->ls_bg_color); + g_writeln("ls_logo_filename: %s", globals->ls_logo_filename); + g_writeln("ls_logo_x_pos: %d", globals->ls_logo_x_pos); + g_writeln("ls_logo_y_pos: %d", globals->ls_logo_y_pos); + g_writeln("ls_label_x_pos: %d", globals->ls_label_x_pos); + g_writeln("ls_label_width: %d", globals->ls_label_width); + g_writeln("ls_input_x_pos: %d", globals->ls_input_x_pos); + g_writeln("ls_input_width: %d", globals->ls_input_width); + g_writeln("ls_input_y_pos: %d", globals->ls_input_y_pos); + g_writeln("ls_btn_ok_x_pos: %d", globals->ls_btn_ok_x_pos); + g_writeln("ls_btn_ok_y_pos: %d", globals->ls_btn_ok_y_pos); + g_writeln("ls_btn_ok_width: %d", globals->ls_btn_ok_width); + g_writeln("ls_btn_ok_height: %d", globals->ls_btn_ok_height); + g_writeln("ls_btn_cancel_x_pos: %d", globals->ls_btn_cancel_x_pos); + g_writeln("ls_btn_cancel_y_pos: %d", globals->ls_btn_cancel_y_pos); + g_writeln("ls_btn_cancel_width: %d", globals->ls_btn_cancel_width); + g_writeln("ls_btn_cancel_height: %d", globals->ls_btn_cancel_height); +#endif + + list_delete(names); + list_delete(values); + g_file_close(fd); return 0; } diff --git a/xrdp/xrdp_logo.bmp b/xrdp/xrdp_logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..58ce50ff667fb2a88d26bd6899cc2ddecc829351 GIT binary patch literal 100854 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 = self->screen; self->current_surface_index = 0xffff; /* screen */ + + /* to store configuration from xrdp.ini */ + self->xrdp_config = g_malloc(sizeof(struct xrdp_config), 1); + return self; } @@ -79,6 +83,10 @@ xrdp_wm_delete(struct xrdp_wm *self) /* free default font */ xrdp_font_delete(self->default_font); g_delete_wait_obj(self->login_mode_event); + + if (self->xrdp_config) + g_free(self->xrdp_config); + /* free self */ g_free(self); } @@ -535,12 +543,18 @@ xrdp_wm_init(struct xrdp_wm *self) char cfg_file[256]; char autorun_name[256]; + load_xrdp_config(self->xrdp_config); + xrdp_wm_load_static_colors_plus(self, autorun_name); xrdp_wm_load_static_pointers(self); - self->screen->bg_color = self->background; + self->screen->bg_color = self->xrdp_config->cfg_globals.ls_top_window_bg_color; if (self->session->client_info->rdp_autologin || (autorun_name[0] != 0)) { + /* + * NOTE: this should eventually be accessed from self->xrdp_config + */ + g_snprintf(cfg_file, 255, "%s/xrdp.ini", XRDP_CFG_PATH); fd = g_file_open(cfg_file); /* xrdp.ini */