about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command/command.c35
-rw-r--r--src/command/command.h4
-rw-r--r--src/ui/core.c27
3 files changed, 66 insertions, 0 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 03dc6e01..2a3afb24 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -53,6 +53,7 @@
 #include "contact.h"
 #include "roster_list.h"
 #include "jid.h"
+#include "xmpp/form.h"
 #include "log.h"
 #include "muc.h"
 #ifdef HAVE_LIBOTR
@@ -1421,6 +1422,40 @@ cmd_autocomplete_add(char *value)
 }
 
 void
+cmd_autocomplete_add_form_fields(DataForm *form)
+{
+    if (form) {
+        GSList *fields = autocomplete_create_list(form->tag_ac);
+        GSList *curr_field = fields;
+        while (curr_field) {
+            GString *field_str = g_string_new("/");
+            g_string_append(field_str, curr_field->data);
+            cmd_autocomplete_add(field_str->str);
+            g_string_free(field_str, TRUE);
+            curr_field = g_slist_next(curr_field);
+        }
+        g_slist_free_full(fields, free);
+    }
+}
+
+void
+cmd_autocomplete_remove_form_fields(DataForm *form)
+{
+    if (form) {
+        GSList *fields = autocomplete_create_list(form->tag_ac);
+        GSList *curr_field = fields;
+        while (curr_field) {
+            GString *field_str = g_string_new("/");
+            g_string_append(field_str, curr_field->data);
+            cmd_autocomplete_remove(field_str->str);
+            g_string_free(field_str, TRUE);
+            curr_field = g_slist_next(curr_field);
+        }
+        g_slist_free_full(fields, free);
+    }
+}
+
+void
 cmd_autocomplete_remove(char *value)
 {
     if (commands_ac != NULL) {
diff --git a/src/command/command.h b/src/command/command.h
index a2ded657..13cf2d00 100644
--- a/src/command/command.h
+++ b/src/command/command.h
@@ -37,6 +37,8 @@
 
 #include <glib.h>
 
+#include "xmpp/form.h"
+
 GHashTable *commands;
 
 void cmd_init(void);
@@ -46,6 +48,8 @@ void cmd_autocomplete(char *input, int *size);
 void cmd_reset_autocomplete(void);
 void cmd_autocomplete_add(char *value);
 void cmd_autocomplete_remove(char *value);
+void cmd_autocomplete_add_form_fields(DataForm *form);
+void cmd_autocomplete_remove_form_fields(DataForm *form);
 void cmd_alias_add(char *value);
 void cmd_alias_remove(char *value);
 
diff --git a/src/ui/core.c b/src/ui/core.c
index 899cc3fb..837cac3d 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -726,7 +726,16 @@ static gboolean
 _ui_switch_win(const int i)
 {
     if (ui_win_exists(i)) {
+        ProfWin *old_current = wins_get_current();
+        if (old_current->type == WIN_MUC_CONFIG) {
+            cmd_autocomplete_remove_form_fields(old_current->form);
+        }
+
         ProfWin *new_current = wins_get_by_num(i);
+        if (new_current->type == WIN_MUC_CONFIG) {
+            cmd_autocomplete_add_form_fields(new_current->form);
+        }
+
         wins_set_current_by_num(i);
 
         new_current->unread = 0;
@@ -751,7 +760,16 @@ _ui_switch_win(const int i)
 static void
 _ui_previous_win(void)
 {
+    ProfWin *old_current = wins_get_current();
+    if (old_current->type == WIN_MUC_CONFIG) {
+        cmd_autocomplete_remove_form_fields(old_current->form);
+    }
+
     ProfWin *new_current = wins_get_previous();
+    if (new_current->type == WIN_MUC_CONFIG) {
+        cmd_autocomplete_add_form_fields(new_current->form);
+    }
+
     int i = wins_get_num(new_current);
     wins_set_current_by_num(i);
 
@@ -773,7 +791,16 @@ _ui_previous_win(void)
 static void
 _ui_next_win(void)
 {
+    ProfWin *old_current = wins_get_current();
+    if (old_current->type == WIN_MUC_CONFIG) {
+        cmd_autocomplete_remove_form_fields(old_current->form);
+    }
+
     ProfWin *new_current = wins_get_next();
+    if (new_current->type == WIN_MUC_CONFIG) {
+        cmd_autocomplete_add_form_fields(new_current->form);
+    }
+
     int i = wins_get_num(new_current);
     wins_set_current_by_num(i);
 
5f22cdd43f7d3cdef21a9523f0aceb8c'>^
46bb1d31 ^








67de9b02 ^

46bb1d31 ^


67de9b02 ^
46bb1d31 ^




67de9b02 ^
46bb1d31 ^







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86


                       
                                                








                                                                
                                                 



                            
                                               




                               

                                                 





                    
                                                   


                                 
                                                       


                                
                                                   


                                                        

                                                                            




                                                                         
                                



                  
                                                                      








                                                             

                                                                            


                  
                                     




                         
                                                   







                                                            
#include "fifobuffer.h"
#include "alloc.h"

FifoBuffer* FifoBuffer_create(uint32 capacity) {
    FifoBuffer* fifo = (FifoBuffer*)kmalloc(sizeof(FifoBuffer));
    memset((uint8*)fifo, 0, sizeof(FifoBuffer));
    fifo->data = (uint8*)kmalloc(capacity);
    memset((uint8*)fifo->data, 0, capacity);
    fifo->capacity= capacity;

    return fifo;
}

void FifoBuffer_destroy(FifoBuffer* fifoBuffer) {
    kfree(fifoBuffer->data);
    kfree(fifoBuffer);
}

void FifoBuffer_clear(FifoBuffer* fifoBuffer) {
    fifoBuffer->usedBytes = 0;
    fifoBuffer->readIndex = 0;
    fifoBuffer->writeIndex = 0;
}

BOOL FifoBuffer_isEmpty(FifoBuffer* fifoBuffer) {
    if (0 == fifoBuffer->usedBytes) {
        return TRUE;
    }

    return FALSE;
}

uint32 FifoBuffer_getSize(FifoBuffer* fifoBuffer) {
    return fifoBuffer->usedBytes;
}

uint32 FifoBuffer_getCapacity(FifoBuffer* fifoBuffer) {
    return fifoBuffer->capacity;
}

uint32 FifoBuffer_getFree(FifoBuffer* fifoBuffer) {
    return fifoBuffer->capacity - fifoBuffer->usedBytes;
}

int32 FifoBuffer_enqueue(FifoBuffer* fifoBuffer, uint8* data, uint32 size) {
    if (size == 0) {
        return -1;
    }

    uint32 bytesAvailable = fifoBuffer->capacity - fifoBuffer->usedBytes;

    if (size > bytesAvailable) {
        return -1;
    }

    uint32 i = 0;
    while (fifoBuffer->usedBytes < fifoBuffer->capacity && i < size) {
        fifoBuffer->data[fifoBuffer->writeIndex] = data[i++];
        fifoBuffer->usedBytes++;
        fifoBuffer->writeIndex++;
        fifoBuffer->writeIndex %= fifoBuffer->capacity;
    }

    return size;
}

int32 FifoBuffer_dequeue(FifoBuffer* fifoBuffer, uint8* data, uint32 size) {
    if (size == 0) {
        return -1;
    }

    if (0 == fifoBuffer->usedBytes) {
        //Buffer is empty
        return 0;
    }

    uint32 i = 0;
    while (fifoBuffer->usedBytes > 0 && i < size) {
        data[i++] = fifoBuffer->data[fifoBuffer->readIndex];
        fifoBuffer->usedBytes--;
        fifoBuffer->readIndex++;
        fifoBuffer->readIndex %= fifoBuffer->capacity;
    }

    return i;
}