--- xrdp/xrdp/xrdp_login_wnd.c.orig 2009-05-28 19:26:05.000000000 +0930 +++ xrdp/xrdp/xrdp_login_wnd.c 2009-05-28 19:30:37.000000000 +0930 @@ -386,6 +386,8 @@ int fd; int i; int j; + int k = 0; // real number of the items in the list + int h = 0; // is the current item hidden? char* p; char* q; char* r; @@ -411,26 +413,58 @@ } else { - g_strncpy(name, p, 255); - mod_data = (struct xrdp_mod_data*) - g_malloc(sizeof(struct xrdp_mod_data), 1); - mod_data->names = list_create(); - mod_data->names->auto_free = 1; - mod_data->values = list_create(); - mod_data->values->auto_free = 1; - for (j = 0; j < section_names->count; j++) - { + // check to see if this is a hidden item + // do this early so we don't need to mess around freeing memory + for (j = 0; j < section_names->count; j++) { q = (char*)list_get_item(section_names, j); r = (char*)list_get_item(section_values, j); - if (g_strncmp("name", q, 255) == 0) + if (g_strncmp("hidden", q, 255) == 0) { - g_strncpy(name, r, 255); + if (g_strncmp("yes", r, 255) == 0) { + h = 1; + break; + } } - list_add_item(mod_data->names, (long)g_strdup(q)); - list_add_item(mod_data->values, (long)g_strdup(r)); } - list_add_item(b->string_list, (long)g_strdup(name)); - list_add_item(b->data_list, (long)mod_data); + + if (h == 1) { + // yup, hidden, reset state + h = 0; + } else { + // not hidden + g_strncpy(name, p, 255); + mod_data = (struct xrdp_mod_data*) + g_malloc(sizeof(struct xrdp_mod_data), 1); + mod_data->names = list_create(); + mod_data->names->auto_free = 1; + mod_data->values = list_create(); + mod_data->values->auto_free = 1; + for (j = 0; j < section_names->count; j++) + { + q = (char*)list_get_item(section_names, j); + r = (char*)list_get_item(section_values, j); + if (g_strncmp("name", q, 255) == 0) + { + g_strncpy(name, r, 255); + } + list_add_item(mod_data->names, (long)g_strdup(q)); + list_add_item(mod_data->values, (long)g_strdup(r)); + } + + list_add_item(b->string_list, (long)g_strdup(name)); + list_add_item(b->data_list, (long)mod_data); + + if (g_strncmp(self->session->client_info->domain, p, 255) == 0) { + // "domain" matches this module's name. change the default selected item to this. + // normally this only applies to autologin. now this applies it in non-auto mode + // + // we can't use (i) here as that is the index of the section in the ini, not the index of + // the current item in the combobox. + b->item_index = k; + } + + k++; + } } } g_file_close(fd);