diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/core.c | 86 | ||||
-rw-r--r-- | src/ui/ui.h | 1 | ||||
-rw-r--r-- | src/ui/window.h | 1 | ||||
-rw-r--r-- | src/ui/windows.c | 15 |
4 files changed, 101 insertions, 2 deletions
diff --git a/src/ui/core.c b/src/ui/core.c index 4a7bb365..83bcb6ba 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -1601,7 +1601,8 @@ _ui_room_requires_config(const char * const room_jid) ui_index = 0; } - win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Room requires configuration, use '/room config accept' or '/room config cancel'"); + win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", + "Room requires configuration, use '/room config accept' or '/room config destroy'"); // currently in groupchat window if (wins_is_current(window)) { @@ -1870,6 +1871,88 @@ _ui_draw_term_title(void) } static void +_ui_handle_room_configuration(const char * const room, DataForm *form) +{ + GString *title = g_string_new(room); + g_string_append(title, " config"); + ProfWin *window = wins_new(title->str, WIN_MUC_CONFIG); + g_string_free(title, TRUE); + int num = wins_get_num(window); + ui_switch_win(num); + + win_save_vprint(window, '-', NULL, 0, 0, "", "Receieved configuration for room %s.", room); + + if (form->type != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Type: %s", form->type); + } + if (form->title != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Title: %s", form->title); + } + if (form->instructions != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Instructions: %s", form->instructions); + } + + GSList *fields = form->fields; + GSList *curr_field = fields; + while (curr_field != NULL) { + FormField *field = curr_field->data; + win_save_vprint(window, '-', NULL, 0, 0, "", " Field:"); + + if (field->label != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Label: %s", field->label); + } + if (field->type != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Type: %s", field->type); + } + if (field->var != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Var: %s", field->var); + } + if (field->description != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Description: %s", field->description); + } + + if (field->required) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Required: TRUE"); + } else { + win_save_vprint(window, '-', NULL, 0, 0, "", " Required: FALSE"); + } + + GSList *values = field->values; + GSList *curr_value = values; + if (curr_value != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Values:"); + } + while (curr_value != NULL) { + char *value = curr_value->data; + win_save_vprint(window, '-', NULL, 0, 0, "", " %s", value); + + curr_value = g_slist_next(curr_value); + } + + GSList *options = field->options; + GSList *curr_option = options; + if (curr_option != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Options:"); + } + while (curr_option != NULL) { + FormOption *option = curr_option->data; + if (option->label != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Label: %s", option->label); + } + if (option->value != NULL) { + win_save_vprint(window, '-', NULL, 0, 0, "", " Value: %s", option->value); + } + + curr_option = g_slist_next(curr_option); + } + + curr_field = g_slist_next(curr_field); + } + + form_destroy(form); +} + +static void _win_handle_switch(const wint_t * const ch) { if (*ch == KEY_F(1)) { @@ -2106,4 +2189,5 @@ ui_init_module(void) ui_update = _ui_update; ui_room_requires_config = _ui_room_requires_config; ui_room_destroyed = _ui_room_destroyed; + ui_handle_room_configuration = _ui_handle_room_configuration; } diff --git a/src/ui/ui.h b/src/ui/ui.h index 7e8967c0..cb1a92ee 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -160,6 +160,7 @@ void (*ui_handle_recipient_error)(const char * const recipient, const char * con void (*ui_handle_error)(const char * const err_msg); void (*ui_clear_win_title)(void); void (*ui_handle_room_join_error)(const char * const room, const char * const err); +void (*ui_handle_room_configuration)(const char * const room, DataForm *form); // contact status functions void (*ui_status_room)(const char * const contact); diff --git a/src/ui/window.h b/src/ui/window.h index ed0c64b4..5a72f18f 100644 --- a/src/ui/window.h +++ b/src/ui/window.h @@ -58,6 +58,7 @@ typedef enum { WIN_CONSOLE, WIN_CHAT, WIN_MUC, + WIN_MUC_CONFIG, WIN_PRIVATE, WIN_DUCK, WIN_XML diff --git a/src/ui/windows.c b/src/ui/windows.c index 3d835a0e..5156684b 100644 --- a/src/ui/windows.c +++ b/src/ui/windows.c @@ -385,7 +385,11 @@ wins_get_prune_recipients(void) while (curr != NULL) { ProfWin *window = curr->data; - if (window->unread == 0 && window->type != WIN_MUC && window->type != WIN_CONSOLE) { + if (window->unread == 0 && + window->type != WIN_MUC && + window->type != WIN_MUC_CONFIG && + window->type != WIN_XML && + window->type != WIN_CONSOLE) { result = g_slist_append(result, window->from); } curr = g_list_next(curr); @@ -539,6 +543,7 @@ wins_create_summary(void) GString *chat_string; GString *priv_string; GString *muc_string; + GString *muc_config_string; GString *duck_string; GString *xml_string; @@ -606,6 +611,14 @@ wins_create_summary(void) break; + case WIN_MUC_CONFIG: + muc_config_string = g_string_new(""); + g_string_printf(muc_config_string, "%d: %s", ui_index, window->from); + result = g_slist_append(result, strdup(muc_config_string->str)); + g_string_free(muc_config_string, TRUE); + + break; + case WIN_DUCK: duck_string = g_string_new(""); g_string_printf(duck_string, "%d: DuckDuckGo search", ui_index); |