about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorSteffen Jaeckel <jaeckel-floss@eyet-services.de>2023-04-03 15:54:33 +0200
committerSteffen Jaeckel <jaeckel-floss@eyet-services.de>2023-04-04 11:22:00 +0200
commit7271898541f217b24ce13010ca494c7b74d49ad6 (patch)
tree7d17ca5427bd0e3ded5ebbfe73ae48a2fa1b29e7
parent74415ae71d287d097a7adadea34cb8662735b530 (diff)
downloadprofani-tty-7271898541f217b24ce13010ca494c7b74d49ad6.tar.gz
fix display of a "list type" in a form if there's no value assigned yet
It is possible, that a server sends a form with a field as follows, which
has no (default) value assigned.

```
<field label="foo" type="list-single" var="bar">
  <option label="a"><value>a</value></option>
  <option label="b"><value>b</value></option>
  <option label="c"><value>c</value></option>
</field>
```

This patch fixes profanity to show that list. Before this patch
profanity showed nothing.

I stumbled over this while running the `/room config` command inside
a newly created muc on the `sure.im` XMPP server.

Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de>
-rw-r--r--src/ui/confwin.c48
1 files changed, 21 insertions, 27 deletions
diff --git a/src/ui/confwin.c b/src/ui/confwin.c
index d74c6d86..85abe748 100644
--- a/src/ui/confwin.c
+++ b/src/ui/confwin.c
@@ -215,8 +215,8 @@ _confwin_form_field(ProfWin* window, char* tag, FormField* field)
         win_append(window, THEME_DEFAULT, ": ");
     }
 
-    GSList* values = field->values;
-    GSList* curr_value = values;
+    GSList* curr_value = field->values;
+    GSList* curr_option;
 
     switch (field->type_t) {
     case FIELD_HIDDEN:
@@ -272,36 +272,30 @@ _confwin_form_field(ProfWin* window, char* tag, FormField* field)
         }
         break;
     case FIELD_LIST_SINGLE:
-        if (curr_value) {
-            win_newline(window);
-            char* value = curr_value->data;
-            GSList* options = field->options;
-            GSList* curr_option = options;
-            while (curr_option) {
-                FormOption* option = curr_option->data;
-                if (g_strcmp0(option->value, value) == 0) {
-                    win_println(window, THEME_ONLINE, "-", "  [%s] %s", option->value, option->label);
-                } else {
-                    win_println(window, THEME_OFFLINE, "-", "  [%s] %s", option->value, option->label);
-                }
-                curr_option = g_slist_next(curr_option);
+        win_newline(window);
+        char* value = curr_value ? curr_value->data : NULL;
+        curr_option = field->options;
+        while (curr_option) {
+            FormOption* option = curr_option->data;
+            if (g_strcmp0(option->value, value) == 0) {
+                win_println(window, THEME_ONLINE, "-", "  [%s] %s", option->value, option->label);
+            } else {
+                win_println(window, THEME_OFFLINE, "-", "  [%s] %s", option->value, option->label);
             }
+            curr_option = g_slist_next(curr_option);
         }
         break;
     case FIELD_LIST_MULTI:
-        if (curr_value) {
-            win_newline(window);
-            GSList* options = field->options;
-            GSList* curr_option = options;
-            while (curr_option) {
-                FormOption* option = curr_option->data;
-                if (g_slist_find_custom(curr_value, option->value, (GCompareFunc)g_strcmp0)) {
-                    win_println(window, THEME_ONLINE, "-", "  [%s] %s", option->value, option->label);
-                } else {
-                    win_println(window, THEME_OFFLINE, "-", "  [%s] %s", option->value, option->label);
-                }
-                curr_option = g_slist_next(curr_option);
+        win_newline(window);
+        curr_option = field->options;
+        while (curr_option) {
+            FormOption* option = curr_option->data;
+            if (g_slist_find_custom(curr_value, option->value, (GCompareFunc)g_strcmp0)) {
+                win_println(window, THEME_ONLINE, "-", "  [%s] %s", option->value, option->label);
+            } else {
+                win_println(window, THEME_OFFLINE, "-", "  [%s] %s", option->value, option->label);
             }
+            curr_option = g_slist_next(curr_option);
         }
         break;
     case FIELD_JID_SINGLE: