From b29b4050519fb5e6315de609ba6cf11770790d1c Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 4 Feb 2024 23:10:30 +0900 Subject: [PATCH] feat(setup)!: rewrite ibus-setup-chewing using libadwaita --- .clang-format | 2 + CMakeLists.txt | 12 +- src/CMakeLists.txt | 86 +-- src/GConf2Backend.c | 193 ------ src/GConf2Backend.h | 46 -- src/IBusChewingProperties.c | 12 +- src/MakerDialogWidget.c | 568 ------------------ src/MakerDialogWidget.h | 157 ----- src/generate-gconf-schemas.c | 213 ------- src/generate-gsettings-schemas.c | 94 --- src/ibus-chewing-engine-private.h | 6 - src/ibus-chewing-engine.c | 14 - src/ibus-chewing-engine.h | 5 - src/ibus-setup-chewing.c | 137 ----- src/main.c | 2 - src/maker-dialog-private.h | 45 -- src/maker-dialog.c | 526 ---------------- src/maker-dialog.h | 133 ---- src/setup/ibus-setup-chewing-application.c | 81 +++ src/setup/ibus-setup-chewing-application.h | 38 ++ src/setup/ibus-setup-chewing-window.c | 192 ++++++ src/setup/ibus-setup-chewing-window.h | 32 + src/setup/ibus-setup-chewing-window.ui | 231 +++++++ src/setup/ibus-setup-chewing.gresource.xml | 6 + src/setup/main.c | 38 ++ .../org.freedesktop.IBus.Chewing.gschema.xml | 137 +++++ test/IBusChewingPreEdit-test.c | 16 +- test/MakerDialogBackend-test.c | 49 +- 28 files changed, 813 insertions(+), 2258 deletions(-) create mode 100644 .clang-format delete mode 100644 src/GConf2Backend.c delete mode 100644 src/GConf2Backend.h delete mode 100644 src/MakerDialogWidget.c delete mode 100644 src/MakerDialogWidget.h delete mode 100644 src/generate-gconf-schemas.c delete mode 100644 src/generate-gsettings-schemas.c delete mode 100644 src/ibus-setup-chewing.c delete mode 100644 src/maker-dialog-private.h delete mode 100644 src/maker-dialog.c delete mode 100644 src/maker-dialog.h create mode 100644 src/setup/ibus-setup-chewing-application.c create mode 100644 src/setup/ibus-setup-chewing-application.h create mode 100644 src/setup/ibus-setup-chewing-window.c create mode 100644 src/setup/ibus-setup-chewing-window.h create mode 100644 src/setup/ibus-setup-chewing-window.ui create mode 100644 src/setup/ibus-setup-chewing.gresource.xml create mode 100644 src/setup/main.c create mode 100644 src/setup/org.freedesktop.IBus.Chewing.gschema.xml diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..80d3293 --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +BasedOnStyle: LLVM +IndentWidth: 4 diff --git a/CMakeLists.txt b/CMakeLists.txt index e2f82ce..d62a828 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,8 +34,6 @@ enable_testing() include(GNUInstallDirs) option(GNOME_SHELL "Enable GNOME Shell support" ON) -option(GCONF2_SUPPORT "Enable GConf2 support" OFF) -option(GSETTINGS_SUPPORT "Enable GSettings support" ON) find_package(PkgConfig REQUIRED) pkg_check_modules(IBUS REQUIRED IMPORTED_TARGET ibus-1.0>=1.3) @@ -53,14 +51,10 @@ pkg_check_modules(GTK4 REQUIRED IMPORTED_TARGET gtk4) pkg_check_modules(LIBADWAITA REQUIRED IMPORTED_TARGET libadwaita-1) pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) +find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED) + set(CMAKE_C_STANDARD 99) add_compile_definitions(_XOPEN_SOURCE) -if(GSETTINGS_SUPPORT) - add_compile_definitions(USE_GSETTINGS) -endif() -if(GCONF2_SUPPORT) - add_compile_definitions(USE_GCONF2) -endif() # Directory that store ibus-chewing icons add_compile_definitions(PRJ_ICON_DIR="${CMAKE_INSTALL_DATADIR}/ibus-chewing/icons") @@ -73,8 +67,6 @@ add_compile_definitions( PROJECT_SCHEMA_BASE=/desktop/ibus/engine PROJECT_SCHEMA_SECTION=chewing PROJECT_SCHEMA_DIR=/desktop/ibus/engine/chewing - PROJECT_GCONF2_SCHEMA_SECTION=Chewing - PROJECT_GCONF2_SCHEMA_DIR=/desktop/ibus/engine/Chewing PROJECT_SCHEMA_PATH=/desktop/ibus/engine/chewing/ ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8c8956..2137190 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,20 +23,9 @@ target_link_libraries(common PUBLIC ) add_library(gui-core STATIC - maker-dialog.c - maker-dialog.h - maker-dialog-private.h - IBusConfigBackend.c - IBusConfigBackend.h - MakerDialogWidget.c - MakerDialogWidget.h + GSettingsBackend.c + GSettingsBackend.h ) -if(GSETTINGS_SUPPORT) - target_sources(gui-core PRIVATE - GSettingsBackend.c - GSettingsBackend.h - ) -endif() target_link_libraries(gui-core PUBLIC common PkgConfig::GLIB2 @@ -47,8 +36,37 @@ target_link_libraries(gui-core PUBLIC PkgConfig::CHEWING ) -add_executable(ibus-setup-chewing ibus-setup-chewing.c) -target_link_libraries(ibus-setup-chewing gui-core) +add_custom_command( + OUTPUT ibus-setup-chewing-window-ui.c + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/setup + COMMAND ${GLIB_COMPILE_RESOURCES} + ARGS + --generate + --target=${CMAKE_CURRENT_BINARY_DIR}/ibus-setup-chewing-window-ui.c + ibus-setup-chewing.gresource.xml + VERBATIM + MAIN_DEPENDENCY setup/ibus-setup-chewing.gresource.xml + DEPENDS + setup/ibus-setup-chewing-window.ui +) +set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/ibus-setup-chewing-window-ui.c + PROPERTIES GENERATED TRUE +) +add_executable(ibus-setup-chewing + setup/ibus-setup-chewing-application.c + setup/ibus-setup-chewing-application.h + setup/ibus-setup-chewing-window.c + setup/ibus-setup-chewing-window.h + setup/main.c + ${CMAKE_CURRENT_BINARY_DIR}/ibus-setup-chewing-window-ui.c +) +target_compile_definitions(ibus-setup-chewing PRIVATE + GETTEXT_PACKAGE="ibus-setup-chewing" + LOCALEDIR="${CMAKE_INSTALL_LOCALEDIR}" +) +target_include_directories(ibus-setup-chewing PRIVATE setup) +target_link_libraries(ibus-setup-chewing PkgConfig::LIBADWAITA) add_executable(ibus-engine-chewing ibus-chewing-engine.c @@ -70,30 +88,28 @@ target_include_directories(ibus-engine-chewing target_link_libraries(ibus-engine-chewing gui-core) -if(GSETTINGS_SUPPORT) - set(PROJECT_GSCHEMA_XML ${PROJECT_SCHEMA_ID}.gschema.xml) - set(GSETTINGS_SCHEMAS_DIR ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) +set(PROJECT_GSCHEMA_XML ${PROJECT_SCHEMA_ID}.gschema.xml) +set(GSETTINGS_SCHEMAS_DIR ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) - add_executable(generate-gsettings-schemas - GSettingsBackend.c - GSettingsBackend.h - generate-gsettings-schemas.c - ) - target_link_libraries(generate-gsettings-schemas common) +# add_executable(generate-gsettings-schemas +# GSettingsBackend.c +# GSettingsBackend.h +# generate-gsettings-schemas.c +# ) +# target_link_libraries(generate-gsettings-schemas common) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_GSCHEMA_XML} - DESTINATION ${GSETTINGS_SCHEMAS_DIR} - ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_GSCHEMA_XML} + DESTINATION ${GSETTINGS_SCHEMAS_DIR} +) - add_custom_target(schemas_gsettings ALL - COMMAND G_MESSAGES_DEBUG=all "${CMAKE_CURRENT_BINARY_DIR}/generate-gsettings-schemas" -v 5 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_GSCHEMA_XML}" - COMMAND G_MESSAGES_DEBUG=all glib-compile-schemas "${CMAKE_CURRENT_BINARY_DIR}" - COMMENT "Generating gsettings schemas ${PROJECT_GSCHEMA_XML}" - VERBATIM - ) +# add_custom_target(schemas_gsettings ALL +# COMMAND G_MESSAGES_DEBUG=all "${CMAKE_CURRENT_BINARY_DIR}/generate-gsettings-schemas" -v 5 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_GSCHEMA_XML}" +# COMMAND G_MESSAGES_DEBUG=all glib-compile-schemas "${CMAKE_CURRENT_BINARY_DIR}" +# COMMENT "Generating gsettings schemas ${PROJECT_GSCHEMA_XML}" +# VERBATIM +# ) - add_dependencies(schemas_gsettings generate-gsettings-schemas) -endif() +# add_dependencies(schemas_gsettings generate-gsettings-schemas) install(TARGETS ibus-engine-chewing ibus-setup-chewing DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}) \ No newline at end of file diff --git a/src/GConf2Backend.c b/src/GConf2Backend.c deleted file mode 100644 index a753b0e..0000000 --- a/src/GConf2Backend.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright © 2014 Red Hat, Inc. All rights reserved. - * Copyright © 2014 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include "MakerDialogUtil.h" -#include "GConf2Backend.h" - -static GHashTable *camalCasedKeyTable = NULL; - -gchar *gconf2_backend_get_key(MkdgBackend * backend, - const gchar * section, const gchar * key, - gpointer userData); - -static GValue *gconf_value_to_g_value(GConfValue * confValue, GValue * value) -{ - GType gType = G_VALUE_TYPE(value); - - switch (confValue->type) { - case GCONF_VALUE_BOOL: - if (gType != G_TYPE_BOOLEAN) { - return NULL; - } - g_value_set_boolean(value, gconf_value_get_bool(confValue)); - break; - case GCONF_VALUE_INT: - if (gType != G_TYPE_INT && gType != G_TYPE_UINT) { - return NULL; - } else if (gType == G_TYPE_INT) { - g_value_set_int(value, gconf_value_get_int(confValue)); - } else { - g_value_set_uint(value, gconf_value_get_int(confValue)); - } - break; - case GCONF_VALUE_STRING: - if (gType != G_TYPE_STRING) { - return NULL; - } - g_value_set_string(value, gconf_value_get_string(confValue)); - break; - default: - return NULL; - } - return value; -} - -static GConfValue *gconf_value_new_g_value(GValue * value) -{ - GConfValue *confValue; - GType gType = G_VALUE_TYPE(value); - - switch (gType) { - case G_TYPE_BOOLEAN: - confValue = gconf_value_new(GCONF_VALUE_BOOL); - gconf_value_set_bool(confValue, g_value_get_boolean(value)); - break; - case G_TYPE_INT: - confValue = gconf_value_new(GCONF_VALUE_INT); - gconf_value_set_int(confValue, g_value_get_int(value)); - break; - case G_TYPE_UINT: - confValue = gconf_value_new(GCONF_VALUE_INT); - gconf_value_set_int(confValue, g_value_get_uint(value)); - break; - case G_TYPE_STRING: - confValue = gconf_value_new(GCONF_VALUE_STRING); - gconf_value_set_string(confValue, g_value_get_string(value)); - break; - default: - return NULL; - } - return confValue; -} - -#define KEY_BUFFER_SIZE 100 -static gchar *to_real_key(gchar * confKey, MkdgBackend * backend, - const gchar * section, const gchar * key) -{ - gchar *camalCasedKey = gconf2_backend_get_key(backend, section, key, NULL); - - if (!STRING_IS_EMPTY(backend->basePath)) { - g_strlcpy(confKey, backend->basePath, KEY_BUFFER_SIZE); - g_strlcat(confKey, "/", KEY_BUFFER_SIZE); - } else { - g_strlcpy(confKey, "/", KEY_BUFFER_SIZE); - } - - if (!STRING_IS_EMPTY(section)) { - g_strlcat(confKey, section, KEY_BUFFER_SIZE); - g_strlcat(confKey, "/", KEY_BUFFER_SIZE); - } - g_strlcat(confKey, camalCasedKey, KEY_BUFFER_SIZE); - return confKey; -} - -/*============================================ - * Interface routines - */ -gchar *gconf2_backend_get_key(MkdgBackend * backend, - const gchar * section, const gchar * key, - gpointer userData) -{ - gchar *camalCasedKey = - (gchar *) g_hash_table_lookup(camalCasedKeyTable, key); - if (camalCasedKey == NULL) { - camalCasedKey = mkdg_str_dash_to_camel(key); - g_hash_table_insert(camalCasedKeyTable, (gpointer) key, camalCasedKey); - } - return camalCasedKey; -} - -GValue *gconf2_backend_read_value(MkdgBackend * backend, - GValue * value, - const gchar * section, - const gchar * key, gpointer userData) -{ - mkdg_log(DEBUG, "gconf2_backend_read_value(-,-,%s,%s,-):", section, key); - GConfClient *config = (GConfClient *) backend->config; - GError *err = NULL; - gchar confKey[KEY_BUFFER_SIZE]; - - to_real_key(confKey, backend, section, key); - GConfValue *confValue = gconf_client_get(config, confKey, &err); - - if (confValue == NULL) { - mkdg_log(ERROR, - "gconf2_backend_read_value(-,-,%s,%s,-): Failed to retrieve confValue", - section, key); - return NULL; - } - if (err != NULL) { - mkdg_log(ERROR, "gconf2_backend_read_value(-,-,%s,%s,-): %s", - section, key, err->message); - return NULL; - } - return gconf_value_to_g_value(confValue, value); -} - -gboolean gconf2_backend_write_value(MkdgBackend * backend, - GValue * value, - const gchar * section, - const gchar * key, gpointer userData) -{ - GConfClient *config = (GConfClient *) backend->config; - GError *err = NULL; - gchar confKey[KEY_BUFFER_SIZE]; - - to_real_key(confKey, backend, section, key); - GConfValue *confValue = gconf_value_new_g_value(value); - - gconf_client_set(config, confKey, confValue, &err); - gconf_value_free(confValue); - if (err != NULL) { - mkdg_log(ERROR, "gconf2_backend_write_value(-,-,%s,%s,-): %s", - section, key, err->message); - return FALSE; - } - return TRUE; -} - -MkdgBackend *gconf2_backend_new(const gchar * basePath, gpointer auxData) -{ - GConfClient *client = gconf_client_get_default(); - MkdgBackend *result = mkdg_backend_new(GCONF2_BACKEND_ID, - (gpointer) client, basePath, - auxData); - - camalCasedKeyTable = g_hash_table_new(g_str_hash, g_str_equal); - result->getKeyFunc = gconf2_backend_get_key; - result->readFunc = gconf2_backend_read_value; - result->writeFunc = gconf2_backend_write_value; - return result; -} diff --git a/src/GConf2Backend.h b/src/GConf2Backend.h deleted file mode 100644 index 5db946c..0000000 --- a/src/GConf2Backend.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © 2014 Red Hat, Inc. All rights reserved. - * Copyright © 2014 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:GConf2Backend - * @short_description: A GConf2 Backend - * @title: GConf2 Backend - * @stability: Stable - * @include: GConf2Backend.h - * - * GConf2 as MakerDialog backend. - */ - -#ifndef _G_CONF2_BACKEND_H_ -# define _G_CONF2_BACKEND_H_ -# include "MakerDialogBackend.h" -# define GCONF2_BACKEND_ID "gconf2" - -/** - * gconf2_backend_new: - * @basePath: All keys and sub-sections of this project should be put under here (with trailing '/'). - * @auxData: Auxiliary data. - * - * @returns: And GConf2 backend for this project. - */ -MkdgBackend *gconf2_backend_new(const gchar * basePath, gpointer auxData); - -#endif /* _G_CONF2_BACKEND_H_ */ diff --git a/src/IBusChewingProperties.c b/src/IBusChewingProperties.c index 09525fc..a37ba16 100644 --- a/src/IBusChewingProperties.c +++ b/src/IBusChewingProperties.c @@ -6,9 +6,7 @@ #include "IBusChewingUtil.h" #include "IBusChewingProperties.h" #include "IBusConfigBackend.h" -#ifdef USE_GSETTINGS -# include "GSettingsBackend.h" -#endif +#include "GSettingsBackend.h" #define PAGE_EDITING N_("Editing") #define PAGE_SELECTING N_("Selecting") @@ -257,15 +255,10 @@ IBusChewingProperties *ibus_chewing_properties_new(MkdgBackend * backend, mkdg_properties_from_spec_array(propSpecs, backend, parent, auxData); /* In schema generation, backend is NULL */ -#ifdef USE_GSETTINGS self->confObjTable = g_hash_table_new(g_str_hash, g_str_equal); -#else - self->confObjTable = NULL; -#endif return self; } -#ifdef USE_GSETTINGS static GString *ibus_section_to_schema(const gchar * section) { GString *result = g_string_new("org.freedesktop"); @@ -278,7 +271,6 @@ static GString *ibus_section_to_schema(const gchar * section) g_strfreev(strArr); return result; } -#endif /* USE_GSETTINGS */ GValue *ibus_chewing_properties_read_general(IBusChewingProperties * self, GValue * value, @@ -288,7 +280,6 @@ GValue *ibus_chewing_properties_read_general(IBusChewingProperties * self, { g_assert(self); g_assert(value); -#ifdef USE_GSETTINGS if (STRING_EQUALS(self->properties->backend->id, GSETTINGS_BACKEND_ID)) { GSettings *confObj; @@ -307,7 +298,6 @@ GValue *ibus_chewing_properties_read_general(IBusChewingProperties * self, g_assert(confObj); return mkdg_g_settings_read_value(confObj, value, key); } -#endif /* USE_GSETTINGS */ return mkdg_backend_read(self->properties->backend, value, section, key, userData); } diff --git a/src/MakerDialogWidget.c b/src/MakerDialogWidget.c deleted file mode 100644 index af9f637..0000000 --- a/src/MakerDialogWidget.c +++ /dev/null @@ -1,568 +0,0 @@ -#define GETTEXT_PACKAGE "gtk30" -#include -#include "MakerDialogUtil.h" -#include "MakerDialogWidget.h" - -const gchar *mkdgButtonTextArray[MKDG_BUTTON_INDEX_INVALID + 1] = { - NC_("Configure", "Cancel"), - NC_("Configure", "Save"), - NC_("Configure", "Apply"), - NC_("Configure", "Close"), - NC_("Configure", "Ok"), - NULL -}; - -MkdgButtonResponse mkdg_button_get_response(MkdgButtonIndex index) -{ - switch (index) { - case MKDG_BUTTON_INDEX_CANCEL: - return MKDG_BUTTON_RESPONSE_CANCEL; - case MKDG_BUTTON_INDEX_SAVE: - return MKDG_BUTTON_RESPONSE_SAVE; - case MKDG_BUTTON_INDEX_APPLY: - return MKDG_BUTTON_RESPONSE_APPLY; - case MKDG_BUTTON_INDEX_CLOSE: - return MKDG_BUTTON_RESPONSE_CLOSE; - case MKDG_BUTTON_INDEX_OK: - return MKDG_BUTTON_RESPONSE_OK; - default: - break; - } - return MKDG_BUTTON_RESPONSE_INVALID; -} - -const gchar *mkdg_button_get_text(MkdgButtonIndex index) -{ - if (index < 0) { - return NULL; - } - if (index > MKDG_BUTTON_INDEX_INVALID) { - return NULL; - } - return g_dpgettext2(NULL, "Configure", mkdgButtonTextArray[index]); -} - -/*===================================== - * MkdgWidget - * - */ - -static void mkdg_list_store_append(GtkListStore * listStore, - const gchar * str, - const gchar * translationContext, - MkdgPropertyFlags propertyFlags) -{ - GtkTreeIter iter; - - gtk_list_store_append(listStore, &iter); - - if (propertyFlags & MKDG_PROPERTY_FLAG_HAS_TRANSLATION) { - if (STRING_IS_EMPTY(translationContext)) { - mkdg_log(DEBUG, "mkdg_list_store_append() str=%s, _(str)=%s", - str, _(str)); - gtk_list_store_set(listStore, &iter, 0, str, 1, _(str), -1); - } else { - mkdg_log(DEBUG, "mkdg_list_store_append() str=%s, _(str)=%s", - str, g_dpgettext2(NULL, translationContext, str)); - gtk_list_store_set(listStore, &iter, 0, str, 1, - g_dpgettext2(NULL, translationContext, str), -1); - } - } else { - mkdg_log(DEBUG, "mkdg_list_store_append() str=%s", str); - gtk_list_store_set(listStore, &iter, 0, str, -1); - } -} - -gint mkdg_list_store_find_string(GtkListStore * listStore, - const gchar * str, - const gchar * translationContext, - MkdgPropertyFlags propertyFlags) -{ - g_assert(str); - mkdg_log(INFO, "mkdg_list_store_find_string(%s,%u)", str, propertyFlags); - gint i = 0, index = -1; - GtkTreeIter iter; - GValue gValue = { 0 }; - if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStore), &iter)) { - do { - gtk_tree_model_get_value(GTK_TREE_MODEL(listStore), &iter, 0, - &gValue); - if (STRING_EQUALS(str, g_value_get_string(&gValue))) { - index = i; - break; - } - i++; - g_value_unset(&gValue); - } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(listStore), &iter)); - } - if (index < 0 && !(propertyFlags & MKDG_PROPERTY_FLAG_NO_NEW)) { - /* Add new item */ - mkdg_list_store_append(listStore, str, translationContext, - propertyFlags); - index = i; - } - mkdg_log(DEBUG, "mkdg_list_store_find_string(%s,%u) index=%d", str, - propertyFlags, index); - return index; -} - -gint mkdg_combo_find_string_index(GtkComboBox * combo, - const gchar * str, - const gchar * translationContext, - MkdgPropertyFlags propertyFlags) -{ - GtkListStore *listStore = GTK_LIST_STORE(gtk_combo_box_get_model(combo)); - - return mkdg_list_store_find_string(listStore, str, translationContext, - propertyFlags); -} - -static GValue *mkdg_combo_get_active_text(GtkComboBox * combo) -{ - GtkTreeIter iter; - - if (!gtk_combo_box_get_active_iter(combo, &iter)) { - return NULL; - } - GValue *value = g_new0(GValue, 1); - GtkListStore *listStore = GTK_LIST_STORE(gtk_combo_box_get_model(combo)); - - gtk_tree_model_get_value(GTK_TREE_MODEL(listStore), &iter, 0, value); - return value; -} - -/*===================================== - * Widget Callback function wraps - */ - -static void on_value_change(MkdgWidget * mWidget, GValue * value) -{ - if (!(mWidget->flags & MKDG_WIDGET_FLAG_SET_IMMEDIATELY)) { - if (mWidget->flags & MKDG_WIDGET_FLAG_WRITE_IMMEDIATELY) { - mkdg_log(ERROR, - "MKDG_WIDGET_FLAG_SET_IMMEDIATELY is needed for MKDG_WIDGET_FLAG_WRITE_IMMEDIATELY"); - return; - } else if (mWidget->flags & MKDG_WIDGET_FLAG_APPLY_IMMEDIATELY) { - mkdg_log(ERROR, - "MKDG_WIDGET_FLAG_SET_IMMEDIATELY is needed for MKDG_WIDGET_FLAG_APPLY_IMMEDIATELY"); - return; - } - } - if (mWidget->flags & MKDG_WIDGET_FLAG_SET_IMMEDIATELY) { - property_context_set(mWidget->ctx, value); - } - - if (mWidget->flags & MKDG_WIDGET_FLAG_WRITE_IMMEDIATELY) { - property_context_save(mWidget->ctx, value, NULL); - } - - if (mWidget->flags & MKDG_WIDGET_FLAG_APPLY_IMMEDIATELY) { - property_context_apply(mWidget->ctx, NULL); - } -} - -static void on_comboBox_changed_wrap(GtkComboBox * comboBox, gpointer userData) -{ - MkdgWidget *mWidget = (MkdgWidget *) userData; - - //GValue gValue = { 0 }; - GValue *value = mkdg_combo_get_active_text(comboBox); - - mkdg_log(INFO, "on_comboBox_changed_wrap(), key=%s value=%s", - mWidget->ctx->spec->key, mkdg_g_value_to_string(value)); - on_value_change(mWidget, value); - g_value_unset(value); -} - -static void on_entry_activate_wrap(GtkEntry * entry, gpointer userData) -{ - MkdgWidget *mWidget = (MkdgWidget *) userData; - GValue gValue = { 0 }; - g_value_init(&gValue, mWidget->ctx->spec->valueType); - g_value_set_string(&gValue, gtk_editable_get_text(GTK_EDITABLE(entry))); - mkdg_log(INFO, "on_entry_activate_wrap(), key=%s value=%s", - mWidget->ctx->spec->key, g_value_get_string(&gValue)); - on_value_change(mWidget, &gValue); -} - -static void on_spinButton_value_changed_wrap(GtkSpinButton * button, - gpointer userData) -{ - MkdgWidget *mWidget = (MkdgWidget *) userData; - GValue gValue = { 0 }; - g_value_init(&gValue, mWidget->ctx->spec->valueType); - switch (mWidget->ctx->spec->valueType) { - case G_TYPE_INT: - g_value_set_int(&gValue, (gint) gtk_spin_button_get_value(button)); - mkdg_log(INFO, - "on_spinButton_value_changed_wrap(), key=%s value=%d", - mWidget->ctx->spec->key, g_value_get_int(&gValue)); - break; - case G_TYPE_UINT: - g_value_set_uint(&gValue, (guint) gtk_spin_button_get_value(button)); - mkdg_log(INFO, - "on_spinButton_value_changed_wrap(), key=%s value=%u", - mWidget->ctx->spec->key, g_value_get_uint(&gValue)); - break; - case G_TYPE_DOUBLE: - g_value_set_double(&gValue, gtk_spin_button_get_value(button)); - mkdg_log(INFO, - "on_spinButton_value_changed_wrap(), key=%s value=%g", - mWidget->ctx->spec->key, g_value_get_double(&gValue)); - break; - default: - break; - } - on_value_change(mWidget, &gValue); -} - -static void on_toggleButton_toggled_wrap(GtkToggleButton * button, - gpointer userData) -{ - MkdgWidget *mWidget = (MkdgWidget *) userData; - GValue gValue = { 0 }; - g_value_init(&gValue, mWidget->ctx->spec->valueType); - g_value_set_boolean(&gValue, gtk_toggle_button_get_active(button)); - mkdg_log(INFO, "on_entry_activate_wrap(), key=%s value=%s", - mWidget->ctx->spec->key, mkdg_g_value_to_string(&gValue)); - on_value_change(mWidget, &gValue); -} - -/*===================================== - * MkdgWgt subroutines - */ - -gint mkdg_wgt_get_width(MkdgWgt * wgt) -{ - GtkRequisition min_size; - GtkRequisition natural_size; - - gtk_widget_get_preferred_size(wgt, &min_size, &natural_size); - return natural_size.width; -} - -void mkdg_wgt_set_width(MkdgWgt * wgt, gint width) -{ - gtk_widget_set_size_request(wgt, width, -1); -} - -void mkdg_wgt_set_alignment(MkdgWgt * wgt, gfloat xAlign, gfloat yAlign) -{ - gtk_widget_set_halign(wgt, xAlign); - gtk_widget_set_valign(wgt, yAlign); - if (GTK_IS_LABEL(wgt)) { - /* gtk_label_set_justify takes no effect on single line label, - * but multi-lined label need this - */ - gtk_label_set_justify(GTK_LABEL(wgt), GTK_JUSTIFY_RIGHT); - } -} - -/*===================================== - * MkdgWidgetContainer subroutines - */ - -MkdgWidgetContainer *mkdg_widget_container_new(MkdgWgt * wgt) -{ - if (wgt == NULL) { - return NULL; - } - MkdgWidgetContainer *container = g_new0(MkdgWidgetContainer, 1); - - container->wgt = wgt; - container->children = g_ptr_array_new(); - container->childrenLabelWidth = 0; - return container; -} - -void mkdg_widget_container_add_widget(MkdgWidgetContainer * container, - MkdgWidget * mWidget) -{ - if ((container == NULL) || (mWidget == NULL)) { - return; - } - MkdgWgt *vbox = container->wgt; - - /* Add widget to the vbox */ - MkdgWgt *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, MKDG_HBOX_SPACING_DEFAULT); - MkdgWgt *labelWgt = MKDG_WGT(mWidget->label); - MkdgWgt *wgt = mWidget->wgt; - - gtk_box_prepend(GTK_BOX(hbox), labelWgt); - // mkdg_wgt_show(labelWgt); - gtk_box_prepend(GTK_BOX(hbox), wgt); - gtk_box_prepend(GTK_BOX(vbox), hbox); - - g_ptr_array_add(container->children, mWidget); - container->childrenLabelWidth = - MAX(container->childrenLabelWidth, mkdg_wgt_get_width(labelWgt)); -} - -void mkdg_widget_container_align_all_children(MkdgWidgetContainer * - container, - gfloat labelXAlign, - gfloat labelYAlign, - gfloat wgtXAlign, - gfloat wgtYAlign) -{ - if ((container == NULL) || (container->children == NULL)) { - return; - } - - gint i; - - for (i = 0; i < mkdg_widget_container_count_children(container); i++) { - MkdgWidget *mWidget = g_ptr_array_index(container->children, i); - - /* Set Width and Aligning labels */ - MkdgWgt *labelWgt = MKDG_WGT(mWidget->label); - - mkdg_wgt_set_width(labelWgt, container->childrenLabelWidth); - mkdg_wgt_set_alignment(labelWgt, labelXAlign, labelYAlign); - mkdg_wgt_set_alignment(mWidget->wgt, wgtXAlign, wgtYAlign); - } -} - -gint mkdg_widget_container_count_children(MkdgWidgetContainer * container) -{ - if ((container == NULL) || (container->children == NULL)) { - return -1; - } - return container->children->len; -} - -void mkdg_widget_cointainer_free(MkdgWidgetContainer * container) -{ - g_ptr_array_free(container->children, TRUE); - g_free(container); -} - -/*===================================== - * MkdgWidget subroutines - */ - -MkdgWidget *mkdg_widget_new(PropertyContext * ctx, MkdgWidgetFlag widgetFlags) -{ - if (ctx == NULL) { - return NULL; - } - mkdg_log(INFO, "mkdg_widget_new(%s,%x)", ctx->spec->key, widgetFlags); - MkdgWidget *mWidget = g_new0(MkdgWidget, 1); - - MkdgWgt *wgt = NULL; - GtkAdjustment *gAdjust = NULL; - gboolean bValue; - const gchar *strValue; - gdouble numberValue; - gdouble stepInc = 1.0; - gdouble pageInc = 10.0; - gdouble pageSize = 0.0; - - switch (ctx->spec->valueType) { - case G_TYPE_BOOLEAN: - bValue = g_value_get_boolean(property_context_get(ctx)); - wgt = gtk_toggle_button_new(); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wgt), bValue); - g_signal_connect(wgt, "toggled", - G_CALLBACK(on_toggleButton_toggled_wrap), mWidget); - break; - case G_TYPE_UINT: - case G_TYPE_INT: - if (ctx->spec->valueType == G_TYPE_UINT) { - numberValue = (gdouble) g_value_get_uint(property_context_get(ctx)); - } else { - numberValue = (gdouble) g_value_get_int(property_context_get(ctx)); - } - gAdjust = (GtkAdjustment *) gtk_adjustment_new(numberValue, - ctx->spec->min, - ctx->spec->max, - stepInc, pageInc, - pageSize); - wgt = gtk_spin_button_new(gAdjust, 1.0, 0); - g_signal_connect(wgt, "value-changed", - G_CALLBACK(on_spinButton_value_changed_wrap), mWidget); - break; - case G_TYPE_STRING: - strValue = g_value_get_string(property_context_get(ctx)); - if (ctx->spec->validValues) { - GtkListStore *listStore = NULL; - - if (ctx->spec->propertyFlags & MKDG_PROPERTY_FLAG_HAS_TRANSLATION) { - listStore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); - } else { - listStore = gtk_list_store_new(1, G_TYPE_STRING); - } - int i; - - for (i = 0; ctx->spec->validValues[i] != NULL; i++) { - /* Add new item */ - mkdg_list_store_append(listStore, - ctx->spec->validValues[i], - ctx->spec->translationContext, - ctx->spec->propertyFlags); - } - int index = mkdg_list_store_find_string(listStore, strValue, - ctx->spec-> - translationContext, - ctx->spec->propertyFlags); - - if (ctx->spec->propertyFlags & MKDG_PROPERTY_FLAG_NO_NEW) { - wgt = gtk_combo_box_new_with_model(GTK_TREE_MODEL(listStore)); - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(wgt), - renderer, FALSE); - if (ctx->spec->propertyFlags & - MKDG_PROPERTY_FLAG_HAS_TRANSLATION) { - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(wgt), - renderer, "text", 1, NULL); - } else { - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(wgt), - renderer, "text", 0, NULL); - } - } else { - wgt = - gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL - (listStore)); - gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX(wgt), - (ctx->spec-> - propertyFlags & - MKDG_PROPERTY_FLAG_HAS_TRANSLATION) - ? 1 : 0); - } - gtk_combo_box_set_active(GTK_COMBO_BOX(wgt), index); - g_signal_connect(wgt, "changed", - G_CALLBACK(on_comboBox_changed_wrap), mWidget); - } else { - wgt = gtk_entry_new(); - if (ctx->spec->max >= 0) { - gtk_entry_set_max_length(GTK_ENTRY(wgt), ctx->spec->max); - } - gtk_editable_set_text(GTK_EDITABLE(wgt), strValue); - gtk_editable_set_editable(GTK_EDITABLE(wgt), - !(ctx->spec->propertyFlags & - MKDG_PROPERTY_FLAG_NO_NEW)); - g_signal_connect(wgt, "activate", - G_CALLBACK(on_entry_activate_wrap), mWidget); - } - break; - default: - break; - } - if (wgt == NULL) { - g_free(mWidget); - return NULL; - } - mWidget->ctx = ctx; - mWidget->wgt = wgt; - MkdgWgtLabel *label = GTK_LABEL(gtk_label_new(_(ctx->spec->label))); - - mWidget->label = label; - gtk_widget_set_tooltip_text(GTK_WIDGET(label), _(ctx->spec->tooltip)); - mWidget->flags = widgetFlags; - mWidget->container = NULL; - return mWidget; -} - -MkdgWidget *mkdg_widget_new_in_container(PropertyContext * ctx, - MkdgWidgetFlag widgetFlags, - MkdgWidgetContainer * container) -{ - MkdgWidget *mWidget = mkdg_widget_new(ctx, widgetFlags); - - if (mWidget == NULL) { - return NULL; - } - mkdg_widget_container_add_widget(container, mWidget); - return mWidget; -} - -GValue *mkdg_widget_get_widget_value(MkdgWidget * mWidget, GValue * value) -{ - if (mWidget == NULL) { - return NULL; - } - if (mWidget->wgt == NULL) { - return NULL; - } - switch (mWidget->ctx->spec->valueType) { - case G_TYPE_BOOLEAN: - g_value_set_boolean(value, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (mWidget->wgt))); - break; - case G_TYPE_INT: - g_value_set_int(value, (gint) - gtk_spin_button_get_value(GTK_SPIN_BUTTON - (mWidget->wgt))); - break; - case G_TYPE_UINT: - g_value_set_uint(value, (guint) - gtk_spin_button_get_value(GTK_SPIN_BUTTON - (mWidget->wgt))); - break; - case G_TYPE_STRING: - if (mWidget->ctx->spec->validValues) { - GValue *strValue = - mkdg_combo_get_active_text(GTK_COMBO_BOX(mWidget->wgt)); - mkdg_log(INFO, "mkdg_widget_get_widget_value(%s) %s", - mWidget->ctx->spec->key, mkdg_g_value_to_string(strValue)); - g_value_copy(strValue, value); - g_value_unset(strValue); - } else { - g_value_set_string(value, - gtk_editable_get_text(GTK_EDITABLE(mWidget->wgt))); - } - break; - default: - return NULL; - } - return value; -} - -gboolean mkdg_widget_set_widget_value(MkdgWidget * mWidget, GValue * value) -{ - if (mWidget == NULL) { - return FALSE; - } - if (mWidget->ctx == NULL) { - return FALSE; - } - if (mWidget->wgt == NULL) { - return FALSE; - } - - switch (mWidget->ctx->spec->valueType) { - case G_TYPE_BOOLEAN: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mWidget->wgt), - g_value_get_boolean(value)); - break; - case G_TYPE_INT: - gtk_spin_button_set_value(GTK_SPIN_BUTTON(mWidget->wgt), - (gdouble) g_value_get_int(value)); - break; - case G_TYPE_UINT: - gtk_spin_button_set_value(GTK_SPIN_BUTTON(mWidget->wgt), - (gdouble) g_value_get_uint(value)); - break; - case G_TYPE_STRING: - if (mWidget->ctx->spec->validValues) { - const gchar *str = g_value_get_string(value); - gint index = - mkdg_combo_find_string_index(GTK_COMBO_BOX(mWidget->wgt), str, - mWidget->ctx->spec-> - translationContext, - mWidget->ctx->spec->propertyFlags); - - gtk_combo_box_set_active(GTK_COMBO_BOX(mWidget->wgt), index); - } else { - g_value_set_string(value, - gtk_editable_get_text(GTK_EDITABLE(mWidget->wgt))); - } - break; - default: - /* Not supported */ - return FALSE; - } - return TRUE; -} diff --git a/src/MakerDialogWidget.h b/src/MakerDialogWidget.h deleted file mode 100644 index 6e3effb..0000000 --- a/src/MakerDialogWidget.h +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef _MAKER_DIALOG_WIDGET_H_ -# define _MAKER_DIALOG_WIDGET_H_ -# include -# include "MakerDialogProperty.h" - -# ifndef MKDG_HBOX_SPACING_DEFAULT -# define MKDG_HBOX_SPACING_DEFAULT 5 -# endif - -# ifndef MKDG_VBOX_SPACING_DEFAULT -# define MKDG_VBOX_SPACING_DEFAULT 10 -# endif - -typedef enum { - MKDG_WIDGET_FLAG_SET_IMMEDIATELY = 1, - MKDG_WIDGET_FLAG_WRITE_IMMEDIATELY = 1 << 1, - MKDG_WIDGET_FLAG_APPLY_IMMEDIATELY = 1 << 2 -} MkdgWidgetFlag; - -typedef enum { - MKDG_BUTTON_INDEX_CANCEL, - MKDG_BUTTON_INDEX_SAVE, - MKDG_BUTTON_INDEX_APPLY, - MKDG_BUTTON_INDEX_CLOSE, - MKDG_BUTTON_INDEX_OK, - MKDG_BUTTON_INDEX_INVALID, -} MkdgButtonIndex; - -/** - * MkdgButtonFlag: - * @MKDG_BUTTON_FLAG_CANCEL: Close dialog. - * @MKDG_BUTTON_FLAG_SAVE: Save. - * @MKDG_BUTTON_FLAG_APPLY: Apply. - * @MKDG_BUTTON_FLAG_OK: Save, Apply and Close dialog. - * - * Buttons of this dialog. - */ - -typedef enum { - MKDG_BUTTON_FLAG_CANCEL = 1 << MKDG_BUTTON_INDEX_CANCEL, - MKDG_BUTTON_FLAG_SAVE = 1 << MKDG_BUTTON_INDEX_SAVE, - MKDG_BUTTON_FLAG_APPLY = 1 << MKDG_BUTTON_INDEX_APPLY, - MKDG_BUTTON_FLAG_CLOSE = 1 << MKDG_BUTTON_INDEX_CLOSE, - MKDG_BUTTON_FLAG_OK = 1 << MKDG_BUTTON_INDEX_OK, - MKDG_BUTTON_FLAG_INVALID = 1 << MKDG_BUTTON_INDEX_INVALID, -} MkdgButtonFlag; - -typedef enum { - MKDG_BUTTON_RESPONSE_CANCEL = GTK_RESPONSE_CANCEL, - MKDG_BUTTON_RESPONSE_SAVE = MKDG_BUTTON_INDEX_SAVE, - MKDG_BUTTON_RESPONSE_APPLY = GTK_RESPONSE_APPLY, - MKDG_BUTTON_RESPONSE_CLOSE = GTK_RESPONSE_CLOSE, - MKDG_BUTTON_RESPONSE_OK = GTK_RESPONSE_OK, - MKDG_BUTTON_RESPONSE_INVALID = MKDG_BUTTON_INDEX_INVALID -} MkdgButtonResponse; - -MkdgButtonResponse mkdg_button_get_response(MkdgButtonIndex index); -const gchar *mkdg_button_get_text(MkdgButtonIndex index); - -/** - * MkdgWdt: - * - * The actual widget from the ToolKit. - */ -typedef GtkWidget MkdgWgt; - -/** - * MkdgWdtLabel: - * - * The actual label widget from the ToolKit. - */ -typedef GtkLabel MkdgWgtLabel; - -/** - * MKDG_WGT: - * @obj: Object to be casted. - * - * Cast the object as MkdgWgt. - */ -# define MKDG_WGT(obj) GTK_WIDGET(obj) - -gint mkdg_wgt_get_width(MkdgWgt * wgt); - -void mkdg_wgt_set_width(MkdgWgt * wgt, gint width); - -void mkdg_wgt_set_alignment(MkdgWgt * wgt, gfloat xAlign, gfloat yAlign); - -void mkdg_wgt_show(MkdgWgt * wgt); - -void mkdg_wgt_show_all(MkdgWgt * wgt); - -void mkdg_wgt_destroy(MkdgWgt * wgt); - -/*===================================== - * MkdgWidgetContainer subroutines - */ -typedef struct { - MkdgWgt *wgt; - GPtrArray *children; - gint childrenLabelWidth; -} MkdgWidgetContainer; - -typedef struct { - MkdgWgtLabel *label; - MkdgWgt *wgt; - PropertyContext *ctx; - MkdgWidgetFlag flags; - MkdgWidgetContainer *container; -} MkdgWidget; - -MkdgWidgetContainer *mkdg_widget_container_new(MkdgWgt * wgt); - - -void mkdg_widget_container_add_widget(MkdgWidgetContainer * container, - MkdgWidget * mWidget); - -void mkdg_widget_container_align_all_children(MkdgWidgetContainer * - container, - gfloat labelXAlign, - gfloat labelYAlign, - gfloat wgtXAlign, - gfloat wgtYAlign); - -gint mkdg_widget_container_count_children(MkdgWidgetContainer * container); - -void mkdg_widget_cointainer_free(MkdgWidgetContainer * container); - - -MkdgWidget *mkdg_widget_new(PropertyContext * ctx, MkdgWidgetFlag widgetFlags); - - -/** - * mkdg_widget_get_widget_value: - * @mWidget: Widget to be get. - * @value: Result value stores here. - * @returns: NULL if failed, otherwise return the address of value. - * - * Get value from display widget. - * This subroutine will not touch the property context. Use property_context_get() for that. - * @see_also: property_context_get(), mkdg_widget_set_widget_value() - * @returns: TRUE if success, FALSE if either mWidget or it's members are NULL - */ -GValue *mkdg_widget_get_widget_value(MkdgWidget * mWidget, GValue * value); - -/** - * mkdg_widget_set_widget_value: - * @mWidget: Widget to be set. - * @value: Set Widget with this value. - * - * Set widget value for display. - * This subroutine will not touch the property context. Use property_context_set() for that. - * @see_also: property_context_set(), mkdg_widget_get_widget_value() - * @returns: TRUE if success, FALSE if either mWidget or it's members are NULL - */ -gboolean mkdg_widget_set_widget_value(MkdgWidget * mWidget, GValue * value); - -#endif /* _MAKER_DIALOG_WIDGET_H_ */ diff --git a/src/generate-gconf-schemas.c b/src/generate-gconf-schemas.c deleted file mode 100644 index 18852b7..0000000 --- a/src/generate-gconf-schemas.c +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include -#include -#include -#include - -/* - * Callback should be skipped - */ -#ifndef MKDG_SPEC_ONLY -# define MKDG_SPEC_ONLY -#endif - -#include "MakerDialogUtil.h" -#include "MakerDialogProperty.h" -#include "IBusConfigBackend.h" -#include "IBusChewingProperties.h" -#define XML_BUFFER_SIZE 1000 -#define DEFAULT_LOCALES "C;zh_TW" - -static gint verbose = WARN; -static gchar *schemasFilename = NULL; -static gchar *localeStr = NULL; -static gchar *localeOptStr = NULL; -static gchar **localeArray = NULL; - -static const GOptionEntry entries[] = { - {"verbose", 'v', 0, G_OPTION_ARG_INT, &verbose, - "Verbose level. The higher the level, the more the debug messages.", - "[integer]"}, - {"locale", 'l', 0, G_OPTION_ARG_STRING, &localeOptStr, - "Supported locales. Use ';' to separate locales.", - "[str]"}, - {NULL}, -}; - - -/*============================================ - * GConf Schemas routines - */ - -static void ctx_write_locale(PropertyContext * ctx, - FILE * outF, const gchar * locale) -{ - gchar buf[XML_BUFFER_SIZE]; - - mkdg_log(DEBUG, "ctx_write_locale(%s,-,%s)", ctx->spec->key, locale); - setlocale(LC_ALL, "locale"); - g_snprintf(buf, 50, "name=\"%s\"", locale); - setlocale(LC_MESSAGES, locale); - mkdg_xml_tags_write(outF, "locale", MKDG_XML_TAG_TYPE_BEGIN_ONLY, buf, - NULL); - mkdg_xml_tags_write(outF, "short", MKDG_XML_TAG_TYPE_SHORT, NULL, - gettext(ctx->spec->label)); - mkdg_xml_tags_write(outF, "long", MKDG_XML_TAG_TYPE_LONG, NULL, - gettext(ctx->spec->tooltip)); - mkdg_xml_tags_write(outF, "locale", MKDG_XML_TAG_TYPE_END_ONLY, NULL, NULL); -} - -gboolean ctx_write(PropertyContext * ctx, const gchar * schemasHome, - const gchar * owner, FILE * outF) -{ - if (ctx->spec->propertyFlags & MKDG_PROPERTY_FLAG_NO_BACKEND) { - return TRUE; - } - mkdg_xml_tags_write(outF, "schema", MKDG_XML_TAG_TYPE_BEGIN_ONLY, NULL, - NULL); - gchar buf[XML_BUFFER_SIZE]; - gchar *camalCasedKey = mkdg_str_dash_to_camel(ctx->spec->key); - - g_snprintf(buf, XML_BUFFER_SIZE, "/schemas%s", schemasHome); - - if (!STRING_IS_EMPTY(ctx->spec->subSection)) { - g_strlcat(buf, "/", XML_BUFFER_SIZE); - g_strlcat(buf, ctx->spec->subSection, XML_BUFFER_SIZE); - } - g_strlcat(buf, "/", XML_BUFFER_SIZE); - g_strlcat(buf, camalCasedKey, XML_BUFFER_SIZE); - - mkdg_xml_tags_write(outF, "key", MKDG_XML_TAG_TYPE_SHORT, NULL, buf); - mkdg_xml_tags_write(outF, "applyto", MKDG_XML_TAG_TYPE_SHORT, NULL, - buf + strlen("/schemas")); - mkdg_xml_tags_write(outF, "owner", MKDG_XML_TAG_TYPE_SHORT, NULL, owner); - switch (ctx->spec->valueType) { - case G_TYPE_BOOLEAN: - mkdg_xml_tags_write(outF, "type", MKDG_XML_TAG_TYPE_SHORT, NULL, - "bool"); - break; - case G_TYPE_INT: - case G_TYPE_UINT: - mkdg_xml_tags_write(outF, "type", MKDG_XML_TAG_TYPE_SHORT, NULL, "int"); - break; - case G_TYPE_STRING: - mkdg_xml_tags_write(outF, "type", MKDG_XML_TAG_TYPE_SHORT, NULL, - "string"); - break; - default: - break; - } - if (ctx->spec->defaultValue) { - mkdg_xml_tags_write(outF, "default", MKDG_XML_TAG_TYPE_SHORT, NULL, - ctx->spec->defaultValue); - } - int i; - - for (i = 0; localeArray[i] != NULL; i++) { - ctx_write_locale(ctx, outF, localeArray[i]); - } - - setlocale(LC_ALL, NULL); - mkdg_xml_tags_write(outF, "schema", MKDG_XML_TAG_TYPE_END_ONLY, NULL, NULL); - return TRUE; -} - -/** - * write_gconf_schemas_file: - * @filename: Filename for output. - * @owner: Owner of the schemas. - * @schemasHome: The "home direcory" of schemas. - * @localeStr: Supported localeStr, use ';' as delimiter. - * @returns: TRUE if succeed; FALSE otherwise. - * - * Output the parameters as GConf schemes file. - */ -gboolean write_gconf_schemas_file(const gchar * filename, - const gchar * owner, - const gchar * schemasHome, - const gchar * localeStr) -{ - mkdg_log(INFO, "write_gconf_schemes_file(%s,%s,%s,%s)", filename, - owner, schemasHome, localeStr); - FILE *outF = fopen(filename, "w"); - - if (outF == NULL) { - mkdg_log(DEBUG, - "write_gconf_schemas_file(%s) file %s cannot be written!", - filename, filename); - return FALSE; - } - localeArray = g_strsplit_set(localeStr, ":;", -1); - gchar **loc; - - for (loc = localeArray; *loc != NULL; loc++) { - mkdg_log(DEBUG, "write_gconf_schemas_file() locale=%s", *loc); - } - - /* Header */ - mkdg_xml_tags_write(outF, "gconfschemafile", - MKDG_XML_TAG_TYPE_BEGIN_ONLY, NULL, NULL); - mkdg_xml_tags_write(outF, "schemalist", - MKDG_XML_TAG_TYPE_BEGIN_ONLY, NULL, NULL); - /* Body */ - /* Backend is not needed for schema generation */ - IBusChewingProperties *iProperties = - ibus_chewing_properties_new(NULL, NULL, NULL); - gsize i; - - for (i = 0; i < mkdg_properties_size(iProperties->properties); i++) { - PropertyContext *ctx = - mkdg_properties_index(iProperties->properties, i); - ctx_write(ctx, schemasHome, owner, outF); - } - - /* Footer */ - mkdg_xml_tags_write(outF, "schemalist", MKDG_XML_TAG_TYPE_END_ONLY, - NULL, NULL); - mkdg_xml_tags_write(outF, "gconfschemafile", - MKDG_XML_TAG_TYPE_END_ONLY, NULL, NULL); - if (fclose(outF)) - return FALSE; - mkdg_log(DEBUG, "write_gconf_schemas_file(%s) ... done.", filename); - return TRUE; -} - -int main(gint argc, gchar * argv[]) -{ - GError *error = NULL; - GOptionContext *context; - - /* Init i18n messages */ - setlocale(LC_ALL, ""); - bindtextdomain(QUOTE_ME(PROJECT_NAME), QUOTE_ME(DATA_DIR) "/locale"); - textdomain(QUOTE_ME(PROJECT_NAME)); - - context = g_option_context_new("schemasFile"); - - g_option_context_add_main_entries(context, entries, "ibus-chewing"); - - if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_print("Option parsing failed: %s\n", error->message); - return 2; - } - g_option_context_free(context); - if (argc < 2) { - fprintf(stderr, "Specify output schemas file!\n"); - return 2; - } - mkdg_log_set_level(verbose); - schemasFilename = argv[1]; - - localeStr = (localeOptStr) ? localeOptStr : DEFAULT_LOCALES; - g_type_init(); - gboolean result = write_gconf_schemas_file(schemasFilename, "ibus-chewing", - QUOTE_ME(PROJECT_SCHEMA_BASE), - localeStr); - - if (localeOptStr) - g_free(localeOptStr); - if (!result) { - return 1; - } - return 0; -} diff --git a/src/generate-gsettings-schemas.c b/src/generate-gsettings-schemas.c deleted file mode 100644 index 2578783..0000000 --- a/src/generate-gsettings-schemas.c +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include -#include -#include -#include - -/* - * Callback should be skipped - */ -#ifndef MKDG_SPEC_ONLY -# define MKDG_SPEC_ONLY -#endif - -#include "MakerDialogUtil.h" -#include "MakerDialogProperty.h" -#include "GSettingsBackend.h" -#include "IBusChewingProperties.h" -#define XML_BUFFER_SIZE 1000 -#define DEFAULT_LOCALES "C;zh_TW" - -static gint verbose = WARN; -static gchar *schemasFilename = NULL; - -static const GOptionEntry entries[] = { - {"verbose", 'v', 0, G_OPTION_ARG_INT, &verbose, - "Verbose level. The higher the level, the more the debug messages.", - "[integer]"}, - {NULL}, -}; - -/** - * write_gconf_schemas_file: - * @filename: Filename for output. - * - * Output the parameters as GSettings schemes file. - */ -gboolean write_schemas_file(const gchar * filename) -{ - mkdg_log(INFO, "write_schemes_file(%s,)", filename); - FILE *outF = fopen(filename, "w"); - - if (outF == NULL) { - mkdg_log(DEBUG, - "write_gconf_schemas_file(%s) file %s cannot be written!", - filename, filename); - return FALSE; - } - - gboolean result = - mkdg_g_settings_write_schema_from_spec_array(QUOTE_ME - (PROJECT_SCHEMA_ID), - QUOTE_ME - (PROJECT_SCHEMA_PATH), - outF, propSpecs, - QUOTE_ME(PROJECT_NAME)); - - if (fclose(outF)) - return FALSE; - mkdg_log(DEBUG, "write_gconf_schemas_file(%s) ... done.", filename); - return result; -} - -int main(gint argc, gchar * argv[]) -{ - GError *error = NULL; - GOptionContext *context; - - /* Init i18n messages */ - setlocale(LC_ALL, ""); - bindtextdomain(QUOTE_ME(PROJECT_NAME), QUOTE_ME(DATA_DIR) "/locale"); - textdomain(QUOTE_ME(PROJECT_NAME)); - - context = g_option_context_new("schemasFile"); - - g_option_context_add_main_entries(context, entries, "ibus-chewing"); - - if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_print("Option parsing failed: %s\n", error->message); - return 1; - } - g_option_context_free(context); - if (argc < 2) { - fprintf(stderr, "Specify filename of outputing schemas file!\n"); - return 1; - } - mkdg_log_set_level(verbose); - schemasFilename = argv[1]; - gboolean result = write_schemas_file(schemasFilename); - - if (!result) { - return 2; - } - return 0; -} diff --git a/src/ibus-chewing-engine-private.h b/src/ibus-chewing-engine-private.h index 9401ac0..5c253fc 100644 --- a/src/ibus-chewing-engine-private.h +++ b/src/ibus-chewing-engine-private.h @@ -32,12 +32,7 @@ #include "IBusChewingUtil.h" #include "IBusChewingProperties.h" #include "IBusChewingPreEdit.h" -#ifdef USE_GSETTINGS #include "GSettingsBackend.h" -#endif -#ifdef USE_GCONF2 -#include "GConf2Backend.h" -#endif #ifndef __IBUS_CHEWING_ENGINE_PRIVATE_H__ #define __IBUS_CHEWING_ENGINE_PRIVATE_H__ @@ -50,7 +45,6 @@ extern "C" { -#include "maker-dialog.h" void ibus_chewing_engine_handle_Default(IBusChewingEngine * self, guint keyval, gboolean shiftPressed); diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index 906e907..8188fa8 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -33,12 +33,7 @@ #include "IBusChewingUtil.h" #include "IBusChewingProperties.h" #include "IBusChewingPreEdit.h" -#ifdef USE_GSETTINGS #include "GSettingsBackend.h" -#endif -#ifdef USE_GCONF2 -#include "GConf2Backend.h" -#endif #define GOB_VERSION_MAJOR 2 #define GOB_VERSION_MINOR 0 @@ -300,18 +295,9 @@ ibus_chewing_engine_init (IBusChewingEngine * self G_GNUC_UNUSED) if (self->icPreEdit == NULL) { -#ifdef USE_GSETTINGS MkdgBackend *backend = mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); -#elif defined USE_GCONF2 - MkdgBackend *backend = - gconf2_backend_new(QUOTE_ME(PROJECT_SCHEMA_BASE), NULL); -#else - MkdgBackend *backend = NULL; - g_error("Flag GSETTINGS_SUPPORT or GCONF2_SUPPORT are required!"); - return; -#endif /* USE_GSETTINGS */ self->icPreEdit = ibus_chewing_pre_edit_new(backend); } diff --git a/src/ibus-chewing-engine.h b/src/ibus-chewing-engine.h index a4d9975..2e83bc1 100644 --- a/src/ibus-chewing-engine.h +++ b/src/ibus-chewing-engine.h @@ -33,12 +33,7 @@ #include "IBusChewingUtil.h" #include "IBusChewingProperties.h" #include "IBusChewingPreEdit.h" -#ifdef USE_GSETTINGS #include "GSettingsBackend.h" -#endif -#ifdef USE_GCONF2 -#include "GConf2Backend.h" -#endif #include #include diff --git a/src/ibus-setup-chewing.c b/src/ibus-setup-chewing.c deleted file mode 100644 index 6cc0428..0000000 --- a/src/ibus-setup-chewing.c +++ /dev/null @@ -1,137 +0,0 @@ -/* vim:set et sts=4: */ -/* - * Copyright © 2014 Red Hat, Inc. All rights reserved. - * Copyright © 2014 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include -#include -#include "MakerDialogUtil.h" -#include "MakerDialogBackend.h" -#ifdef USE_GSETTINGS -# include "GSettingsBackend.h" -#endif -#ifdef USE_GCONF2_SUPPORT -# include "GConf2Backend.h" -#endif -#include "GConf2Backend.h" -#include "IBusChewingProperties.h" -#include "IBusChewingUtil.h" -#include "maker-dialog.h" - - -/* options */ -static gboolean showFlags = FALSE; -gint verbose = 0; - -static const GOptionEntry entries[] = { - {"show_flags", 's', 0, G_OPTION_ARG_NONE, &showFlags, - "Show compile flag only", NULL}, - {"verbose", 'v', 0, G_OPTION_ARG_INT, &verbose, - "Verbose level. The higher the level, the more the debug messages.", - "[integer]"}, - {NULL}, -}; - - -void save_values(GtkDialog *sDialog, gint response_id, gpointer mDialog) -{ - if (response_id != GTK_RESPONSE_OK) { - return; - } - maker_dialog_save_all_widgets_values(mDialog, NULL); -} - -gint start_dialog() -{ -#ifdef USE_GSETTINGS - MkdgBackend *backend = - mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), - QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); -#elif defined USE_GCONF2 - MkdgBackend *backend = - gconf2_backend_new(QUOTE_ME(PROJECT_SCHEMA_BASE), NULL); -#else - MkdgBackend *backend = NULL; - - g_error("Flag GSETTINGS_SUPPORT or GCONF2_SUPPORT are required!"); - return 1; -#endif /* GSETTINGS_SUPPORT */ - IBusChewingProperties *iProperties = - ibus_chewing_properties_new(backend, NULL, NULL); - - MakerDialog *mDialog = - maker_dialog_new_full(iProperties->properties, _("Setting"), - MKDG_WIDGET_FLAG_SET_IMMEDIATELY, - MKDG_BUTTON_FLAG_OK | MKDG_BUTTON_FLAG_CANCEL); - GtkWidget *sDialog = GTK_WIDGET(mDialog); - - gtk_window_present(GTK_WINDOW(mDialog)); - g_signal_connect(sDialog, "response", G_CALLBACK(save_values), mDialog); - // gint result = gtk_dialog_run(GTK_DIALOG(sDialog)); - - // gtk_widget_hide(sDialog); - // if (result != GTK_RESPONSE_OK) { - // return 3; - // } - // maker_dialog_save_all_widgets_values(mDialog, NULL); - return 0; -} - -gint main(gint argc, gchar * argv[]) -{ - GError *error = NULL; - GOptionContext *context; - - adw_init(); - - /* Init i18n messages */ - setlocale(LC_ALL, ""); - bindtextdomain(QUOTE_ME(PROJECT_NAME), QUOTE_ME(DATA_DIR) "/locale"); - textdomain(QUOTE_ME(PROJECT_NAME)); - - context = g_option_context_new("- ibus chewing engine setup"); - - g_option_context_add_main_entries(context, entries, QUOTE_ME(PROJECT_NAME)); - - if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_print("Option parsing failed: %s\n", error->message); - exit(1); - } - - g_option_context_free(context); - if (showFlags) { - printf("PROJECT_NAME=" QUOTE_ME(PROJECT_NAME) "\n"); - printf("DATA_DIR=" QUOTE_ME(DATA_DIR) "\n"); - printf("CHEWING_DATADIR_REAL=" QUOTE_ME(CHEWING_DATADIR_REAL) - "\n"); - return 0; - } - mkdg_log_set_level(verbose); - start_dialog(); - while (true) - g_main_context_iteration (NULL, TRUE); - return 0; -} - -/* vim:set et sts=4: */ diff --git a/src/main.c b/src/main.c index cc46588..1be5dfd 100644 --- a/src/main.c +++ b/src/main.c @@ -27,9 +27,7 @@ #include #include "ibus-chewing-engine.h" #include "IBusChewingUtil.h" -#include "maker-dialog.h" -MakerDialog *makerDialog = NULL; static IBusBus *bus = NULL; static IBusFactory *factory = NULL; diff --git a/src/maker-dialog-private.h b/src/maker-dialog-private.h deleted file mode 100644 index e042511..0000000 --- a/src/maker-dialog-private.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. All rights reserved. - * Copyright © 2009 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef __MAKER_DIALOG_PRIVATE_H__ -#define __MAKER_DIALOG_PRIVATE_H__ - -#include "maker-dialog.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -struct _MakerDialogPrivate { - GHashTable * containerTable; - GHashTable * widgetTable; - GHashTable * notebookContentTable; - GStringChunk * widgetIds; - GPtrArray * pageLabels; - MkdgProperties * properties; -}; -gboolean maker_dialog_prepare (MakerDialog * self); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/src/maker-dialog.c b/src/maker-dialog.c deleted file mode 100644 index df0a912..0000000 --- a/src/maker-dialog.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. All rights reserved. - * Copyright © 2009 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#define GOB_VERSION_MAJOR 2 -#define GOB_VERSION_MINOR 0 -#define GOB_VERSION_PATCHLEVEL 20 - -#define selfp (self->_priv) - -#include /* memset() */ - -#include "maker-dialog.h" - -#include "maker-dialog-private.h" - -#ifdef G_LIKELY -#define ___GOB_LIKELY(expr) G_LIKELY(expr) -#define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr) -#else /* ! G_LIKELY */ -#define ___GOB_LIKELY(expr) (expr) -#define ___GOB_UNLIKELY(expr) (expr) -#endif /* G_LIKELY */ - - -#define GETTEXT_PACKAGE "gtk30" -#include - -/* self casting macros */ -#define SELF(x) MAKER_DIALOG(x) -#define SELF_CONST(x) MAKER_DIALOG_CONST(x) -#define IS_SELF(x) MAKER_IS_DIALOG(x) -#define TYPE_SELF MAKER_TYPE_DIALOG -#define SELF_CLASS(x) MAKER_DIALOG_CLASS(x) - -#define SELF_GET_CLASS(x) MAKER_DIALOG_GET_CLASS(x) - -/* self typedefs */ -typedef MakerDialog Self; -typedef MakerDialogClass SelfClass; - -/* here are local prototypes */ -static void maker_dialog_class_init (MakerDialogClass * c) G_GNUC_UNUSED; -static void maker_dialog_init (MakerDialog * self) G_GNUC_UNUSED; - -/* pointer to the class of our parent */ -static GtkDialogClass *parent_class = NULL; - -/* Short form macros */ -#define self_new maker_dialog_new -#define self_new_full maker_dialog_new_full -#define self_add_property maker_dialog_add_property -#define self_add_all_properties maker_dialog_add_all_properties -#define self_prepare maker_dialog_prepare -#define self_assign_widget_value maker_dialog_assign_widget_value -#define self_assign_all_widgets_values maker_dialog_assign_all_widgets_values -#define self_save_all_widgets_values maker_dialog_save_all_widgets_values -#define self_get_widget_value maker_dialog_get_widget_value -#define self_set_widget_value maker_dialog_set_widget_value -#define self_show maker_dialog_show -#define self_get_widget_by_key maker_dialog_get_widget_by_key -GType -maker_dialog_get_type (void) -{ - static GType type = 0; - - if ___GOB_UNLIKELY(type == 0) { - static const GTypeInfo info = { - sizeof (MakerDialogClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) maker_dialog_class_init, - (GClassFinalizeFunc) NULL, - NULL /* class_data */, - sizeof (MakerDialog), - 0 /* n_preallocs */, - (GInstanceInitFunc) maker_dialog_init, - NULL - }; - - type = g_type_register_static (GTK_TYPE_DIALOG, "MakerDialog", &info, (GTypeFlags)0); - } - - return type; -} - -/* a macro for creating a new object of our type */ -#define GET_NEW ((MakerDialog *)g_object_new(maker_dialog_get_type(), NULL)) - -/* a function for creating a new object of our type */ -#include -static MakerDialog * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED; -static MakerDialog * -GET_NEW_VARG (const char *first, ...) -{ - MakerDialog *ret; - va_list ap; - va_start (ap, first); - ret = (MakerDialog *)g_object_new_valist (maker_dialog_get_type (), first, ap); - va_end (ap); - return ret; -} - - -static void -___finalize(GObject *obj_self) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::finalize" - MakerDialog *self G_GNUC_UNUSED = MAKER_DIALOG (obj_self); - gpointer priv G_GNUC_UNUSED = self->_priv; - if(self->notebookWgt) { g_object_unref ((gpointer) self->notebookWgt); self->notebookWgt = NULL; } - if(self->_priv->containerTable) { g_hash_table_destroy ((gpointer) self->_priv->containerTable); self->_priv->containerTable = NULL; } - if(self->_priv->widgetTable) { g_hash_table_destroy ((gpointer) self->_priv->widgetTable); self->_priv->widgetTable = NULL; } - if(self->_priv->notebookContentTable) { g_hash_table_destroy ((gpointer) self->_priv->notebookContentTable); self->_priv->notebookContentTable = NULL; } - if(self->_priv->widgetIds) { g_string_chunk_free ((gpointer) self->_priv->widgetIds); self->_priv->widgetIds = NULL; } -#define pageLabels (self->_priv->pageLabels) -#define VAR pageLabels - { - - if (VAR) { - g_ptr_array_free(VAR, TRUE); - } - } - memset(&(pageLabels), 0, sizeof(pageLabels)); -#undef VAR -#undef pageLabels -#define properties (self->_priv->properties) -#define VAR properties - { - - if (VAR) { - mkdg_properties_free(VAR); - } - } - memset(&(properties), 0, sizeof(properties)); -#undef VAR -#undef properties - if(G_OBJECT_CLASS(parent_class)->finalize) \ - (* G_OBJECT_CLASS(parent_class)->finalize)(obj_self); -} -#undef __GOB_FUNCTION__ - -static void -maker_dialog_class_init (MakerDialogClass * c G_GNUC_UNUSED) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::class_init" - GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) c; - - g_type_class_add_private(c,sizeof(MakerDialogPrivate)); - - parent_class = g_type_class_ref (GTK_TYPE_DIALOG); - - g_object_class->finalize = ___finalize; -} -#undef __GOB_FUNCTION__ -static void -maker_dialog_init (MakerDialog * self G_GNUC_UNUSED) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::init" - self->_priv = G_TYPE_INSTANCE_GET_PRIVATE(self,MAKER_TYPE_DIALOG,MakerDialogPrivate); - self->notebookWgt = NULL; - self->_priv->containerTable = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ; - self->_priv->widgetTable = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ; - self->_priv->notebookContentTable = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL) ; - self->_priv->widgetIds = g_string_chunk_new(MAKER_DIALOG_ID_LENGTH) ; - self->_priv->pageLabels = NULL; - self->_priv->properties = NULL; - { - - /* initialize the object here */ - - } -} -#undef __GOB_FUNCTION__ - - - -MakerDialog * -maker_dialog_new (void) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::new" -{ - - Self * self = GET_NEW; - return self; - }} -#undef __GOB_FUNCTION__ - -MakerDialog * -maker_dialog_new_full (MkdgProperties * properties, const gchar * title, MkdgWidgetFlag wFlags, MkdgButtonFlag bFlags) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::new_full" -{ - - Self * self = GET_NEW; - GtkDialog * dialog = GTK_DIALOG(self); - gtk_window_set_title(GTK_WINDOW(dialog), title); - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); - // gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - self->wFlags = wFlags; - self->_priv->properties = properties; - - gint i; - /* Create Buttons */ - for (i = MKDG_BUTTON_INDEX_INVALID -1; i >= 0; i--) { - if ( bFlags & (1 << i)) { - const gchar *buttonText = mkdg_button_get_text(i); - mkdg_log(DEBUG, "new_full(-,%s,%X,%X) i=%d, buttonText=%s", - title, wFlags, bFlags, i, buttonText); - MkdgButtonResponse response = mkdg_button_get_response(i); - gtk_dialog_add_button(dialog, buttonText, response); - } - } - - /* Create Notebook */ - self->notebookWgt = gtk_notebook_new(); - // gtk_container_set_border_width(GTK_CONTAINER(self->notebookWgt), 5); - // mkdg_wgt_show(self->notebookWgt); - GtkWidget *dialogVboxWgt = gtk_dialog_get_content_area(GTK_DIALOG(self)); - // mkdg_wgt_show(dialogVboxWgt); - gtk_box_prepend(GTK_BOX(dialogVboxWgt), self->notebookWgt); - - self_prepare(self); - return self; - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_add_property: - * @self: A MakerDialog - * @ctx: A PropertyContext which contain the value to be set. - * @returns: TRUE if the property adding succeed; FALSE otherwise. - * - * Add a property to the dialog and corresponding Gtk widget will also be - * set. - **/ -gboolean -maker_dialog_add_property (MakerDialog * self, PropertyContext * ctx) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::add_property" - g_return_val_if_fail (self != NULL, (gboolean )0); - g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0); -{ - - - if (ctx == NULL) { - return FALSE; - } - mkdg_log(INFO, "add_property(%s) %s", ctx->spec->key, - property_context_to_string(ctx)); - - /* Create the widget */ - MkdgWidget * mWidget = mkdg_widget_new(ctx, self->wFlags); - if (mWidget == NULL) - return FALSE; - - /* Find the container */ - const gchar *pageName = (STRING_IS_EMPTY(ctx->spec->pageName)) ? - MKDG_PAGE_NAME_DEFAULT : ctx->spec->pageName; - MkdgWidgetContainer *container = - MKDG_CONTAINER_TABLE_LOOKUP(self->_priv->containerTable, pageName); - - /* Do we need a new container/page? */ - if (container == NULL) { - MkdgWgt * vboxWgt = gtk_box_new(GTK_ORIENTATION_VERTICAL, MKDG_VBOX_SPACING_DEFAULT); - // gtk_container_set_border_width(GTK_CONTAINER (vboxWgt), 10); - // mkdg_wgt_show(vboxWgt); - container = mkdg_widget_container_new(vboxWgt); - g_hash_table_insert(self->_priv->containerTable, (gpointer) pageName, - (gpointer) container); - - /* new notebook page */ - MkdgWgt * pageLabelWgt = gtk_label_new(_(pageName)); - // mkdg_wgt_show(pageLabelWgt); - gtk_notebook_append_page(GTK_NOTEBOOK(self->notebookWgt), vboxWgt, - pageLabelWgt); - } - - /* Add the widget to container */ - mkdg_widget_container_add_widget(container, mWidget); - g_hash_table_insert(self->_priv->widgetTable, (gpointer) ctx->spec->key, - (gpointer) mWidget); - return TRUE; - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_add_all_properties: - * @self: A MakerDialog - * @returns: TRUE if all properties added successfully; FALSE otherwise. - * - * Add all properties to the dialog and corresponding Gtk widget will also be - * set. - * - **/ -gboolean -maker_dialog_add_all_properties (MakerDialog * self) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::add_all_properties" - g_return_val_if_fail (self != NULL, (gboolean )0); - g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0); -{ - - gint i; - gboolean result = TRUE; - for(i = 0; i < mkdg_properties_size(self->_priv->properties); i++) { - PropertyContext * ctx = mkdg_properties_index(self->_priv->properties, i); - GValue * ret = property_context_load(ctx, NULL); - if (ret == NULL) - result = FALSE; - self_add_property(self, ctx); - } - return result; - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_prepare: - * @returns: TRUE if success; FALSE otherwise. - * - * Prepare the MakerDialog after new. This includes add_all_properties. - **/ -gboolean -maker_dialog_prepare (MakerDialog * self) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::prepare" - g_return_val_if_fail (self != NULL, (gboolean )0); - g_return_val_if_fail (MAKER_IS_DIALOG (self), (gboolean )0); -{ - - gboolean success; - success = self_add_all_properties(self); - if (!success) { - return FALSE; - } - - GList * containerList = g_hash_table_get_values(self->_priv->containerTable); - GList * node; - for(node = g_list_first(containerList); node != NULL; node = g_list_next(node)) { - MkdgWidgetContainer *container = (MkdgWidgetContainer *) node->data; - mkdg_widget_container_align_all_children(container, 1.0f, 0.5f, 0.0f, 0.5f); - } - g_list_free(containerList); - return TRUE; - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_assign_widget_value: - * @self: A MakerDialog. - * @ctx: The PropertyContext - * @userData: userData that pass through applyFunc. - * - * Assign the value shown in widget to the property. - * That is firstly save the value, then apply the value. - * - * @see_also: set_widget_value() - **/ -void -maker_dialog_assign_widget_value (MakerDialog * self, PropertyContext * ctx, gpointer userData) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::assign_widget_value" - g_return_if_fail (self != NULL); - g_return_if_fail (MAKER_IS_DIALOG (self)); -{ - - mkdg_log(INFO, "assign_widget_value(%s)", ctx->spec->key); - GValue gValue = { 0 }; - mkdg_g_value_reset(&gValue, ctx->spec->valueType, TRUE); - self_get_widget_value(self, ctx->spec->key, &gValue); - property_context_save(ctx, &gValue, userData); - property_context_apply(ctx, userData); - g_value_unset(&gValue); - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_assign_all_widgets_values: - * @self: A MakerDialog. - * @userData: userData that pass through applyFunc. - * - * Invoke assign_widget_value for all widgets. - * - * @see_also: assign_widget_value(), set_widget_value() - **/ -void -maker_dialog_assign_all_widgets_values (MakerDialog * self, gpointer userData) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::assign_all_widgets_values" - g_return_if_fail (self != NULL); - g_return_if_fail (MAKER_IS_DIALOG (self)); -{ - - gint i; - for (i = 0; i < mkdg_properties_size(self->_priv->properties); i++) { - PropertyContext *ctx = mkdg_properties_index(self->_priv->properties, i); - self_assign_widget_value(self, ctx, userData); - } - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_save_all_widgets_values: - * @self: A MakerDialog. - * @userData: userData that pass through property_context_save. - * - * Save all widget values to configuration backend. - * - **/ -void -maker_dialog_save_all_widgets_values (MakerDialog * self, gpointer userData) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::save_all_widgets_values" - g_return_if_fail (self != NULL); - g_return_if_fail (MAKER_IS_DIALOG (self)); -{ - - gint i; - for (i = 0; i < mkdg_properties_size(self->_priv->properties); i++) { - PropertyContext *ctx = mkdg_properties_index(self->_priv->properties,i); - GValue gValue= { 0 }; - mkdg_g_value_reset(&gValue, ctx->spec->valueType, TRUE); - self_get_widget_value(self, ctx->spec->key, &gValue); - property_context_save(ctx, &gValue, userData); - g_value_reset(&gValue); - } - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_get_widget_value: - * @self: A MakerDialog. - * @key: The key of a property. - * @value: GValue that store output. - * @returns: The address of value if success, NULL if failed. - * - * Get value as display in widget. - **/ -GValue * -maker_dialog_get_widget_value (MakerDialog * self, const gchar * key, GValue * value) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::get_widget_value" - g_return_val_if_fail (self != NULL, (GValue * )0); - g_return_val_if_fail (MAKER_IS_DIALOG (self), (GValue * )0); -{ - - mkdg_log(INFO, "get_widget_value(%s)", key); - MkdgWidget * mWidget = self_get_widget_by_key(self, key); - if (mWidget == NULL) { - /* Not fount */ - return NULL; - } - return mkdg_widget_get_widget_value(mWidget, value); - }} -#undef __GOB_FUNCTION__ - -/** - * maker_dialog_set_widget_value: - * @self: A MakerDialog. - * @key: The key of a property. - * @value: Value to be shown in widget. - * - * Set value for widget display. - * However, value in PropertyContext is not changed. - * Use assign_widget_value() to do it. - * @see_also: assign_widget_value() - **/ -void -maker_dialog_set_widget_value (MakerDialog * self, const gchar * key, GValue * value) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::set_widget_value" - g_return_if_fail (self != NULL); - g_return_if_fail (MAKER_IS_DIALOG (self)); -{ - - mkdg_log(INFO, "set_widget_value(%s, %s)", key, mkdg_g_value_to_string(value)); - MkdgWidget * mWidget = self_get_widget_by_key(self, key); - mkdg_widget_set_widget_value(mWidget, value); - }} -#undef __GOB_FUNCTION__ - -// /** -// * maker_dialog_show: -// * @self: A MakerDialog. -// * -// **/ -// void -// maker_dialog_show (MakerDialog * self) -// { -// #define __GOB_FUNCTION__ "Maker:Dialog::show" -// g_return_if_fail (self != NULL); -// g_return_if_fail (MAKER_IS_DIALOG (self)); -// { - -// mkdg_wgt_show_all(GTK_WIDGET(self)); -// }} -// #undef __GOB_FUNCTION__ - -MkdgWidget * -maker_dialog_get_widget_by_key (MakerDialog * self, const gchar * key) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::get_widget_by_key" - g_return_val_if_fail (self != NULL, (MkdgWidget * )0); - g_return_val_if_fail (MAKER_IS_DIALOG (self), (MkdgWidget * )0); -{ - - return (MkdgWidget *) g_hash_table_lookup(self->_priv->widgetTable, key); - }} -#undef __GOB_FUNCTION__ diff --git a/src/maker-dialog.h b/src/maker-dialog.h deleted file mode 100644 index 2c94d0a..0000000 --- a/src/maker-dialog.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. All rights reserved. - * Copyright © 2009 Ding-Yi Chen - * - * This file is part of the ibus-chewing Project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include -#include - - -#ifndef MAKER_DIALOG_H_ -#define MAKER_DIALOG_H_ -#include -#include -#include -#include -#include -#include -#include "MakerDialogProperty.h" -#include "MakerDialogWidget.h" - - - -#define MKDG_PAGE_NAME_DEFAULT "..." -#ifndef WIDGET_ID_PREFIX -#define WIDGET_ID_PREFIX "+" -#endif - -#ifndef MAKER_DIALOG_ID_LENGTH -#define MAKER_DIALOG_ID_LENGTH 200 -#endif - -#define MKDG_CONTAINER_TABLE_LOOKUP(table,key) (MkdgWidgetContainer *) g_hash_table_lookup(table, (gconstpointer) key) - - - -#endif /* MAKER_DIALOG_H_ */ - -#ifndef __MAKER_DIALOG_H__ -#define __MAKER_DIALOG_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/* - * Type checking and casting macros - */ -#define MAKER_TYPE_DIALOG (maker_dialog_get_type()) -#define MAKER_DIALOG(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), maker_dialog_get_type(), MakerDialog) -#define MAKER_DIALOG_CONST(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), maker_dialog_get_type(), MakerDialog const) -#define MAKER_DIALOG_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), maker_dialog_get_type(), MakerDialogClass) -#define MAKER_IS_DIALOG(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), maker_dialog_get_type ()) - -#define MAKER_DIALOG_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), maker_dialog_get_type(), MakerDialogClass) - -/* Private structure type */ -typedef struct _MakerDialogPrivate MakerDialogPrivate; - -/* - * Main object structure - */ -#ifndef __TYPEDEF_MAKER_DIALOG__ -#define __TYPEDEF_MAKER_DIALOG__ -typedef struct _MakerDialog MakerDialog; -#endif -struct _MakerDialog { - GtkDialog __parent__; - /*< private >*/ - MkdgWgt * notebookWgt; /* protected */ - MkdgWidgetFlag wFlags; /* protected */ - MakerDialogPrivate *_priv; -}; - -/* - * Class definition - */ -typedef struct _MakerDialogClass MakerDialogClass; -struct _MakerDialogClass { - GtkDialogClass __parent__; -}; - - -/* - * Public methods - */ -GType maker_dialog_get_type (void) G_GNUC_CONST; -MakerDialog * maker_dialog_new (void); -MakerDialog * maker_dialog_new_full (MkdgProperties * properties, - const gchar * title, - MkdgWidgetFlag wFlags, - MkdgButtonFlag bFlags); -gboolean maker_dialog_add_property (MakerDialog * self, - PropertyContext * ctx); -gboolean maker_dialog_add_all_properties (MakerDialog * self); -void maker_dialog_assign_widget_value (MakerDialog * self, - PropertyContext * ctx, - gpointer userData); -void maker_dialog_assign_all_widgets_values (MakerDialog * self, - gpointer userData); -void maker_dialog_save_all_widgets_values (MakerDialog * self, - gpointer userData); -GValue * maker_dialog_get_widget_value (MakerDialog * self, - const gchar * key, - GValue * value); -void maker_dialog_set_widget_value (MakerDialog * self, - const gchar * key, - GValue * value); -void maker_dialog_show (MakerDialog * self); -MkdgWidget * maker_dialog_get_widget_by_key (MakerDialog * self, - const gchar * key); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/src/setup/ibus-setup-chewing-application.c b/src/setup/ibus-setup-chewing-application.c new file mode 100644 index 0000000..4eb837a --- /dev/null +++ b/src/setup/ibus-setup-chewing-application.c @@ -0,0 +1,81 @@ +/* ibus-setup-chewing-application.c + * + * Copyright 2024 Kan-Ru Chen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "ibus-setup-chewing-application.h" +#include "ibus-setup-chewing-window.h" + +struct _IbusSetupChewingApplication { + AdwApplication parent_instance; +}; + +G_DEFINE_TYPE(IbusSetupChewingApplication, ibus_setup_chewing_application, + ADW_TYPE_APPLICATION) + +IbusSetupChewingApplication * +ibus_setup_chewing_application_new(const char *application_id, + GApplicationFlags flags) { + g_return_val_if_fail(application_id != NULL, NULL); + + return g_object_new(IBUS_SETUP_CHEWING_TYPE_APPLICATION, "application-id", + application_id, "flags", flags, NULL); +} + +static void ibus_setup_chewing_application_activate(GApplication *app) { + GtkWindow *window; + + g_assert(IBUS_SETUP_CHEWING_IS_APPLICATION(app)); + + window = gtk_application_get_active_window(GTK_APPLICATION(app)); + + if (window == NULL) + window = g_object_new(IBUS_SETUP_CHEWING_TYPE_WINDOW, "application", + app, NULL); + + gtk_window_present(window); +} + +static void ibus_setup_chewing_application_class_init( + IbusSetupChewingApplicationClass *klass) { + GApplicationClass *app_class = G_APPLICATION_CLASS(klass); + + app_class->activate = ibus_setup_chewing_application_activate; +} + +static void ibus_setup_chewing_application_quit_action(GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { + IbusSetupChewingApplication *self = user_data; + + g_assert(IBUS_SETUP_CHEWING_IS_APPLICATION(self)); + + g_application_quit(G_APPLICATION(self)); +} + +static const GActionEntry app_actions[] = { + {"quit", ibus_setup_chewing_application_quit_action}, +}; + +static void +ibus_setup_chewing_application_init(IbusSetupChewingApplication *self) { + g_action_map_add_action_entries(G_ACTION_MAP(self), app_actions, + G_N_ELEMENTS(app_actions), self); + gtk_application_set_accels_for_action(GTK_APPLICATION(self), "app.quit", + (const char *[]){"q", NULL}); +} diff --git a/src/setup/ibus-setup-chewing-application.h b/src/setup/ibus-setup-chewing-application.h new file mode 100644 index 0000000..0f37b4e --- /dev/null +++ b/src/setup/ibus-setup-chewing-application.h @@ -0,0 +1,38 @@ +/* ibus-setup-chewing-application.h + * + * Copyright 2024 Kan-Ru Chen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define IBUS_SETUP_CHEWING_TYPE_APPLICATION \ + (ibus_setup_chewing_application_get_type()) + +G_DECLARE_FINAL_TYPE(IbusSetupChewingApplication, + ibus_setup_chewing_application, IBUS_SETUP_CHEWING, + APPLICATION, AdwApplication) + +IbusSetupChewingApplication * +ibus_setup_chewing_application_new(const char *application_id, + GApplicationFlags flags); + +G_END_DECLS diff --git a/src/setup/ibus-setup-chewing-window.c b/src/setup/ibus-setup-chewing-window.c new file mode 100644 index 0000000..ba2769a --- /dev/null +++ b/src/setup/ibus-setup-chewing-window.c @@ -0,0 +1,192 @@ +/* ibus-setup-chewing-window.c + * + * Copyright 2024 Kan-Ru Chen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "ibus-setup-chewing-window.h" + +struct _IbusSetupChewingWindow { + AdwPreferencesWindow parent_instance; + + /* Template widgets */ + AdwComboRow *kb_type; + AdwComboRow *sel_keys; + AdwSwitchRow *plain_zhuyin; + AdwSwitchRow *show_systray; + AdwSwitchRow *auto_shift_cur; + AdwSwitchRow *add_phrase_direction; + AdwSwitchRow *clean_buffer_focus_out; + AdwSwitchRow *easy_symbol_input; + AdwSwitchRow *esc_clean_all_buf; + AdwSpinRow *max_chi_symbol_len; + AdwComboRow *chi_eng_mode_toggle; + AdwComboRow *sync_caps_lock; + AdwComboRow *default_english_case; + AdwSpinRow *cand_per_page; + AdwSwitchRow *show_page_number; + AdwSwitchRow *phrase_choice_from_last; + AdwSwitchRow *space_as_selection; + AdwSwitchRow *vertical_lookup_table; +}; + +G_DEFINE_FINAL_TYPE(IbusSetupChewingWindow, ibus_setup_chewing_window, + ADW_TYPE_PREFERENCES_WINDOW) + +#define bind_child(child_id) \ + gtk_widget_class_bind_template_child(widget_class, IbusSetupChewingWindow, \ + child_id) + +static void +ibus_setup_chewing_window_class_init(IbusSetupChewingWindowClass *klass) { + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + + gtk_widget_class_set_template_from_resource( + widget_class, + "/org/freedesktop/IBus/Chewing/Setup/ibus-setup-chewing-window.ui"); + + bind_child(kb_type); + bind_child(sel_keys); + bind_child(plain_zhuyin); + bind_child(show_systray); + bind_child(auto_shift_cur); + bind_child(add_phrase_direction); + bind_child(clean_buffer_focus_out); + bind_child(easy_symbol_input); + bind_child(esc_clean_all_buf); + bind_child(max_chi_symbol_len); + bind_child(chi_eng_mode_toggle); + bind_child(sync_caps_lock); + bind_child(default_english_case); + bind_child(cand_per_page); + bind_child(show_page_number); + bind_child(phrase_choice_from_last); + bind_child(space_as_selection); + bind_child(vertical_lookup_table); +} + +const gchar *kb_type_ids[] = { + "default", "hsu", "ibm", "gin_yieh", "eten", + "eten26", "dvorak", "dvorak_hsu", "dachen_26", "hanyu", + "thl_pinying", "mps2_pinyin", NULL}; + +const gchar *sel_key_ids[] = { + "1234567890", "asdfghjkl;", "asdfzxcv89", + "asdfjkl789", "aoeu;qjkix", /* Dvorak */ + "aoeuhtnsid", /* Dvorak */ + "aoeuidhtns", /* Dvorak */ + "1234qweras", NULL, +}; + +const gchar *chi_eng_mode_toggle_ids[] = { + "caps_lock", "shift", "shift_l", "shift_r", NULL, +}; + +const gchar *sync_caps_lock_ids[] = { + "disable", + "keyboard", + "input method", + NULL, +}; + +const gchar *default_english_case_ids[] = { + "no default", + "lowercase", + "uppercase", + NULL, +}; + +static gboolean id_get_mapping(GValue *value, GVariant *variant, + gpointer user_data) { + const gchar *saved; + gchar **ids_list = (gchar **)user_data; + + g_return_val_if_fail(g_variant_is_of_type(variant, G_VARIANT_TYPE_STRING), + FALSE); + + saved = g_variant_get_string(variant, NULL); + for (int i = 0; ids_list[i] != NULL; i++) { + if (!g_strcmp0(ids_list[i], saved)) { + g_value_set_uint(value, i); + return TRUE; + } + } + return FALSE; +} + +static GVariant *id_set_mapping(const GValue *value, + const GVariantType *expected_type, + gpointer user_data) { + gchar **ids_list = (gchar **)user_data; + return g_variant_new_string(ids_list[g_value_get_uint(value)]); +} + +static void ibus_setup_chewing_window_init(IbusSetupChewingWindow *self) { + GSettings *settings; + + gtk_widget_init_template(GTK_WIDGET(self)); + + settings = g_settings_new("org.freedesktop.IBus.Chewing"); + + g_settings_bind_with_mapping(settings, "kb-type", self->kb_type, "selected", + G_SETTINGS_BIND_DEFAULT, id_get_mapping, + id_set_mapping, kb_type_ids, NULL); + g_settings_bind_with_mapping(settings, "sel-keys", self->sel_keys, + "selected", G_SETTINGS_BIND_DEFAULT, + id_get_mapping, id_set_mapping, sel_key_ids, + NULL); + g_settings_bind(settings, "plain-zhuyin", self->plain_zhuyin, "active", + G_SETTINGS_BIND_INVERT_BOOLEAN); + g_settings_bind(settings, "auto-shift-cur", self->auto_shift_cur, "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "add-phrase-direction", + self->add_phrase_direction, "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "clean-buffer-focus-out", + self->clean_buffer_focus_out, "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "easy-symbol-input", self->easy_symbol_input, + "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "esc-clean-all-buf", self->esc_clean_all_buf, + "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "max-chi-symbol-len", self->max_chi_symbol_len, + "value", G_SETTINGS_BIND_DEFAULT); + g_settings_bind_with_mapping(settings, "chi-eng-mode-toggle", + self->chi_eng_mode_toggle, "selected", + G_SETTINGS_BIND_DEFAULT, id_get_mapping, + id_set_mapping, chi_eng_mode_toggle_ids, NULL); + g_settings_bind_with_mapping(settings, "sync-caps-lock", + self->sync_caps_lock, "selected", + G_SETTINGS_BIND_DEFAULT, id_get_mapping, + id_set_mapping, sync_caps_lock_ids, NULL); + g_settings_bind_with_mapping( + settings, "default-english-case", self->default_english_case, + "selected", G_SETTINGS_BIND_DEFAULT, id_get_mapping, id_set_mapping, + default_english_case_ids, NULL); + g_settings_bind(settings, "cand-per-page", self->cand_per_page, "value", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "show-page-number", self->show_page_number, + "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "phrase-choice-from-last", + self->phrase_choice_from_last, "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "space-as-selection", self->space_as_selection, + "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind(settings, "vertical-lookup-table", + self->vertical_lookup_table, "active", + G_SETTINGS_BIND_DEFAULT); +} diff --git a/src/setup/ibus-setup-chewing-window.h b/src/setup/ibus-setup-chewing-window.h new file mode 100644 index 0000000..112a119 --- /dev/null +++ b/src/setup/ibus-setup-chewing-window.h @@ -0,0 +1,32 @@ +/* ibus-setup-chewing-window.h + * + * Copyright 2024 Kan-Ru Chen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define IBUS_SETUP_CHEWING_TYPE_WINDOW (ibus_setup_chewing_window_get_type()) + +G_DECLARE_FINAL_TYPE(IbusSetupChewingWindow, ibus_setup_chewing_window, + IBUS_SETUP_CHEWING, WINDOW, AdwPreferencesWindow) + +G_END_DECLS diff --git a/src/setup/ibus-setup-chewing-window.ui b/src/setup/ibus-setup-chewing-window.ui new file mode 100644 index 0000000..dcb8881 --- /dev/null +++ b/src/setup/ibus-setup-chewing-window.ui @@ -0,0 +1,231 @@ + + + + + + + + \ No newline at end of file diff --git a/src/setup/ibus-setup-chewing.gresource.xml b/src/setup/ibus-setup-chewing.gresource.xml new file mode 100644 index 0000000..6aab55f --- /dev/null +++ b/src/setup/ibus-setup-chewing.gresource.xml @@ -0,0 +1,6 @@ + + + + ibus-setup-chewing-window.ui + + \ No newline at end of file diff --git a/src/setup/main.c b/src/setup/main.c new file mode 100644 index 0000000..aa4afb6 --- /dev/null +++ b/src/setup/main.c @@ -0,0 +1,38 @@ +/* main.c + * + * Copyright 2024 Kan-Ru Chen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include + +#include "ibus-setup-chewing-application.h" + +int main(int argc, char *argv[]) { + g_autoptr(IbusSetupChewingApplication) app = NULL; + int ret; + + bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); + + app = ibus_setup_chewing_application_new( + "org.freedesktop.IBus.Chewing.Setup", G_APPLICATION_DEFAULT_FLAGS); + ret = g_application_run(G_APPLICATION(app), argc, argv); + + return ret; +} diff --git a/src/setup/org.freedesktop.IBus.Chewing.gschema.xml b/src/setup/org.freedesktop.IBus.Chewing.gschema.xml new file mode 100644 index 0000000..6c448d3 --- /dev/null +++ b/src/setup/org.freedesktop.IBus.Chewing.gschema.xml @@ -0,0 +1,137 @@ + + + + "default" + Keyboard Type + + Select Zhuyin keyboard layout + + + + "1234567890" + Selection keys + + Keys used to select candidate. For example "asdfghjkl;", press 'a' to select the 1st candidate, 's' for 2nd, and so on. + + + + true + Show systray icons + + On: Show Chinese/English and Full/Half shape status as a systray icon + Off: Do not show the status icon + + + + true + Auto move cursor + + Automatically move the cursor to the next character after selection + + + + true + Add phrase before the cursor + + Use Ctrl + Numbers (2-9) to add new phrase before the cursor + + + + false + Clean pre-edit buffer when focus out + + On: Clean pre-edit buffer when focus out to prevent program crash + Off: Keep what you already type for convenience + + + + true + Easy symbol input + + Press shift to input Chinese punctuation symbols + + + + false + Esc clean all buffer + + Escape key cleans the text in pre-edit-buffer + + + + 20 + Maximum Chinese characters + + Maximum Chinese characters in pre-edit buffer, not including inputing Zhuyin symbols. + + + + "caps_lock" + Chinese/Alphanumeric Mode Toggle Key + + + + + "lowercase" + Default English letter case +(Only effective when Caps Lock is the toggle key) + + no control: No default letter case. Not recommend if you use multiple keyboards or synergy + lowercase: Default to lowercase, press shift for uppercase. + uppercase: Default to uppercase, press shift for lowercase. + + + + "keyboard" + Sync between CapsLock and IM + + Occasionally, the CapsLock status does not match the IM, this option determines how these status be synchronized. Valid values: + "disable": Do nothing + "keyboard": IM status follows keyboard status + "IM": Keyboard status follows IM status + + + + false + Plain Zhuyin mode + + In plain Zhuyin mode, automatic candidate selection and related options are disabled or ignored. + + + + 5 + Candidate per page + + Number of candidate per page. + + + + false + Show page number + + Display the page number of the candidate list. + + + + true + Choose phrases from backward + + Open candidate list from the back of a phrase, without moving the cursor to the front. + + + + false + Space to select + + Press Space to select the candidate. + + + + false + Vertical Lookup Table + + Use vertical lookup table. + + + + diff --git a/test/IBusChewingPreEdit-test.c b/test/IBusChewingPreEdit-test.c index 5308f7f..6b79a1f 100644 --- a/test/IBusChewingPreEdit-test.c +++ b/test/IBusChewingPreEdit-test.c @@ -3,11 +3,7 @@ #include "IBusChewingPreEdit.h" #include "IBusChewingPreEdit-private.h" #include "IBusChewingUtil.h" -#ifdef USE_GSETTINGS -# include "GSettingsBackend.h" -#elif defined USE_GCONF2 -# include "GConf2Backend.h" -#endif +#include "GSettingsBackend.h" #include "MakerDialogUtil.h" #include "test-util.h" #define TEST_RUN_THIS(f) add_test_case("IBusChewingPreEdit", f) @@ -916,19 +912,9 @@ void test_keypad() gint main(gint argc, gchar ** argv) { g_test_init(&argc, &argv, NULL); -#ifdef USE_GSETTINGS MkdgBackend *backend = mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); -#elif defined USE_GCONF2 - MkdgBackend *backend = - gconf2_backend_new(QUOTE_ME(PROJECT_SCHEMA_BASE), NULL); -#else - MkdgBackend *backend = NULL; - - g_error("Flag GSETTINGS_SUPPORT or GCONF2_SUPPORT are required!"); - return 1; -#endif /* USE_GSETTINGS */ mkdg_log_set_level(DEBUG); self = ibus_chewing_pre_edit_new(backend); ibus_chewing_pre_edit_use_all_configure(self); diff --git a/test/MakerDialogBackend-test.c b/test/MakerDialogBackend-test.c index 3e6200d..425296c 100644 --- a/test/MakerDialogBackend-test.c +++ b/test/MakerDialogBackend-test.c @@ -6,11 +6,7 @@ #include "test-util.h" #include "MakerDialogUtil.h" #include "MakerDialogBackend.h" -#ifdef USE_GSETTINGS -# include "GSettingsBackend.h" -#elif defined USE_GCONF2 -# include "GConf2Backend.h" -#endif +#include "GSettingsBackend.h" #define TEST_RUN_THIS(f) add_test_case("MakerDialogBackend", f) #define COMMAND_BUFFER_SIZE 200 #define FILE_BUFFER_SIZE 1024 @@ -44,23 +40,16 @@ GValue *backend_command_get_key_value(const gchar * key, GValue * value) gchar cmdBuf[COMMAND_BUFFER_SIZE]; gchar *cKey = mkdg_backend_get_key(backend, NULL, key, NULL); -#ifdef USE_GSETTINGS g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, "gsettings get %s %s", QUOTE_ME(PROJECT_SCHEMA_ID), cKey); -#else - g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, "gconftool-2 --get %s/%s", - QUOTE_ME(PROJECT_GCONF2_SCHEMA_DIR), cKey); -#endif gchar *retStr = command_run_obtain_output(cmdBuf); -#ifdef USE_GSETTINGS /* gsettings prepend 'uint32 ' before actual value */ if (G_VALUE_TYPE(value) == G_TYPE_UINT) { gint offset = strlen("uint32 "); retStr += offset; } -#endif mkdg_g_value_from_string(value, retStr); return value; } @@ -75,38 +64,9 @@ void backend_command_set_key_value(const gchar * key, GValue * value) gchar cmdBuf[COMMAND_BUFFER_SIZE]; gchar *cKey = mkdg_backend_get_key(backend, NULL, key, NULL); -#ifdef USE_GSETTINGS g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, "gsettings set %s %s %s", QUOTE_ME(PROJECT_SCHEMA_ID), cKey, valueStr); -#else - gchar *typeStr; - GType gType = G_VALUE_TYPE(value); - - switch (gType) { - case G_TYPE_BOOLEAN: - typeStr = "bool"; - break; - case G_TYPE_FLOAT: - case G_TYPE_DOUBLE: - typeStr = "float"; - break; - case G_TYPE_INT: - case G_TYPE_UINT: - case G_TYPE_LONG: - case G_TYPE_ULONG: - case G_TYPE_INT64: - case G_TYPE_UINT64: - typeStr = "int"; - break; - case G_TYPE_STRING: - typeStr = "string"; - break; - } - g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, - "gconftool-2 --set %s/%s --type %s '%s'", - QUOTE_ME(PROJECT_SCHEMA_DIR), cKey, typeStr, valueStr); -#endif command_run_obtain_output(cmdBuf); } @@ -248,15 +208,8 @@ void int_w_test() gint main(gint argc, gchar ** argv) { g_test_init(&argc, &argv, NULL); -#ifdef USE_GSETTINGS backend = mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); -#elif defined USE_GCONF2 - backend = gconf2_backend_new(QUOTE_ME(PROJECT_SCHEMA_BASE), NULL); -#else - g_error("Flag GSETTINGS_SUPPORT or GCONF2_SUPPORT are required!"); - return 2; -#endif /* USE_GSETTINGS */ mkdg_log_set_level(DEBUG); TEST_RUN_THIS(mkdg_g_value_from_string_boolean_test);