File: macro_utils.cpp

package info (click to toggle)
ibus-unikey 0.7.0~beta1-1
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, trixie
  • size: 672 kB
  • sloc: cpp: 7,042; xml: 63; makefile: 6
file content (129 lines) | stat: -rw-r--r-- 3,537 bytes parent folder | download | duplicates (2)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <cstring>
#include <libintl.h>

#include "keycons.h"
#include "macro_utils.h"

#define _(str) gettext(str)

gboolean list_store_check_exists(GtkListStore* store, gchar* check_key)
{
    GtkTreeIter iter;
    gchar* key;
    auto model = GTK_TREE_MODEL(store);
    auto b = gtk_tree_model_get_iter_first(model, &iter);
    while (b)
    {
        gtk_tree_model_get(model, &iter, COL_KEY, &key, -1);
        if (strcasecmp(key, check_key) == 0)
        {
            g_free(key);
            return true;
        }
        g_free(key);

        b = gtk_tree_model_iter_next(model, &iter);
    }

    return false;
}

void list_store_append(GtkListStore* list, CMacroTable* macro)
{
    gchar key[MAX_MACRO_KEY_LEN*3];
    gchar value[MAX_MACRO_TEXT_LEN*3];
    UKBYTE* p;

    for (int i = 0 ; i < macro->getCount(); i++)
    {
        // get key and convert to XUTF charset
        p = (UKBYTE*)macro->getKey(i);
        int inLen = -1;
        int maxOutLen = sizeof(key);
        int ret = VnConvert(CONV_CHARSET_VNSTANDARD, CONV_CHARSET_XUTF8,
                        p, (UKBYTE*)key,
                        &inLen, &maxOutLen);
        if (ret != 0)
            continue;

        if (list_store_check_exists(list, key))
            continue;

        // get value and convert to XUTF charset
        p = (UKBYTE*)macro->getText(i);
        inLen = -1;
        maxOutLen = sizeof(value);
        ret = VnConvert(CONV_CHARSET_VNSTANDARD, CONV_CHARSET_XUTF8,
                        p, (UKBYTE*)value,
                        &inLen, &maxOutLen);
        if (ret != 0)
            continue;

        // append to liststore
        GtkTreeIter iter;
        gtk_list_store_append(list, &iter);
        gtk_list_store_set(list, &iter, COL_KEY, key, COL_VALUE, value, -1);
    }
}

void unikey_macro_to_store(CMacroTable* macro, GtkListStore* store)
{
    gtk_list_store_clear(store);

    list_store_append(store, macro);
    list_store_add_null_item(store);

    // select first iter
    //GtkTreeSelection* select = gtk_tree_view_get_selection(tree_macro);
    //gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
    //gtk_tree_selection_select_iter(select, &iter);
}

void unikey_store_to_macro(GtkListStore* store, CMacroTable* macro)
{
    auto model = GTK_TREE_MODEL(store);

    GtkTreeIter iter;
    auto b = gtk_tree_model_get_iter_first(model, &iter);
    macro->resetContent();
    while (b == TRUE)
    {
        gchar *key, *value;
        gtk_tree_model_get(model, &iter, COL_KEY, &key, COL_VALUE, &value, -1);

        if (strcasecmp(key, STR_NULL_ITEM) != 0)
        {
            macro->addItem(key, value, CONV_CHARSET_XUTF8);
        }
        g_free(key);
        g_free(value);

        b = gtk_tree_model_iter_next(model, &iter);
    }
}

void list_store_add_null_item(GtkListStore* list)
{
    GtkTreeIter iter;

    auto n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL);
    if (n > 0)
    {
        gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1);
        gchar *key;
        gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &key, -1);
        if (strcmp(key, STR_NULL_ITEM) == 0)
        {
            g_free(key);
            return;
        }
        g_free(key);
    }

    // if last item is valid item or no item in list, add new NULL item
    gtk_list_store_append(list, &iter);
    gtk_list_store_set(list, &iter,
                       COL_KEY, STR_NULL_ITEM,
                       COL_VALUE, STR_NULL_ITEM,
                       -1);
}