diff --git a/gtk/keygrab.c b/gtk/keygrab.c index 47e0a89..cd864d5 100644 --- a/gtk/keygrab.c +++ b/gtk/keygrab.c @@ -76,9 +76,9 @@ void begin_key_grab(KeyGrabButton* self, gpointer v) { - gtk_widget_add_events(GTK_WIDGET(self), GDK_KEY_PRESS_MASK); KeyGrabButton* b = KEYGRAB_BUTTON(self); b->popup = popup_new(GTK_WIDGET(self), _("Please press the new key combination"), FALSE); + gtk_widget_add_events(GTK_WIDGET(b->popup), GDK_KEY_PRESS_MASK); gtk_widget_show_all(b->popup); b->handler = g_signal_connect(G_OBJECT(b->popup), "key-press-event", (GCallback)on_key_press_event, b); @@ -128,6 +128,10 @@ void keygrab_button_set_key(KeyGrabButton* self, guint key, GdkModifierType mods) { + if (mods & GDK_SUPER_MASK) { + mods &= ~GDK_SUPER_MASK; + mods |= FcitxKeyState_Super; + } KeyGrabButton* b = KEYGRAB_BUTTON(self); gchar *label; b->key = key; diff --git a/gtk/sub_config_parser.c b/gtk/sub_config_parser.c index ff979d2..0c79b87 100644 --- a/gtk/sub_config_parser.c +++ b/gtk/sub_config_parser.c @@ -32,7 +32,7 @@ #include "sub_config_parser.h" static void sub_config_pattern_free(void* pattern); -static GList* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern); +static GHashTable* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern); static GList* get_files_by_pattern(const gchar* dirpath, FcitxSubConfigPattern* pattern, int index); static void sub_file_list_free(gpointer data, gpointer user_data); @@ -185,15 +185,14 @@ g_free(subconfig->configdesc); g_free(subconfig->nativepath); g_free(subconfig->name); - g_list_foreach(subconfig->filelist, sub_file_list_free, NULL); - g_list_free(subconfig->filelist); + g_hash_table_unref(subconfig->filelist); g_free(subconfig); } -GList* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern) +GHashTable* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern) { size_t size, i; - GList* result = NULL; + GHashTable* result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); #if FCITX_CHECK_VERSION(4,2,1) char** xdgpath = FcitxXDGGetPathWithPrefix(&size, ""); #else @@ -213,10 +212,14 @@ l = l->next) { if (strncmp(dirpath, (gchar*) l->data, strlen(dirpath)) == 0) { gchar* filename = (gchar*) l->data; + + FcitxLog(INFO, "%s", filename); gchar* name = filename + strlen(dirpath); while (name[0] == '/') name ++; - result = g_list_append(result, g_strdup(name)); + if (!g_hash_table_lookup_extended(result, name, NULL, NULL)) { + g_hash_table_insert(result, g_strdup(name), NULL); + } } } g_list_foreach(list, sub_file_list_free, NULL); diff --git a/gtk/sub_config_parser.h b/gtk/sub_config_parser.h index 017a75b..2be8104 100644 --- a/gtk/sub_config_parser.h +++ b/gtk/sub_config_parser.h @@ -37,7 +37,7 @@ typedef struct { gchar* name; SubConfigType type; - GList* filelist; + GHashTable* filelist; gchar* nativepath; gchar* configdesc; } FcitxSubConfig; diff --git a/gtk/sub_config_widget.c b/gtk/sub_config_widget.c index 9363662..ba738f1 100644 --- a/gtk/sub_config_widget.c +++ b/gtk/sub_config_widget.c @@ -25,11 +25,11 @@ #include "configdesc.h" #include "config_widget.h" -G_DEFINE_TYPE(FcitxSubConfigWidget, fcitx_sub_config_widget, GTK_TYPE_VBOX) +G_DEFINE_TYPE(FcitxSubConfigWidget, fcitx_sub_config_widget, GTK_TYPE_BOX) static void open_subconfig_file(GtkButton *button, gpointer user_data); static void open_native_file(GtkButton *button, gpointer user_data); -static void push_into_store_cb(gpointer data, gpointer user_data); +static void push_into_store_cb(gpointer data, gpointer value, gpointer user_data); static void fcitx_sub_config_widget_get_property(GObject *object, guint property_id, @@ -97,7 +97,7 @@ gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); - g_list_foreach(widget->subconfig->filelist, push_into_store_cb, store); + g_hash_table_foreach(widget->subconfig->filelist, push_into_store_cb, store); GtkWidget* button = gtk_button_new(); gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_BUTTON)); @@ -163,14 +163,19 @@ { FcitxSubConfigWidget* widget = (FcitxSubConfigWidget*) user_data; char *newpath = NULL; - if (g_list_length(widget->subconfig->filelist) > 0) { - FILE* fp = FcitxXDGGetFileWithPrefix("", widget->subconfig->filelist->data, "r", &newpath); - if (fp) - fclose(fp); + if (g_hash_table_size(widget->subconfig->filelist) > 0) { + GHashTableIter iter; + g_hash_table_iter_init(&iter, widget->subconfig->filelist); + gpointer key; + if (g_hash_table_iter_next(&iter, &key, NULL)) { + FILE* fp = FcitxXDGGetFileWithPrefix("", key, "r", &newpath); + if (fp) + fclose(fp); + } } else { FILE* fp = FcitxXDGGetFileUserWithPrefix("", widget->subconfig->nativepath, "w", &newpath); if (fp) { - widget->subconfig->filelist = g_list_append(widget->subconfig->filelist, widget->subconfig->nativepath); + g_hash_table_insert(widget->subconfig->filelist, widget->subconfig->nativepath, NULL); fclose(fp); } } @@ -189,6 +194,7 @@ void push_into_store_cb(gpointer data, + gpointer value, gpointer user_data) { GtkListStore* store = user_data; diff --git a/gtk3/config_widget.c b/gtk3/config_widget.c index 01dd6a8..55d959a 100644 --- a/gtk3/config_widget.c +++ b/gtk3/config_widget.c @@ -427,9 +427,9 @@ #else gtk_color_button_get_rgba(GTK_COLOR_BUTTON(arg), &color); #endif - r = color.red / 256; - g = color.green / 256; - b = color.blue / 256; + r = color.red * 256; + g = color.green * 256; + b = color.blue * 256; r = RoundColor(r); g = RoundColor(g); b = RoundColor(b); diff --git a/gtk3/keygrab.c b/gtk3/keygrab.c index 1920aaa..35c3cb1 100644 --- a/gtk3/keygrab.c +++ b/gtk3/keygrab.c @@ -76,12 +76,12 @@ void begin_key_grab(KeyGrabButton* self, gpointer v) { - gtk_widget_add_events(GTK_WIDGET(self), GDK_KEY_PRESS_MASK); KeyGrabButton* b = KEYGRAB_BUTTON(self); b->popup = popup_new(GTK_WIDGET(self), _("Please press the new key combination"), FALSE); + gtk_widget_add_events(GTK_WIDGET(b->popup), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_show_all(b->popup); b->handler = g_signal_connect(G_OBJECT(b->popup), "key-press-event", (GCallback)on_key_press_event, b); - + GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(b->popup)); GdkDisplay* display = gdk_window_get_display (window); GdkDeviceManager* device_manager = gdk_display_get_device_manager (display); @@ -91,7 +91,7 @@ while (gdk_device_grab( keyboard, window, - GDK_OWNERSHIP_NONE, FALSE, + GDK_OWNERSHIP_WINDOW, TRUE, GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) @@ -145,6 +145,10 @@ void keygrab_button_set_key(KeyGrabButton* self, guint key, GdkModifierType mods) { + if (mods & GDK_SUPER_MASK) { + mods &= ~GDK_SUPER_MASK; + mods |= FcitxKeyState_Super; + } KeyGrabButton* b = KEYGRAB_BUTTON(self); gchar *label; b->key = key; diff --git a/gtk3/sub_config_parser.c b/gtk3/sub_config_parser.c index ff979d2..0c79b87 100644 --- a/gtk3/sub_config_parser.c +++ b/gtk3/sub_config_parser.c @@ -32,7 +32,7 @@ #include "sub_config_parser.h" static void sub_config_pattern_free(void* pattern); -static GList* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern); +static GHashTable* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern); static GList* get_files_by_pattern(const gchar* dirpath, FcitxSubConfigPattern* pattern, int index); static void sub_file_list_free(gpointer data, gpointer user_data); @@ -185,15 +185,14 @@ g_free(subconfig->configdesc); g_free(subconfig->nativepath); g_free(subconfig->name); - g_list_foreach(subconfig->filelist, sub_file_list_free, NULL); - g_list_free(subconfig->filelist); + g_hash_table_unref(subconfig->filelist); g_free(subconfig); } -GList* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern) +GHashTable* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern) { size_t size, i; - GList* result = NULL; + GHashTable* result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); #if FCITX_CHECK_VERSION(4,2,1) char** xdgpath = FcitxXDGGetPathWithPrefix(&size, ""); #else @@ -213,10 +212,14 @@ l = l->next) { if (strncmp(dirpath, (gchar*) l->data, strlen(dirpath)) == 0) { gchar* filename = (gchar*) l->data; + + FcitxLog(INFO, "%s", filename); gchar* name = filename + strlen(dirpath); while (name[0] == '/') name ++; - result = g_list_append(result, g_strdup(name)); + if (!g_hash_table_lookup_extended(result, name, NULL, NULL)) { + g_hash_table_insert(result, g_strdup(name), NULL); + } } } g_list_foreach(list, sub_file_list_free, NULL); diff --git a/gtk3/sub_config_parser.h b/gtk3/sub_config_parser.h index 017a75b..2be8104 100644 --- a/gtk3/sub_config_parser.h +++ b/gtk3/sub_config_parser.h @@ -37,7 +37,7 @@ typedef struct { gchar* name; SubConfigType type; - GList* filelist; + GHashTable* filelist; gchar* nativepath; gchar* configdesc; } FcitxSubConfig; diff --git a/gtk3/sub_config_widget.c b/gtk3/sub_config_widget.c index 9353ce7..ba738f1 100644 --- a/gtk3/sub_config_widget.c +++ b/gtk3/sub_config_widget.c @@ -29,7 +29,7 @@ static void open_subconfig_file(GtkButton *button, gpointer user_data); static void open_native_file(GtkButton *button, gpointer user_data); -static void push_into_store_cb(gpointer data, gpointer user_data); +static void push_into_store_cb(gpointer data, gpointer value, gpointer user_data); static void fcitx_sub_config_widget_get_property(GObject *object, guint property_id, @@ -97,7 +97,7 @@ gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); - g_list_foreach(widget->subconfig->filelist, push_into_store_cb, store); + g_hash_table_foreach(widget->subconfig->filelist, push_into_store_cb, store); GtkWidget* button = gtk_button_new(); gtk_button_set_image(GTK_BUTTON(button), gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_BUTTON)); @@ -163,14 +163,19 @@ { FcitxSubConfigWidget* widget = (FcitxSubConfigWidget*) user_data; char *newpath = NULL; - if (g_list_length(widget->subconfig->filelist) > 0) { - FILE* fp = FcitxXDGGetFileWithPrefix("", widget->subconfig->filelist->data, "r", &newpath); - if (fp) - fclose(fp); + if (g_hash_table_size(widget->subconfig->filelist) > 0) { + GHashTableIter iter; + g_hash_table_iter_init(&iter, widget->subconfig->filelist); + gpointer key; + if (g_hash_table_iter_next(&iter, &key, NULL)) { + FILE* fp = FcitxXDGGetFileWithPrefix("", key, "r", &newpath); + if (fp) + fclose(fp); + } } else { FILE* fp = FcitxXDGGetFileUserWithPrefix("", widget->subconfig->nativepath, "w", &newpath); if (fp) { - widget->subconfig->filelist = g_list_append(widget->subconfig->filelist, widget->subconfig->nativepath); + g_hash_table_insert(widget->subconfig->filelist, widget->subconfig->nativepath, NULL); fclose(fp); } } @@ -189,6 +194,7 @@ void push_into_store_cb(gpointer data, + gpointer value, gpointer user_data) { GtkListStore* store = user_data;