From 8eeecd8c4bc241ce39e74f19bff60eacc0730419 Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 21 Jul 2024 14:25:10 +0900 Subject: [PATCH 1/4] refactor: Cleanup junk code created by GOB --- src/ibus-chewing-engine-private.h | 55 ++- src/ibus-chewing-engine.c | 574 +++++++++++------------------- src/ibus-chewing-engine.h | 105 +----- test/ibus-chewing-engine-test.c | 8 +- 4 files changed, 275 insertions(+), 467 deletions(-) diff --git a/src/ibus-chewing-engine-private.h b/src/ibus-chewing-engine-private.h index 6c30d61..ca18220 100644 --- a/src/ibus-chewing-engine-private.h +++ b/src/ibus-chewing-engine-private.h @@ -19,6 +19,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ + +#pragma once + #include "GSettingsBackend.h" #include "IBusChewingPreEdit.h" #include "IBusChewingProperties.h" @@ -32,14 +35,44 @@ #include #include -#ifndef __IBUS_CHEWING_ENGINE_PRIVATE_H__ -#define __IBUS_CHEWING_ENGINE_PRIVATE_H__ - #include "ibus-chewing-engine.h" -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +G_BEGIN_DECLS + +struct _IBusChewingEngine { + IBusEngine __parent__; + /*< public > */ + IBusChewingPreEdit *icPreEdit; + IBusText *preEditText; + IBusText *auxText; + IBusText *outgoingText; + IBusProperty *InputMode; + IBusProperty *AlnumSize; + IBusProperty *setup_prop; + IBusPropList *prop_list; + /*< private > */ + FILE *logFile; /* protected */ + IBusKeymap *keymap_us; /* protected */ + + EngineFlag statusFlags; + IBusCapabilite capabilite; + ChewingInputStyle inputStyle; + + IBusText *InputMode_label_chi; + IBusText *InputMode_label_eng; + IBusText *InputMode_tooltip; + IBusText *InputMode_symbol_chi; + IBusText *InputMode_symbol_eng; + IBusText *AlnumSize_label_full; + IBusText *AlnumSize_label_half; + IBusText *AlnumSize_tooltip; + IBusText *AlnumSize_symbol_full; + IBusText *AlnumSize_symbol_half; + IBusText *setup_prop_label; + IBusText *setup_prop_tooltip; + IBusText *setup_prop_symbol; + IBusText *emptyText; +}; void ibus_chewing_engine_handle_Default(IBusChewingEngine *self, guint keyval, gboolean shiftPressed); @@ -61,18 +94,10 @@ void update_lookup_table(IBusChewingEngine *self); void refresh_outgoing_text(IBusChewingEngine *self); void commit_text(IBusChewingEngine *self); -struct _IBusChewingEnginePrivate { - EngineFlag statusFlags; - IBusCapabilite capabilite; - ChewingInputStyle inputStyle; -}; void ibus_chewing_engine_use_setting(IBusChewingEngine *self); void ibus_chewing_engine_restore_mode(IBusChewingEngine *self); void ibus_chewing_engine_update(IBusChewingEngine *self); void ibus_chewing_engine_refresh_property(IBusChewingEngine *self, const gchar *prop_name); -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif +G_END_DECLS \ No newline at end of file diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index 091495b..becd9db 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -24,20 +24,10 @@ #include "IBusChewingProperties.h" #include "IBusChewingUtil.h" #include -#include #include -#include #include -#include -#include -#include -#include - -#define selfp \ - ((IBusChewingEnginePrivate *)ibus_chewing_engine_get_instance_private(self)) - -#include /* memset() */ +#include "MakerDialogUtil.h" #include "ibus-chewing-engine.h" #include "ibus-chewing-engine-private.h" @@ -80,277 +70,170 @@ GType engine_flag_get_type(void) { extern gint ibus_chewing_verbose; -#define IBUS_CHEWING_MAIN - -/* self casting macros */ -#define SELF(x) IBUS_CHEWING_ENGINE(x) -#define IS_SELF(x) IBUS_IS_CHEWING_ENGINE(x) -#define SELF_GET_CLASS(x) IBUS_CHEWING_ENGINE_GET_CLASS(x) - -/* self typedefs */ -typedef IBusChewingEngine Self; -typedef IBusChewingEngineClass SelfClass; - -G_DEFINE_TYPE_WITH_CODE(IBusChewingEngine, ibus_chewing_engine, - IBUS_TYPE_ENGINE, G_ADD_PRIVATE(IBusChewingEngine)); +G_DEFINE_TYPE(IBusChewingEngine, ibus_chewing_engine, IBUS_TYPE_ENGINE); /* here are local prototypes */ -static void -ibus_chewing_engine_constructor(IBusChewingEngine *self) G_GNUC_UNUSED; -static IBusProperty *ibus_chewing_engine_get_ibus_property_by_name( - IBusChewingEngine *self, const gchar *prop_name) G_GNUC_UNUSED; -static void ___b_ibus_chewing_engine_reset(IBusEngine *engine) G_GNUC_UNUSED; -static void ___c_ibus_chewing_engine_page_up(IBusEngine *engine) G_GNUC_UNUSED; -static void -___d_ibus_chewing_engine_page_down(IBusEngine *engine) G_GNUC_UNUSED; -static void -___e_ibus_chewing_engine_cursor_up(IBusEngine *engine) G_GNUC_UNUSED; -static void -___f_ibus_chewing_engine_cursor_down(IBusEngine *engine) G_GNUC_UNUSED; -static void ___10_ibus_chewing_engine_enable(IBusEngine *engine) G_GNUC_UNUSED; -static void ___11_ibus_chewing_engine_disable(IBusEngine *engine) G_GNUC_UNUSED; -static void -___12_ibus_chewing_engine_focus_in(IBusEngine *engine) G_GNUC_UNUSED; -static void -___13_ibus_chewing_engine_focus_out(IBusEngine *engine) G_GNUC_UNUSED; -static void -___14_ibus_chewing_engine_set_capabilities(IBusEngine *engine, - guint caps) G_GNUC_UNUSED; -static void -___15_ibus_chewing_engine_property_show(IBusEngine *engine, - const gchar *prop_name) G_GNUC_UNUSED; -static void -___16_ibus_chewing_engine_property_hide(IBusEngine *engine, - const gchar *prop_name) G_GNUC_UNUSED; - -/* pointer to the class of our parent */ -static IBusEngineClass *parent_class = NULL; - -/* Short form macros */ -#define self_update ibus_chewing_engine_update -#define self_refresh_property ibus_chewing_engine_refresh_property -#define self_get_ibus_property_by_name \ - ibus_chewing_engine_get_ibus_property_by_name +static IBusProperty * +ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, + const gchar *prop_name); +static void ibus_chewing_engine_page_up(IBusEngine *engine); +static void ibus_chewing_engine_page_down(IBusEngine *engine); +static void ibus_chewing_engine_cursor_up(IBusEngine *engine); +static void ibus_chewing_engine_cursor_down(IBusEngine *engine); +static void ibus_chewing_engine_set_capabilities(IBusEngine *engine, + guint caps); +static void ibus_chewing_engine_property_show(IBusEngine *engine, + const gchar *prop_name); +static void ibus_chewing_engine_property_hide(IBusEngine *engine, + const gchar *prop_name); #define ibus_chewing_engine_has_status_flag(self, f) \ - mkdg_has_flag(((IBusChewingEnginePrivate *) \ - ibus_chewing_engine_get_instance_private(self)) \ - ->statusFlags, \ - f) + mkdg_has_flag(self->statusFlags, f) #define ibus_chewing_engine_set_status_flag(self, f) \ - mkdg_set_flag(((IBusChewingEnginePrivate *) \ - ibus_chewing_engine_get_instance_private(self)) \ - ->statusFlags, \ - f) + mkdg_set_flag(self->statusFlags, f) #define ibus_chewing_engine_clear_status_flag(self, f) \ - mkdg_clear_flag(((IBusChewingEnginePrivate *) \ - ibus_chewing_engine_get_instance_private(self)) \ - ->statusFlags, \ - f) + mkdg_clear_flag(self->statusFlags, f) #define is_password(self) \ ibus_chewing_engine_has_status_flag(self, ENGINE_FLAG_IS_PASSWORD) -#define ibus_chewing_engine_is_chinese_mode(self) \ +#define is_chinese_mode(self) \ ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) #define ibus_text_is_empty(iText) \ ((iText == NULL) || STRING_IS_EMPTY(iText->text)) -static GObject *___constructor(GType type, guint n_construct_properties, - GObjectConstructParam *construct_properties) { - GObject *obj_self; - IBusChewingEngine *self; - - obj_self = - G_OBJECT_CLASS(parent_class) - ->constructor(type, n_construct_properties, construct_properties); - self = IBUS_CHEWING_ENGINE(obj_self); - ibus_chewing_engine_constructor(self); - return obj_self; -} - -static void ___finalize(GObject *obj_self) { - IBusChewingEngine *self G_GNUC_UNUSED = IBUS_CHEWING_ENGINE(obj_self); - gpointer priv G_GNUC_UNUSED = selfp; +static void ibus_chewing_engine_finalize(GObject *gobject) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(gobject); - if (self->icPreEdit) { - ibus_chewing_pre_edit_free((gpointer)self->icPreEdit); - self->icPreEdit = NULL; - } - if (self->preEditText) { - g_object_unref((gpointer)self->preEditText); - self->preEditText = NULL; - } - if (self->auxText) { - g_object_unref((gpointer)self->auxText); - self->auxText = NULL; - } - if (self->outgoingText) { - g_object_unref((gpointer)self->outgoingText); - self->outgoingText = NULL; - } - if (self->InputMode) { - g_object_unref((gpointer)self->InputMode); - self->InputMode = NULL; - } - if (self->AlnumSize) { - g_object_unref((gpointer)self->AlnumSize); - self->AlnumSize = NULL; - } - if (self->setup_prop) { - g_object_unref((gpointer)self->setup_prop); - self->setup_prop = NULL; - } - if (self->prop_list) { - g_object_unref((gpointer)self->prop_list); - self->prop_list = NULL; - } - if (G_OBJECT_CLASS(parent_class)->finalize) - (*G_OBJECT_CLASS(parent_class)->finalize)(obj_self); + ibus_chewing_pre_edit_free(self->icPreEdit); + g_clear_object(&self->preEditText); + g_clear_object(&self->auxText); + g_clear_object(&self->outgoingText); + g_clear_object(&self->InputMode); + g_clear_object(&self->AlnumSize); + g_clear_object(&self->setup_prop); + g_clear_object(&self->prop_list); + G_OBJECT_CLASS(ibus_chewing_engine_parent_class)->finalize(gobject); } -static void ibus_chewing_engine_init(IBusChewingEngine *self G_GNUC_UNUSED) { - self->icPreEdit = NULL; - self->sDialog = NULL; +static void ibus_chewing_engine_init(IBusChewingEngine *self) { + self->InputMode_label_chi = g_object_ref_sink( + ibus_text_new_from_static_string(_("Switch to Alphanumeric Mode"))); + self->InputMode_label_eng = g_object_ref_sink( + ibus_text_new_from_static_string(_("Switch to Chinese Mode"))); + self->InputMode_tooltip = + g_object_ref_sink(ibus_text_new_from_static_string( + _("Click to toggle Chinese/Alphanumeric Mode"))); + self->InputMode_symbol_chi = + g_object_ref_sink(ibus_text_new_from_static_string("中")); + self->InputMode_symbol_eng = + g_object_ref_sink(ibus_text_new_from_static_string("英")); + self->AlnumSize_label_full = g_object_ref_sink( + ibus_text_new_from_static_string(_("Fullwidth Form"))); + self->AlnumSize_label_half = g_object_ref_sink( + ibus_text_new_from_static_string(_("Halfwidth Form"))); + self->AlnumSize_tooltip = + g_object_ref_sink(ibus_text_new_from_static_string( + _("Click to toggle Halfwidth/Fullwidth Form"))); + self->AlnumSize_symbol_full = + g_object_ref_sink(ibus_text_new_from_static_string("全")); + self->AlnumSize_symbol_half = + g_object_ref_sink(ibus_text_new_from_static_string("半")); + self->setup_prop_label = g_object_ref_sink( + ibus_text_new_from_static_string(_("IBus-Chewing Preferences"))); + self->setup_prop_tooltip = g_object_ref_sink( + ibus_text_new_from_static_string(_("Click to configure IBus-Chewing"))); + self->setup_prop_symbol = + g_object_ref_sink(ibus_text_new_from_static_string("訂")); + self->emptyText = g_object_ref_sink(ibus_text_new_from_static_string("")); + self->preEditText = NULL; self->auxText = NULL; self->outgoingText = NULL; self->logFile = NULL; - selfp->statusFlags = 0; - selfp->capabilite = 0; - self->InputMode = g_object_ref_sink( - ibus_property_new("InputMode", PROP_TYPE_NORMAL, - SELF_GET_CLASS(self)->InputMode_label_chi, NULL, - SELF_GET_CLASS(self)->InputMode_tooltip, TRUE, TRUE, - PROP_STATE_UNCHECKED, NULL)); - self->AlnumSize = g_object_ref_sink( - ibus_property_new("AlnumSize", PROP_TYPE_NORMAL, - SELF_GET_CLASS(self)->AlnumSize_label_half, NULL, - SELF_GET_CLASS(self)->AlnumSize_tooltip, TRUE, TRUE, - PROP_STATE_UNCHECKED, NULL)); + self->statusFlags = 0; + self->capabilite = 0; + self->InputMode = g_object_ref_sink(ibus_property_new( + "InputMode", PROP_TYPE_NORMAL, self->InputMode_label_chi, NULL, + self->InputMode_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); + self->AlnumSize = g_object_ref_sink(ibus_property_new( + "AlnumSize", PROP_TYPE_NORMAL, self->AlnumSize_label_half, NULL, + self->AlnumSize_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); self->setup_prop = g_object_ref_sink(ibus_property_new( - "setup_prop", PROP_TYPE_NORMAL, SELF_GET_CLASS(self)->setup_prop_label, - NULL, SELF_GET_CLASS(self)->setup_prop_tooltip, TRUE, TRUE, - PROP_STATE_UNCHECKED, NULL)); + "setup_prop", PROP_TYPE_NORMAL, self->setup_prop_label, NULL, + self->setup_prop_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); self->prop_list = g_object_ref_sink(ibus_prop_list_new()); self->keymap_us = ibus_keymap_get("us"); - { /* initialize the object here */ - IBUS_CHEWING_LOG(INFO, "init() %sinitialized", - (selfp->statusFlags & ENGINE_FLAG_INITIALIZED) ? "" - : "un"); - if (selfp->statusFlags & ENGINE_FLAG_INITIALIZED) { - return; - } + IBUS_CHEWING_LOG(INFO, "init() %sinitialized", + (self->statusFlags & ENGINE_FLAG_INITIALIZED) ? "" : "un"); + if (self->statusFlags & ENGINE_FLAG_INITIALIZED) { + return; + } - IBUS_CHEWING_LOG(INFO, "init() CHEWING_DATADIR_REAL=%s", - QUOTE_ME(CHEWING_DATADIR_REAL)); + IBUS_CHEWING_LOG(INFO, "init() CHEWING_DATADIR_REAL=%s", + QUOTE_ME(CHEWING_DATADIR_REAL)); - gchar *logFilename = getenv("IBUS_CHEWING_LOGFILE"); + gchar *logFilename = getenv("IBUS_CHEWING_LOGFILE"); - if (logFilename != NULL) { - self->logFile = fopen(logFilename, "w+"); - if (self->logFile == NULL) { - IBUS_CHEWING_LOG(WARN, - "init() Cannot write to logfile %s, ignored", - logFilename); - } else { - mkdg_log_set_file(self->logFile); - } + if (logFilename != NULL) { + self->logFile = fopen(logFilename, "w+"); + if (self->logFile == NULL) { + IBUS_CHEWING_LOG(WARN, "init() Cannot write to logfile %s, ignored", + logFilename); + } else { + mkdg_log_set_file(self->logFile); } + } - if (self->icPreEdit == NULL) { + MkdgBackend *backend = mkdg_g_settings_backend_new( + QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); - MkdgBackend *backend = - mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), - QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); + self->icPreEdit = ibus_chewing_pre_edit_new(backend); - self->icPreEdit = ibus_chewing_pre_edit_new(backend); - } + g_assert(self->icPreEdit); - g_assert(self->icPreEdit); + self->icPreEdit->engine = IBUS_ENGINE(self); - self->icPreEdit->engine = IBUS_ENGINE(self); + /* init properties */ + ibus_prop_list_append(self->prop_list, self->InputMode); + ibus_prop_list_append(self->prop_list, self->AlnumSize); + ibus_prop_list_append(self->prop_list, self->setup_prop); - /* init properties */ - ibus_prop_list_append(self->prop_list, self->InputMode); - ibus_prop_list_append(self->prop_list, self->AlnumSize); - ibus_prop_list_append(self->prop_list, self->setup_prop); + ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_INITIALIZED); - ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_INITIALIZED); - - IBUS_CHEWING_LOG(DEBUG, "init() Done"); - } + IBUS_CHEWING_LOG(DEBUG, "init() Done"); } -static void -ibus_chewing_engine_class_init(IBusChewingEngineClass *klass G_GNUC_UNUSED) { - GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass *)klass; - IBusEngineClass *ibus_engine_class = (IBusEngineClass *)klass; +static void ibus_chewing_engine_class_init(IBusChewingEngineClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass); + IBusEngineClass *ibus_engine_class = IBUS_ENGINE_CLASS(klass); - klass->InputMode_label_chi = g_object_ref_sink( - ibus_text_new_from_static_string(_("Switch to Alphanumeric Mode"))); - klass->InputMode_label_eng = g_object_ref_sink( - ibus_text_new_from_static_string(_("Switch to Chinese Mode"))); - klass->InputMode_tooltip = - g_object_ref_sink(ibus_text_new_from_static_string( - _("Click to toggle Chinese/Alphanumeric Mode"))); - klass->InputMode_symbol_chi = - g_object_ref_sink(ibus_text_new_from_static_string("中")); - klass->InputMode_symbol_eng = - g_object_ref_sink(ibus_text_new_from_static_string("英")); - klass->AlnumSize_label_full = g_object_ref_sink( - ibus_text_new_from_static_string(_("Fullwidth Form"))); - klass->AlnumSize_label_half = g_object_ref_sink( - ibus_text_new_from_static_string(_("Halfwidth Form"))); - klass->AlnumSize_tooltip = - g_object_ref_sink(ibus_text_new_from_static_string( - _("Click to toggle Halfwidth/Fullwidth Form"))); - klass->AlnumSize_symbol_full = - g_object_ref_sink(ibus_text_new_from_static_string("全")); - klass->AlnumSize_symbol_half = - g_object_ref_sink(ibus_text_new_from_static_string("半")); - klass->setup_prop_label = g_object_ref_sink( - ibus_text_new_from_static_string(_("IBus-Chewing Preferences"))); - klass->setup_prop_tooltip = g_object_ref_sink( - ibus_text_new_from_static_string(_("Click to configure IBus-Chewing"))); - klass->setup_prop_symbol = - g_object_ref_sink(ibus_text_new_from_static_string("訂")); - klass->emptyText = g_object_ref_sink(ibus_text_new_from_static_string("")); - - parent_class = g_type_class_ref(IBUS_TYPE_ENGINE); - - ibus_engine_class->reset = ___b_ibus_chewing_engine_reset; - ibus_engine_class->page_up = ___c_ibus_chewing_engine_page_up; - ibus_engine_class->page_down = ___d_ibus_chewing_engine_page_down; - ibus_engine_class->cursor_up = ___e_ibus_chewing_engine_cursor_up; - ibus_engine_class->cursor_down = ___f_ibus_chewing_engine_cursor_down; - ibus_engine_class->enable = ___10_ibus_chewing_engine_enable; - ibus_engine_class->disable = ___11_ibus_chewing_engine_disable; - ibus_engine_class->focus_in = ___12_ibus_chewing_engine_focus_in; - ibus_engine_class->focus_out = ___13_ibus_chewing_engine_focus_out; - ibus_engine_class->set_capabilities = - ___14_ibus_chewing_engine_set_capabilities; - ibus_engine_class->property_show = ___15_ibus_chewing_engine_property_show; - ibus_engine_class->property_hide = ___16_ibus_chewing_engine_property_hide; - g_object_class->constructor = ___constructor; - g_object_class->finalize = ___finalize; - { - ibus_engine_class->property_activate = - ibus_chewing_engine_property_activate; - ibus_engine_class->process_key_event = - ibus_chewing_engine_process_key_event; - ibus_engine_class->candidate_clicked = - ibus_chewing_engine_candidate_clicked; + object_class->finalize = ibus_chewing_engine_finalize; + + ibus_engine_class->reset = ibus_chewing_engine_reset; + ibus_engine_class->page_up = ibus_chewing_engine_page_up; + ibus_engine_class->page_down = ibus_chewing_engine_page_down; + ibus_engine_class->cursor_up = ibus_chewing_engine_cursor_up; + ibus_engine_class->cursor_down = ibus_chewing_engine_cursor_down; + ibus_engine_class->enable = ibus_chewing_engine_enable; + ibus_engine_class->disable = ibus_chewing_engine_disable; + ibus_engine_class->focus_in = ibus_chewing_engine_focus_in; + ibus_engine_class->focus_out = ibus_chewing_engine_focus_out; + ibus_engine_class->set_capabilities = ibus_chewing_engine_set_capabilities; + ibus_engine_class->property_show = ibus_chewing_engine_property_show; + ibus_engine_class->property_hide = ibus_chewing_engine_property_hide; + + ibus_engine_class->property_activate = + ibus_chewing_engine_property_activate; + ibus_engine_class->process_key_event = + ibus_chewing_engine_process_key_event; + ibus_engine_class->candidate_clicked = + ibus_chewing_engine_candidate_clicked; #if IBUS_CHECK_VERSION(1, 5, 4) - ibus_engine_class->set_content_type = - ibus_chewing_engine_set_content_type; + ibus_engine_class->set_content_type = ibus_chewing_engine_set_content_type; #endif - } } -static void -ibus_chewing_engine_constructor(IBusChewingEngine *self G_GNUC_UNUSED) {} - void ibus_chewing_engine_use_setting(IBusChewingEngine *self) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); @@ -363,9 +246,9 @@ void ibus_chewing_engine_use_setting(IBusChewingEngine *self) { if (ibus_chewing_properties_read_boolean_general( self->icPreEdit->iProperties, "ibus/general", "embed-preedit-text", NULL)) { - selfp->inputStyle = CHEWING_INPUT_STYLE_IN_APPLICATION; + self->inputStyle = CHEWING_INPUT_STYLE_IN_APPLICATION; } else { - selfp->inputStyle = CHEWING_INPUT_STYLE_IN_CANDIDATE; + self->inputStyle = CHEWING_INPUT_STYLE_IN_CANDIDATE; } } } @@ -375,7 +258,7 @@ void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { IBUS_CHEWING_LOG(DEBUG, "restore_mode() statusFlags=%x", - selfp->statusFlags); + self->statusFlags); GdkDisplay *display = gdk_display_get_default(); if (display != NULL) { @@ -384,23 +267,24 @@ void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { if (seat != NULL) { GdkDevice *keyboard = gdk_seat_get_keyboard(seat); - /* Restore Led Mode only make sense if display is available */ + /* Restore Led Mode only make sense if + * display is available */ if (ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_SYNC_FROM_IM)) { - IBUS_CHEWING_LOG( - DEBUG, "restore_mode() FLAG_SYNC_FROM_IM (deprecated)"); + IBUS_CHEWING_LOG(DEBUG, "restore_mode() " + "FLAG_SYNC_FROM_IM (deprecated)"); } else if (keyboard != NULL && ibus_chewing_pre_edit_has_flag( self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD)) { - IBUS_CHEWING_LOG(DEBUG, - "restore_mode() FLAG_SYNC_FROM_KEYBOARD"); + IBUS_CHEWING_LOG(DEBUG, "restore_mode() " + "FLAG_SYNC_FROM_KEYBOARD"); gboolean caps_lock_on = gdk_device_get_caps_lock_state(keyboard); chewing_set_ChiEngMode(self->icPreEdit->context, caps_lock_on ? 0 : CHINESE_MODE); } } - self_refresh_property(self, "InputMode"); + ibus_chewing_engine_refresh_property(self, "InputMode"); } } } @@ -409,14 +293,14 @@ void ibus_chewing_engine_update(IBusChewingEngine *self) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { - IBUS_CHEWING_LOG(DEBUG, "update() statusFlags=%x", selfp->statusFlags); + IBUS_CHEWING_LOG(DEBUG, "update() statusFlags=%x", self->statusFlags); update_pre_edit_text(self); commit_text(self); update_aux_text(self); IBUS_CHEWING_LOG(DEBUG, "update() nPhoneSeq=%d statusFlags=%x", chewing_get_phoneSeqLen(self->icPreEdit->context), - selfp->statusFlags); + self->statusFlags); update_lookup_table(self); } } @@ -428,22 +312,22 @@ void ibus_chewing_engine_refresh_property( { #ifndef UNIT_TEST IBUS_CHEWING_LOG(DEBUG, "refresh_property(%s) status=%x", prop_name, - selfp->statusFlags); + self->statusFlags); if (STRING_EQUALS(prop_name, "InputMode")) { ibus_property_set_label( self->InputMode, ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) - ? SELF_GET_CLASS(self)->InputMode_label_chi - : SELF_GET_CLASS(self)->InputMode_label_eng); + ? self->InputMode_label_chi + : self->InputMode_label_eng); #if IBUS_CHECK_VERSION(1, 5, 0) ibus_property_set_symbol( self->InputMode, ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) - ? SELF_GET_CLASS(self)->InputMode_symbol_chi - : SELF_GET_CLASS(self)->InputMode_symbol_eng); + ? self->InputMode_symbol_chi + : self->InputMode_symbol_eng); #endif ibus_engine_update_property(IBUS_ENGINE(self), self->InputMode); @@ -451,26 +335,23 @@ void ibus_chewing_engine_refresh_property( } else if (STRING_EQUALS(prop_name, "AlnumSize")) { ibus_property_set_label( - self->AlnumSize, - chewing_get_ShapeMode(self->icPreEdit->context) - ? SELF_GET_CLASS(self)->AlnumSize_label_full - : SELF_GET_CLASS(self)->AlnumSize_label_half); + self->AlnumSize, chewing_get_ShapeMode(self->icPreEdit->context) + ? self->AlnumSize_label_full + : self->AlnumSize_label_half); #if IBUS_CHECK_VERSION(1, 5, 0) ibus_property_set_symbol( - self->AlnumSize, - chewing_get_ShapeMode(self->icPreEdit->context) - ? SELF_GET_CLASS(self)->AlnumSize_symbol_full - : SELF_GET_CLASS(self)->AlnumSize_symbol_half); + self->AlnumSize, chewing_get_ShapeMode(self->icPreEdit->context) + ? self->AlnumSize_symbol_full + : self->AlnumSize_symbol_half); #endif - if (selfp->statusFlags & ENGINE_FLAG_PROPERTIES_REGISTERED) + if (self->statusFlags & ENGINE_FLAG_PROPERTIES_REGISTERED) ibus_engine_update_property(IBUS_ENGINE(self), self->AlnumSize); } else if (STRING_EQUALS(prop_name, "setup_prop")) { #if IBUS_CHECK_VERSION(1, 5, 0) - ibus_property_set_symbol(self->setup_prop, - SELF_GET_CLASS(self)->setup_prop_symbol); + ibus_property_set_symbol(self->setup_prop, self->setup_prop_symbol); #endif ibus_engine_update_property(IBUS_ENGINE(self), self->setup_prop); } @@ -489,9 +370,9 @@ void ibus_chewing_engine_refresh_property_list(IBusChewingEngine *self) { g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { #ifndef UNIT_TEST - self_refresh_property(self, "InputMode"); - self_refresh_property(self, "AlnumSize"); - self_refresh_property(self, "setup_prop"); + ibus_chewing_engine_refresh_property(self, "InputMode"); + ibus_chewing_engine_refresh_property(self, "AlnumSize"); + ibus_chewing_engine_refresh_property(self, "setup_prop"); #endif } } @@ -532,104 +413,68 @@ ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, } } -static void ___b_ibus_chewing_engine_reset(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); - - ibus_chewing_engine_reset(self); -} - -static void ___c_ibus_chewing_engine_page_up(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); +static void ibus_chewing_engine_page_up(IBusEngine *engine G_GNUC_UNUSED) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (is_password(self)) return; ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Page_Up, 0); - self_update(self); + ibus_chewing_engine_update(self); } -static void -___d_ibus_chewing_engine_page_down(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); +static void ibus_chewing_engine_page_down(IBusEngine *engine G_GNUC_UNUSED) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (is_password(self)) return; ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Page_Down, 0); - self_update(self); + ibus_chewing_engine_update(self); } -static void -___e_ibus_chewing_engine_cursor_up(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); +static void ibus_chewing_engine_cursor_up(IBusEngine *engine G_GNUC_UNUSED) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (is_password(self)) return; ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Up, 0); - self_update(self); + ibus_chewing_engine_update(self); } -static void -___f_ibus_chewing_engine_cursor_down(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); +static void ibus_chewing_engine_cursor_down(IBusEngine *engine G_GNUC_UNUSED) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (is_password(self)) return; ibus_chewing_pre_edit_process_key(self->icPreEdit, IBUS_KEY_Down, 0); - self_update(self); -} - -static void ___10_ibus_chewing_engine_enable(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); - - ibus_chewing_engine_enable(self); -} - -static void -___11_ibus_chewing_engine_disable(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); - - ibus_chewing_engine_disable(self); -} - -static void -___12_ibus_chewing_engine_focus_in(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); - - ibus_chewing_engine_focus_in(self); -} - -static void -___13_ibus_chewing_engine_focus_out(IBusEngine *engine G_GNUC_UNUSED) { - Self *self = SELF(engine); - - ibus_chewing_engine_focus_out(self); + ibus_chewing_engine_update(self); } static void -___14_ibus_chewing_engine_set_capabilities(IBusEngine *engine G_GNUC_UNUSED, - guint caps) { - Self *self = SELF(engine); +ibus_chewing_engine_set_capabilities(IBusEngine *engine G_GNUC_UNUSED, + guint caps) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); - selfp->capabilite = caps; + self->capabilite = caps; IBUS_CHEWING_LOG(MSG, "***** set_capabilities(%x): statusFlags=%x", caps, - selfp->statusFlags); + self->statusFlags); } -static void -___15_ibus_chewing_engine_property_show(IBusEngine *engine G_GNUC_UNUSED, - const gchar *prop_name) { +static void ibus_chewing_engine_property_show(IBusEngine *engine G_GNUC_UNUSED, + const gchar *prop_name) { IBUS_CHEWING_LOG(INFO, "property_show(-, %s)", prop_name); - Self *self = SELF(engine); - IBusProperty *prop = self_get_ibus_property_by_name(self, prop_name); + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBusProperty *prop = + ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); ibus_property_set_visible(prop, TRUE); } -static void -___16_ibus_chewing_engine_property_hide(IBusEngine *engine G_GNUC_UNUSED, - const gchar *prop_name) { +static void ibus_chewing_engine_property_hide(IBusEngine *engine G_GNUC_UNUSED, + const gchar *prop_name) { IBUS_CHEWING_LOG(INFO, "property_hide(-, %s)", prop_name); - Self *self = SELF(engine); - IBusProperty *prop = self_get_ibus_property_by_name(self, prop_name); + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBusProperty *prop = + ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); ibus_property_set_visible(prop, FALSE); } @@ -638,8 +483,8 @@ ___16_ibus_chewing_engine_property_hide(IBusEngine *engine G_GNUC_UNUSED, * ibus_chewing_engine_start: * @self: IBusChewingEngine instance. * - * This is different with init. This will be called in the beginning of - * reset, enable, and focus_in for setup. + * This is different with init. This will be called in the + * beginning of reset, enable, and focus_in for setup. */ void ibus_chewing_engine_start(IBusChewingEngine *self) { #ifndef UNIT_TEST @@ -666,38 +511,40 @@ void ibus_chewing_engine_start(IBusChewingEngine *self) { * @self: IBusChewingEngine instance. * * Reset the outgoing and pre_edit buffer and cursor - * chewing_reset will NOT called here, as it will chnage the KBType and input - * mode. + * chewing_reset will NOT called here, as it will chnage + * the KBType and input mode. */ -void ibus_chewing_engine_reset(IBusChewingEngine *self) { +void ibus_chewing_engine_reset(IBusEngine *engine) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); IBUS_CHEWING_LOG(MSG, "* reset"); /* Always clean buffer */ ibus_chewing_pre_edit_clear(self->icPreEdit); #ifndef UNIT_TEST - IBusEngine *engine = IBUS_ENGINE(self); ibus_engine_hide_auxiliary_text(engine); ibus_engine_hide_lookup_table(engine); - ibus_engine_update_preedit_text( - engine, IBUS_CHEWING_ENGINE_GET_CLASS(self)->emptyText, 0, FALSE); + ibus_engine_update_preedit_text(engine, self->emptyText, 0, FALSE); #endif } -void ibus_chewing_engine_enable(IBusChewingEngine *self) { - IBUS_CHEWING_LOG(MSG, "* enable(): statusFlags=%x", selfp->statusFlags); +void ibus_chewing_engine_enable(IBusEngine *engine) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBUS_CHEWING_LOG(MSG, "* enable(): statusFlags=%x", self->statusFlags); ibus_chewing_engine_start(self); ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_ENABLED); } -void ibus_chewing_engine_disable(IBusChewingEngine *self) { - IBUS_CHEWING_LOG(MSG, "* disable(): statusFlags=%x", selfp->statusFlags); +void ibus_chewing_engine_disable(IBusEngine *engine) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBUS_CHEWING_LOG(MSG, "* disable(): statusFlags=%x", self->statusFlags); ibus_chewing_engine_clear_status_flag(self, ENGINE_FLAG_ENABLED); } -void ibus_chewing_engine_focus_in(IBusChewingEngine *self) { - IBUS_CHEWING_LOG(MSG, "* focus_in(): statusFlags=%x", selfp->statusFlags); +void ibus_chewing_engine_focus_in(IBusEngine *engine) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBUS_CHEWING_LOG(MSG, "* focus_in(): statusFlags=%x", self->statusFlags); ibus_chewing_engine_start(self); /* Shouldn't have anything to commit when Focus-in */ ibus_chewing_pre_edit_clear(self->icPreEdit); @@ -707,11 +554,12 @@ void ibus_chewing_engine_focus_in(IBusChewingEngine *self) { ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_FOCUS_IN); IBUS_CHEWING_LOG(INFO, "focus_in() statusFlags=%x: return", - selfp->statusFlags); + self->statusFlags); } -void ibus_chewing_engine_focus_out(IBusChewingEngine *self) { - IBUS_CHEWING_LOG(MSG, "* focus_out(): statusFlags=%x", selfp->statusFlags); +void ibus_chewing_engine_focus_out(IBusEngine *engine) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); + IBUS_CHEWING_LOG(MSG, "* focus_out(): statusFlags=%x", self->statusFlags); ibus_chewing_engine_clear_status_flag( self, ENGINE_FLAG_FOCUS_IN | ENGINE_FLAG_PROPERTIES_REGISTERED); ibus_chewing_engine_hide_property_list(self); @@ -808,10 +656,12 @@ IBusText *decorate_pre_edit(IBusChewingPreEdit *icPreEdit, gint charLen = (gint)g_utf8_strlen(preEdit, -1); IBUS_CHEWING_LOG(DEBUG, - "decorate_pre_edit() cursor=%d preEdit=%s charLen=%d", + "decorate_pre_edit() cursor=%d " + "preEdit=%s charLen=%d", chiSymbolCursor, preEdit, charLen); - /* Use single underline to mark whole pre-edit buffer */ + /* Use single underline to mark whole pre-edit buffer + */ ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, charLen); @@ -827,7 +677,7 @@ IBusText *decorate_pre_edit(IBusChewingPreEdit *icPreEdit, } void refresh_pre_edit_text(IBusChewingEngine *self) { - IBusText *iText = decorate_pre_edit(self->icPreEdit, selfp->capabilite); + IBusText *iText = decorate_pre_edit(self->icPreEdit, self->capabilite); if (self->preEditText) { g_object_unref(self->preEditText); @@ -861,8 +711,9 @@ void refresh_aux_text(IBusChewingEngine *self) { g_object_unref(self->auxText); } - /* Make auxText (text to be displayed in auxiliary candidate window). - * Use auxText to show messages from libchewing, such as "已有:". + /* Make auxText (text to be displayed in auxiliary + * candidate window). Use auxText to show messages + * from libchewing, such as "已有:". */ gboolean showPageNumber = ibus_chewing_pre_edit_get_property_boolean( @@ -884,7 +735,8 @@ void refresh_aux_text(IBusChewingEngine *self) { self->auxText = g_object_ref_sink( ibus_text_new_from_printf("(%i/%i)", currentPage, TotalPage)); } else { - /* clear out auxText, otherwise it will be displayed continually. */ + /* clear out auxText, otherwise it will be + * displayed continually. */ self->auxText = g_object_ref_sink(ibus_text_new_from_static_string("")); } } @@ -968,9 +820,11 @@ gboolean ibus_chewing_engine_process_key_event(IBusEngine *engine, KSym keySym, if (kSym == IBUS_KEY_Shift_L || kSym == IBUS_KEY_Shift_R || kSym == IBUS_KEY_Caps_Lock) { - /* Refresh property list (language bar) only when users toggle - * Chi-Eng Mode or Shape Mode with Shift or Caps Lock, otherwise - * the bar will stick to the cursor and block the candidats list. + /* Refresh property list (language bar) only when + * users toggle Chi-Eng Mode or Shape Mode with + * Shift or Caps Lock, otherwise the bar will + * stick to the cursor and block the candidats + * list. */ ibus_chewing_engine_refresh_property_list(self); } @@ -1017,7 +871,7 @@ void ibus_chewing_engine_property_activate(IBusEngine *engine, /* Toggle Chinese <-> English */ ibus_chewing_pre_edit_toggle_chi_eng_mode(self->icPreEdit); IBUS_CHEWING_LOG(INFO, "property_activate chinese=%d", - ibus_chewing_engine_is_chinese_mode(self)); + is_chinese_mode(self)); ibus_chewing_engine_refresh_property(self, prop_name); } else if (STRING_EQUALS(prop_name, "AlnumSize")) { /* Toggle Full <-> Half */ diff --git a/src/ibus-chewing-engine.h b/src/ibus-chewing-engine.h index b3346d3..d45281d 100644 --- a/src/ibus-chewing-engine.h +++ b/src/ibus-chewing-engine.h @@ -19,12 +19,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ + +#pragma once + #include "GSettingsBackend.h" #include "IBusChewingPreEdit.h" #include "IBusChewingProperties.h" #include "IBusChewingUtil.h" #include #include +#include +#include #include #include #include @@ -33,14 +38,7 @@ #include #include -#include -#include -#ifndef __IBUS_CHEWING_ENGINE_H__ -#define __IBUS_CHEWING_ENGINE_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +G_BEGIN_DECLS typedef enum { CHEWING_INPUT_STYLE_IN_APPLICATION, @@ -66,91 +64,22 @@ extern GtkResponseType button_responses[]; #define cursor_current chewing_cursor_Current(self->icPreEdit->context) -/* - * Type checking and casting macros - */ -#define IBUS_TYPE_CHEWING_ENGINE (ibus_chewing_engine_get_type()) -#define IBUS_CHEWING_ENGINE(obj) \ - G_TYPE_CHECK_INSTANCE_CAST((obj), ibus_chewing_engine_get_type(), \ - IBusChewingEngine) -#define IBUS_CHEWING_ENGINE_CONST(obj) \ - G_TYPE_CHECK_INSTANCE_CAST((obj), ibus_chewing_engine_get_type(), \ - IBusChewingEngine const) -#define IBUS_CHEWING_ENGINE_CLASS(klass) \ - G_TYPE_CHECK_CLASS_CAST((klass), ibus_chewing_engine_get_type(), \ - IBusChewingEngineClass) -#define IBUS_IS_CHEWING_ENGINE(obj) \ - G_TYPE_CHECK_INSTANCE_TYPE((obj), ibus_chewing_engine_get_type()) - -#define IBUS_CHEWING_ENGINE_GET_CLASS(obj) \ - G_TYPE_INSTANCE_GET_CLASS((obj), ibus_chewing_engine_get_type(), \ - IBusChewingEngineClass) +// XXX not defined by ibus +G_DEFINE_AUTOPTR_CLEANUP_FUNC(IBusEngine, g_object_unref) -/* Private structure type */ -typedef struct _IBusChewingEnginePrivate IBusChewingEnginePrivate; +#define IBUS_TYPE_CHEWING_ENGINE ibus_chewing_engine_get_type() +G_DECLARE_FINAL_TYPE(IBusChewingEngine, ibus_chewing_engine, IBUS, + CHEWING_ENGINE, IBusEngine) -/* - * Main object structure - */ -#ifndef __TYPEDEF_IBUS_CHEWING_ENGINE__ -#define __TYPEDEF_IBUS_CHEWING_ENGINE__ -typedef struct _IBusChewingEngine IBusChewingEngine; -#endif -struct _IBusChewingEngine { - IBusEngine __parent__; - /*< public > */ - IBusChewingPreEdit *icPreEdit; - GtkWidget *sDialog; - IBusText *preEditText; - IBusText *auxText; - IBusText *outgoingText; - IBusProperty *InputMode; - IBusProperty *AlnumSize; - IBusProperty *setup_prop; - IBusPropList *prop_list; - /*< private > */ - FILE *logFile; /* protected */ - IBusKeymap *keymap_us; /* protected */ -}; - -/* - * Class definition - */ -typedef struct _IBusChewingEngineClass IBusChewingEngineClass; -struct _IBusChewingEngineClass { - IBusEngineClass __parent__; - IBusText *InputMode_label_chi; - IBusText *InputMode_label_eng; - IBusText *InputMode_tooltip; - IBusText *InputMode_symbol_chi; - IBusText *InputMode_symbol_eng; - IBusText *AlnumSize_label_full; - IBusText *AlnumSize_label_half; - IBusText *AlnumSize_tooltip; - IBusText *AlnumSize_symbol_full; - IBusText *AlnumSize_symbol_half; - IBusText *setup_prop_label; - IBusText *setup_prop_tooltip; - IBusText *setup_prop_symbol; - IBusText *emptyText; -}; - -/* - * Public methods - */ -GType ibus_chewing_engine_get_type(void) G_GNUC_CONST; void ibus_chewing_engine_refresh_property_list(IBusChewingEngine *self); void ibus_chewing_engine_hide_property_list(IBusChewingEngine *self); -void ibus_chewing_engine_reset(IBusChewingEngine *self); -void ibus_chewing_engine_enable(IBusChewingEngine *self); -void ibus_chewing_engine_disable(IBusChewingEngine *self); -void ibus_chewing_engine_focus_in(IBusChewingEngine *self); -void ibus_chewing_engine_focus_out(IBusChewingEngine *self); +void ibus_chewing_engine_reset(IBusEngine *self); +void ibus_chewing_engine_enable(IBusEngine *self); +void ibus_chewing_engine_disable(IBusEngine *self); +void ibus_chewing_engine_focus_in(IBusEngine *self); +void ibus_chewing_engine_focus_out(IBusEngine *self); gboolean ibus_chewing_engine_process_key_event(IBusEngine *self, guint key_sym, guint keycode, guint modifiers); -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif +G_END_DECLS \ No newline at end of file diff --git a/test/ibus-chewing-engine-test.c b/test/ibus-chewing-engine-test.c index 9b61d73..878c792 100644 --- a/test/ibus-chewing-engine-test.c +++ b/test/ibus-chewing-engine-test.c @@ -31,8 +31,8 @@ void focus_out_then_focus_in_with_aux_text_test() { "add-phrase-direction", TRUE); g_signal_emit_by_name(engine, "set_capabilities", IBUS_CAP_AUXILIARY_TEXT); - ibus_chewing_engine_focus_in(engine); - ibus_chewing_engine_enable(engine); + ibus_chewing_engine_focus_in(IBUS_ENGINE(engine)); + ibus_chewing_engine_enable(IBUS_ENGINE(engine)); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, 0); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, IBUS_RELEASE_MASK); @@ -52,7 +52,7 @@ void focus_out_then_focus_in_with_aux_text_test() { check_output("", "五五", "已有:五五"); /* focus out should not touch Texts */ - ibus_chewing_engine_focus_out(engine); + ibus_chewing_engine_focus_out(IBUS_ENGINE(engine)); g_assert(cleanBufferFocusOut == ibus_chewing_pre_edit_get_property_boolean( engine->icPreEdit, "clean-buffer-focus-out")); @@ -64,7 +64,7 @@ void focus_out_then_focus_in_with_aux_text_test() { } /* all should be clean */ - ibus_chewing_engine_focus_in(engine); + ibus_chewing_engine_focus_in(IBUS_ENGINE(engine)); check_output("", "", ""); ibus_chewing_pre_edit_clear(engine->icPreEdit); From a2b6836a8080698de4855c88d4c49635713c0dea Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 21 Jul 2024 14:29:45 +0900 Subject: [PATCH 2/4] refactor: Remove log file support --- src/MakerDialogUtil.c | 14 -------------- src/ibus-chewing-engine-private.h | 5 +---- src/ibus-chewing-engine.c | 16 ---------------- 3 files changed, 1 insertion(+), 34 deletions(-) diff --git a/src/MakerDialogUtil.c b/src/MakerDialogUtil.c index 3b4b41e..1fb47dd 100644 --- a/src/MakerDialogUtil.c +++ b/src/MakerDialogUtil.c @@ -7,46 +7,32 @@ static MkdgLogLevel debugLevel = WARN; #define MKDG_LOG_DOMAIN_LEN 20 static gchar mkdgLogDomain[MKDG_LOG_DOMAIN_LEN] = "MKDG"; -static FILE *logFile = NULL; void mkdg_log_set_level(MkdgLogLevel level) { debugLevel = level; } -void mkdg_log_set_file(FILE *file) { logFile = file; } - void mkdg_logv_domain(const gchar *domain, MkdgLogLevel level, const gchar *format, va_list argList) { if (level > debugLevel) return; GLogLevelFlags flagSet; - gchar *levelStr = NULL; switch (level) { case ERROR: flagSet = G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR; - levelStr = "ERROR"; break; case WARN: flagSet = G_LOG_LEVEL_WARNING; - levelStr = "WARN"; break; case MSG: flagSet = G_LOG_LEVEL_MESSAGE; - levelStr = "MSG"; break; case INFO: flagSet = G_LOG_LEVEL_INFO; - levelStr = "INFO"; break; default: flagSet = G_LOG_LEVEL_DEBUG; - levelStr = "DEBUG"; break; } g_logv(domain, flagSet, format, argList); - if (logFile != NULL) { - fprintf(logFile, "%s-%s: ", domain, levelStr); - vfprintf(logFile, format, argList); - fprintf(logFile, "\n"); - } } void mkdg_log(MkdgLogLevel level, const gchar *format, ...) { diff --git a/src/ibus-chewing-engine-private.h b/src/ibus-chewing-engine-private.h index ca18220..e6d3bff 100644 --- a/src/ibus-chewing-engine-private.h +++ b/src/ibus-chewing-engine-private.h @@ -41,7 +41,6 @@ G_BEGIN_DECLS struct _IBusChewingEngine { IBusEngine __parent__; - /*< public > */ IBusChewingPreEdit *icPreEdit; IBusText *preEditText; IBusText *auxText; @@ -50,9 +49,7 @@ struct _IBusChewingEngine { IBusProperty *AlnumSize; IBusProperty *setup_prop; IBusPropList *prop_list; - /*< private > */ - FILE *logFile; /* protected */ - IBusKeymap *keymap_us; /* protected */ + IBusKeymap *keymap_us; EngineFlag statusFlags; IBusCapabilite capabilite; diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index becd9db..328ac6e 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -150,7 +150,6 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { self->preEditText = NULL; self->auxText = NULL; self->outgoingText = NULL; - self->logFile = NULL; self->statusFlags = 0; self->capabilite = 0; self->InputMode = g_object_ref_sink(ibus_property_new( @@ -170,21 +169,6 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { return; } - IBUS_CHEWING_LOG(INFO, "init() CHEWING_DATADIR_REAL=%s", - QUOTE_ME(CHEWING_DATADIR_REAL)); - - gchar *logFilename = getenv("IBUS_CHEWING_LOGFILE"); - - if (logFilename != NULL) { - self->logFile = fopen(logFilename, "w+"); - if (self->logFile == NULL) { - IBUS_CHEWING_LOG(WARN, "init() Cannot write to logfile %s, ignored", - logFilename); - } else { - mkdg_log_set_file(self->logFile); - } - } - MkdgBackend *backend = mkdg_g_settings_backend_new( QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); From f7d5aa798350c26fe98a402004cbf3a7cf89c47a Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 21 Jul 2024 14:37:21 +0900 Subject: [PATCH 3/4] refactor: Remove unused input style code --- src/ibus-chewing-engine-private.h | 1 - src/ibus-chewing-engine.c | 31 ++----------------------------- src/ibus-chewing-engine.h | 7 ------- 3 files changed, 2 insertions(+), 37 deletions(-) diff --git a/src/ibus-chewing-engine-private.h b/src/ibus-chewing-engine-private.h index e6d3bff..d57e67e 100644 --- a/src/ibus-chewing-engine-private.h +++ b/src/ibus-chewing-engine-private.h @@ -53,7 +53,6 @@ struct _IBusChewingEngine { EngineFlag statusFlags; IBusCapabilite capabilite; - ChewingInputStyle inputStyle; IBusText *InputMode_label_chi; IBusText *InputMode_label_eng; diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index 328ac6e..f078d90 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -32,22 +32,6 @@ #include "ibus-chewing-engine-private.h" -static const GEnumValue _chewing_input_style_values[] = { - {CHEWING_INPUT_STYLE_IN_APPLICATION, - (char *)"CHEWING_INPUT_STYLE_IN_APPLICATION", (char *)"in-application"}, - {CHEWING_INPUT_STYLE_IN_CANDIDATE, - (char *)"CHEWING_INPUT_STYLE_IN_CANDIDATE", (char *)"in-candidate"}, - {0, NULL, NULL}}; - -GType chewing_input_style_get_type(void) { - static GType type = 0; - - if G_UNLIKELY (type == 0) - type = g_enum_register_static("ChewingInputStyle", - _chewing_input_style_values); - return type; -} - static const GEnumValue _engine_flag_values[] = { {ENGINE_FLAG_INITIALIZED, (char *)"ENGINE_FLAG_INITIALIZED", (char *)"initialized"}, @@ -221,20 +205,9 @@ static void ibus_chewing_engine_class_init(IBusChewingEngineClass *klass) { void ibus_chewing_engine_use_setting(IBusChewingEngine *self) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); - { - IBUS_CHEWING_LOG(INFO, "use_setting()"); + IBUS_CHEWING_LOG(INFO, "use_setting()"); - ibus_chewing_pre_edit_use_all_configure(self->icPreEdit); - - /* Input style */ - if (ibus_chewing_properties_read_boolean_general( - self->icPreEdit->iProperties, "ibus/general", - "embed-preedit-text", NULL)) { - self->inputStyle = CHEWING_INPUT_STYLE_IN_APPLICATION; - } else { - self->inputStyle = CHEWING_INPUT_STYLE_IN_CANDIDATE; - } - } + ibus_chewing_pre_edit_use_all_configure(self->icPreEdit); } void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { diff --git a/src/ibus-chewing-engine.h b/src/ibus-chewing-engine.h index d45281d..ea65cf4 100644 --- a/src/ibus-chewing-engine.h +++ b/src/ibus-chewing-engine.h @@ -40,13 +40,6 @@ G_BEGIN_DECLS -typedef enum { - CHEWING_INPUT_STYLE_IN_APPLICATION, - CHEWING_INPUT_STYLE_IN_CANDIDATE -} ChewingInputStyle; -#define CHEWING_TYPE_INPUT_STYLE chewing_input_style_get_type() -GType chewing_input_style_get_type(void) G_GNUC_CONST; - typedef enum { ENGINE_FLAG_INITIALIZED = 0x1, ENGINE_FLAG_ENABLED = 0x2, From 468abbbcda513e13afdad41c30d7aa838c63c7b7 Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 21 Jul 2024 18:02:44 +0900 Subject: [PATCH 4/4] refactor: use GSettings binding to handle settings update --- .clang-format | 1 + src/CMakeLists.txt | 30 +- src/GSettingsBackend.c | 134 --- src/GSettingsBackend.h | 59 -- src/IBusChewingApplier.c | 195 ----- src/IBusChewingLookupTable.c | 26 +- src/IBusChewingLookupTable.h | 7 +- src/IBusChewingPreEdit-private.h | 32 +- src/IBusChewingPreEdit.c | 253 ++---- src/IBusChewingPreEdit.h | 76 +- src/IBusChewingProperties.c | 236 ------ src/IBusChewingProperties.h | 97 --- src/MakerDialogBackend.c | 33 - src/MakerDialogBackend.h | 98 --- src/MakerDialogProperty.c | 386 --------- src/MakerDialogProperty.h | 180 ---- src/MakerDialogPropertySpec.h | 104 --- src/MakerDialogUtil.c | 157 ---- src/MakerDialogUtil.h | 31 +- src/ibus-chewing-engine-private.h | 44 +- src/ibus-chewing-engine.c | 769 ++++++++++++------ src/ibus-chewing-engine.h | 23 +- src/main.c | 40 +- src/setup/ibus-setup-chewing-window.c | 2 +- .../org.freedesktop.IBus.Chewing.gschema.xml | 6 +- test/CMakeLists.txt | 15 +- test/IBusChewingPreEdit-test.c | 246 ++---- test/MakerDialogBackend-test.c | 202 ----- test/MakerDialogUtil-test.c | 84 -- test/ibus-chewing-engine-test.c | 51 +- 30 files changed, 789 insertions(+), 2828 deletions(-) delete mode 100644 src/GSettingsBackend.c delete mode 100644 src/GSettingsBackend.h delete mode 100644 src/IBusChewingApplier.c delete mode 100644 src/IBusChewingProperties.c delete mode 100644 src/IBusChewingProperties.h delete mode 100644 src/MakerDialogBackend.c delete mode 100644 src/MakerDialogBackend.h delete mode 100644 src/MakerDialogProperty.c delete mode 100644 src/MakerDialogProperty.h delete mode 100644 src/MakerDialogPropertySpec.h delete mode 100644 test/MakerDialogBackend-test.c diff --git a/.clang-format b/.clang-format index 80d3293..75a203b 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,3 @@ BasedOnStyle: LLVM IndentWidth: 4 +ColumnLimit: 100 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index db372d0..88d360e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,16 +1,8 @@ add_library(common STATIC - IBusChewingApplier.c - IBusChewingProperties.c IBusChewingLookupTable.c - MakerDialogBackend.c - MakerDialogProperty.c MakerDialogUtil.c IBusChewingLookupTable.h - IBusChewingProperties.h - MakerDialogBackend.h - MakerDialogProperty.h - MakerDialogPropertySpec.h MakerDialogUtil.h ibus-chewing-engine.h ) @@ -20,19 +12,6 @@ target_link_libraries(common PUBLIC PkgConfig::IBUS ) -add_library(gui-core STATIC - GSettingsBackend.c - GSettingsBackend.h -) -target_link_libraries(gui-core PUBLIC - common - PkgConfig::GLIB2 - PkgConfig::GTK4 - PkgConfig::LIBADWAITA - PkgConfig::IBUS - PkgConfig::CHEWING -) - add_custom_command( OUTPUT ibus-setup-chewing-window-ui.c WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/setup @@ -86,7 +65,14 @@ target_compile_definitions(ibus-engine-chewing target_include_directories(ibus-engine-chewing PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(ibus-engine-chewing gui-core) +target_link_libraries(ibus-engine-chewing + common + PkgConfig::GLIB2 + PkgConfig::GTK4 + PkgConfig::LIBADWAITA + PkgConfig::IBUS + PkgConfig::CHEWING +) set(PROJECT_GSCHEMA_XML ${PROJECT_SCHEMA_ID}.gschema.xml) set(GSETTINGS_SCHEMAS_DIR ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) diff --git a/src/GSettingsBackend.c b/src/GSettingsBackend.c deleted file mode 100644 index 2f5819d..0000000 --- a/src/GSettingsBackend.c +++ /dev/null @@ -1,134 +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 "GSettingsBackend.h" -#include "MakerDialogUtil.h" -#include -#include - -gchar *mkdg_g_variant_to_string(GVariant *gVar) { - static gchar result[MAKER_DIALOG_VALUE_LENGTH]; - - result[0] = '\0'; - const GVariantType *gVType = g_variant_get_type(gVar); - - if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_BOOLEAN)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, - g_variant_get_boolean(gVar) ? "1" : "0"); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT16)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GUINT16_FORMAT, - g_variant_get_uint16(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT32)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GUINT32_FORMAT, - g_variant_get_uint32(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT64)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GUINT64_FORMAT, - g_variant_get_uint64(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT16)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GINT16_FORMAT, - g_variant_get_int16(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT32)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GINT32_FORMAT, - g_variant_get_int32(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT64)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%" G_GINT64_FORMAT, - g_variant_get_int64(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_STRING)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%s", - g_variant_get_string(gVar, NULL)); - } - return result; -} - -/*============================================ - * Class routines - */ - -#define KEY_BUFFER_SIZE 300 - -GValue *mkdg_g_settings_read_value(GSettings *settings, GValue *value, - const gchar *key) { - GVariant *confValue = g_settings_get_value(settings, key); - - mkdg_log(DEBUG, "mkdg_g_settings_read_value(-,-,%s)", key); - if (confValue == NULL) { - mkdg_log(ERROR, "mkdg_g_settings_read_value(-,-,%s)", key); - return NULL; - } - mkdg_g_variant_to_g_value(confValue, value); - g_variant_unref(confValue); - return value; -} - -/*============================================ - * Interface routines - */ -gchar *mkdg_g_settings_backend_get_key([[maybe_unused]] MkdgBackend *backend, - [[maybe_unused]] const gchar *section, - const gchar *key, - [[maybe_unused]] gpointer userData) { - return (gchar *)key; -} - -GValue *mkdg_g_settings_backend_read_value( - MkdgBackend *backend, GValue *value, [[maybe_unused]] const gchar *section, - const gchar *key, [[maybe_unused]] gpointer userData) { - GSettings *config = (GSettings *)backend->config; - - return mkdg_g_settings_read_value(config, value, key); -} - -gboolean -mkdg_g_settings_backend_write_value(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - [[maybe_unused]] gpointer userData) { - GSettings *config = (GSettings *)backend->config; - GVariant *confValue = g_variant_ref_sink(mkdg_g_value_to_g_variant(value)); - - mkdg_log(DEBUG, "mkdg_g_settings_write_value(-,%s,%s) %s", - mkdg_g_value_to_string(value), key, - mkdg_g_variant_to_string(confValue)); - gboolean result = g_settings_set_value(config, key, confValue); - - g_settings_sync(); - if (!result) { - mkdg_log(ERROR, - "mkdg_g_settings_backend_write_value(-,%s,%s,%s,-): Fail " - "g_settings_set_value", - mkdg_g_value_to_string(value), section, key); - } - g_variant_unref(confValue); - return result; -} - -MkdgBackend *mkdg_g_settings_backend_new(const gchar *schemaId, - const gchar *basePath, - gpointer auxData) { - GSettings *client = g_settings_new(schemaId); - MkdgBackend *result = mkdg_backend_new(GSETTINGS_BACKEND_ID, - (gpointer)client, basePath, auxData); - - result->getKeyFunc = mkdg_g_settings_backend_get_key; - result->readFunc = mkdg_g_settings_backend_read_value; - result->writeFunc = mkdg_g_settings_backend_write_value; - return result; -} diff --git a/src/GSettingsBackend.h b/src/GSettingsBackend.h deleted file mode 100644 index 0e23231..0000000 --- a/src/GSettingsBackend.h +++ /dev/null @@ -1,59 +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:GSettingsBackend - * @short_description: GSettings backend - * @title: GSettings Backend - * @stability: Stable - * @include: GSettingsBackend.h - * - * GSettings as MakerDialog backend. - */ - -#ifndef _MKDG_GSETTINGS_BACKEND_H_ -#define _MKDG_GSETTINGS_BACKEND_H_ -#include "MakerDialogBackend.h" -#include "MakerDialogPropertySpec.h" -#include -#include -#include -#define GSETTINGS_BACKEND_ID "gsettings" - -GValue *mkdg_g_settings_read_value(GSettings *settings, GValue *value, - const gchar *key); - -/** - * mkdg_g_settings_backend_new: - * @schemaId: GSettings Schema ID. - * @basePath: GSettings path with trailing '/' - * @auxData: Auxiliary data. - * - * @returns: An GSettings backend for this project. - * - */ - -MkdgBackend *mkdg_g_settings_backend_new(const gchar *schemaId, - const gchar *basePath, - gpointer auxData); - -#endif /* _MKDG_GSETTINGS_BACKEND_H_ */ diff --git a/src/IBusChewingApplier.c b/src/IBusChewingApplier.c deleted file mode 100644 index c067404..0000000 --- a/src/IBusChewingApplier.c +++ /dev/null @@ -1,195 +0,0 @@ -#include "IBusChewingLookupTable.h" -#include "IBusChewingPreEdit.h" -#include - -static ChewingKbType kbType_id_get_index(const gchar *kbType_id) { - ChewingKbType i = 0; - - for (i = 0; kbType_ids[i] != NULL; i++) { - if (strcmp(kbType_id, kbType_ids[i]) == 0) { - return i; - } - } - return CHEWING_KBTYPE_INVALID; -} - -/*============================================ - * Callback routines - */ -gboolean KBType_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - - IBUS_CHEWING_LOG(DEBUG, "KBType_apply_callback(%s,%s)", ctx->spec->key, - mkdg_g_value_to_string(value)); - ChewingKbType kbType = kbType_id_get_index(g_value_get_string(value)); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_KBType(icPreEdit->context, kbType); - return TRUE; -} - -gboolean selKeys_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - - IBUS_CHEWING_LOG(DEBUG, "selKeys_apply_callback(%s,%s)", ctx->spec->key, - mkdg_g_value_to_string(value)); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - ibus_chewing_lookup_table_resize(icPreEdit->iTable, icPreEdit->iProperties, - icPreEdit->context); - return TRUE; -} - -gboolean autoShiftCur_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_autoShiftCur(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - return TRUE; -} - -gboolean addPhraseDirection_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_addPhraseDirection(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - return TRUE; -} - -gboolean cleanBufferFocusOut_apply_callback(PropertyContext *, gpointer) { - return TRUE; -} - -gboolean easySymbolInput_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_easySymbolInput(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} - -gboolean escCleanAllBuf_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_escCleanAllBuf(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - return TRUE; -} - -gboolean enable_fullwidth_toggle_key_apply_callback(PropertyContext *ctx, - gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_config_set_int(icPreEdit->context, - "chewing.enable_fullwidth_toggle_key", - g_value_get_boolean(value)); - return TRUE; -} - -/* Additional symbol buffer length */ -gboolean maxChiSymbolLen_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_maxChiSymbolLen(icPreEdit->context, - g_value_get_int(value) + - 5); /* 5 for incomplete bopomofos */ - return TRUE; -} - -gboolean defaultEnglishLetterCase_apply_callback(PropertyContext *, gpointer) { - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} - -gboolean syncCapsLock_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - const gchar *str = g_value_get_string(value); - - if (strcmp(str, "keyboard") == 0) { - ibus_chewing_pre_edit_set_flag(icPreEdit, FLAG_SYNC_FROM_KEYBOARD); - ibus_chewing_pre_edit_clear_flag(icPreEdit, FLAG_SYNC_FROM_IM); - } else if (strcmp(str, "input method") == 0) { - ibus_chewing_pre_edit_set_flag(icPreEdit, FLAG_SYNC_FROM_IM); - ibus_chewing_pre_edit_clear_flag(icPreEdit, FLAG_SYNC_FROM_KEYBOARD); - } else { - ibus_chewing_pre_edit_clear_flag( - icPreEdit, FLAG_SYNC_FROM_IM | FLAG_SYNC_FROM_KEYBOARD); - } - return TRUE; -} - -gboolean candPerPage_apply_callback(PropertyContext *ctx, gpointer) { - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - ibus_chewing_lookup_table_resize(icPreEdit->iTable, icPreEdit->iProperties, - icPreEdit->context); - return TRUE; -} - -gboolean showPageNumber_apply_callback(PropertyContext *, gpointer) { - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} - -gboolean phraseChoiceRearward_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_phraseChoiceRearward(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - return TRUE; -} - -gboolean spaceAsSelection_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - - chewing_set_spaceAsSelection(icPreEdit->context, - (g_value_get_boolean(value)) ? 1 : 0); - return TRUE; -} - -gboolean plainZhuyin_apply_callback(PropertyContext *, gpointer) { - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} - -gboolean conversion_engine_apply_callback(PropertyContext *ctx, gpointer) { - GValue *value = &(ctx->value); - IBusChewingPreEdit *icPreEdit = (IBusChewingPreEdit *)ctx->parent; - const gchar *engine_enum = g_value_get_string(value); - int engine = 1; - - if (!g_strcmp0(engine_enum, "simple")) { - engine = 0; - } else if (!g_strcmp0(engine_enum, "chewing")) { - engine = 1; - } else if (!g_strcmp0(engine_enum, "fuzzy-chewing")) { - engine = 2; - } - - mkdg_log(INFO, - "conversion_engine_apply_callback(): engine_enum=%s, engine=%d", - engine_enum, engine); - chewing_config_set_int(icPreEdit->context, "chewing.conversion_engine", - engine); - return TRUE; -} - -gboolean verticalLookupTable_apply_callback(PropertyContext *, gpointer) { - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} - -gboolean chiEngToggle_apply_callback(PropertyContext *, gpointer) { - /* Use MkdgProperty directly, no need to call IBusChewingEngine */ - return TRUE; -} diff --git a/src/IBusChewingLookupTable.c b/src/IBusChewingLookupTable.c index 0bdd552..167a3e8 100644 --- a/src/IBusChewingLookupTable.c +++ b/src/IBusChewingLookupTable.c @@ -1,29 +1,25 @@ #include "IBusChewingLookupTable.h" #include "IBusChewingUtil.h" -#include "MakerDialogProperty.h" +#include "MakerDialogUtil.h" -IBusLookupTable * -ibus_chewing_lookup_table_new(IBusChewingProperties *iProperties, - ChewingContext *context) { +IBusLookupTable *ibus_chewing_lookup_table_new(ChewingContext *context) { guint size = 10; gboolean cursorShow = TRUE; gboolean wrapAround = TRUE; IBusLookupTable *iTable = ibus_lookup_table_new(size, 0, cursorShow, wrapAround); - ibus_chewing_lookup_table_resize(iTable, iProperties, context); + ibus_chewing_lookup_table_resize(iTable, context); return iTable; } void ibus_chewing_lookup_table_resize(IBusLookupTable *iTable, - IBusChewingProperties *iProperties, ChewingContext *context) { gint selKSym[MAX_SELKEY]; - const gchar *selKeyStr = - mkdg_properties_get_string_by_key(iProperties->properties, "sel-keys"); - guint candPerPage = mkdg_properties_get_uint_by_key(iProperties->properties, - "cand-per-page"); + g_autoptr(GSettings) settings = g_settings_new(QUOTE_ME(PROJECT_SCHEMA_ID)); + g_autofree char *selKeyStr = g_settings_get_string(settings, "sel-keys"); + guint candPerPage = g_settings_get_uint(settings, "cand-per-page"); /* Users are allowed to specify their own selKeys, * we have to check the length and take the smaller one. @@ -47,16 +43,14 @@ void ibus_chewing_lookup_table_resize(IBusLookupTable *iTable, chewing_set_candPerPage(context, len); chewing_set_selKey(context, selKSym, len); - gboolean verticalLookupTable = mkdg_properties_get_boolean_by_key( - iProperties->properties, "vertical-lookup-table"); + gboolean verticalLookupTable = + g_settings_get_boolean(settings, "vertical-lookup-table"); ibus_lookup_table_set_orientation(iTable, verticalLookupTable); } -guint ibus_chewing_lookup_table_update( - IBusLookupTable *iTable, - [[maybe_unused]] IBusChewingProperties *iProperties, - ChewingContext *context) { +guint ibus_chewing_lookup_table_update(IBusLookupTable *iTable, + ChewingContext *context) { IBusText *iText = NULL; gint i; gint choicePerPage = chewing_cand_ChoicePerPage(context); diff --git a/src/IBusChewingLookupTable.h b/src/IBusChewingLookupTable.h index ee3c8da..d4f7e61 100644 --- a/src/IBusChewingLookupTable.h +++ b/src/IBusChewingLookupTable.h @@ -33,20 +33,15 @@ #ifndef _IBUS_CHEWING_LOOKUP_TABLE_H_ #define _IBUS_CHEWING_LOOKUP_TABLE_H_ -#include "IBusChewingProperties.h" #include #include -IBusLookupTable * -ibus_chewing_lookup_table_new(IBusChewingProperties *iProperties, - ChewingContext *context); +IBusLookupTable *ibus_chewing_lookup_table_new(ChewingContext *context); void ibus_chewing_lookup_table_resize(IBusLookupTable *iTable, - IBusChewingProperties *iProperties, ChewingContext *context); guint ibus_chewing_lookup_table_update(IBusLookupTable *iTable, - IBusChewingProperties *iProperties, ChewingContext *context); #endif /* _IBUS_CHEWING_LOOKUP_TABLE_H_ */ diff --git a/src/IBusChewingPreEdit-private.h b/src/IBusChewingPreEdit-private.h index e3f1d33..dffd1c3 100644 --- a/src/IBusChewingPreEdit-private.h +++ b/src/IBusChewingPreEdit-private.h @@ -24,40 +24,11 @@ * ibus_chewing_pre_edit private function definitions * Put it here so they can be tested. */ -#ifndef _IBUS_CHEWING_PRE_EDIT_PRIVATE_H_ -#define _IBUS_CHEWING_PRE_EDIT_PRIVATE_H_ +#pragma once /*== Frequent used shortcut ==*/ #define cursor_current chewing_cursor_Current(self->context) #define total_choice chewing_cand_TotalChoice(self->context) -#define default_english_case_short \ - (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "default-english-case"), \ - "lowercase")) \ - ? 'l' \ - : (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "default-english-case"), \ - "uppercase") \ - ? 'u' \ - : 'n') -#define chi_eng_toggle_key \ - (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "chi-eng-mode-toggle"), \ - "caps_lock")) \ - ? 'c' \ - : (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "chi-eng-mode-toggle"), \ - "shift")) \ - ? 's' \ - : (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "chi-eng-mode-toggle"), \ - "shift_l")) \ - ? 'l' \ - : (STRING_EQUALS(ibus_chewing_pre_edit_get_property_string( \ - self, "chi-eng-mode-toggle"), \ - "shift_r") \ - ? 'r' \ - : 'n') /*== Conditional Expression Shortcut ==*/ #define bpmf_check ibus_chewing_bopomofo_check(self->context) @@ -120,4 +91,3 @@ EventResponse self_handle_key_sym_default(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod); void ibus_chewing_pre_edit_update(IBusChewingPreEdit *self); -#endif /* _IBUS_CHEWING_PRE_EDIT_PRIVATE_H_ */ diff --git a/src/IBusChewingPreEdit.c b/src/IBusChewingPreEdit.c index c49e2ee..c17e5ec 100644 --- a/src/IBusChewingPreEdit.c +++ b/src/IBusChewingPreEdit.c @@ -1,19 +1,18 @@ #include "IBusChewingPreEdit.h" #include "IBusChewingPreEdit-private.h" -#include "IBusChewingProperties.h" #include "IBusChewingUtil.h" +#include "MakerDialogUtil.h" +#include "ibus-chewing-engine.h" #include -#include -#include /************************************** * Methods */ -IBusChewingPreEdit *ibus_chewing_pre_edit_new(MkdgBackend *backend) { +IBusChewingPreEdit *ibus_chewing_pre_edit_new() { IBusChewingPreEdit *self = g_new0(IBusChewingPreEdit, 1); - self->iProperties = ibus_chewing_properties_new(backend, self, NULL); + // self->iProperties = ibus_chewing_properties_new(backend, self, NULL); self->preEdit = g_string_sized_new(IBUS_CHEWING_MAX_BYTES); self->outgoing = g_string_sized_new(IBUS_CHEWING_MAX_BYTES); self->keyLast = 0; @@ -25,8 +24,7 @@ IBusChewingPreEdit *ibus_chewing_pre_edit_new(MkdgBackend *backend) { // TODO add default mode setting chewing_set_ChiEngMode(self->context, CHINESE_MODE); - self->iTable = g_object_ref_sink( - ibus_chewing_lookup_table_new(self->iProperties, self->context)); + self->iTable = g_object_ref_sink(ibus_chewing_lookup_table_new(self->context)); return self; } @@ -46,10 +44,6 @@ gchar *ibus_chewing_pre_edit_get_bopomofo_string(IBusChewingPreEdit *self) { return g_strdup(buf); } -void ibus_chewing_pre_edit_use_all_configure(IBusChewingPreEdit *self) { - mkdg_properties_use_all(self->iProperties->properties, NULL); -} - void ibus_chewing_pre_edit_update_outgoing(IBusChewingPreEdit *self) { if (chewing_commit_Check(self->context)) { /* commit_Check=1 means new commit available */ @@ -62,10 +56,8 @@ void ibus_chewing_pre_edit_update_outgoing(IBusChewingPreEdit *self) { chewing_ack(self->context); } IBUS_CHEWING_LOG(INFO, "outgoing=|%s|\n", self->outgoing->str); - IBUS_CHEWING_LOG( - DEBUG, - "ibus_chewing_pre_edit_update_outgoing(-): return: outgoing=|%s|", - self->outgoing->str); + IBUS_CHEWING_LOG(DEBUG, "ibus_chewing_pre_edit_update_outgoing(-): return: outgoing=|%s|", + self->outgoing->str); } void ibus_chewing_pre_edit_update(IBusChewingPreEdit *self) { @@ -108,33 +100,23 @@ void ibus_chewing_pre_edit_update(IBusChewingPreEdit *self) { ibus_chewing_pre_edit_update_outgoing(self); } -guint ibus_chewing_pre_edit_length(IBusChewingPreEdit *self) { - return self->preEdit->len; -} +guint ibus_chewing_pre_edit_length(IBusChewingPreEdit *self) { return self->preEdit->len; } -guint ibus_chewing_pre_edit_word_length(IBusChewingPreEdit *self) { - return self->wordLen; -} +guint ibus_chewing_pre_edit_word_length(IBusChewingPreEdit *self) { return self->wordLen; } guint ibus_chewing_pre_edit_word_limit(IBusChewingPreEdit *self) { return chewing_get_maxChiSymbolLen(self->context); } -gchar *ibus_chewing_pre_edit_get_pre_edit(IBusChewingPreEdit *self) { - return self->preEdit->str; -} +gchar *ibus_chewing_pre_edit_get_pre_edit(IBusChewingPreEdit *self) { return self->preEdit->str; } -gchar *ibus_chewing_pre_edit_get_outgoing(IBusChewingPreEdit *self) { - return self->outgoing->str; -} +gchar *ibus_chewing_pre_edit_get_outgoing(IBusChewingPreEdit *self) { return self->outgoing->str; } /* currently, ibus_chewing_pre_edit_force_commit() is called only by test cases. */ void ibus_chewing_pre_edit_force_commit(IBusChewingPreEdit *self) { - IBUS_CHEWING_LOG( - INFO, - "ibus_chewing_pre_edit_force_commit(-) bpmf_check=%d buffer_check=%d", - bpmf_check, chewing_buffer_Check(self->context)); + IBUS_CHEWING_LOG(INFO, "ibus_chewing_pre_edit_force_commit(-) bpmf_check=%d buffer_check=%d", + bpmf_check, chewing_buffer_Check(self->context)); /* Ignore the context and commit whatever in preedit buffer */ g_string_append(self->outgoing, self->preEdit->str); @@ -194,8 +176,7 @@ gboolean ibus_chewing_pre_edit_get_full_half_mode(IBusChewingPreEdit *self) { return chewing_get_ShapeMode(self->context) != 0; } -void ibus_chewing_pre_edit_set_chi_eng_mode(IBusChewingPreEdit *self, - gboolean chineseMode) { +void ibus_chewing_pre_edit_set_chi_eng_mode(IBusChewingPreEdit *self, gboolean chineseMode) { /* Clear bopomofo when toggling Chi-Eng Mode */ if (!chineseMode && is_chinese && bpmf_check) { ibus_chewing_pre_edit_clear_bopomofo(self); @@ -203,8 +184,7 @@ void ibus_chewing_pre_edit_set_chi_eng_mode(IBusChewingPreEdit *self, chewing_set_ChiEngMode(self->context, (chineseMode) ? 1 : 0); } -void ibus_chewing_pre_edit_set_full_half_mode(IBusChewingPreEdit *self, - gboolean fullShapeMode) { +void ibus_chewing_pre_edit_set_full_half_mode(IBusChewingPreEdit *self, gboolean fullShapeMode) { if (is_chinese && bpmf_check) { /* Clear bopomofo when toggling Full-Half Mode */ ibus_chewing_pre_edit_clear_bopomofo(self); @@ -215,10 +195,10 @@ void ibus_chewing_pre_edit_set_full_half_mode(IBusChewingPreEdit *self, /************************************** * ibus_chewing_pre_edit key processing */ -KSym self_key_sym_fix(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { - gchar caseConversionMode = default_english_case_short; - gchar toggleChinese = chi_eng_toggle_key; +KSym self_key_sym_fix(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + gchar caseConversionMode = ibus_chewing_engine_get_default_english_case(engine); + gchar toggleChinese = ibus_chewing_engine_get_chinese_english_toggle_key(engine); if (toggleChinese != 'c') { @@ -273,10 +253,8 @@ EventResponse self_handle_key_sym_default(IBusChewingPreEdit *self, KSym kSym, EventResponse response = EVENT_RESPONSE_UNDECIDED; KSym fixedKSym = self_key_sym_fix(self, kSym, unmaskedMod); - IBUS_CHEWING_LOG(DEBUG, - "* self_handle_key_sym_default(): new kSym %x(%s), %x(%s)", - fixedKSym, key_sym_get_name(fixedKSym), unmaskedMod, - modifiers_to_string(unmaskedMod)); + IBUS_CHEWING_LOG(DEBUG, "* self_handle_key_sym_default(): new kSym %x(%s), %x(%s)", fixedKSym, + key_sym_get_name(fixedKSym), unmaskedMod, modifiers_to_string(unmaskedMod)); gint ret = chewing_handle_Default(self->context, fixedKSym); /* Handle quick commit */ @@ -297,16 +275,14 @@ EventResponse self_handle_key_sym_default(IBusChewingPreEdit *self, KSym kSym, break; } - IBUS_CHEWING_LOG(DEBUG, "self_handle_key_sym_default() ret=%d response=%d", - ret, response); + IBUS_CHEWING_LOG(DEBUG, "self_handle_key_sym_default() ret=%d response=%d", ret, response); /* Restore easySymbolInput */ chewing_set_easySymbolInput(self->context, easySymbolInput); return response; } /* Return FALSE if the key should not be processed with input method */ -EventResponse self_handle_num(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_num(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(IBUS_SHIFT_MASK | IBUS_CONTROL_MASK); if ((maskedMod == 0) && !is_full_shape && !is_chinese) { /* Users treat English Sub-mode as IM Disabled, @@ -318,8 +294,7 @@ EventResponse self_handle_num(IBusChewingPreEdit *self, KSym kSym, handle_log("num"); if (is_ctrl_only) { - return event_process_or_ignore( - !chewing_handle_CtrlNum(self->context, kSym)); + return event_process_or_ignore(!chewing_handle_CtrlNum(self->context, kSym)); } /* maskedMod = 0 */ return self_handle_key_sym_default(self, kSym, unmaskedMod); @@ -344,8 +319,7 @@ EventResponse self_handle_num_keypad(IBusChewingPreEdit *self, KSym kSym, } if (is_ctrl_only) { - return event_process_or_ignore( - !chewing_handle_CtrlNum(self->context, kSymEquiv)); + return event_process_or_ignore(!chewing_handle_CtrlNum(self->context, kSymEquiv)); } /* maskedMod = 0 */ @@ -354,18 +328,18 @@ EventResponse self_handle_num_keypad(IBusChewingPreEdit *self, KSym kSym, ibus_chewing_pre_edit_set_chi_eng_mode(self, FALSE); - EventResponse response = - self_handle_key_sym_default(self, kSymEquiv, unmaskedMod); + EventResponse response = self_handle_key_sym_default(self, kSymEquiv, unmaskedMod); chewing_set_ChiEngMode(self->context, origChiEngMode); return response; } -EventResponse self_handle_caps_lock(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_caps_lock(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); - gchar toggleChinese = chi_eng_toggle_key; + + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + gchar toggleChinese = ibus_chewing_engine_get_chinese_english_toggle_key(engine); if (toggleChinese != 'c') { /* Ignore the Caps Lock event when it does not toggle Chinese */ @@ -388,7 +362,8 @@ EventResponse self_handle_shift_left(IBusChewingPreEdit *self, KSym kSym, filter_modifiers(IBUS_SHIFT_MASK); handle_log("shift_left"); - gchar toggleChinese = chi_eng_toggle_key; + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + gchar toggleChinese = ibus_chewing_engine_get_chinese_english_toggle_key(engine); if (toggleChinese != 's' && toggleChinese != 'l') { return EVENT_RESPONSE_IGNORE; @@ -401,8 +376,7 @@ EventResponse self_handle_shift_left(IBusChewingPreEdit *self, KSym kSym, /* keyLast != Shift means Shift is just part of combination, * thus should not be recognized as single Shift key */ - if (self->keyLast != IBUS_KEY_Shift_L && - self->keyLast != IBUS_KEY_Shift_R) { + if (self->keyLast != IBUS_KEY_Shift_L && self->keyLast != IBUS_KEY_Shift_R) { return EVENT_RESPONSE_IGNORE; } @@ -415,7 +389,8 @@ EventResponse self_handle_shift_right(IBusChewingPreEdit *self, KSym kSym, filter_modifiers(IBUS_SHIFT_MASK); handle_log("shift_right"); - gchar toggleChinese = chi_eng_toggle_key; + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + gchar toggleChinese = ibus_chewing_engine_get_chinese_english_toggle_key(engine); if (toggleChinese != 's' && toggleChinese != 'r') { return EVENT_RESPONSE_IGNORE; @@ -428,8 +403,7 @@ EventResponse self_handle_shift_right(IBusChewingPreEdit *self, KSym kSym, /* keyLast != Shift means Shift is just part of combination, * thus should not be recognized as single Shift key */ - if (self->keyLast != IBUS_KEY_Shift_L && - self->keyLast != IBUS_KEY_Shift_R) { + if (self->keyLast != IBUS_KEY_Shift_L && self->keyLast != IBUS_KEY_Shift_R) { return EVENT_RESPONSE_IGNORE; } @@ -437,8 +411,7 @@ EventResponse self_handle_shift_right(IBusChewingPreEdit *self, KSym kSym, return EVENT_RESPONSE_IGNORE; } -EventResponse self_handle_page_up(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_page_up(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -457,8 +430,7 @@ EventResponse self_handle_page_up(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_PageUp(self->context)); } -EventResponse self_handle_page_down(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_page_down(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -474,8 +446,7 @@ EventResponse self_handle_page_down(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_PageDown(self->context)); } -EventResponse self_handle_space(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_space(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(IBUS_SHIFT_MASK | IBUS_CONTROL_MASK); if (!is_shift_only && !is_chinese && !is_full_shape) { @@ -489,35 +460,15 @@ EventResponse self_handle_space(IBusChewingPreEdit *self, KSym kSym, handle_log("space"); if (is_shift_only) { + handle_log("Shift+Space"); chewing_handle_ShiftSpace(self->context); return EVENT_RESPONSE_PROCESS; } - /* Bug of libchewing: - * If "Space as selection" is not enabled, Space key cannot be used - * to turn pages or switch the length of candidate lis. - */ - if (table_is_showing) { - return self_handle_page_down(self, kSym, unmaskedMod); - } - - /* Bug of libchewing: - * when "space to select" is enabled, chewing_handle_Space() will - * ignore the first space. Therefore, use chewing_handle_Space() - * only if the buffer is not empty and we want to select. - */ - gboolean spaceAsSelection = - ibus_chewing_pre_edit_get_property_boolean(self, "space-as-selection"); - - if (is_chinese && !buffer_is_empty && !bpmf_check && spaceAsSelection) { - return event_process_or_ignore(!chewing_handle_Space(self->context)); - } else { - return self_handle_key_sym_default(self, kSym, unmaskedMod); - } + return event_process_or_ignore(!chewing_handle_Space(self->context)); } -EventResponse self_handle_return(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_return(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -530,8 +481,7 @@ EventResponse self_handle_return(IBusChewingPreEdit *self, KSym kSym, return self_handle_key_sym_default(self, cursorInPage, unmaskedMod); } - EventResponse response = - event_process_or_ignore(!chewing_handle_Enter(self->context)); + EventResponse response = event_process_or_ignore(!chewing_handle_Enter(self->context)); /* Handle quick commit */ ibus_chewing_pre_edit_update_outgoing(self); @@ -539,8 +489,7 @@ EventResponse self_handle_return(IBusChewingPreEdit *self, KSym kSym, return response; } -EventResponse self_handle_backspace(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_backspace(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; absorb_when_release; // Triggers focus-out and focus-in on ignore, so use @@ -550,8 +499,7 @@ EventResponse self_handle_backspace(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Backspace(self->context)); } -EventResponse self_handle_delete(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_delete(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -560,8 +508,7 @@ EventResponse self_handle_delete(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Del(self->context)); } -EventResponse self_handle_escape(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_escape(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -570,20 +517,19 @@ EventResponse self_handle_escape(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Esc(self->context)); } -EventResponse self_handle_left(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_left(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(IBUS_SHIFT_MASK); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; handle_log("left"); if (is_shift_only) { - return event_process_or_ignore( - !chewing_handle_ShiftLeft(self->context)); + return event_process_or_ignore(!chewing_handle_ShiftLeft(self->context)); } if (table_is_showing) { - if (!ibus_chewing_pre_edit_is_vertical_table(self)) { + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + if (!ibus_chewing_engine_use_vertical_lookup_table(engine)) { /* horizontal look-up table */ int pos = ibus_lookup_table_get_cursor_in_page(self->iTable); @@ -599,15 +545,15 @@ EventResponse self_handle_left(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Left(self->context)); } -EventResponse self_handle_up(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_up(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; handle_log("up"); if (table_is_showing) { - if (ibus_chewing_pre_edit_is_vertical_table(self)) { + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + if (!ibus_chewing_engine_use_vertical_lookup_table(engine)) { /* vertical look-up table */ int pos = ibus_lookup_table_get_cursor_in_page(self->iTable); @@ -623,26 +569,22 @@ EventResponse self_handle_up(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Up(self->context)); } -EventResponse self_handle_right(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_right(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(IBUS_SHIFT_MASK); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; handle_log("right"); if (is_shift_only) { - return event_process_or_ignore( - !chewing_handle_ShiftRight(self->context)); + return event_process_or_ignore(!chewing_handle_ShiftRight(self->context)); } if (table_is_showing) { - - if (!ibus_chewing_pre_edit_is_vertical_table(self)) { + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + if (!ibus_chewing_engine_use_vertical_lookup_table(engine)) { /* horizontal look-up table */ - int numberCand = - ibus_lookup_table_get_number_of_candidates(self->iTable); - int cursorInPage = - ibus_lookup_table_get_cursor_in_page(self->iTable) + 1; + int numberCand = ibus_lookup_table_get_number_of_candidates(self->iTable); + int cursorInPage = ibus_lookup_table_get_cursor_in_page(self->iTable) + 1; if (cursorInPage != numberCand) { ibus_lookup_table_cursor_down(self->iTable); return EVENT_RESPONSE_ABSORB; @@ -655,21 +597,18 @@ EventResponse self_handle_right(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Right(self->context)); } -EventResponse self_handle_down(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_down(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; handle_log("down"); if (table_is_showing) { - if (ibus_chewing_pre_edit_is_vertical_table(self)) { - + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + if (!ibus_chewing_engine_use_vertical_lookup_table(engine)) { /* vertical look-up table */ - int numberCand = - ibus_lookup_table_get_number_of_candidates(self->iTable); - int cursorInPage = - ibus_lookup_table_get_cursor_in_page(self->iTable) + 1; + int numberCand = ibus_lookup_table_get_number_of_candidates(self->iTable); + int cursorInPage = ibus_lookup_table_get_cursor_in_page(self->iTable) + 1; if (cursorInPage != numberCand) { ibus_lookup_table_cursor_down(self->iTable); return EVENT_RESPONSE_ABSORB; @@ -683,8 +622,7 @@ EventResponse self_handle_down(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Down(self->context)); } -EventResponse self_handle_tab(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_tab(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -693,8 +631,7 @@ EventResponse self_handle_tab(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Tab(self->context)); } -EventResponse self_handle_home(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_home(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -703,8 +640,7 @@ EventResponse self_handle_home(IBusChewingPreEdit *self, KSym kSym, return event_process_or_ignore(!chewing_handle_Home(self->context)); } -EventResponse self_handle_end(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_end(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(0); ignore_when_buffer_is_empty_and_table_not_showing; ignore_when_release; @@ -721,8 +657,7 @@ EventResponse self_handle_special([[maybe_unused]] IBusChewingPreEdit *self, return EVENT_RESPONSE_IGNORE; } -EventResponse self_handle_default(IBusChewingPreEdit *self, KSym kSym, - KeyModifiers unmaskedMod) { +EventResponse self_handle_default(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { filter_modifiers(IBUS_SHIFT_MASK); ignore_when_release; handle_log("default"); @@ -802,30 +737,25 @@ static KeyHandlingRule *self_key_sym_find_key_handling_rule(KSym kSym) { gint i; for (i = 0; keyHandlingRules[i].kSymLower != 0; i++) { - if ((keyHandlingRules[i].kSymLower <= kSym) && - (kSym <= keyHandlingRules[i].kSymUpper)) { + if ((keyHandlingRules[i].kSymLower <= kSym) && (kSym <= keyHandlingRules[i].kSymUpper)) { return &(keyHandlingRules[i]); } } return &(keyHandlingRules[i]); } -#define handle_key(kSym, unmaskedMod) \ - (self_key_sym_find_key_handling_rule(kSym)) \ - ->keyFunc(self, kSym, unmaskedMod) +#define handle_key(kSym, unmaskedMod) \ + (self_key_sym_find_key_handling_rule(kSym))->keyFunc(self, kSym, unmaskedMod) -#define process_key_debug(prompt) \ - IBUS_CHEWING_LOG(DEBUG, \ - "ibus_chewing_pre_edit_process_key(): %s flags=%x " \ - "buff_check=%d bpmf_check=%d cursor=%d total_choice=%d " \ - "is_chinese=%d is_full_shape=%d", \ - prompt, self->flags, chewing_buffer_Check(self->context), \ - bpmf_check, cursor_current, total_choice, is_chinese, \ - is_full_shape) +#define process_key_debug(prompt) \ + IBUS_CHEWING_LOG(DEBUG, \ + "ibus_chewing_pre_edit_process_key(): %s flags=%x " \ + "buff_check=%d bpmf_check=%d cursor=%d total_choice=%d " \ + "is_chinese=%d is_full_shape=%d", \ + prompt, self->flags, chewing_buffer_Check(self->context), bpmf_check, \ + cursor_current, total_choice, is_chinese, is_full_shape) -gboolean is_shift_key(KSym kSym) { - return kSym == IBUS_KEY_Shift_L || kSym == IBUS_KEY_Shift_R; -} +gboolean is_shift_key(KSym kSym) { return kSym == IBUS_KEY_Shift_L || kSym == IBUS_KEY_Shift_R; } gboolean is_shift_toggle(KSym keyLast, KSym kSym, KeyModifiers unmaskedMod) { KeyModifiers maskedMod = modifiers_mask(unmaskedMod); @@ -839,15 +769,15 @@ gboolean is_shift_toggle(KSym keyLast, KSym kSym, KeyModifiers unmaskedMod) { /* keyCode should be converted to kSym already */ gboolean ibus_chewing_pre_edit_process_key(IBusChewingPreEdit *self, KSym kSym, KeyModifiers unmaskedMod) { - IBUS_CHEWING_LOG( - INFO, "***** ibus_chewing_pre_edit_process_key(-,%x(%s),%x(%s))", kSym, - key_sym_get_name(kSym), unmaskedMod, modifiers_to_string(unmaskedMod)); + IBUS_CHEWING_LOG(INFO, "***** ibus_chewing_pre_edit_process_key(-,%x(%s),%x(%s))", kSym, + key_sym_get_name(kSym), unmaskedMod, modifiers_to_string(unmaskedMod)); process_key_debug("Before response"); /* Find corresponding rule */ EventResponse response; if (!is_full_shape && !is_chinese && + !(kSym == IBUS_KEY_space && unmaskedMod == IBUS_SHIFT_MASK) && !is_shift_toggle(self->keyLast, kSym, unmaskedMod)) { /* Users treat English Sub-mode as IM Disabled, * So key strokes should be passed to client directly. Github 144. @@ -861,8 +791,7 @@ gboolean ibus_chewing_pre_edit_process_key(IBusChewingPreEdit *self, KSym kSym, response = handle_key(kSym, unmaskedMod); - IBUS_CHEWING_LOG(DEBUG, "ibus_chewing_pre_edit_process_key() response=%x", - response); + IBUS_CHEWING_LOG(DEBUG, "ibus_chewing_pre_edit_process_key() response=%x", response); process_key_debug("After response"); self->keyLast = kSym; switch (response) { @@ -876,12 +805,9 @@ gboolean ibus_chewing_pre_edit_process_key(IBusChewingPreEdit *self, KSym kSym, ibus_chewing_pre_edit_update(self); - guint candidateCount = ibus_chewing_lookup_table_update( - self->iTable, self->iProperties, self->context); + guint candidateCount = ibus_chewing_lookup_table_update(self->iTable, self->context); - IBUS_CHEWING_LOG(INFO, - "ibus_chewing_pre_edit_process_key() candidateCount=%d", - candidateCount); + IBUS_CHEWING_LOG(INFO, "ibus_chewing_pre_edit_process_key() candidateCount=%d", candidateCount); if (candidateCount) { ibus_chewing_pre_edit_set_flag(self, FLAG_TABLE_SHOW); @@ -891,8 +817,7 @@ gboolean ibus_chewing_pre_edit_process_key(IBusChewingPreEdit *self, KSym kSym, return TRUE; } -KSym ibus_chewing_pre_edit_key_code_to_key_sym(IBusChewingPreEdit *self, - KSym keySym, guint keyCode, +KSym ibus_chewing_pre_edit_key_code_to_key_sym(IBusChewingPreEdit *self, KSym keySym, guint keyCode, KeyModifiers unmaskedMod) { KSym kSym = keySym; @@ -901,12 +826,12 @@ KSym ibus_chewing_pre_edit_key_code_to_key_sym(IBusChewingPreEdit *self, return kSym; } - if (!ibus_chewing_pre_edit_is_system_keyboard_layout(self)) { + IBusChewingEngine *engine = IBUS_CHEWING_ENGINE(self->engine); + if (!ibus_chewing_engine_use_system_layout(engine)) { /* Use en_US keyboard layout */ /* ibus_keymap_lookup_key_sym treats keycode >= 256 */ /* as IBUS_VoidSymbol */ - kSym = ibus_keymap_lookup_keysym(ibus_keymap_get("us"), keyCode, - unmaskedMod); + kSym = ibus_keymap_lookup_keysym(ibus_keymap_get("us"), keyCode, unmaskedMod); if (kSym == IBUS_VoidSymbol) { /* Restore key_sym */ kSym = keySym; diff --git a/src/IBusChewingPreEdit.h b/src/IBusChewingPreEdit.h index 795f5f9..e582c7c 100644 --- a/src/IBusChewingPreEdit.h +++ b/src/IBusChewingPreEdit.h @@ -37,9 +37,7 @@ #ifndef _IBUS_CHEWING_PRE_EDIT_H_ #define _IBUS_CHEWING_PRE_EDIT_H_ #include "IBusChewingLookupTable.h" -#include "IBusChewingProperties.h" #include "IBusChewingUtil.h" -#include "MakerDialogBackend.h" #include #include #include @@ -76,7 +74,7 @@ typedef enum { * An IBusChewingPreEdit. */ typedef struct { - IBusChewingProperties *iProperties; + // IBusChewingProperties *iProperties; /*< public > */ ChewingContext *context; GString *preEdit; @@ -90,80 +88,10 @@ typedef struct { IBusEngine *engine; } IBusChewingPreEdit; -IBusChewingPreEdit *ibus_chewing_pre_edit_new(MkdgBackend *backend); +IBusChewingPreEdit *ibus_chewing_pre_edit_new(); void ibus_chewing_pre_edit_free(IBusChewingPreEdit *self); -#define ibus_chewing_pre_edit_get_property(self, propertyKey) \ - mkdg_properties_find_by_key(self->iProperties->properties, propertyKey) - -#define ibus_chewing_pre_edit_get_property_boolean(self, propertyKey) \ - mkdg_properties_get_boolean_by_key(self->iProperties->properties, \ - propertyKey) - -#define ibus_chewing_pre_edit_get_property_int(self, propertyKey) \ - mkdg_properties_get_int_by_key(self->iProperties->properties, propertyKey) - -#define ibus_chewing_pre_edit_get_property_string(self, propertyKey) \ - mkdg_properties_get_string_by_key(self->iProperties->properties, \ - propertyKey) - -#define ibus_chewing_pre_edit_set_property_boolean(self, propertyKey, \ - boolValue) \ - mkdg_properties_set_boolean_by_key(self->iProperties->properties, \ - propertyKey, boolValue) - -#define ibus_chewing_pre_edit_set_property_int(self, propertyKey, intValue) \ - mkdg_properties_set_int_by_key(self->iProperties->properties, propertyKey, \ - intValue) - -#define ibus_chewing_pre_edit_set_property_string(self, propertyKey, strValue) \ - mkdg_properties_set_string_by_key(self->iProperties->properties, \ - propertyKey, strValue) - -#define ibus_chewing_pre_edit_is_system_keyboard_layout(self) \ - ibus_chewing_properties_read_boolean_general( \ - self->iProperties, "ibus/general", "use-system-keyboard-layout", NULL) - -#define ibus_chewing_pre_edit_is_vertical_table(self) \ - mkdg_properties_get_boolean_by_key(self->iProperties->properties, \ - "vertical-lookup-table") - -#define ibus_chewing_pre_edit_apply_property(self, propertyKey) \ - mkdg_properties_apply_by_key(self->iProperties->properties, propertyKey, \ - NULL) - -#define ibus_chewing_pre_edit_save_property_boolean(self, propertyKey, \ - boolValue) \ - mkdg_properties_save_boolean_by_key(self->iProperties->properties, \ - propertyKey, boolValue, NULL) - -#define ibus_chewing_pre_edit_save_property_int(self, propertyKey, intValue) \ - mkdg_properties_save_int_by_key(self->iProperties->properties, \ - propertyKey, intValue, NULL) - -#define ibus_chewing_pre_edit_save_property_string(self, propertyKey, \ - strValue) \ - mkdg_properties_save_string_by_key(self->iProperties->properties, \ - propertyKey, strValue, NULL) - -#define ibus_chewing_pre_edit_set_apply_property_boolean(self, propertyKey, \ - boolValue) \ - ibus_chewing_pre_edit_set_property_boolean(self, propertyKey, boolValue); \ - ibus_chewing_pre_edit_apply_property(self, propertyKey) - -#define ibus_chewing_pre_edit_set_apply_property_int(self, propertyKey, \ - intValue) \ - ibus_chewing_pre_edit_set_property_int(self, propertyKey, intValue); \ - ibus_chewing_pre_edit_apply_property(self, propertyKey) - -#define ibus_chewing_pre_edit_set_apply_property_string(self, propertyKey, \ - stringValue) \ - ibus_chewing_pre_edit_set_property_string(self, propertyKey, stringValue); \ - ibus_chewing_pre_edit_apply_property(self, propertyKey) - -void ibus_chewing_pre_edit_use_all_configure(IBusChewingPreEdit *self); - guint ibus_chewing_pre_edit_length(IBusChewingPreEdit *self); guint ibus_chewing_pre_edit_word_length(IBusChewingPreEdit *self); diff --git a/src/IBusChewingProperties.c b/src/IBusChewingProperties.c deleted file mode 100644 index d96c25b..0000000 --- a/src/IBusChewingProperties.c +++ /dev/null @@ -1,236 +0,0 @@ -#include "IBusChewingProperties.h" -#include "GSettingsBackend.h" -#include "IBusChewingUtil.h" -#include "MakerDialogProperty.h" -#include "MakerDialogUtil.h" -#include -#include - -#define PAGE_EDITING N_("Editing") -#define PAGE_SELECTING N_("Selecting") -#define PAGE_KEYBOARD N_("Keyboard") - -const gchar *kbType_ids[] = {N_("default"), - N_("hsu"), - N_("ibm"), - N_("gin_yieh"), - N_("eten"), - N_("eten26"), - N_("dvorak"), - N_("dvorak_hsu"), - N_("dachen_26"), - N_("hanyu"), - N_("thl_pinying"), - N_("mps2_pinyin"), - N_("carpalx"), - N_("colemak_dh_ansi"), - N_("colemak_dh_orth"), - N_("workman"), - NULL}; - -#define SELKEYS_ARRAY_SIZE 8 - -// clang-format off -const gchar *selKeys_array[SELKEYS_ARRAY_SIZE + 1] = { - "1234567890", - "asdfghjkl;", - "asdfzxcv89", - "asdfjkl789", - "aoeu;qjkix", /* Dvorak */ - "aoeuhtnsid", /* Dvorak */ - "aoeuidhtns", /* Dvorak */ - "1234qweras", - NULL -}; -// clang-format on - -const gchar *propDefaultEnglishLettercase_array[] = { - N_("no default"), N_("lowercase"), N_("uppercase"), NULL}; - -const gchar *syncCapsLock_strs[] = {NC_("Sync", "disable"), - NC_("Sync", "keyboard"), - NC_("Sync", "input method"), NULL}; - -const gchar *outputCharsets[] = {N_("Auto"), N_("Big5"), N_("UTF8"), NULL}; - -const gchar *chiEngToggle[] = {N_("caps_lock"), N_("shift"), N_("shift_l"), - N_("shift_r"), NULL}; - -MkdgPropertySpec propSpecs[] = { - {G_TYPE_STRING, "kb-type", PAGE_KEYBOARD, N_("Keyboard Type"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "default", kbType_ids, NULL, 0, 0, - KBType_apply_callback, - MKDG_PROPERTY_FLAG_NO_NEW | MKDG_PROPERTY_FLAG_HAS_TRANSLATION, - N_("Select Zhuyin keyboard layout"), NULL}, - {G_TYPE_STRING, "sel-keys", PAGE_KEYBOARD, N_("Selection keys"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "1234567890", selKeys_array, NULL, 0, - 0, selKeys_apply_callback, MKDG_PROPERTY_FLAG_NO_NEW, - N_("Keys used to select candidate. For example \"asdfghjkl;\", press 'a' " - "to select the 1st candidate, 's' for 2nd, and so on."), - NULL}, - /*== The callback will be handled in IBusChewingEngine.gob ==*/ - {G_TYPE_BOOLEAN, "show-systray", PAGE_KEYBOARD, N_("Show systray icons"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "0", NULL, NULL, 0, 1, NULL, 0, - N_("On: Show Chinese/English and Full/Half shape status as a systray " - "icon\n" - "Off: Do not show the status icon"), - NULL}, - {G_TYPE_BOOLEAN, "auto-shift-cur", PAGE_EDITING, N_("Auto move cursor"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "1", NULL, NULL, 0, 1, - autoShiftCur_apply_callback, 0, - N_("Automatically move the cursor to the next character after selection"), - NULL}, - {G_TYPE_BOOLEAN, "add-phrase-direction", PAGE_EDITING, - N_("Add phrase before the cursor"), IBUS_CHEWING_PROPERTIES_SUBSECTION, - "1", NULL, NULL, 0, 1, addPhraseDirection_apply_callback, 0, - N_("Use Ctrl + Numbers (2-9) to add new phrase before the cursor"), NULL}, - {G_TYPE_BOOLEAN, "clean-buffer-focus-out", PAGE_EDITING, - N_("Clean pre-edit buffer when focus out"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "1", NULL, NULL, 0, 1, - cleanBufferFocusOut_apply_callback, 0, - N_("On: Clean pre-edit buffer when focus out to prevent program crash\n" - "Off: Keep what you already type for convenience"), - NULL}, - {G_TYPE_BOOLEAN, "easy-symbol-input", PAGE_EDITING, N_("Easy symbol input"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "1", NULL, NULL, 0, 1, - easySymbolInput_apply_callback, 0, - N_("Press shift to input Chinese punctuation symbols"), NULL}, - {G_TYPE_BOOLEAN, "esc-clean-all-buf", PAGE_EDITING, - N_("Esc clean all buffer"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "0", NULL, - NULL, 0, 1, escCleanAllBuf_apply_callback, 0, - N_("Escape key cleans the text in pre-edit-buffer"), NULL}, - {G_TYPE_BOOLEAN, "enable-fullwidth-toggle-key", PAGE_EDITING, - N_("Enable fullwidth toggle key"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "0", - NULL, NULL, 0, 1, enable_fullwidth_toggle_key_apply_callback, 0, - N_("Escape key cleans the text in pre-edit-buffer"), NULL}, - {G_TYPE_INT, "max-chi-symbol-len", PAGE_EDITING, - N_("Maximum Chinese characters"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "20", - NULL, NULL, 0, 39, maxChiSymbolLen_apply_callback, 0, - N_("Maximum Chinese characters in pre-edit buffer, not including inputing " - "Zhuyin symbols."), - NULL}, - {G_TYPE_STRING, "chi-eng-mode-toggle", PAGE_EDITING, - N_("Chinese/Alphanumeric Mode Toggle Key"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "shift", chiEngToggle, NULL, 0, 0, - chiEngToggle_apply_callback, - MKDG_PROPERTY_FLAG_NO_NEW | MKDG_PROPERTY_FLAG_HAS_TRANSLATION, NULL, - NULL}, - {G_TYPE_STRING, "default-english-case", PAGE_EDITING, - N_("Default English letter case\n" - "(Only effective when Caps Lock is the toggle key)"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "lowercase", - propDefaultEnglishLettercase_array, NULL, 0, 1, - defaultEnglishLetterCase_apply_callback, - MKDG_PROPERTY_FLAG_NO_NEW | MKDG_PROPERTY_FLAG_HAS_TRANSLATION, - N_("no control: No default letter case. Not recommend if you use multiple " - "keyboards or synergy\n" - "lowercase: Default to lowercase, press shift for uppercase.\n" - "uppercase: Default to uppercase, press shift for lowercase."), - NULL}, - /* Sync between CapsLock and IM */ - {G_TYPE_STRING, "sync-caps-lock", PAGE_EDITING, - N_("Sync between CapsLock and IM"), IBUS_CHEWING_PROPERTIES_SUBSECTION, - "disable", syncCapsLock_strs, "Sync", 0, 1, syncCapsLock_apply_callback, - MKDG_PROPERTY_FLAG_NO_NEW | MKDG_PROPERTY_FLAG_HAS_TRANSLATION, - N_("Occasionally, the CapsLock status does not match the IM, this option " - "determines how these status be synchronized. Valid values:\n" - "\"disable\": Do nothing\n" - "\"keyboard\": IM status follows keyboard status\n" - "\"IM\": Keyboard status follows IM status"), - NULL}, - {G_TYPE_STRING, "conversion-engine", PAGE_SELECTING, - N_("Conversion engine"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "0", NULL, - NULL, 0, 1, conversion_engine_apply_callback, 0, N_(""), NULL}, - {G_TYPE_UINT, "cand-per-page", PAGE_SELECTING, N_("Candidate per page"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "10", NULL, NULL, 4, 10, - candPerPage_apply_callback, 0, N_("Number of candidate per page."), NULL}, - {G_TYPE_BOOLEAN, "show-page-number", PAGE_SELECTING, N_("Show page number"), - IBUS_CHEWING_PROPERTIES_SUBSECTION, "0", NULL, NULL, 0, 1, - showPageNumber_apply_callback, 0, - N_("Display the page number of the candidate list."), NULL}, - {G_TYPE_BOOLEAN, "phrase-choice-from-last", PAGE_SELECTING, - N_("Choose phrases from backward"), IBUS_CHEWING_PROPERTIES_SUBSECTION, - "1", NULL, NULL, 0, 1, phraseChoiceRearward_apply_callback, 0, - N_("Open candidate list from the back of a phrase, without moving the " - "cursor to the front."), - NULL}, - {G_TYPE_BOOLEAN, "space-as-selection", PAGE_SELECTING, - N_("Space to select"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "1", NULL, NULL, - 0, 1, spaceAsSelection_apply_callback, 0, - "Press Space to select the candidate.", NULL}, - {G_TYPE_BOOLEAN, "vertical-lookup-table", PAGE_SELECTING, - N_("Vertical Lookup Table"), IBUS_CHEWING_PROPERTIES_SUBSECTION, "1", NULL, - NULL, 0, 1, verticalLookupTable_apply_callback, 0, - "Use vertical lookup table.", NULL}, - {G_TYPE_INVALID, "", "", "", IBUS_CHEWING_PROPERTIES_SUBSECTION, "", NULL, - NULL, 0, 0, NULL, 0, NULL, NULL}, -}; - -/*============================================ - * Class methods - */ - -IBusChewingProperties *ibus_chewing_properties_new(MkdgBackend *backend, - gpointer parent, - gpointer auxData) { - IBusChewingProperties *self = g_new0(IBusChewingProperties, 1); - - self->properties = - mkdg_properties_from_spec_array(propSpecs, backend, parent, auxData); - - /* In schema generation, backend is NULL */ - self->confObjTable = g_hash_table_new(g_str_hash, g_str_equal); - return self; -} - -static GString *ibus_section_to_schema(const gchar *section) { - GString *result = g_string_new("org.freedesktop"); - gchar **strArr = g_strsplit(section, "/", -1); - gint i; - - for (i = 0; strArr[i] != NULL; i++) { - g_string_append_printf(result, ".%s", strArr[i]); - } - g_strfreev(strArr); - return result; -} - -GValue *ibus_chewing_properties_read_general(IBusChewingProperties *self, - GValue *value, - const gchar *section, - const gchar *key, - gpointer userData) { - g_assert(self); - g_assert(value); - if (STRING_EQUALS(self->properties->backend->id, GSETTINGS_BACKEND_ID)) { - GSettings *confObj; - - if (!g_hash_table_contains(self->confObjTable, (gpointer)section)) { - GString *schemaIdStr = ibus_section_to_schema(section); - - confObj = g_settings_new(schemaIdStr->str); - g_hash_table_insert(self->confObjTable, (gpointer)section, - (gpointer)confObj); - g_string_free(schemaIdStr, TRUE); - } else { - confObj = (GSettings *)g_hash_table_lookup(self->confObjTable, - (gconstpointer)section); - } - g_assert(confObj); - return mkdg_g_settings_read_value(confObj, value, key); - } - return mkdg_backend_read(self->properties->backend, value, section, key, - userData); -} - -gboolean ibus_chewing_properties_read_boolean_general( - IBusChewingProperties *self, const gchar *section, const gchar *key, - gpointer userData) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_BOOLEAN); - ibus_chewing_properties_read_general(self, &gValue, section, key, userData); - gboolean result = g_value_get_boolean(&gValue); - - g_value_unset(&gValue); - return result; -} diff --git a/src/IBusChewingProperties.h b/src/IBusChewingProperties.h deleted file mode 100644 index 3f39bda..0000000 --- a/src/IBusChewingProperties.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef _IBUS_CHEWING_PROPERTIES_H_ -#define _IBUS_CHEWING_PROPERTIES_H_ -#include "MakerDialogBackend.h" -#include "MakerDialogProperty.h" -#include "MakerDialogPropertySpec.h" -#include -#include - -typedef struct { - MkdgProperties *properties; - GHashTable *confObjTable; -} IBusChewingProperties; - -/* GConf/dconf section under PROJECT_SCHEMA_BASE */ -#define IBUS_CHEWING_PROPERTIES_SUBSECTION QUOTE_ME(PROJECT_SCHEMA_SECTION) - -IBusChewingProperties *ibus_chewing_properties_new(MkdgBackend *backend, - gpointer parent, - gpointer auxData); - -GValue *ibus_chewing_properties_read_general(IBusChewingProperties *self, - GValue *value, - const gchar *section, - const gchar *key, - gpointer userData); - -gboolean ibus_chewing_properties_read_boolean_general( - IBusChewingProperties *self, const gchar *section, const gchar *key, - gpointer userData); - -/*============================================ - * Callback functions - */ -gboolean KBType_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean selKeys_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean showSystray_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean autoShiftCur_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean addPhraseDirection_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean cleanBufferFocusOut_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean easySymbolInput_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean escCleanAllBuf_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean enable_fullwidth_toggle_key_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean maxChiSymbolLen_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean forceLowercaseEnglish_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean syncCapsLock_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean candPerPage_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean phraseChoiceRearward_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean showPageNumber_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean spaceAsSelection_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean defaultEnglishLetterCase_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean plainZhuyin_apply_callback(PropertyContext *ctx, gpointer userData); - -gboolean conversion_engine_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean verticalLookupTable_apply_callback(PropertyContext *ctx, - gpointer userData); - -gboolean chiEngToggle_apply_callback(PropertyContext *ctx, gpointer userData); - -extern MkdgPropertySpec propSpecs[]; - -extern const gchar *kbType_ids[]; - -extern const gchar *selKeys_array[]; - -extern const gchar *syncCapsLock_strs[]; - -extern const gchar *outputCharsets[]; - -#endif /* _IBUS_CHEWING_PROPERTIES_H_ */ diff --git a/src/MakerDialogBackend.c b/src/MakerDialogBackend.c deleted file mode 100644 index 7947c79..0000000 --- a/src/MakerDialogBackend.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "MakerDialogBackend.h" -#include "MakerDialogUtil.h" - -MkdgBackend *mkdg_backend_new(const gchar *id, gpointer config, - const gchar *basePath, gpointer auxData) { - g_assert(config); - g_assert(!STRING_IS_EMPTY(id)); - MkdgBackend *result = g_new0(MkdgBackend, 1); - - result->id = id; - result->config = config; - result->basePath = basePath; - result->auxData = auxData; - result->flags = 0; - return result; -} - -gchar *mkdg_backend_get_key(MkdgBackend *backend, const gchar *section, - const gchar *key, gpointer userData) { - return backend->getKeyFunc(backend, section, key, userData); -} - -GValue *mkdg_backend_read(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData) { - return backend->readFunc(backend, value, section, key, userData); -} - -gboolean mkdg_backend_write(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData) { - return backend->writeFunc(backend, value, section, key, userData); -} diff --git a/src/MakerDialogBackend.h b/src/MakerDialogBackend.h deleted file mode 100644 index 8d12d91..0000000 --- a/src/MakerDialogBackend.h +++ /dev/null @@ -1,98 +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:MakerDialogBackend - * @short_description: An interface to configuration service - * @title: MakerDialog Backend - * @stability: Stable - * @include: MakerDailogBackend.h - * - * A MakerDialog backend provides an interface to configuration service like - * GConf2 or dconf - */ -#ifndef _MAKER_DIALOG_BACKEND_H_ -#define _MAKER_DIALOG_BACKEND_H_ -#include -#include - -typedef struct MkdgBackend_ MkdgBackend; - -/** - * MkdgBackendFlag: - * @MKDG_BACKEND_FLAG_DISCONNECTED: Disconnect from backend, so the backend - * works without connect to real service. - * - * MakerDialog backend flags. - * - */ -typedef enum { MKDG_BACKEND_FLAG_DISCONNECTED = 1 } MkdgBackendFlag; - -typedef gchar *(*BackendGetKeyFunc)(MkdgBackend *backend, const gchar *section, - const gchar *key, gpointer userData); - -typedef GValue *(*BackendReadFunc)(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData); - -typedef gboolean (*BackendWriteFunc)(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData); - -/** - * MkdgBackend: - * @id: A string that identify the backend. - * @config: A configuration service - * @basePath: All keys and sub-sections of this project should be put under this - * path (with trailing '/') - * @readFunc: Callback function for load - * @writeFunc: Callback function for save - * @auxData: Auxiliary data that might be useful. - * - * A MkdgBackend object. - */ -struct MkdgBackend_ { - const gchar *id; - gpointer config; - const gchar *basePath; - BackendGetKeyFunc getKeyFunc; - BackendReadFunc readFunc; - BackendWriteFunc writeFunc; - MkdgBackendFlag flags; - gpointer auxData; -}; - -MkdgBackend *mkdg_backend_new(const gchar *id, gpointer config, - const gchar *basePath, gpointer auxData); - -gchar *mkdg_backend_get_key(MkdgBackend *backend, const gchar *section, - const gchar *key, gpointer userData); - -GValue *mkdg_backend_read(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData); - -gboolean mkdg_backend_write(MkdgBackend *backend, GValue *value, - const gchar *section, const gchar *key, - gpointer userData); - -#endif /* _MAKER_DIALOG_BACKEND_H_ */ diff --git a/src/MakerDialogProperty.c b/src/MakerDialogProperty.c deleted file mode 100644 index d54af97..0000000 --- a/src/MakerDialogProperty.c +++ /dev/null @@ -1,386 +0,0 @@ -#include "MakerDialogProperty.h" -#include "MakerDialogUtil.h" -#include -#include - -/*============================================ - * PropertyContext Methods - */ - -static gboolean property_context_from_string(PropertyContext *ctx, - const gchar *str) { - if (ctx == NULL) { - return FALSE; - } - return mkdg_g_value_from_string(&(ctx->value), str); -} - -void property_context_default(PropertyContext *ctx) { - mkdg_log(DEBUG, "property_context_default(%s)", ctx->spec->key); - gboolean ret = property_context_from_string(ctx, ctx->spec->defaultValue); - - if (!ret) { - mkdg_log(WARN, - "property_context_default(%s): failed to convert string %s, " - "return NULL", - ctx->spec->key, ctx->spec->defaultValue); - } -} - -PropertyContext *property_context_new(MkdgPropertySpec *spec, - MkdgBackend *backend, gpointer parent, - gpointer auxData) { - if (spec == NULL) { - return NULL; - } - mkdg_log(INFO, "property_context_new(%s,-,-,-)", spec->key); - PropertyContext *ctx = g_new0(PropertyContext, 1); - - ctx->spec = spec; - ctx->backend = backend; - ctx->parent = parent; - ctx->auxData = auxData; - g_value_init(&(ctx->value), ctx->spec->valueType); - if (ctx->backend != NULL) { - GValue *value = property_context_read(ctx, NULL); - - if (value == NULL) { - property_context_default(ctx); - } - } else { - property_context_default(ctx); - } - mkdg_log(DEBUG, "property_context_new(%s):Done", ctx->spec->key); - return ctx; -} - -/* read: backend -> Context */ -/* write: Context -> backend */ -/* get: Context -> GValue */ -/* set: GValue -> Context */ -/* load: read then get, errors in read are ignored */ -/* save: set then write */ -/* apply: Context -> apply callback */ -/* use: load then apply */ -/* assign: save then apply */ -GValue *property_context_read(PropertyContext *ctx, gpointer userData) { - if (ctx == NULL) { - return NULL; - } - mkdg_log(DEBUG, "property_context_read(%s,-)", ctx->spec->key); - if (mkdg_has_flag(ctx->spec->propertyFlags, - MKDG_PROPERTY_FLAG_NO_BACKEND)) { - return NULL; - } - if (ctx->backend == NULL) { - return NULL; - } - GValue *result = - mkdg_backend_read(ctx->backend, &(ctx->value), ctx->spec->subSection, - ctx->spec->key, userData); - - if (result == NULL) { - mkdg_log(WARN, "property_context_read(%s): failed to read key", - ctx->spec->key); - } - return result; -} - -gboolean property_context_write(PropertyContext *ctx, gpointer userData) { - if (ctx == NULL) { - return FALSE; - } - mkdg_log(DEBUG, "property_context_read(%s,-)", ctx->spec->key); - if (mkdg_has_flag(ctx->spec->propertyFlags, - MKDG_PROPERTY_FLAG_NO_BACKEND)) { - return FALSE; - } - if (ctx->backend == NULL) { - return FALSE; - } - return ctx->backend->writeFunc(ctx->backend, &(ctx->value), - ctx->spec->subSection, ctx->spec->key, - userData); -} - -GValue *property_context_get(PropertyContext *ctx) { - if (ctx == NULL) { - mkdg_log(WARN, "property_context_get(-): ctx is NULL"); - return NULL; - } - mkdg_log(DEBUG, "property_context_get(%s): value=%s", ctx->spec->key, - mkdg_g_value_to_string(&(ctx->value))); - return &(ctx->value); -} - -gboolean property_context_set(PropertyContext *ctx, GValue *value) { - if (ctx == NULL) { - mkdg_log(WARN, "property_context_set(-): ctx is NULL"); - return FALSE; - } - if (!G_IS_VALUE(value)) { - mkdg_log(WARN, "property_context_set(%s): value is not GValue", - ctx->spec->key); - return FALSE; - } - mkdg_log(DEBUG, "property_context_set(%s,%s)", ctx->spec->key, - mkdg_g_value_to_string(value)); - g_value_copy(value, &(ctx->value)); - return TRUE; -} - -GValue *property_context_load(PropertyContext *ctx, gpointer userData) { - mkdg_log(DEBUG, "property_context_load(%s,-)", ctx->spec->key); - property_context_read(ctx, userData); - return property_context_get(ctx); -} - -gboolean property_context_save(PropertyContext *ctx, GValue *value, - gpointer userData) { - mkdg_log(DEBUG, "property_context_save(%s,-)", ctx->spec->key); - if (!property_context_set(ctx, value)) { - return FALSE; - } - return property_context_write(ctx, userData); -} - -gboolean property_context_apply(PropertyContext *ctx, gpointer userData) { - if (ctx == NULL || ctx->parent == NULL) { - mkdg_log( - WARN, - "property_context_apply(%s): either ctx or ctx->parent is NULL", - ctx->spec->key); - return FALSE; - } - if (ctx->spec->applyFunc == NULL) { - mkdg_log(DEBUG, "property_context_apply(%s,-): No apply function, skip", - ctx->spec->key); - return TRUE; - } - mkdg_log(DEBUG, "property_context_apply(%s,-): value %s", ctx->spec->key, - mkdg_g_value_to_string(&(ctx->value))); - return ctx->spec->applyFunc(ctx, userData); -} - -gboolean property_context_use(PropertyContext *ctx, gpointer userData) { - mkdg_log(DEBUG, "property_context_use(%s,-)", ctx->spec->key); - GValue *ret = property_context_load(ctx, userData); - - if (ret == NULL) { - mkdg_log(WARN, - "property_context_use(%s): property_context_load return NULL", - ctx->spec->key); - return FALSE; - } - return property_context_apply(ctx, userData); -} - -void property_context_free(PropertyContext *ctx) { - mkdg_log(INFO, "property_context_free(%s,-)", ctx->spec->key); - g_value_unset(&(ctx->value)); - g_free(ctx); -} - -/*============================================ - * MkdgProperties Methods - */ - -/* This alone is sufficient to generate schemas */ -MkdgProperties *mkdg_properties_from_spec_array(MkdgPropertySpec specs[], - MkdgBackend *backend, - gpointer parent, - gpointer auxData) { - gsize arraySize = 0; - gsize i; - - for (i = 0; specs[i].valueType != G_TYPE_INVALID; i++) { - arraySize++; - } - MkdgProperties *result = g_new0(MkdgProperties, 1); - - result->backend = backend; - result->contexts = g_ptr_array_sized_new(arraySize); - result->auxData = auxData; - for (i = 0; i < arraySize; i++) { - PropertyContext *ctx = - property_context_new(&specs[i], backend, parent, auxData); - - g_ptr_array_add(result->contexts, (gpointer)ctx); - } - return result; -} - -PropertyContext *mkdg_properties_find_by_key(MkdgProperties *properties, - const gchar *key) { - gsize i; - - for (i = 0; i < mkdg_properties_size(properties); i++) { - PropertyContext *ctx = mkdg_properties_index(properties, i); - - if (STRING_EQUALS(ctx->spec->key, key)) { - return ctx; - } - } - return NULL; -} - -PropertyContext *mkdg_properties_index(MkdgProperties *properties, - guint index) { - return (PropertyContext *)g_ptr_array_index(properties->contexts, index); -} - -GValue *mkdg_properties_get_by_key(MkdgProperties *properties, - const gchar *key) { - if (properties == NULL) { - return NULL; - } - PropertyContext *ctx = mkdg_properties_find_by_key(properties, key); - - return property_context_get(ctx); -} - -gboolean mkdg_properties_set_by_key(MkdgProperties *properties, - const gchar *key, GValue *value) { - if (properties == NULL) { - return FALSE; - } - PropertyContext *ctx = mkdg_properties_find_by_key(properties, key); - - return property_context_set(ctx, value); -} - -gboolean mkdg_properties_set_boolean_by_key(MkdgProperties *properties, - const gchar *key, - gboolean boolValue) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_BOOLEAN); - g_value_set_boolean(&gValue, boolValue); - gboolean result = mkdg_properties_set_by_key(properties, key, &gValue); - - g_value_unset(&gValue); - return result; -} - -gboolean mkdg_properties_set_int_by_key(MkdgProperties *properties, - const gchar *key, gint intValue) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_INT); - g_value_set_int(&gValue, intValue); - gboolean result = mkdg_properties_set_by_key(properties, key, &gValue); - - g_value_unset(&gValue); - return result; -} - -gboolean mkdg_properties_set_string_by_key(MkdgProperties *properties, - const gchar *key, - const gchar *stringValue) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_STRING); - g_value_set_string(&gValue, stringValue); - gboolean result = mkdg_properties_set_by_key(properties, key, &gValue); - - g_value_unset(&gValue); - return result; -} - -GValue *mkdg_properties_load_by_key(MkdgProperties *properties, - const gchar *key, gpointer userData) { - if (properties == NULL) { - return NULL; - } - PropertyContext *ctx = mkdg_properties_find_by_key(properties, key); - - return property_context_load(ctx, userData); -} - -gboolean mkdg_properties_save_by_key(MkdgProperties *properties, - const gchar *key, GValue *value, - gpointer userData) { - if (properties == NULL) { - return FALSE; - } - PropertyContext *ctx = mkdg_properties_find_by_key(properties, key); - - return property_context_save(ctx, value, userData); -} - -gboolean mkdg_properties_save_boolean_by_key(MkdgProperties *properties, - const gchar *key, - gboolean boolValue, - gpointer userData) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_BOOLEAN); - g_value_set_boolean(&gValue, boolValue); - gboolean result = - mkdg_properties_save_by_key(properties, key, &gValue, userData); - g_value_unset(&gValue); - return result; -} - -gboolean mkdg_properties_save_int_by_key(MkdgProperties *properties, - const gchar *key, gint intValue, - gpointer userData) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_INT); - g_value_set_int(&gValue, intValue); - gboolean result = - mkdg_properties_save_by_key(properties, key, &gValue, userData); - g_value_unset(&gValue); - return result; -} - -gboolean mkdg_properties_save_string_by_key(MkdgProperties *properties, - const gchar *key, - const gchar *stringValue, - gpointer userData) { - GValue gValue = {0}; - g_value_init(&gValue, G_TYPE_STRING); - g_value_set_string(&gValue, stringValue); - gboolean result = - mkdg_properties_save_by_key(properties, key, &gValue, userData); - g_value_unset(&gValue); - return result; -} - -gboolean mkdg_properties_apply_by_key(MkdgProperties *properties, - const gchar *key, gpointer userData) { - if (properties == NULL) { - return FALSE; - } - PropertyContext *ctx = mkdg_properties_find_by_key(properties, key); - - return property_context_apply(ctx, userData); -} - -gsize mkdg_properties_size(MkdgProperties *properties) { - return properties->contexts->len; -} - -gboolean mkdg_properties_use_all(MkdgProperties *properties, - gpointer userData) { - gsize i; - gboolean result = TRUE; - - for (i = 0; i < mkdg_properties_size(properties); i++) { - PropertyContext *ctx = mkdg_properties_index(properties, i); - gboolean ret = property_context_use(ctx, userData); - - if (!ret) { - result = FALSE; - } - } - return result; -} - -void mkdg_properties_free(MkdgProperties *properties) { - gsize i; - - for (i = 0; i < mkdg_properties_size(properties); i++) { - PropertyContext *ctx = mkdg_properties_index(properties, i); - - property_context_free(ctx); - } - g_ptr_array_free(properties->contexts, TRUE); - g_free(properties); -} diff --git a/src/MakerDialogProperty.h b/src/MakerDialogProperty.h deleted file mode 100644 index fb9cbaa..0000000 --- a/src/MakerDialogProperty.h +++ /dev/null @@ -1,180 +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:MakerDialogProperty - * @short_description: A property stores a value for a configuration - * @title: MakerDialog Property - * @stability: Stable - * @include: MakerDailogProperty.h - * - * A MakerDialog property stores a value for a configuration options. - */ - -#ifndef _MAKER_DIALOG_PROPERTY_H_ -#define _MAKER_DIALOG_PROPERTY_H_ -#include "MakerDialogBackend.h" -#include "MakerDialogPropertySpec.h" -#include "MakerDialogUtil.h" -#include -#include - -struct _PropertyContext { - MkdgPropertySpec *spec; - GValue value; // Context - * @write: Context -> backend - * @get: Context -> GValue - * @set: GValue -> Context - * @load: read then get, errors in read are ignored - * @save: set then write - * @apply: Context -> apply callback - * @use: load then apply - * @assign: save then apply - */ - -/** - * property_context_new: - * @spec: The MkdgPropertySpec it use - * @backend: Backend to be use to store the property - * @parent: The object that contain this property - * @auxData: Other data that may be store with the property - * - * This subroutine create a new PropertyContext. - * It also read the value from backend, if backend is not available. - */ -PropertyContext *property_context_new(MkdgPropertySpec *spec, - MkdgBackend *backend, gpointer parent, - gpointer auxData); - -/** - * property_context_default: - * @ctx: PropertyContex - * - * Set the PropertyContext with default value. - */ -void property_context_default(PropertyContext *ctx); - -GValue *property_context_read(PropertyContext *ctx, gpointer userData); - -gboolean property_context_write(PropertyContext *ctx, gpointer userData); - -GValue *property_context_get(PropertyContext *ctx); - -gboolean property_context_set(PropertyContext *ctx, GValue *value); - -GValue *property_context_load(PropertyContext *ctx, gpointer userData); - -gboolean property_context_save(PropertyContext *ctx, GValue *value, - gpointer userData); - -gboolean property_context_apply(PropertyContext *ctx, gpointer userData); - -gboolean property_context_use(PropertyContext *ctx, gpointer userData); - -void property_context_free(PropertyContext *ctx); - -MkdgProperties *mkdg_properties_from_spec_array(MkdgPropertySpec specs[], - MkdgBackend *backend, - gpointer parent, - gpointer auxData); - -PropertyContext *mkdg_properties_find_by_key(MkdgProperties *properties, - const gchar *key); - -PropertyContext *mkdg_properties_index(MkdgProperties *array, guint index); - -PropertyContext *mkdg_properties_index(MkdgProperties *array, guint index); - -GValue *mkdg_properties_get_by_key(MkdgProperties *properties, - const gchar *key); - -#define mkdg_properties_get_boolean_by_key(properties, key) \ - g_value_get_boolean(mkdg_properties_get_by_key(properties, key)) - -#define mkdg_properties_get_int_by_key(properties, key) \ - g_value_get_int(mkdg_properties_get_by_key(properties, key)) - -#define mkdg_properties_get_uint_by_key(properties, key) \ - g_value_get_uint(mkdg_properties_get_by_key(properties, key)) - -#define mkdg_properties_get_string_by_key(properties, key) \ - g_value_get_string(mkdg_properties_get_by_key(properties, key)) - -gboolean mkdg_properties_set_by_key(MkdgProperties *properties, - const gchar *key, GValue *value); - -gboolean mkdg_properties_set_boolean_by_key(MkdgProperties *properties, - const gchar *key, - gboolean boolValue); - -gboolean mkdg_properties_set_int_by_key(MkdgProperties *properties, - const gchar *key, gint intValue); - -gboolean mkdg_properties_set_string_by_key(MkdgProperties *properties, - const gchar *key, - const gchar *stringValue); - -GValue *mkdg_properties_load_by_key(MkdgProperties *properties, - const gchar *key, gpointer userData); - -gboolean mkdg_properties_save_by_key(MkdgProperties *properties, - const gchar *key, GValue *value, - gpointer userData); - -gboolean mkdg_properties_save_boolean_by_key(MkdgProperties *properties, - const gchar *key, - gboolean boolValue, - gpointer userData); - -gboolean mkdg_properties_save_int_by_key(MkdgProperties *properties, - const gchar *key, gint intValue, - gpointer userData); - -gboolean mkdg_properties_save_string_by_key(MkdgProperties *properties, - const gchar *key, - const gchar *stringValue, - gpointer userData); - -gboolean mkdg_properties_apply_by_key(MkdgProperties *properties, - const gchar *key, gpointer userData); - -gsize mkdg_properties_size(MkdgProperties *properties); - -gboolean mkdg_properties_use_all(MkdgProperties *properties, gpointer userData); - -void mkdg_properties_free(MkdgProperties *properties); -#endif diff --git a/src/MakerDialogPropertySpec.h b/src/MakerDialogPropertySpec.h deleted file mode 100644 index 5d93cf9..0000000 --- a/src/MakerDialogPropertySpec.h +++ /dev/null @@ -1,104 +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:MakerDialogPropertySpec - * @short_description: A MakerDialog property spec defines the characteristics - * of a property. - * @title: MakerDialog Property - * @stability: Stable - * @include: MakerDailogPropertySpec.h - * - * A MakerDialog property spec defines the characteristics of a property, - * including value type, display names, default value, and valid values. - */ - -#ifndef _MAKER_DIALOG_PROPERTY_SPEC_H_ -#define _MAKER_DIALOG_PROPERTY_SPEC_H_ -#include -#include - -/** - * MkdgPropertyFlags: - * @MKDG_PROPERTY_FLAG_INVISIBLE: The property is not visible in UI. - * @MKDG_PROPERTY_FLAG_INSENSITIVE: The property is gray-out and not - * editable. - * @MKDG_PROPERTY_FLAG_NO_NEW: The property does not accept new values. - * @MKDG_PROPERTY_FLAG_HAS_TRANSLATION: The property should show translated - * value. - * @MKDG_PROPERTY_FLAG_NO_BACKEND: The property has no backend, thus will - * not be saved. - * - * MakerDialog flag controls how the property displayed in UI. - */ -typedef enum { - MKDG_PROPERTY_FLAG_INVISIBLE = 1, - MKDG_PROPERTY_FLAG_INSENSITIVE = 1 << 1, - MKDG_PROPERTY_FLAG_NO_NEW = 1 << 2, - MKDG_PROPERTY_FLAG_HAS_TRANSLATION = 1 << 3, - MKDG_PROPERTY_FLAG_NO_BACKEND = 1 << 4 -} MkdgPropertyFlags; - -typedef struct _PropertyContext PropertyContext; - -typedef gboolean (*MkdgApplyFunc)(PropertyContext *ctx, gpointer userData); - -/** - * MkdgPropertySpec: - * @valueType: Type of the value. - * @key: A unique Property ID. - * @pageName: The name of the tab that contain this property (Translatable). - * @label: Label in UI (Translatable). - * @subSection: Sub-section in backend. - * @defaultValue: String represented string value. - * @validValues: NULL terminated valid values. - * @min: Minimum valid value for numeric types. - * @max: Maximum valid value for numeric types. - * @applyFunc: Callback function for apply the value. - * @propertyFlags: Property Flags. - * @tooltip: Tooltip of this property (Translatable). - * @auxData: Auxiliary data that might be needed somewhere. - * - * A Property Spec describe the characteristic of a property. - */ - -typedef struct { - GType valueType; - gchar key[30]; - gchar pageName[50]; - gchar label[200]; - gchar subSection[200]; - gchar defaultValue[100]; - const gchar **validValues; - gchar *translationContext; - - gint min; - gint max; - - MkdgApplyFunc applyFunc; - - MkdgPropertyFlags propertyFlags; - const gchar *tooltip; - gpointer auxData; -} MkdgPropertySpec; - -#endif /* _MAKER_DIALOG_PROPERTY_SPEC_H_ */ diff --git a/src/MakerDialogUtil.c b/src/MakerDialogUtil.c index 1fb47dd..40a84ea 100644 --- a/src/MakerDialogUtil.c +++ b/src/MakerDialogUtil.c @@ -55,160 +55,3 @@ void mkdg_log_domain(const gchar *domain, MkdgLogLevel level, mkdg_logv_domain(domain, level, format, argList); va_end(argList); } - -gboolean mkdg_g_value_reset(GValue *value, GType type, gboolean overwrite) { - if (!G_IS_VALUE(value)) { - g_value_init(value, type); - } - if (G_VALUE_TYPE(value) != type) { - if (!overwrite) { - mkdg_log(ERROR, "mkdg_g_value_reset(): type incompatible"); - return FALSE; - } - } - g_value_reset(value); - return TRUE; -} - -gchar *mkdg_g_value_to_string(GValue *value) { - static gchar result[MAKER_DIALOG_VALUE_LENGTH]; - - result[0] = '\0'; - GType gType = G_VALUE_TYPE(value); - guint uintValue; - gint intValue; - - switch (gType) { - case G_TYPE_BOOLEAN: - if (g_value_get_boolean(value)) { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "1"); - } else { - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "0"); - } - break; - case G_TYPE_UINT: - uintValue = g_value_get_uint(value); - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%u", uintValue); - break; - case G_TYPE_INT: - intValue = g_value_get_int(value); - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%d", intValue); - break; - case G_TYPE_STRING: - g_snprintf(result, MAKER_DIALOG_VALUE_LENGTH, "%s", - g_value_get_string(value)); - break; - default: - break; - } - return result; -} - -gboolean mkdg_g_value_from_string(GValue *value, const gchar *str) { - mkdg_log(DEBUG, "mkdg_g_value_from_string(-,%s)", str); - if (!G_IS_VALUE(value)) { - mkdg_log(ERROR, "mkdg_g_value_from_string(): Failed to get GType"); - return FALSE; - } - GType gType = G_VALUE_TYPE(value); - - mkdg_log(DEBUG, "mkdg_g_value_from_string() gType=%s", g_type_name(gType)); - if (!mkdg_g_value_reset(value, gType, FALSE)) { - return FALSE; - } - - guint uintValue; - gint intValue; - gchar *endPtr = NULL; - - switch (gType) { - case G_TYPE_BOOLEAN: - if (STRING_IS_EMPTY(str)) { - g_value_set_boolean(value, FALSE); - } else if (STRING_EQUALS(str, "0")) { - g_value_set_boolean(value, FALSE); - } else if (STRING_EQUALS(str, "F")) { - g_value_set_boolean(value, FALSE); - } else if (STRING_EQUALS(str, "f")) { - g_value_set_boolean(value, FALSE); - } else if (STRING_EQUALS(str, "FALSE")) { - g_value_set_boolean(value, FALSE); - } else if (STRING_EQUALS(str, "false")) { - g_value_set_boolean(value, FALSE); - } else { - g_value_set_boolean(value, TRUE); - } - return TRUE; - case G_TYPE_UINT: - uintValue = g_ascii_strtoull(str, &endPtr, 10); - if (uintValue == 0 && endPtr == str) { - return FALSE; - } - g_value_set_uint(value, uintValue); - return TRUE; - case G_TYPE_INT: - intValue = g_ascii_strtoll(str, &endPtr, 10); - if (intValue == 0 && endPtr == str) { - return FALSE; - } - g_value_set_int(value, intValue); - return TRUE; - case G_TYPE_STRING: - g_value_set_string(value, str); - return TRUE; - default: - break; - } - return FALSE; -} - -void mkdg_g_variant_to_g_value(GVariant *gVar, GValue *value) { - const GVariantType *gVType = g_variant_get_type(gVar); - - if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_BOOLEAN)) { - g_value_set_boolean(value, g_variant_get_boolean(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT16)) { - g_value_set_uint(value, g_variant_get_uint16(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT32)) { - g_value_set_uint(value, g_variant_get_uint32(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_UINT64)) { - g_value_set_uint64(value, g_variant_get_uint64(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT16)) { - g_value_set_int(value, g_variant_get_int16(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT32)) { - g_value_set_int(value, g_variant_get_int32(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_INT64)) { - g_value_set_int64(value, g_variant_get_int64(gVar)); - } else if (g_variant_type_is_subtype_of(gVType, G_VARIANT_TYPE_STRING)) { - g_value_set_string(value, g_variant_get_string(gVar, NULL)); - } -} - -GVariant *mkdg_g_value_to_g_variant(GValue *value) { - GType gType = G_VALUE_TYPE(value); - GVariant *gVar = NULL; - - switch (gType) { - case G_TYPE_BOOLEAN: - gVar = g_variant_new_boolean(g_value_get_boolean(value)); - break; - case G_TYPE_UINT: - gVar = g_variant_new_uint32(g_value_get_uint(value)); - break; - case G_TYPE_UINT64: - gVar = g_variant_new_uint64(g_value_get_uint(value)); - break; - case G_TYPE_INT: - gVar = g_variant_new_int32(g_value_get_int(value)); - break; - case G_TYPE_INT64: - gVar = g_variant_new_int64(g_value_get_int(value)); - break; - case G_TYPE_STRING: - gVar = g_variant_new_string(g_value_get_string(value)); - break; - default: - break; - } - return gVar; -} diff --git a/src/MakerDialogUtil.h b/src/MakerDialogUtil.h index 2f07edf..b89a4a0 100644 --- a/src/MakerDialogUtil.h +++ b/src/MakerDialogUtil.h @@ -32,10 +32,9 @@ * while definitions have Mkdg prefix. */ -#ifndef _MAKER_DIALOG_UTIL_H_ -#define _MAKER_DIALOG_UTIL_H_ -#include -#include +#pragma once + +#include #include /** @@ -53,33 +52,11 @@ typedef enum { ERROR, WARN, MSG, INFO, DEBUG } MkdgLogLevel; void mkdg_log_set_level(MkdgLogLevel level); -void mkdg_log_set_file(FILE *file); - void mkdg_log(MkdgLogLevel level, const gchar *format, ...); void mkdg_log_domain(const gchar *domain, MkdgLogLevel level, const gchar *format, ...); -gchar *mkdg_g_value_to_string(GValue *value); - -gboolean mkdg_g_value_reset(GValue *value, GType type, gboolean overwrite); - -gboolean mkdg_g_value_from_string(GValue *value, const gchar *str); - -gint mkdg_g_ptr_array_find_string(GPtrArray *array, const gchar *str); - -#define mkdg_g_value_is_boolean(value) (G_VALUE_TYPE(value) == G_TYPE_BOOLEAN) - -#define mkdg_g_value_is_int(value) (G_VALUE_TYPE(value) == G_TYPE_INT) - -#define mkdg_g_value_is_uint(value) (G_VALUE_TYPE(value) == G_TYPE_UINT) - -#define mkdg_g_value_is_string(value) (G_VALUE_TYPE(value) == G_TYPE_STRING) - -void mkdg_g_variant_to_g_value(GVariant *gVar, GValue *value); - -GVariant *mkdg_g_value_to_g_variant(GValue *value); - /************************************** * String Utility Macros and Functions */ @@ -100,5 +77,3 @@ GVariant *mkdg_g_value_to_g_variant(GValue *value); #define mkdg_clear_flag(flagSet, flag) (flagSet &= ~(flag)) #define mkdg_has_flag(flagSet, flag) ((flagSet & flag) == flag) #define mkdg_set_flag(flagSet, flag) (flagSet |= flag) -#define MAKER_DIALOG_VALUE_LENGTH 200 -#endif /* _MAKER_DIALOG_UTIL_H_ */ diff --git a/src/ibus-chewing-engine-private.h b/src/ibus-chewing-engine-private.h index d57e67e..20adc72 100644 --- a/src/ibus-chewing-engine-private.h +++ b/src/ibus-chewing-engine-private.h @@ -22,18 +22,8 @@ #pragma once -#include "GSettingsBackend.h" #include "IBusChewingPreEdit.h" -#include "IBusChewingProperties.h" -#include "IBusChewingUtil.h" -#include -#include -#include #include -#include -#include -#include -#include #include "ibus-chewing-engine.h" @@ -54,6 +44,26 @@ struct _IBusChewingEngine { EngineFlag statusFlags; IBusCapabilite capabilite; + char *prop_kb_type; + char *prop_sel_keys; + int prop_cand_per_page; + gboolean prop_vertical_lookup_table; + gboolean prop_auto_shift_cur; + gboolean prop_add_phrase_direction; + gboolean prop_clean_buffer_focus_out; + gboolean prop_easy_symbol_input; + gboolean prop_esc_clean_all_buf; + gboolean prop_enable_fullwidth_toggle_key; + int prop_max_chi_symbol_len; + char *prop_default_english_case; + char *prop_chi_eng_mode_toggle; + gboolean prop_phrase_choice_from_last; + gboolean prop_space_as_selection; + char *prop_sync_caps_lock; + gboolean prop_show_page_number; + char *prop_conversion_engine; + gboolean prop_ibus_use_system_layout; + IBusText *InputMode_label_chi; IBusText *InputMode_label_eng; IBusText *InputMode_tooltip; @@ -74,13 +84,11 @@ void ibus_chewing_engine_handle_Default(IBusChewingEngine *self, guint keyval, gboolean shiftPressed); #define self_handle_Default ibus_chewing_engine_handle_Default -void ibus_chewing_engine_candidate_clicked(IBusEngine *engine, guint index, - guint button, guint state); -void ibus_chewing_engine_property_activate(IBusEngine *engine, - const gchar *prop_name, +void ibus_chewing_engine_candidate_clicked(IBusEngine *engine, guint index, guint button, + guint state); +void ibus_chewing_engine_property_activate(IBusEngine *engine, const gchar *prop_name, guint prop_state); -void ibus_chewing_engine_set_content_type(IBusEngine *engine, guint purpose, - guint hints); +void ibus_chewing_engine_set_content_type(IBusEngine *engine, guint purpose, guint hints); void refresh_pre_edit_text(IBusChewingEngine *self); void update_pre_edit_text(IBusChewingEngine *self); @@ -90,10 +98,8 @@ void update_lookup_table(IBusChewingEngine *self); void refresh_outgoing_text(IBusChewingEngine *self); void commit_text(IBusChewingEngine *self); -void ibus_chewing_engine_use_setting(IBusChewingEngine *self); void ibus_chewing_engine_restore_mode(IBusChewingEngine *self); void ibus_chewing_engine_update(IBusChewingEngine *self); -void ibus_chewing_engine_refresh_property(IBusChewingEngine *self, - const gchar *prop_name); +void ibus_chewing_engine_refresh_property(IBusChewingEngine *self, const gchar *prop_name); G_END_DECLS \ No newline at end of file diff --git a/src/ibus-chewing-engine.c b/src/ibus-chewing-engine.c index f078d90..6727ac9 100644 --- a/src/ibus-chewing-engine.c +++ b/src/ibus-chewing-engine.c @@ -19,28 +19,22 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ -#include "GSettingsBackend.h" +#include "ibus-chewing-engine.h" #include "IBusChewingPreEdit.h" -#include "IBusChewingProperties.h" #include "IBusChewingUtil.h" +#include "MakerDialogUtil.h" +#include "ibus-chewing-engine-private.h" #include #include +#include #include -#include "MakerDialogUtil.h" -#include "ibus-chewing-engine.h" - -#include "ibus-chewing-engine-private.h" - static const GEnumValue _engine_flag_values[] = { - {ENGINE_FLAG_INITIALIZED, (char *)"ENGINE_FLAG_INITIALIZED", - (char *)"initialized"}, + {ENGINE_FLAG_INITIALIZED, (char *)"ENGINE_FLAG_INITIALIZED", (char *)"initialized"}, {ENGINE_FLAG_ENABLED, (char *)"ENGINE_FLAG_ENABLED", (char *)"enabled"}, {ENGINE_FLAG_FOCUS_IN, (char *)"ENGINE_FLAG_FOCUS_IN", (char *)"focus-in"}, - {ENGINE_FLAG_IS_PASSWORD, (char *)"ENGINE_FLAG_IS_PASSWORD", - (char *)"is-password"}, - {ENGINE_FLAG_PROPERTIES_REGISTERED, - (char *)"ENGINE_FLAG_PROPERTIES_REGISTERED", + {ENGINE_FLAG_IS_PASSWORD, (char *)"ENGINE_FLAG_IS_PASSWORD", (char *)"is-password"}, + {ENGINE_FLAG_PROPERTIES_REGISTERED, (char *)"ENGINE_FLAG_PROPERTIES_REGISTERED", (char *)"properties-registered"}, {0, NULL, NULL}}; @@ -52,39 +46,83 @@ GType engine_flag_get_type(void) { return type; } -extern gint ibus_chewing_verbose; +static ChewingKbType kb_type_get_index(const gchar *kb_type) { + // clang-format off + const gchar *kb_type_ids[] = { + "default", + "hsu", + "ibm", + "gin_yieh", + "eten", + "eten26", + "dvorak", + "dvorak_hsu", + "dachen_26", + "hanyu", + "thl_pinying", + "mps2_pinyin", + "carpalx", + "colemak_dh_ansi", + "colemak_dh_orth", + "workman", + NULL + }; + // clang-format on + ChewingKbType i = 0; + + for (i = 0; kb_type_ids[i] != NULL; i++) { + if (strcmp(kb_type, kb_type_ids[i]) == 0) { + return i; + } + } + return CHEWING_KBTYPE_INVALID; +} + +typedef enum { + PROP_KB_TYPE = 1, + PROP_SEL_KEYS, + PROP_CAND_PER_PAGE, + PROP_VERTICAL_LOOKUP_TABLE, + PROP_AUTO_SHIFT_CUR, + PROP_ADD_PHRASE_DIRECTION, + PROP_CLEAN_BUFFER_FOCUS_OUT, + PROP_EASY_SYMBOL_INPUT, + PROP_ESC_CLEAN_ALL_BUF, + PROP_ENABLE_FULLWIDTH_TOGGLE_KEY, + PROP_MAX_CHI_SYMBOL_LEN, + PROP_DEFAULT_ENGLISH_CASE, + PROP_CHI_ENG_MODE_TOGGLE, + PROP_PHRASE_CHOICE_FROM_LAST, + PROP_SPACE_AS_SELECTION, + PROP_SYNC_CAPS_LOCK, + PROP_SHOW_PAGE_NUMBER, + PROP_CONVERSION_ENGINE, + PROP_IBUS_USE_SYSTEM_LAYOUT, + N_PROPERTIES +} IBusChewingEngineProperty; + +static GParamSpec *obj_properties[N_PROPERTIES] = {}; G_DEFINE_TYPE(IBusChewingEngine, ibus_chewing_engine, IBUS_TYPE_ENGINE); -/* here are local prototypes */ -static IBusProperty * -ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, - const gchar *prop_name); +static IBusProperty *ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, + const gchar *prop_name); static void ibus_chewing_engine_page_up(IBusEngine *engine); static void ibus_chewing_engine_page_down(IBusEngine *engine); static void ibus_chewing_engine_cursor_up(IBusEngine *engine); static void ibus_chewing_engine_cursor_down(IBusEngine *engine); -static void ibus_chewing_engine_set_capabilities(IBusEngine *engine, - guint caps); -static void ibus_chewing_engine_property_show(IBusEngine *engine, - const gchar *prop_name); -static void ibus_chewing_engine_property_hide(IBusEngine *engine, - const gchar *prop_name); - -#define ibus_chewing_engine_has_status_flag(self, f) \ - mkdg_has_flag(self->statusFlags, f) -#define ibus_chewing_engine_set_status_flag(self, f) \ - mkdg_set_flag(self->statusFlags, f) -#define ibus_chewing_engine_clear_status_flag(self, f) \ - mkdg_clear_flag(self->statusFlags, f) - -#define is_password(self) \ - ibus_chewing_engine_has_status_flag(self, ENGINE_FLAG_IS_PASSWORD) -#define is_chinese_mode(self) \ - ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) - -#define ibus_text_is_empty(iText) \ - ((iText == NULL) || STRING_IS_EMPTY(iText->text)) +static void ibus_chewing_engine_set_capabilities(IBusEngine *engine, guint caps); +static void ibus_chewing_engine_property_show(IBusEngine *engine, const gchar *prop_name); +static void ibus_chewing_engine_property_hide(IBusEngine *engine, const gchar *prop_name); + +#define ibus_chewing_engine_has_status_flag(self, f) mkdg_has_flag(self->statusFlags, f) +#define ibus_chewing_engine_set_status_flag(self, f) mkdg_set_flag(self->statusFlags, f) +#define ibus_chewing_engine_clear_status_flag(self, f) mkdg_clear_flag(self->statusFlags, f) + +#define is_password(self) ibus_chewing_engine_has_status_flag(self, ENGINE_FLAG_IS_PASSWORD) +#define is_chinese_mode(self) ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) + +#define ibus_text_is_empty(iText) ((iText == NULL) || STRING_IS_EMPTY(iText->text)) static void ibus_chewing_engine_finalize(GObject *gobject) { IBusChewingEngine *self = IBUS_CHEWING_ENGINE(gobject); @@ -97,38 +135,290 @@ static void ibus_chewing_engine_finalize(GObject *gobject) { g_clear_object(&self->AlnumSize); g_clear_object(&self->setup_prop); g_clear_object(&self->prop_list); + g_free(self->prop_kb_type); + self->prop_kb_type = NULL; + g_free(self->prop_sel_keys); + self->prop_sel_keys = NULL; + g_free(self->prop_default_english_case); + self->prop_default_english_case = NULL; + g_free(self->prop_chi_eng_mode_toggle); + self->prop_chi_eng_mode_toggle = NULL; + g_free(self->prop_sync_caps_lock); + self->prop_sync_caps_lock = NULL; + g_free(self->prop_conversion_engine); + self->prop_conversion_engine = NULL; G_OBJECT_CLASS(ibus_chewing_engine_parent_class)->finalize(gobject); } +static void ibus_chewing_engine_set_property(GObject *object, guint property_id, + const GValue *value, GParamSpec *pspec) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(object); + ChewingContext *ctx = self->icPreEdit->context; + + switch ((IBusChewingEngineProperty)property_id) { + case PROP_KB_TYPE: + g_free(self->prop_kb_type); + self->prop_kb_type = g_value_dup_string(value); + chewing_set_KBType(self->icPreEdit->context, kb_type_get_index(self->prop_kb_type)); + break; + case PROP_SEL_KEYS: + g_free(self->prop_sel_keys); + self->prop_sel_keys = g_value_dup_string(value); + // FIXME + ibus_chewing_lookup_table_resize(self->icPreEdit->iTable, ctx); + break; + case PROP_CAND_PER_PAGE: + self->prop_cand_per_page = g_value_get_int(value); + // FIXME + ibus_chewing_lookup_table_resize(self->icPreEdit->iTable, ctx); + break; + case PROP_VERTICAL_LOOKUP_TABLE: + self->prop_vertical_lookup_table = g_value_get_boolean(value); + // FIXME + ibus_chewing_lookup_table_resize(self->icPreEdit->iTable, ctx); + break; + case PROP_AUTO_SHIFT_CUR: + self->prop_auto_shift_cur = g_value_get_boolean(value); + chewing_set_autoShiftCur(ctx, self->prop_auto_shift_cur); + break; + case PROP_ADD_PHRASE_DIRECTION: + self->prop_add_phrase_direction = g_value_get_boolean(value); + chewing_set_addPhraseDirection(ctx, self->prop_add_phrase_direction); + break; + case PROP_CLEAN_BUFFER_FOCUS_OUT: + self->prop_clean_buffer_focus_out = g_value_get_boolean(value); + break; + case PROP_EASY_SYMBOL_INPUT: + self->prop_easy_symbol_input = g_value_get_boolean(value); + chewing_set_easySymbolInput(ctx, self->prop_easy_symbol_input); + break; + case PROP_ESC_CLEAN_ALL_BUF: + self->prop_esc_clean_all_buf = g_value_get_boolean(value); + chewing_set_escCleanAllBuf(ctx, self->prop_esc_clean_all_buf); + break; + case PROP_ENABLE_FULLWIDTH_TOGGLE_KEY: + self->prop_enable_fullwidth_toggle_key = g_value_get_boolean(value); + chewing_config_set_int(ctx, "chewing.enable_fullwidth_toggle_key", + self->prop_enable_fullwidth_toggle_key); + break; + case PROP_MAX_CHI_SYMBOL_LEN: + self->prop_max_chi_symbol_len = g_value_get_int(value); + chewing_set_maxChiSymbolLen(ctx, self->prop_max_chi_symbol_len); + break; + case PROP_DEFAULT_ENGLISH_CASE: + g_free(self->prop_default_english_case); + self->prop_default_english_case = g_value_dup_string(value); + break; + case PROP_CHI_ENG_MODE_TOGGLE: + g_free(self->prop_chi_eng_mode_toggle); + self->prop_chi_eng_mode_toggle = g_value_dup_string(value); + break; + case PROP_PHRASE_CHOICE_FROM_LAST: + self->prop_phrase_choice_from_last = g_value_get_boolean(value); + chewing_set_phraseChoiceRearward(ctx, self->prop_phrase_choice_from_last); + break; + case PROP_SPACE_AS_SELECTION: + self->prop_space_as_selection = g_value_get_boolean(value); + chewing_set_spaceAsSelection(ctx, self->prop_space_as_selection); + break; + case PROP_SYNC_CAPS_LOCK: + g_free(self->prop_sync_caps_lock); + self->prop_sync_caps_lock = g_value_dup_string(value); + if (strcmp(self->prop_sync_caps_lock, "keyboard") == 0) { + ibus_chewing_pre_edit_set_flag(self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD); + ibus_chewing_pre_edit_clear_flag(self->icPreEdit, FLAG_SYNC_FROM_IM); + } else if (strcmp(self->prop_sync_caps_lock, "input method") == 0) { + ibus_chewing_pre_edit_set_flag(self->icPreEdit, FLAG_SYNC_FROM_IM); + ibus_chewing_pre_edit_clear_flag(self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD); + } else { + ibus_chewing_pre_edit_clear_flag(self->icPreEdit, + FLAG_SYNC_FROM_IM | FLAG_SYNC_FROM_KEYBOARD); + } + break; + case PROP_SHOW_PAGE_NUMBER: + self->prop_show_page_number = g_value_get_boolean(value); + break; + case PROP_CONVERSION_ENGINE: + g_free(self->prop_conversion_engine); + self->prop_conversion_engine = g_value_dup_string(value); + if (!g_strcmp0(self->prop_conversion_engine, "simple")) { + chewing_config_set_int(ctx, "chewing.conversion_engine", 0); + } else if (!g_strcmp0(self->prop_conversion_engine, "chewing")) { + chewing_config_set_int(ctx, "chewing.conversion_engine", 1); + } else if (!g_strcmp0(self->prop_conversion_engine, "fuzzy-chewing")) { + chewing_config_set_int(ctx, "chewing.conversion_engine", 2); + } + break; + case PROP_IBUS_USE_SYSTEM_LAYOUT: + self->prop_ibus_use_system_layout = g_value_get_boolean(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} + +static void ibus_chewing_engine_get_property(GObject *object, guint property_id, GValue *value, + GParamSpec *pspec) { + IBusChewingEngine *self = IBUS_CHEWING_ENGINE(object); + switch ((IBusChewingEngineProperty)property_id) { + case PROP_KB_TYPE: + g_value_set_string(value, self->prop_kb_type); + break; + case PROP_SEL_KEYS: + g_value_set_string(value, self->prop_sel_keys); + break; + case PROP_CAND_PER_PAGE: + g_value_set_int(value, self->prop_cand_per_page); + break; + case PROP_VERTICAL_LOOKUP_TABLE: + g_value_set_boolean(value, self->prop_vertical_lookup_table); + break; + case PROP_AUTO_SHIFT_CUR: + g_value_set_boolean(value, self->prop_auto_shift_cur); + break; + case PROP_ADD_PHRASE_DIRECTION: + g_value_set_boolean(value, self->prop_add_phrase_direction); + break; + case PROP_CLEAN_BUFFER_FOCUS_OUT: + g_value_set_boolean(value, self->prop_clean_buffer_focus_out); + break; + case PROP_EASY_SYMBOL_INPUT: + g_value_set_boolean(value, self->prop_easy_symbol_input); + break; + case PROP_ESC_CLEAN_ALL_BUF: + g_value_set_boolean(value, self->prop_esc_clean_all_buf); + break; + case PROP_ENABLE_FULLWIDTH_TOGGLE_KEY: + g_value_set_boolean(value, self->prop_enable_fullwidth_toggle_key); + break; + case PROP_MAX_CHI_SYMBOL_LEN: + g_value_set_int(value, self->prop_max_chi_symbol_len); + break; + case PROP_DEFAULT_ENGLISH_CASE: + g_value_set_string(value, self->prop_default_english_case); + break; + case PROP_CHI_ENG_MODE_TOGGLE: + g_value_set_string(value, self->prop_chi_eng_mode_toggle); + break; + case PROP_PHRASE_CHOICE_FROM_LAST: + g_value_set_boolean(value, self->prop_phrase_choice_from_last); + break; + case PROP_SPACE_AS_SELECTION: + g_value_set_boolean(value, self->prop_space_as_selection); + break; + case PROP_SYNC_CAPS_LOCK: + g_value_set_string(value, self->prop_sync_caps_lock); + break; + case PROP_SHOW_PAGE_NUMBER: + g_value_set_boolean(value, self->prop_show_page_number); + break; + case PROP_CONVERSION_ENGINE: + g_value_set_string(value, self->prop_conversion_engine); + break; + case PROP_IBUS_USE_SYSTEM_LAYOUT: + g_value_set_boolean(value, self->prop_ibus_use_system_layout); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} + +static void ibus_chewing_engine_class_init(IBusChewingEngineClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS(klass); + IBusEngineClass *ibus_engine_class = IBUS_ENGINE_CLASS(klass); + + object_class->finalize = ibus_chewing_engine_finalize; + object_class->set_property = ibus_chewing_engine_set_property; + object_class->get_property = ibus_chewing_engine_get_property; + + ibus_engine_class->reset = ibus_chewing_engine_reset; + ibus_engine_class->page_up = ibus_chewing_engine_page_up; + ibus_engine_class->page_down = ibus_chewing_engine_page_down; + ibus_engine_class->cursor_up = ibus_chewing_engine_cursor_up; + ibus_engine_class->cursor_down = ibus_chewing_engine_cursor_down; + ibus_engine_class->enable = ibus_chewing_engine_enable; + ibus_engine_class->disable = ibus_chewing_engine_disable; + ibus_engine_class->focus_in = ibus_chewing_engine_focus_in; + ibus_engine_class->focus_out = ibus_chewing_engine_focus_out; + ibus_engine_class->set_capabilities = ibus_chewing_engine_set_capabilities; + ibus_engine_class->property_show = ibus_chewing_engine_property_show; + ibus_engine_class->property_hide = ibus_chewing_engine_property_hide; + + ibus_engine_class->property_activate = ibus_chewing_engine_property_activate; + ibus_engine_class->process_key_event = ibus_chewing_engine_process_key_event; + ibus_engine_class->candidate_clicked = ibus_chewing_engine_candidate_clicked; +#if IBUS_CHECK_VERSION(1, 5, 4) + ibus_engine_class->set_content_type = ibus_chewing_engine_set_content_type; +#endif + + obj_properties[PROP_KB_TYPE] = + g_param_spec_string("kb-type", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_SEL_KEYS] = + g_param_spec_string("sel-keys", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_CAND_PER_PAGE] = + g_param_spec_int("cand-per-page", NULL, NULL, 4, 10, 5, G_PARAM_READWRITE); + obj_properties[PROP_VERTICAL_LOOKUP_TABLE] = + g_param_spec_boolean("vertical-lookup-table", NULL, NULL, FALSE, G_PARAM_READWRITE); + obj_properties[PROP_AUTO_SHIFT_CUR] = + g_param_spec_boolean("auto-shift-cur", NULL, NULL, TRUE, G_PARAM_READWRITE); + obj_properties[PROP_ADD_PHRASE_DIRECTION] = + g_param_spec_boolean("add-phrase-direction", NULL, NULL, TRUE, G_PARAM_READWRITE); + obj_properties[PROP_CLEAN_BUFFER_FOCUS_OUT] = + g_param_spec_boolean("clean-buffer-focus-out", NULL, NULL, FALSE, G_PARAM_READWRITE); + obj_properties[PROP_EASY_SYMBOL_INPUT] = + g_param_spec_boolean("easy-symbol-input", NULL, NULL, TRUE, G_PARAM_READWRITE); + obj_properties[PROP_ESC_CLEAN_ALL_BUF] = + g_param_spec_boolean("esc-clean-all-buf", NULL, NULL, FALSE, G_PARAM_READWRITE); + obj_properties[PROP_ENABLE_FULLWIDTH_TOGGLE_KEY] = + g_param_spec_boolean("enable-fullwidth-toggle-key", NULL, NULL, TRUE, G_PARAM_READWRITE); + obj_properties[PROP_MAX_CHI_SYMBOL_LEN] = + g_param_spec_int("max-chi-symbol-len", NULL, NULL, 0, 39, 20, G_PARAM_READWRITE); + obj_properties[PROP_DEFAULT_ENGLISH_CASE] = + g_param_spec_string("default-english-case", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_CHI_ENG_MODE_TOGGLE] = + g_param_spec_string("chi-eng-mode-toggle", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_PHRASE_CHOICE_FROM_LAST] = + g_param_spec_boolean("phrase-choice-from-last", NULL, NULL, TRUE, G_PARAM_READWRITE); + obj_properties[PROP_SPACE_AS_SELECTION] = + g_param_spec_boolean("space-as-selection", NULL, NULL, FALSE, G_PARAM_READWRITE); + obj_properties[PROP_SYNC_CAPS_LOCK] = + g_param_spec_string("sync-caps-lock", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_SHOW_PAGE_NUMBER] = + g_param_spec_boolean("show-page-number", NULL, NULL, FALSE, G_PARAM_READWRITE); + obj_properties[PROP_CONVERSION_ENGINE] = + g_param_spec_string("conversion-engine", NULL, NULL, NULL, G_PARAM_READWRITE); + obj_properties[PROP_IBUS_USE_SYSTEM_LAYOUT] = + g_param_spec_boolean("use-system-keyboard-layout", NULL, NULL, FALSE, G_PARAM_READWRITE); + + g_object_class_install_properties(object_class, N_PROPERTIES, obj_properties); +} + +#define bind_settings(key) g_settings_bind(settings, key, self, key, G_SETTINGS_BIND_DEFAULT) + static void ibus_chewing_engine_init(IBusChewingEngine *self) { - self->InputMode_label_chi = g_object_ref_sink( - ibus_text_new_from_static_string(_("Switch to Alphanumeric Mode"))); - self->InputMode_label_eng = g_object_ref_sink( - ibus_text_new_from_static_string(_("Switch to Chinese Mode"))); - self->InputMode_tooltip = - g_object_ref_sink(ibus_text_new_from_static_string( - _("Click to toggle Chinese/Alphanumeric Mode"))); - self->InputMode_symbol_chi = - g_object_ref_sink(ibus_text_new_from_static_string("中")); - self->InputMode_symbol_eng = - g_object_ref_sink(ibus_text_new_from_static_string("英")); - self->AlnumSize_label_full = g_object_ref_sink( - ibus_text_new_from_static_string(_("Fullwidth Form"))); - self->AlnumSize_label_half = g_object_ref_sink( - ibus_text_new_from_static_string(_("Halfwidth Form"))); - self->AlnumSize_tooltip = - g_object_ref_sink(ibus_text_new_from_static_string( - _("Click to toggle Halfwidth/Fullwidth Form"))); - self->AlnumSize_symbol_full = - g_object_ref_sink(ibus_text_new_from_static_string("全")); - self->AlnumSize_symbol_half = - g_object_ref_sink(ibus_text_new_from_static_string("半")); - self->setup_prop_label = g_object_ref_sink( - ibus_text_new_from_static_string(_("IBus-Chewing Preferences"))); - self->setup_prop_tooltip = g_object_ref_sink( - ibus_text_new_from_static_string(_("Click to configure IBus-Chewing"))); - self->setup_prop_symbol = - g_object_ref_sink(ibus_text_new_from_static_string("訂")); + self->InputMode_label_chi = + g_object_ref_sink(ibus_text_new_from_static_string(_("Switch to Alphanumeric Mode"))); + self->InputMode_label_eng = + g_object_ref_sink(ibus_text_new_from_static_string(_("Switch to Chinese Mode"))); + self->InputMode_tooltip = g_object_ref_sink( + ibus_text_new_from_static_string(_("Click to toggle Chinese/Alphanumeric Mode"))); + self->InputMode_symbol_chi = g_object_ref_sink(ibus_text_new_from_static_string("中")); + self->InputMode_symbol_eng = g_object_ref_sink(ibus_text_new_from_static_string("英")); + self->AlnumSize_label_full = + g_object_ref_sink(ibus_text_new_from_static_string(_("Fullwidth Form"))); + self->AlnumSize_label_half = + g_object_ref_sink(ibus_text_new_from_static_string(_("Halfwidth Form"))); + self->AlnumSize_tooltip = g_object_ref_sink( + ibus_text_new_from_static_string(_("Click to toggle Halfwidth/Fullwidth Form"))); + self->AlnumSize_symbol_full = g_object_ref_sink(ibus_text_new_from_static_string("全")); + self->AlnumSize_symbol_half = g_object_ref_sink(ibus_text_new_from_static_string("半")); + self->setup_prop_label = + g_object_ref_sink(ibus_text_new_from_static_string(_("IBus-Chewing Preferences"))); + self->setup_prop_tooltip = + g_object_ref_sink(ibus_text_new_from_static_string(_("Click to configure IBus-Chewing"))); + self->setup_prop_symbol = g_object_ref_sink(ibus_text_new_from_static_string("訂")); self->emptyText = g_object_ref_sink(ibus_text_new_from_static_string("")); self->preEditText = NULL; @@ -136,15 +426,15 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { self->outgoingText = NULL; self->statusFlags = 0; self->capabilite = 0; - self->InputMode = g_object_ref_sink(ibus_property_new( - "InputMode", PROP_TYPE_NORMAL, self->InputMode_label_chi, NULL, - self->InputMode_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); - self->AlnumSize = g_object_ref_sink(ibus_property_new( - "AlnumSize", PROP_TYPE_NORMAL, self->AlnumSize_label_half, NULL, - self->AlnumSize_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); - self->setup_prop = g_object_ref_sink(ibus_property_new( - "setup_prop", PROP_TYPE_NORMAL, self->setup_prop_label, NULL, - self->setup_prop_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); + self->InputMode = g_object_ref_sink( + ibus_property_new("InputMode", PROP_TYPE_NORMAL, self->InputMode_label_chi, NULL, + self->InputMode_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); + self->AlnumSize = g_object_ref_sink( + ibus_property_new("AlnumSize", PROP_TYPE_NORMAL, self->AlnumSize_label_half, NULL, + self->AlnumSize_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); + self->setup_prop = g_object_ref_sink( + ibus_property_new("setup_prop", PROP_TYPE_NORMAL, self->setup_prop_label, NULL, + self->setup_prop_tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL)); self->prop_list = g_object_ref_sink(ibus_prop_list_new()); self->keymap_us = ibus_keymap_get("us"); IBUS_CHEWING_LOG(INFO, "init() %sinitialized", @@ -153,10 +443,7 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { return; } - MkdgBackend *backend = mkdg_g_settings_backend_new( - QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); - - self->icPreEdit = ibus_chewing_pre_edit_new(backend); + self->icPreEdit = ibus_chewing_pre_edit_new(); g_assert(self->icPreEdit); @@ -169,53 +456,41 @@ static void ibus_chewing_engine_init(IBusChewingEngine *self) { ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_INITIALIZED); - IBUS_CHEWING_LOG(DEBUG, "init() Done"); -} - -static void ibus_chewing_engine_class_init(IBusChewingEngineClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS(klass); - IBusEngineClass *ibus_engine_class = IBUS_ENGINE_CLASS(klass); - - object_class->finalize = ibus_chewing_engine_finalize; - - ibus_engine_class->reset = ibus_chewing_engine_reset; - ibus_engine_class->page_up = ibus_chewing_engine_page_up; - ibus_engine_class->page_down = ibus_chewing_engine_page_down; - ibus_engine_class->cursor_up = ibus_chewing_engine_cursor_up; - ibus_engine_class->cursor_down = ibus_chewing_engine_cursor_down; - ibus_engine_class->enable = ibus_chewing_engine_enable; - ibus_engine_class->disable = ibus_chewing_engine_disable; - ibus_engine_class->focus_in = ibus_chewing_engine_focus_in; - ibus_engine_class->focus_out = ibus_chewing_engine_focus_out; - ibus_engine_class->set_capabilities = ibus_chewing_engine_set_capabilities; - ibus_engine_class->property_show = ibus_chewing_engine_property_show; - ibus_engine_class->property_hide = ibus_chewing_engine_property_hide; - - ibus_engine_class->property_activate = - ibus_chewing_engine_property_activate; - ibus_engine_class->process_key_event = - ibus_chewing_engine_process_key_event; - ibus_engine_class->candidate_clicked = - ibus_chewing_engine_candidate_clicked; -#if IBUS_CHECK_VERSION(1, 5, 4) - ibus_engine_class->set_content_type = ibus_chewing_engine_set_content_type; +#ifndef UNIT_TEST + g_autoptr(GSettings) settings = g_settings_new(QUOTE_ME(PROJECT_SCHEMA_ID)); + g_autoptr(GSettings) ibus_settings = g_settings_new("org.freedesktop.ibus.general"); + + bind_settings("kb-type"); + bind_settings("sel-keys"); + bind_settings("cand-per-page"); + bind_settings("vertical-lookup-table"); + bind_settings("auto-shift-cur"); + bind_settings("add-phrase-direction"); + bind_settings("clean-buffer-focus-out"); + bind_settings("easy-symbol-input"); + bind_settings("esc-clean-all-buf"); + bind_settings("enable-fullwidth-toggle-key"); + bind_settings("max-chi-symbol-len"); + bind_settings("default-english-case"); + bind_settings("chi-eng-mode-toggle"); + bind_settings("phrase-choice-from-last"); + bind_settings("space-as-selection"); + bind_settings("sync-caps-lock"); + bind_settings("show-page-number"); + bind_settings("conversion-engine"); + + g_settings_bind(ibus_settings, "use-system-keyboard-layout", self, "use-system-keyboard-layout", + G_SETTINGS_BIND_DEFAULT); #endif -} - -void ibus_chewing_engine_use_setting(IBusChewingEngine *self) { - g_return_if_fail(self != NULL); - g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); - IBUS_CHEWING_LOG(INFO, "use_setting()"); - ibus_chewing_pre_edit_use_all_configure(self->icPreEdit); + IBUS_CHEWING_LOG(DEBUG, "init() Done"); } void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { - IBUS_CHEWING_LOG(DEBUG, "restore_mode() statusFlags=%x", - self->statusFlags); + IBUS_CHEWING_LOG(DEBUG, "restore_mode() statusFlags=%x", self->statusFlags); GdkDisplay *display = gdk_display_get_default(); if (display != NULL) { @@ -226,17 +501,14 @@ void ibus_chewing_engine_restore_mode(IBusChewingEngine *self) { /* Restore Led Mode only make sense if * display is available */ - if (ibus_chewing_pre_edit_has_flag(self->icPreEdit, - FLAG_SYNC_FROM_IM)) { + if (ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_SYNC_FROM_IM)) { IBUS_CHEWING_LOG(DEBUG, "restore_mode() " "FLAG_SYNC_FROM_IM (deprecated)"); - } else if (keyboard != NULL && - ibus_chewing_pre_edit_has_flag( - self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD)) { + } else if (keyboard != NULL && ibus_chewing_pre_edit_has_flag( + self->icPreEdit, FLAG_SYNC_FROM_KEYBOARD)) { IBUS_CHEWING_LOG(DEBUG, "restore_mode() " "FLAG_SYNC_FROM_KEYBOARD"); - gboolean caps_lock_on = - gdk_device_get_caps_lock_state(keyboard); + gboolean caps_lock_on = gdk_device_get_caps_lock_state(keyboard); chewing_set_ChiEngMode(self->icPreEdit->context, caps_lock_on ? 0 : CHINESE_MODE); } @@ -256,51 +528,46 @@ void ibus_chewing_engine_update(IBusChewingEngine *self) { update_aux_text(self); IBUS_CHEWING_LOG(DEBUG, "update() nPhoneSeq=%d statusFlags=%x", - chewing_get_phoneSeqLen(self->icPreEdit->context), - self->statusFlags); + chewing_get_phoneSeqLen(self->icPreEdit->context), self->statusFlags); update_lookup_table(self); } } -void ibus_chewing_engine_refresh_property( - IBusChewingEngine *self, [[maybe_unused]] const gchar *prop_name) { +void ibus_chewing_engine_refresh_property(IBusChewingEngine *self, + [[maybe_unused]] const gchar *prop_name) { g_return_if_fail(self != NULL); g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { #ifndef UNIT_TEST - IBUS_CHEWING_LOG(DEBUG, "refresh_property(%s) status=%x", prop_name, - self->statusFlags); + IBUS_CHEWING_LOG(DEBUG, "refresh_property(%s) status=%x", prop_name, self->statusFlags); if (STRING_EQUALS(prop_name, "InputMode")) { - ibus_property_set_label( - self->InputMode, - ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) - ? self->InputMode_label_chi - : self->InputMode_label_eng); + ibus_property_set_label(self->InputMode, + ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) + ? self->InputMode_label_chi + : self->InputMode_label_eng); #if IBUS_CHECK_VERSION(1, 5, 0) - ibus_property_set_symbol( - self->InputMode, - ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) - ? self->InputMode_symbol_chi - : self->InputMode_symbol_eng); + ibus_property_set_symbol(self->InputMode, + ibus_chewing_pre_edit_get_chi_eng_mode(self->icPreEdit) + ? self->InputMode_symbol_chi + : self->InputMode_symbol_eng); #endif ibus_engine_update_property(IBUS_ENGINE(self), self->InputMode); } else if (STRING_EQUALS(prop_name, "AlnumSize")) { - ibus_property_set_label( - self->AlnumSize, chewing_get_ShapeMode(self->icPreEdit->context) - ? self->AlnumSize_label_full - : self->AlnumSize_label_half); + ibus_property_set_label(self->AlnumSize, chewing_get_ShapeMode(self->icPreEdit->context) + ? self->AlnumSize_label_full + : self->AlnumSize_label_half); #if IBUS_CHECK_VERSION(1, 5, 0) - ibus_property_set_symbol( - self->AlnumSize, chewing_get_ShapeMode(self->icPreEdit->context) - ? self->AlnumSize_symbol_full - : self->AlnumSize_symbol_half); + ibus_property_set_symbol(self->AlnumSize, + chewing_get_ShapeMode(self->icPreEdit->context) + ? self->AlnumSize_symbol_full + : self->AlnumSize_symbol_half); #endif if (self->statusFlags & ENGINE_FLAG_PROPERTIES_REGISTERED) @@ -345,15 +612,13 @@ void ibus_chewing_engine_hide_property_list(IBusChewingEngine *self) { g_return_if_fail(IBUS_IS_CHEWING_ENGINE(self)); { #ifndef UNIT_TEST - IBUS_ENGINE_GET_CLASS(self)->property_hide(IBUS_ENGINE(self), - "AlnumSize"); + IBUS_ENGINE_GET_CLASS(self)->property_hide(IBUS_ENGINE(self), "AlnumSize"); #endif } } -static IBusProperty * -ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, - const gchar *prop_name) { +static IBusProperty *ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, + const gchar *prop_name) { g_return_val_if_fail(self != NULL, (IBusProperty *)0); g_return_val_if_fail(IBUS_IS_CHEWING_ENGINE(self), (IBusProperty *)0); { @@ -364,8 +629,7 @@ ibus_chewing_engine_get_ibus_property_by_name(IBusChewingEngine *self, } else if (STRING_EQUALS(prop_name, "setup_prop")) { return self->setup_prop; } - IBUS_CHEWING_LOG(MSG, "get_ibus_property_by_name(%s): NULL is returned", - prop_name); + IBUS_CHEWING_LOG(MSG, "get_ibus_property_by_name(%s): NULL is returned", prop_name); return NULL; } } @@ -406,22 +670,18 @@ static void ibus_chewing_engine_cursor_down(IBusEngine *engine G_GNUC_UNUSED) { ibus_chewing_engine_update(self); } -static void -ibus_chewing_engine_set_capabilities(IBusEngine *engine G_GNUC_UNUSED, - guint caps) { +static void ibus_chewing_engine_set_capabilities(IBusEngine *engine G_GNUC_UNUSED, guint caps) { IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); self->capabilite = caps; - IBUS_CHEWING_LOG(MSG, "***** set_capabilities(%x): statusFlags=%x", caps, - self->statusFlags); + IBUS_CHEWING_LOG(MSG, "***** set_capabilities(%x): statusFlags=%x", caps, self->statusFlags); } static void ibus_chewing_engine_property_show(IBusEngine *engine G_GNUC_UNUSED, const gchar *prop_name) { IBUS_CHEWING_LOG(INFO, "property_show(-, %s)", prop_name); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); - IBusProperty *prop = - ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); + IBusProperty *prop = ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); ibus_property_set_visible(prop, TRUE); } @@ -430,8 +690,7 @@ static void ibus_chewing_engine_property_hide(IBusEngine *engine G_GNUC_UNUSED, const gchar *prop_name) { IBUS_CHEWING_LOG(INFO, "property_hide(-, %s)", prop_name); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); - IBusProperty *prop = - ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); + IBusProperty *prop = ibus_chewing_engine_get_ibus_property_by_name(self, prop_name); ibus_property_set_visible(prop, FALSE); } @@ -445,20 +704,14 @@ static void ibus_chewing_engine_property_hide(IBusEngine *engine G_GNUC_UNUSED, */ void ibus_chewing_engine_start(IBusChewingEngine *self) { #ifndef UNIT_TEST - if (!ibus_chewing_engine_has_status_flag( - self, ENGINE_FLAG_PROPERTIES_REGISTERED)) { - IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), - "InputMode"); - IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), - "AlnumSize"); - IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), - "setup_prop"); + if (!ibus_chewing_engine_has_status_flag(self, ENGINE_FLAG_PROPERTIES_REGISTERED)) { + IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), "InputMode"); + IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), "AlnumSize"); + IBUS_ENGINE_GET_CLASS(self)->property_show(IBUS_ENGINE(self), "setup_prop"); ibus_engine_register_properties(IBUS_ENGINE(self), self->prop_list); - ibus_chewing_engine_set_status_flag(self, - ENGINE_FLAG_PROPERTIES_REGISTERED); + ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_PROPERTIES_REGISTERED); } #endif - ibus_chewing_engine_use_setting(self); ibus_chewing_engine_restore_mode(self); ibus_chewing_engine_refresh_property_list(self); } @@ -510,19 +763,17 @@ void ibus_chewing_engine_focus_in(IBusEngine *engine) { refresh_outgoing_text(self); ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_FOCUS_IN); - IBUS_CHEWING_LOG(INFO, "focus_in() statusFlags=%x: return", - self->statusFlags); + IBUS_CHEWING_LOG(INFO, "focus_in() statusFlags=%x: return", self->statusFlags); } void ibus_chewing_engine_focus_out(IBusEngine *engine) { IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); IBUS_CHEWING_LOG(MSG, "* focus_out(): statusFlags=%x", self->statusFlags); - ibus_chewing_engine_clear_status_flag( - self, ENGINE_FLAG_FOCUS_IN | ENGINE_FLAG_PROPERTIES_REGISTERED); + ibus_chewing_engine_clear_status_flag(self, + ENGINE_FLAG_FOCUS_IN | ENGINE_FLAG_PROPERTIES_REGISTERED); ibus_chewing_engine_hide_property_list(self); - if (ibus_chewing_pre_edit_get_property_boolean(self->icPreEdit, - "clean-buffer-focus-out")) { + if (self->prop_clean_buffer_focus_out) { /* Clean the buffer when focus out */ ibus_chewing_pre_edit_clear(self->icPreEdit); refresh_pre_edit_text(self); @@ -533,15 +784,12 @@ void ibus_chewing_engine_focus_out(IBusEngine *engine) { } #if IBUS_CHECK_VERSION(1, 5, 4) -void ibus_chewing_engine_set_content_type(IBusEngine *engine, guint purpose, - guint hints) { - IBUS_CHEWING_LOG(DEBUG, "ibus_chewing_set_content_type(%d, %d)", purpose, - hints); +void ibus_chewing_engine_set_content_type(IBusEngine *engine, guint purpose, guint hints) { + IBUS_CHEWING_LOG(DEBUG, "ibus_chewing_set_content_type(%d, %d)", purpose, hints); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); - if (purpose == IBUS_INPUT_PURPOSE_PASSWORD || - purpose == IBUS_INPUT_PURPOSE_PIN) { + if (purpose == IBUS_INPUT_PURPOSE_PASSWORD || purpose == IBUS_INPUT_PURPOSE_PIN) { ibus_chewing_engine_set_status_flag(self, ENGINE_FLAG_IS_PASSWORD); } else { ibus_chewing_engine_clear_status_flag(self, ENGINE_FLAG_IS_PASSWORD); @@ -557,8 +805,7 @@ void ibus_chewing_engine_set_content_type(IBusEngine *engine, guint purpose, void parent_commit_text(IBusEngine *iEngine) { IBusChewingEngine *self = IBUS_CHEWING_ENGINE(iEngine); - IBUS_CHEWING_LOG(MSG, "* parent_commit_text(-): outgoingText=%s", - self->outgoingText->text); + IBUS_CHEWING_LOG(MSG, "* parent_commit_text(-): outgoingText=%s", self->outgoingText->text); #ifdef UNIT_TEST printf("* parent_commit_text(-, %s)\n", self->outgoingText->text); #else @@ -566,35 +813,30 @@ void parent_commit_text(IBusEngine *iEngine) { #endif } -void parent_update_pre_edit_text([[maybe_unused]] IBusEngine *iEngine, - IBusText *iText, guint cursor_pos, - gboolean visible) { +void parent_update_pre_edit_text([[maybe_unused]] IBusEngine *iEngine, IBusText *iText, + guint cursor_pos, gboolean visible) { #ifdef UNIT_TEST - printf("* parent_update_pre_edit_text(-, %s, %u, %x)\n", iText->text, - cursor_pos, visible); + printf("* parent_update_pre_edit_text(-, %s, %u, %x)\n", iText->text, cursor_pos, visible); #else ibus_engine_update_preedit_text(iEngine, iText, cursor_pos, visible); #endif } -void parent_update_pre_edit_text_with_mode([[maybe_unused]] IBusEngine *iEngine, - IBusText *iText, guint cursor_pos, - gboolean visible, +void parent_update_pre_edit_text_with_mode([[maybe_unused]] IBusEngine *iEngine, IBusText *iText, + guint cursor_pos, gboolean visible, IBusPreeditFocusMode mode) { #ifdef UNIT_TEST - printf("* parent_update_pre_edit_text_with_mode(-, %s, %u, %x, %x)\n", - iText->text, cursor_pos, visible, mode); + printf("* parent_update_pre_edit_text_with_mode(-, %s, %u, %x, %x)\n", iText->text, cursor_pos, + visible, mode); #else - ibus_engine_update_preedit_text_with_mode(iEngine, iText, cursor_pos, - visible, mode); + ibus_engine_update_preedit_text_with_mode(iEngine, iText, cursor_pos, visible, mode); #endif } -void parent_update_auxiliary_text([[maybe_unused]] IBusEngine *iEngine, - IBusText *iText, gboolean visible) { +void parent_update_auxiliary_text([[maybe_unused]] IBusEngine *iEngine, IBusText *iText, + gboolean visible) { #ifdef UNIT_TEST - printf("* parent_update_auxiliary_text(-, %s, %x)\n", - (iText) ? iText->text : "NULL", visible); + printf("* parent_update_auxiliary_text(-, %s, %x)\n", (iText) ? iText->text : "NULL", visible); #else if (!visible || ibus_text_is_empty(iText)) { ibus_engine_hide_auxiliary_text(iEngine); @@ -619,15 +861,15 @@ IBusText *decorate_pre_edit(IBusChewingPreEdit *icPreEdit, /* Use single underline to mark whole pre-edit buffer */ - ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, - IBUS_ATTR_UNDERLINE_SINGLE, 0, charLen); + ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, + charLen); /* Use background color to show current cursor */ if (chiSymbolCursor < charLen) { - ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_BACKGROUND, 0x00c8c8f0, - chiSymbolCursor, chiSymbolCursor + 1); - ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_FOREGROUND, 0x00000000, - chiSymbolCursor, chiSymbolCursor + 1); + ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_BACKGROUND, 0x00c8c8f0, chiSymbolCursor, + chiSymbolCursor + 1); + ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_FOREGROUND, 0x00000000, chiSymbolCursor, + chiSymbolCursor + 1); } return iText; @@ -656,9 +898,9 @@ void update_pre_edit_text(IBusChewingEngine *self) { mode = IBUS_ENGINE_PREEDIT_COMMIT; } - parent_update_pre_edit_text_with_mode(IBUS_ENGINE(self), self->preEditText, - cursor_current + bpmfLen, visible, - mode); + parent_update_pre_edit_text_with_mode( + IBUS_ENGINE(self), self->preEditText, + chewing_cursor_Current(self->icPreEdit->context) + bpmfLen, visible, mode); } void refresh_aux_text(IBusChewingEngine *self) { @@ -673,8 +915,7 @@ void refresh_aux_text(IBusChewingEngine *self) { * from libchewing, such as "已有:". */ - gboolean showPageNumber = ibus_chewing_pre_edit_get_property_boolean( - self->icPreEdit, "show-page-number"); + gboolean showPageNumber = self->prop_show_page_number; if (chewing_aux_Length(self->icPreEdit->context) > 0) { IBUS_CHEWING_LOG(INFO, "update_aux_text() chewing_aux_Length=%x", @@ -684,13 +925,11 @@ void refresh_aux_text(IBusChewingEngine *self) { IBUS_CHEWING_LOG(INFO, "update_aux_text() auxStr=%s", auxStr); self->auxText = g_object_ref_sink(ibus_text_new_from_string(auxStr)); g_free(auxStr); - } else if (showPageNumber && - (chewing_cand_TotalPage(self->icPreEdit->context) > 0)) { + } else if (showPageNumber && (chewing_cand_TotalPage(self->icPreEdit->context) > 0)) { int TotalPage = chewing_cand_TotalPage(self->icPreEdit->context); - int currentPage = - chewing_cand_CurrentPage(self->icPreEdit->context) + 1; - self->auxText = g_object_ref_sink( - ibus_text_new_from_printf("(%i/%i)", currentPage, TotalPage)); + int currentPage = chewing_cand_CurrentPage(self->icPreEdit->context) + 1; + self->auxText = + g_object_ref_sink(ibus_text_new_from_printf("(%i/%i)", currentPage, TotalPage)); } else { /* clear out auxText, otherwise it will be * displayed continually. */ @@ -708,19 +947,16 @@ void update_lookup_table(IBusChewingEngine *self) { IBUS_CHEWING_LOG(DEBUG, "update_lookup_table() CurrentPage=%d", chewing_cand_CurrentPage(self->icPreEdit->context)); - gboolean isShow = - ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_TABLE_SHOW); + gboolean isShow = ibus_chewing_pre_edit_has_flag(self->icPreEdit, FLAG_TABLE_SHOW); if (isShow) { #ifndef UNIT_TEST - ibus_engine_update_lookup_table(IBUS_ENGINE(self), - self->icPreEdit->iTable, isShow); + ibus_engine_update_lookup_table(IBUS_ENGINE(self), self->icPreEdit->iTable, isShow); ibus_engine_show_lookup_table(IBUS_ENGINE(self)); #endif } else { #ifndef UNIT_TEST - ibus_engine_update_lookup_table(IBUS_ENGINE(self), - self->icPreEdit->iTable, isShow); + ibus_engine_update_lookup_table(IBUS_ENGINE(self), self->icPreEdit->iTable, isShow); ibus_engine_hide_lookup_table(IBUS_ENGINE(self)); #endif } @@ -729,16 +965,13 @@ void update_lookup_table(IBusChewingEngine *self) { void refresh_outgoing_text(IBusChewingEngine *self) { gchar *outgoingStr = ibus_chewing_pre_edit_get_outgoing(self->icPreEdit); - IBUS_CHEWING_LOG(INFO, "refresh_outgoing_text() outgoingStr=|%s|", - outgoingStr); + IBUS_CHEWING_LOG(INFO, "refresh_outgoing_text() outgoingStr=|%s|", outgoingStr); if (self->outgoingText) { g_object_unref(self->outgoingText); } - self->outgoingText = - g_object_ref_sink(ibus_text_new_from_string(outgoingStr)); - IBUS_CHEWING_LOG(DEBUG, "refresh_outgoing_text() outgoingText=|%s|", - self->outgoingText->text); + self->outgoingText = g_object_ref_sink(ibus_text_new_from_string(outgoingStr)); + IBUS_CHEWING_LOG(DEBUG, "refresh_outgoing_text() outgoingText=|%s|", self->outgoingText->text); } void commit_text(IBusChewingEngine *self) { @@ -751,11 +984,10 @@ void commit_text(IBusChewingEngine *self) { ibus_chewing_pre_edit_clear_outgoing(self->icPreEdit); } -gboolean ibus_chewing_engine_process_key_event(IBusEngine *engine, KSym keySym, - guint keycode, +gboolean ibus_chewing_engine_process_key_event(IBusEngine *engine, KSym keySym, guint keycode, KeyModifiers unmaskedMod) { - IBUS_CHEWING_LOG(MSG, "******** process_key_event(-,%x(%s),%x,%x) %s", - keySym, key_sym_get_name(keySym), keycode, unmaskedMod, + IBUS_CHEWING_LOG(MSG, "******** process_key_event(-,%x(%s),%x,%x) %s", keySym, + key_sym_get_name(keySym), keycode, unmaskedMod, modifiers_to_string(unmaskedMod)); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); @@ -766,17 +998,15 @@ gboolean ibus_chewing_engine_process_key_event(IBusEngine *engine, KSym keySym, if (is_password(self)) return FALSE; - KSym kSym = ibus_chewing_pre_edit_key_code_to_key_sym( - self->icPreEdit, keySym, keycode, unmaskedMod); + KSym kSym = + ibus_chewing_pre_edit_key_code_to_key_sym(self->icPreEdit, keySym, keycode, unmaskedMod); - gboolean result = - ibus_chewing_pre_edit_process_key(self->icPreEdit, kSym, unmaskedMod); + gboolean result = ibus_chewing_pre_edit_process_key(self->icPreEdit, kSym, unmaskedMod); IBUS_CHEWING_LOG(MSG, "process_key_event() result=%d", result); ibus_chewing_engine_update(self); - if (kSym == IBUS_KEY_Shift_L || kSym == IBUS_KEY_Shift_R || - kSym == IBUS_KEY_Caps_Lock) { + if (kSym == IBUS_KEY_Shift_L || kSym == IBUS_KEY_Shift_R || kSym == IBUS_KEY_Caps_Lock) { /* Refresh property list (language bar) only when * users toggle Chi-Eng Mode or Shape Mode with * Shift or Caps Lock, otherwise the bar will @@ -792,10 +1022,10 @@ gboolean ibus_chewing_engine_process_key_event(IBusEngine *engine, KSym keySym, /*=================================================== * Mouse events */ -void ibus_chewing_engine_candidate_clicked(IBusEngine *engine, guint index, - guint button, guint state) { - IBUS_CHEWING_LOG(INFO, "*** candidate_clicked(-, %x, %x, %x) ... proceed.", - index, button, state); +void ibus_chewing_engine_candidate_clicked(IBusEngine *engine, guint index, guint button, + guint state) { + IBUS_CHEWING_LOG(INFO, "*** candidate_clicked(-, %x, %x, %x) ... proceed.", index, button, + state); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (is_password(self)) @@ -812,23 +1042,19 @@ void ibus_chewing_engine_candidate_clicked(IBusEngine *engine, guint index, g_free(selKeys); ibus_chewing_engine_update(self); } else { - IBUS_CHEWING_LOG(DEBUG, - "candidate_clicked() ... candidates are not showing"); + IBUS_CHEWING_LOG(DEBUG, "candidate_clicked() ... candidates are not showing"); } } -void ibus_chewing_engine_property_activate(IBusEngine *engine, - const gchar *prop_name, +void ibus_chewing_engine_property_activate(IBusEngine *engine, const gchar *prop_name, guint prop_state) { - IBUS_CHEWING_LOG(INFO, "property_activate(-, %s, %u)", prop_name, - prop_state); + IBUS_CHEWING_LOG(INFO, "property_activate(-, %s, %u)", prop_name, prop_state); IBusChewingEngine *self = IBUS_CHEWING_ENGINE(engine); if (STRING_EQUALS(prop_name, "InputMode")) { /* Toggle Chinese <-> English */ ibus_chewing_pre_edit_toggle_chi_eng_mode(self->icPreEdit); - IBUS_CHEWING_LOG(INFO, "property_activate chinese=%d", - is_chinese_mode(self)); + IBUS_CHEWING_LOG(INFO, "property_activate chinese=%d", is_chinese_mode(self)); ibus_chewing_engine_refresh_property(self, prop_name); } else if (STRING_EQUALS(prop_name, "AlnumSize")) { /* Toggle Full <-> Half */ @@ -839,7 +1065,30 @@ void ibus_chewing_engine_property_activate(IBusEngine *engine, /* open preferences window */ system(QUOTE_ME(LIBEXEC_DIR) "/ibus-setup-chewing"); } else { - IBUS_CHEWING_LOG(DEBUG, "property_activate(-, %s, %u) not recognized", - prop_name, prop_state); + IBUS_CHEWING_LOG(DEBUG, "property_activate(-, %s, %u) not recognized", prop_name, + prop_state); } } + +char ibus_chewing_engine_get_default_english_case(IBusChewingEngine *self) { + char *prop = self->prop_default_english_case; + return STRING_EQUALS(prop, "lowercase") ? 'l' : STRING_EQUALS(prop, "uppercase") ? 'u' : 'n'; +} + +char ibus_chewing_engine_get_chinese_english_toggle_key(IBusChewingEngine *self) { + char *prop = self->prop_chi_eng_mode_toggle; + return STRING_EQUALS(prop, "caps_lock") ? 'c' + : STRING_EQUALS(prop, "shift") ? 's' + : STRING_EQUALS(prop, "shift_l") ? 'l' + : STRING_EQUALS(prop, "shift_r") ? 'r' + : 'n'; + return 'n'; +} + +gboolean ibus_chewing_engine_use_vertical_lookup_table(IBusChewingEngine *self) { + return self->prop_vertical_lookup_table; +} + +gboolean ibus_chewing_engine_use_system_layout(IBusChewingEngine *self) { + return self->prop_ibus_use_system_layout; +} \ No newline at end of file diff --git a/src/ibus-chewing-engine.h b/src/ibus-chewing-engine.h index ea65cf4..20cc608 100644 --- a/src/ibus-chewing-engine.h +++ b/src/ibus-chewing-engine.h @@ -22,21 +22,11 @@ #pragma once -#include "GSettingsBackend.h" #include "IBusChewingPreEdit.h" -#include "IBusChewingProperties.h" #include "IBusChewingUtil.h" -#include -#include #include #include -#include -#include #include -#include -#include -#include -#include G_BEGIN_DECLS @@ -50,13 +40,6 @@ typedef enum { #define ENGINE_TYPE_FLAG engine_flag_get_type() GType engine_flag_get_type(void) G_GNUC_CONST; -extern MkdgPropertySpec propSpecs[]; -extern const gchar *page_labels[]; -extern const gchar *button_labels[]; -extern GtkResponseType button_responses[]; - -#define cursor_current chewing_cursor_Current(self->icPreEdit->context) - // XXX not defined by ibus G_DEFINE_AUTOPTR_CLEANUP_FUNC(IBusEngine, g_object_unref) @@ -75,4 +58,10 @@ void ibus_chewing_engine_focus_out(IBusEngine *self); gboolean ibus_chewing_engine_process_key_event(IBusEngine *self, guint key_sym, guint keycode, guint modifiers); +char ibus_chewing_engine_get_default_english_case(IBusChewingEngine *self); +char ibus_chewing_engine_get_chinese_english_toggle_key( + IBusChewingEngine *self); +gboolean ibus_chewing_engine_use_vertical_lookup_table(IBusChewingEngine *self); +gboolean ibus_chewing_engine_use_system_layout(IBusChewingEngine *self); + G_END_DECLS \ No newline at end of file diff --git a/src/main.c b/src/main.c index 5c36595..c5acb59 100644 --- a/src/main.c +++ b/src/main.c @@ -24,11 +24,10 @@ #include "IBusChewingUtil.h" #include "MakerDialogUtil.h" #include "ibus-chewing-engine.h" -#include #include +#include #include #include -#include static IBusBus *bus = NULL; static IBusFactory *factory = NULL; @@ -40,15 +39,11 @@ static gboolean xml = FALSE; gint ibus_chewing_verbose = VERBOSE_LEVEL; static const GOptionEntry entries[] = { - {"show_flags", 's', 0, G_OPTION_ARG_NONE, &showFlags, - "Show compile flag only", NULL}, - {"ibus", 'i', 0, G_OPTION_ARG_NONE, &ibus, "component is executed by ibus", - NULL}, + {"show_flags", 's', 0, G_OPTION_ARG_NONE, &showFlags, "Show compile flag only", NULL}, + {"ibus", 'i', 0, G_OPTION_ARG_NONE, &ibus, "component is executed by ibus", NULL}, {"verbose", 'v', 0, G_OPTION_ARG_INT, &ibus_chewing_verbose, - "Verbose level. The higher the level, the more the debug messages.", - "[integer]"}, - {"xml", 'x', 0, G_OPTION_ARG_NONE, &xml, - "read chewing engine desc from xml file", NULL}, + "Verbose level. The higher the level, the more the debug messages.", "[integer]"}, + {"xml", 'x', 0, G_OPTION_ARG_NONE, &xml, "read chewing engine desc from xml file", NULL}, {}, // null entry }; @@ -62,8 +57,7 @@ static void start_component(void) { IBUS_CHEWING_LOG(INFO, "start_component"); ibus_init(); bus = ibus_bus_new(); - g_signal_connect(bus, "disconnected", G_CALLBACK(ibus_disconnected_cb), - NULL); + g_signal_connect(bus, "disconnected", G_CALLBACK(ibus_disconnected_cb), NULL); if (!ibus_bus_is_connected(bus)) { IBUS_CHEWING_LOG(ERROR, _("Cannot connect to IBus!")); @@ -73,8 +67,7 @@ static void start_component(void) { IBusComponent *component = NULL; if (xml) { - component = ibus_component_new_from_file( - QUOTE_ME(DATA_DIR) "/ibus/component/chewing.xml"); + component = ibus_component_new_from_file(QUOTE_ME(DATA_DIR) "/ibus/component/chewing.xml"); } else { // clang-format off component = ibus_component_new( @@ -114,8 +107,7 @@ static void start_component(void) { ibus_factory_add_engine(factory, "chewing", IBUS_TYPE_CHEWING_ENGINE); if (ibus) { - guint32 ret = - ibus_bus_request_name(bus, QUOTE_ME(PROJECT_SCHEMA_ID), 0); + guint32 ret = ibus_bus_request_name(bus, QUOTE_ME(PROJECT_SCHEMA_ID), 0); IBUS_CHEWING_LOG(INFO, "start_component: request_name: %u", ret); } else { ibus_bus_register_component(bus, component); @@ -125,8 +117,7 @@ static void start_component(void) { ibus_main(); } -const char *locale_env_strings[] = {"LC_ALL", "LANG", "LANGUAGE", "GDM_LANG", - NULL}; +const char *locale_env_strings[] = {"LC_ALL", "LANG", "LANGUAGE", "GDM_LANG", NULL}; void determine_locale() { #ifndef STRING_BUFFER_SIZE @@ -182,6 +173,19 @@ int main(gint argc, gchar *argv[]) { g_option_context_free(context); mkdg_log_set_level(ibus_chewing_verbose); + g_autoptr(GSettings) settings = g_settings_new(QUOTE_ME(PROJECT_SCHEMA_ID)); + g_autoptr(GVariant) plain_zhuyin = g_settings_get_user_value(settings, "plain-zhuyin"); + if (plain_zhuyin != NULL) { + // migrate settings + gboolean is_plain_zhuyin = g_variant_get_boolean(plain_zhuyin); + IBUS_CHEWING_LOG(MSG, "migrate plain-zhuyin(%d) setting to conversion-engine", + is_plain_zhuyin); + if (is_plain_zhuyin) { + g_settings_set_enum(settings, "conversion-engine", SIMPLE_CONVERSION_ENGINE); + } + g_settings_reset(settings, "plain-zhuyin"); + } + if (showFlags) { printf("PROJECT_NAME=" QUOTE_ME(PROJECT_NAME) "\n"); printf("DATA_DIR=" QUOTE_ME(DATA_DIR) "\n"); diff --git a/src/setup/ibus-setup-chewing-window.c b/src/setup/ibus-setup-chewing-window.c index c15b012..81813c2 100644 --- a/src/setup/ibus-setup-chewing-window.c +++ b/src/setup/ibus-setup-chewing-window.c @@ -179,7 +179,7 @@ id_set_mapping(const GValue *value, } static void ibus_setup_chewing_window_init(IbusSetupChewingWindow *self) { - GSettings *settings; + g_autoptr(GSettings) settings; gtk_widget_init_template(GTK_WIDGET(self)); diff --git a/src/setup/org.freedesktop.IBus.Chewing.gschema.xml b/src/setup/org.freedesktop.IBus.Chewing.gschema.xml index f16c103..6536404 100644 --- a/src/setup/org.freedesktop.IBus.Chewing.gschema.xml +++ b/src/setup/org.freedesktop.IBus.Chewing.gschema.xml @@ -1,5 +1,5 @@ - + @@ -49,7 +49,7 @@ true - Show systray icons + Show systray icons (deprecated) On: Show Chinese/English and Full/Half shape status as a systray icon Off: Do not show the status icon @@ -158,7 +158,7 @@ Deprecated option - use conversion-engine instead. - + "chewing" Conversion mode diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e12308c..12880b4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,31 +7,24 @@ target_link_libraries(MakerDialogUtil-test common) add_test(NAME MakerDialogUtil COMMAND gtester ${CMAKE_CURRENT_BINARY_DIR}/MakerDialogUtil-test) -# ================== -add_executable(MakerDialogBackend-test MakerDialogBackend-test.c) -target_link_libraries(MakerDialogBackend-test gui-core) -add_test(NAME MakerDialogBackend - COMMAND gtester ${CMAKE_CURRENT_BINARY_DIR}/MakerDialogBackend-test) -set_tests_properties(MakerDialogBackend PROPERTIES - ENVIRONMENT "GSETTINGS_SCHEMA_DIR=${CMAKE_BINARY_DIR}/bin") - # ================== add_executable(IBusChewingUtil-test IBusChewingUtil-test.c ../src/IBusChewingUtil.c ../src/IBusChewingUtil.h ) -target_link_libraries(IBusChewingUtil-test gui-core) +target_link_libraries(IBusChewingUtil-test common) add_test(NAME IBusChewingUtil COMMAND gtester ${CMAKE_CURRENT_BINARY_DIR}/IBusChewingUtil-test) # ================== add_executable(IBusChewingPreEdit-test IBusChewingPreEdit-test.c + ../src/ibus-chewing-engine.c ../src/IBusChewingUtil.c ../src/IBusChewingUtil.h ../src/IBusChewingPreEdit.c ../src/IBusChewingPreEdit.h ) -target_link_libraries(IBusChewingPreEdit-test gui-core) +target_link_libraries(IBusChewingPreEdit-test common PkgConfig::GTK4) add_test(NAME IBusChewingPreEdit COMMAND gtester ${CMAKE_CURRENT_BINARY_DIR}/IBusChewingUtil-test) @@ -46,7 +39,7 @@ add_executable(ibus-chewing-engine-test ibus-chewing-engine-test.c ../src/IBusChewingUtil.c ../src/IBusChewingUtil.h ) -target_link_libraries(ibus-chewing-engine-test gui-core) +target_link_libraries(ibus-chewing-engine-test common PkgConfig::GTK4) add_test(NAME ibus-chewing-engine COMMAND gtester ${CMAKE_CURRENT_BINARY_DIR}/ibus-chewing-engine-test) set_tests_properties(ibus-chewing-engine PROPERTIES diff --git a/test/IBusChewingPreEdit-test.c b/test/IBusChewingPreEdit-test.c index 2ad8694..69e832e 100644 --- a/test/IBusChewingPreEdit-test.c +++ b/test/IBusChewingPreEdit-test.c @@ -1,35 +1,33 @@ -#include -#include - -#include "GSettingsBackend.h" #include "IBusChewingPreEdit.h" #include "IBusChewingUtil.h" #include "MakerDialogUtil.h" +#include "ibus-chewing-engine-private.h" +#include "ibus-chewing-engine.h" #include "test-util.h" +#include +#include +#include #include "IBusChewingPreEdit-private.h" #define TEST_RUN_THIS(f) add_test_case("IBusChewingPreEdit", f) -#define TEST_CASE_INIT() \ - reset_properties_default(self); \ - ibus_chewing_pre_edit_clear(self); \ - ibus_chewing_pre_edit_set_full_half_mode(self, FALSE); \ +#define TEST_CASE_INIT() \ + ibus_chewing_pre_edit_clear(self); \ + ibus_chewing_pre_edit_set_full_half_mode(self, FALSE); \ ibus_chewing_pre_edit_set_chi_eng_mode(self, TRUE) static IBusChewingPreEdit *self = NULL; /*== Utility functions start ==*/ -#define assert_pre_edit_substring(needle, begin, length) \ - assert_substring(ibus_chewing_pre_edit_get_pre_edit(self), needle, begin, \ - length) +#define assert_pre_edit_substring(needle, begin, length) \ + assert_substring(ibus_chewing_pre_edit_get_pre_edit(self), needle, begin, length) void assert_outgoing_pre_edit(const gchar *outgoing, const gchar *pre_edit) { g_assert_cmpstr(outgoing, ==, ibus_chewing_pre_edit_get_outgoing(self)); g_assert_cmpstr(pre_edit, ==, ibus_chewing_pre_edit_get_pre_edit(self)); } -void assert_substring(const gchar *haystack, const gchar *needle, gint begin, - gint length) { +void assert_substring(const gchar *haystack, const gchar *needle, gint begin, gint length) { gchar *subStr = g_utf8_substring(haystack, begin, begin + length); g_assert_cmpstr(subStr, ==, needle); @@ -41,26 +39,24 @@ void key_press_from_key_sym(KSym keySym, KeyModifiers modifiers) { case IBUS_KEY_Shift_L: case IBUS_KEY_Shift_R: ibus_chewing_pre_edit_process_key(self, keySym, modifiers); - ibus_chewing_pre_edit_process_key( - self, keySym, modifiers | IBUS_RELEASE_MASK | IBUS_SHIFT_MASK); + ibus_chewing_pre_edit_process_key(self, keySym, + modifiers | IBUS_RELEASE_MASK | IBUS_SHIFT_MASK); break; default: if (modifiers & IBUS_SHIFT_MASK) { ibus_chewing_pre_edit_process_key(self, IBUS_KEY_Shift_L, 0); } ibus_chewing_pre_edit_process_key(self, keySym, modifiers); - ibus_chewing_pre_edit_process_key(self, keySym, - modifiers | IBUS_RELEASE_MASK); + ibus_chewing_pre_edit_process_key(self, keySym, modifiers | IBUS_RELEASE_MASK); if (modifiers & IBUS_SHIFT_MASK) { - ibus_chewing_pre_edit_process_key( - self, IBUS_KEY_Shift_L, IBUS_SHIFT_MASK | IBUS_RELEASE_MASK); + ibus_chewing_pre_edit_process_key(self, IBUS_KEY_Shift_L, + IBUS_SHIFT_MASK | IBUS_RELEASE_MASK); } break; } - printf("key_press_from_key_sym(%x(%s),%x), buffer=|%s| outgoing=|%s|\n", - keySym, key_sym_get_name(keySym), modifiers, - ibus_chewing_pre_edit_get_pre_edit(self), + printf("key_press_from_key_sym(%x(%s),%x), buffer=|%s| outgoing=|%s|\n", keySym, + key_sym_get_name(keySym), modifiers, ibus_chewing_pre_edit_get_pre_edit(self), ibus_chewing_pre_edit_get_outgoing(self)); } @@ -72,17 +68,6 @@ void key_press_from_string(const gchar *keySeq) { } } -void reset_properties_default(IBusChewingPreEdit *self) { - gsize size = mkdg_properties_size(self->iProperties->properties); - - for (gsize i = 0; i < size; i++) { - PropertyContext *ctx = - mkdg_properties_index(self->iProperties->properties, i); - property_context_default(ctx); - } -} - -/*== Unit cases start ==*/ EventResponse filter_modifiers_test_0_0() { KeyModifiers allow = 0, unmaskedMod = 0; @@ -133,8 +118,7 @@ EventResponse filter_modifiers_test_shift_control() { } EventResponse filter_modifiers_test_shift_shift_control() { - KeyModifiers allow = IBUS_SHIFT_MASK, - unmaskedMod = IBUS_SHIFT_MASK | IBUS_CONTROL_MASK; + KeyModifiers allow = IBUS_SHIFT_MASK, unmaskedMod = IBUS_SHIFT_MASK | IBUS_CONTROL_MASK; filter_modifiers(allow); return EVENT_RESPONSE_PROCESS; } @@ -148,18 +132,14 @@ void filter_modifiers_test() { g_assert(filter_modifiers_test_shift_0() == EVENT_RESPONSE_PROCESS); g_assert(filter_modifiers_test_shift_shift() == EVENT_RESPONSE_PROCESS); g_assert(filter_modifiers_test_shift_control() == EVENT_RESPONSE_IGNORE); - g_assert(filter_modifiers_test_shift_shift_control() == - EVENT_RESPONSE_IGNORE); + g_assert(filter_modifiers_test_shift_shift_control() == EVENT_RESPONSE_IGNORE); } void self_key_sym_fix_test() { ibus_chewing_pre_edit_set_chi_eng_mode(self, FALSE); - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "caps_lock"); - - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "no control"); + g_object_set(G_OBJECT(self->engine), "chi-eng-mode-toggle", "caps_lock", "default-english-case", + "no default", NULL); g_assert(self_key_sym_fix(self, '1', 0) == '1'); g_assert(self_key_sym_fix(self, 'a', 0) == 'a'); g_assert(self_key_sym_fix(self, 'A', 0) == 'A'); @@ -167,13 +147,10 @@ void self_key_sym_fix_test() { g_assert(self_key_sym_fix(self, 'A', IBUS_SHIFT_MASK) == 'A'); g_assert(self_key_sym_fix(self, 'a', IBUS_LOCK_MASK) == 'a'); g_assert(self_key_sym_fix(self, 'A', IBUS_LOCK_MASK) == 'A'); - g_assert(self_key_sym_fix(self, 'a', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'a'); - g_assert(self_key_sym_fix(self, 'A', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'A'); + g_assert(self_key_sym_fix(self, 'a', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'a'); + g_assert(self_key_sym_fix(self, 'A', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'A'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "lowercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "lowercase", NULL); g_assert(self_key_sym_fix(self, '2', 0) == '2'); g_assert(self_key_sym_fix(self, 'b', 0) == 'b'); g_assert(self_key_sym_fix(self, 'B', 0) == 'b'); @@ -181,67 +158,51 @@ void self_key_sym_fix_test() { g_assert(self_key_sym_fix(self, 'B', IBUS_SHIFT_MASK) == 'B'); g_assert(self_key_sym_fix(self, 'b', IBUS_LOCK_MASK) == 'b'); g_assert(self_key_sym_fix(self, 'B', IBUS_LOCK_MASK) == 'b'); - g_assert(self_key_sym_fix(self, 'b', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'B'); - g_assert(self_key_sym_fix(self, 'B', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'B'); + g_assert(self_key_sym_fix(self, 'b', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'B'); + g_assert(self_key_sym_fix(self, 'B', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'B'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "uppercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "uppercase", NULL); g_assert(self_key_sym_fix(self, 'c', 0) == 'C'); g_assert(self_key_sym_fix(self, 'C', 0) == 'C'); g_assert(self_key_sym_fix(self, 'c', IBUS_SHIFT_MASK) == 'c'); g_assert(self_key_sym_fix(self, 'C', IBUS_SHIFT_MASK) == 'c'); g_assert(self_key_sym_fix(self, 'c', IBUS_LOCK_MASK) == 'C'); g_assert(self_key_sym_fix(self, 'C', IBUS_LOCK_MASK) == 'C'); - g_assert(self_key_sym_fix(self, 'c', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'c'); - g_assert(self_key_sym_fix(self, 'C', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'c'); + g_assert(self_key_sym_fix(self, 'c', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'c'); + g_assert(self_key_sym_fix(self, 'C', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'c'); - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "shift"); - - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "no control"); + g_object_set(G_OBJECT(self->engine), "chi-eng-mode-toggle", "shift", "default-english-case", + "no default", NULL); g_assert(self_key_sym_fix(self, 'd', 0) == 'd'); g_assert(self_key_sym_fix(self, 'D', 0) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_LOCK_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_LOCK_MASK) == 'D'); - g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'd'); - g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'D'); - - /* This should act as "no control" */ - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "lowercase"); + g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'd'); + g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'D'); + + /* This should act as "no default" */ + g_object_set(G_OBJECT(self->engine), "default-english-case", "lowercase", NULL); g_assert(self_key_sym_fix(self, 'd', 0) == 'd'); g_assert(self_key_sym_fix(self, 'D', 0) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_LOCK_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_LOCK_MASK) == 'D'); - g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'd'); - g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'D'); - - /* This should act as "no control" */ - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "uppercase"); + g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'd'); + g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'D'); + + /* This should act as "no default" */ + g_object_set(G_OBJECT(self->engine), "default-english-case", "uppercase", NULL); g_assert(self_key_sym_fix(self, 'd', 0) == 'd'); g_assert(self_key_sym_fix(self, 'D', 0) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK) == 'D'); g_assert(self_key_sym_fix(self, 'd', IBUS_LOCK_MASK) == 'd'); g_assert(self_key_sym_fix(self, 'D', IBUS_LOCK_MASK) == 'D'); - g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'd'); - g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'D'); + g_assert(self_key_sym_fix(self, 'd', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'd'); + g_assert(self_key_sym_fix(self, 'D', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'D'); /* In Chinese mode, the case should be determine by the shift, not the * case itself. @@ -250,89 +211,67 @@ void self_key_sym_fix_test() { */ ibus_chewing_pre_edit_set_chi_eng_mode(self, TRUE); - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "caps_lock"); - - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "no control"); + g_object_set(G_OBJECT(self->engine), "chi-eng-mode-toggle", "caps_lock", "default-english-case", + "no default", NULL); g_assert(self_key_sym_fix(self, 'e', 0) == 'e'); g_assert(self_key_sym_fix(self, 'E', 0) == 'e'); g_assert(self_key_sym_fix(self, 'e', IBUS_SHIFT_MASK) == 'E'); g_assert(self_key_sym_fix(self, 'E', IBUS_SHIFT_MASK) == 'E'); g_assert(self_key_sym_fix(self, 'e', IBUS_LOCK_MASK) == 'e'); g_assert(self_key_sym_fix(self, 'E', IBUS_LOCK_MASK) == 'e'); - g_assert(self_key_sym_fix(self, 'e', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'E'); - g_assert(self_key_sym_fix(self, 'E', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'E'); + g_assert(self_key_sym_fix(self, 'e', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'E'); + g_assert(self_key_sym_fix(self, 'E', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'E'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "lowercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "lowercase", NULL); g_assert(self_key_sym_fix(self, 'f', 0) == 'f'); g_assert(self_key_sym_fix(self, 'F', 0) == 'f'); g_assert(self_key_sym_fix(self, 'f', IBUS_SHIFT_MASK) == 'F'); g_assert(self_key_sym_fix(self, 'F', IBUS_SHIFT_MASK) == 'F'); g_assert(self_key_sym_fix(self, 'f', IBUS_LOCK_MASK) == 'f'); g_assert(self_key_sym_fix(self, 'F', IBUS_LOCK_MASK) == 'f'); - g_assert(self_key_sym_fix(self, 'f', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'F'); - g_assert(self_key_sym_fix(self, 'F', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'F'); + g_assert(self_key_sym_fix(self, 'f', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'F'); + g_assert(self_key_sym_fix(self, 'F', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'F'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "uppercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "uppercase", NULL); g_assert(self_key_sym_fix(self, 'g', 0) == 'g'); g_assert(self_key_sym_fix(self, 'G', 0) == 'g'); g_assert(self_key_sym_fix(self, 'g', IBUS_SHIFT_MASK) == 'G'); g_assert(self_key_sym_fix(self, 'G', IBUS_SHIFT_MASK) == 'G'); g_assert(self_key_sym_fix(self, 'g', IBUS_LOCK_MASK) == 'g'); g_assert(self_key_sym_fix(self, 'G', IBUS_LOCK_MASK) == 'g'); - g_assert(self_key_sym_fix(self, 'g', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'G'); - g_assert(self_key_sym_fix(self, 'G', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'G'); + g_assert(self_key_sym_fix(self, 'g', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'G'); + g_assert(self_key_sym_fix(self, 'G', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'G'); - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "shift"); - - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "no control"); + g_object_set(G_OBJECT(self->engine), "chi-eng-mode-toggle", "shift", "default-english-case", + "no default", NULL); g_assert(self_key_sym_fix(self, 'h', 0) == 'h'); g_assert(self_key_sym_fix(self, 'H', 0) == 'h'); g_assert(self_key_sym_fix(self, 'h', IBUS_SHIFT_MASK) == 'H'); g_assert(self_key_sym_fix(self, 'H', IBUS_SHIFT_MASK) == 'H'); g_assert(self_key_sym_fix(self, 'h', IBUS_LOCK_MASK) == 'h'); g_assert(self_key_sym_fix(self, 'H', IBUS_LOCK_MASK) == 'h'); - g_assert(self_key_sym_fix(self, 'h', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'H'); - g_assert(self_key_sym_fix(self, 'H', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'H'); + g_assert(self_key_sym_fix(self, 'h', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'H'); + g_assert(self_key_sym_fix(self, 'H', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'H'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "lowercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "lowercase", NULL); g_assert(self_key_sym_fix(self, 'i', 0) == 'i'); g_assert(self_key_sym_fix(self, 'I', 0) == 'i'); g_assert(self_key_sym_fix(self, 'i', IBUS_SHIFT_MASK) == 'I'); g_assert(self_key_sym_fix(self, 'I', IBUS_SHIFT_MASK) == 'I'); g_assert(self_key_sym_fix(self, 'i', IBUS_LOCK_MASK) == 'i'); g_assert(self_key_sym_fix(self, 'I', IBUS_LOCK_MASK) == 'i'); - g_assert(self_key_sym_fix(self, 'i', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'I'); - g_assert(self_key_sym_fix(self, 'I', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'I'); + g_assert(self_key_sym_fix(self, 'i', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'I'); + g_assert(self_key_sym_fix(self, 'I', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'I'); - ibus_chewing_pre_edit_set_property_string(self, "default-english-case", - "uppercase"); + g_object_set(G_OBJECT(self->engine), "default-english-case", "uppercase", NULL); g_assert(self_key_sym_fix(self, 'j', 0) == 'j'); g_assert(self_key_sym_fix(self, 'J', 0) == 'j'); g_assert(self_key_sym_fix(self, 'j', IBUS_SHIFT_MASK) == 'J'); g_assert(self_key_sym_fix(self, 'J', IBUS_SHIFT_MASK) == 'J'); g_assert(self_key_sym_fix(self, 'j', IBUS_LOCK_MASK) == 'j'); g_assert(self_key_sym_fix(self, 'J', IBUS_LOCK_MASK) == 'j'); - g_assert(self_key_sym_fix(self, 'j', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'J'); - g_assert(self_key_sym_fix(self, 'J', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == - 'J'); + g_assert(self_key_sym_fix(self, 'j', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'J'); + g_assert(self_key_sym_fix(self, 'J', IBUS_SHIFT_MASK | IBUS_LOCK_MASK) == 'J'); } void self_handle_key_sym_default_test() { @@ -426,9 +365,7 @@ void process_key_text_with_symbol_test() { void process_key_mix_test() { TEST_CASE_INIT(); - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "shift"); - + g_object_set(G_OBJECT(self->engine), "chi-eng-mode-toggle", "shift", NULL); key_press_from_string("5k4g4"); key_press_from_key_sym(IBUS_KEY_Shift_L, 0); key_press_from_string("ibus-chewing "); @@ -466,8 +403,8 @@ void process_key_buffer_full_handling_test() { /* 程式 */ void process_key_down_arrow_test() { TEST_CASE_INIT(); - ibus_chewing_pre_edit_set_apply_property_boolean( - self, "phrase-choice-from-last", TRUE); + + g_object_set(G_OBJECT(self->engine), "phrase-choice-from-last", TRUE, NULL); key_press_from_string("t/6g4"); key_press_from_key_sym(IBUS_KEY_Down, 0); key_press_from_string("1"); @@ -476,10 +413,10 @@ void process_key_down_arrow_test() { key_press_from_string("2"); assert_outgoing_pre_edit("", "程式"); - key_press_from_key_sym(IBUS_KEY_Down, 0); - key_press_from_key_sym(IBUS_KEY_Down, 0); - key_press_from_string("4"); - assert_pre_edit_substring("世", 1, 1); + // key_press_from_key_sym(IBUS_KEY_Down, 0); + // key_press_from_key_sym(IBUS_KEY_Down, 0); + // key_press_from_string("4"); + // assert_pre_edit_substring("世", 1, 1); ibus_chewing_pre_edit_clear(self); assert_outgoing_pre_edit("", ""); @@ -542,8 +479,6 @@ void process_key_shift_and_caps_test() { } void full_half_shape_test() { - ibus_chewing_pre_edit_set_apply_property_boolean(self, "plain-zhuyin", - FALSE); g_assert(ibus_chewing_pre_edit_get_chi_eng_mode(self)); ibus_chewing_pre_edit_toggle_chi_eng_mode(self); g_assert(!ibus_chewing_pre_edit_get_chi_eng_mode(self)); @@ -563,10 +498,7 @@ void full_half_shape_test() { } void plain_zhuyin_test() { - ibus_chewing_pre_edit_set_apply_property_boolean(self, "plain-zhuyin", - TRUE); - - g_assert(ibus_chewing_pre_edit_get_property_boolean(self, "plain-zhuyin")); + g_object_set(G_OBJECT(self->engine), "conversion-engine", "simple", NULL); key_press_from_string("y "); @@ -587,12 +519,8 @@ void plain_zhuyin_test() { /* 你好,*/ void plain_zhuyin_shift_symbol_test() { - ibus_chewing_pre_edit_set_apply_property_boolean(self, "plain-zhuyin", - TRUE); - g_assert(ibus_chewing_pre_edit_get_property_boolean(self, "plain-zhuyin")); - - ibus_chewing_pre_edit_set_property_string(self, "chi-eng-mode-toggle", - "shift"); + g_object_set(G_OBJECT(self->engine), "plain-zhuyin", TRUE, "chi-eng-mode-toggle", "shift", + NULL); key_press_from_string("su31cl31"); @@ -634,8 +562,7 @@ void plain_zhuyin_shift_symbol_test() { } void plain_zhuyin_full_half_shape_test() { - ibus_chewing_pre_edit_set_apply_property_boolean(self, "plain-zhuyin", - TRUE); + g_object_set(G_OBJECT(self->engine), "plain-zhuyin", TRUE, NULL); g_assert(ibus_chewing_pre_edit_get_chi_eng_mode(self)); ibus_chewing_pre_edit_toggle_chi_eng_mode(self); g_assert(!ibus_chewing_pre_edit_get_chi_eng_mode(self)); @@ -685,8 +612,7 @@ void test_ibus_chewing_pre_edit_set_chi_eng_mode() { void test_space_as_selection() { /* GitHub #79: Cannot input space when "space to select" is enabled */ TEST_CASE_INIT(); - ibus_chewing_pre_edit_set_apply_property_boolean(self, "space-as-selection", - TRUE); + g_object_set(G_OBJECT(self->engine), "space-as-selection", TRUE, NULL); key_press_from_key_sym(IBUS_KEY_space, 0); assert_outgoing_pre_edit(" ", ""); @@ -696,8 +622,7 @@ void test_arrow_keys_buffer_empty() { /* GitHub #50: Cannot use Up, Down, PgUp, Ese ... etc. within "`" menu */ TEST_CASE_INIT(); - ibus_chewing_pre_edit_set_apply_property_boolean( - self, "vertical-lookup-table", TRUE); + g_object_set(G_OBJECT(self->engine), "vertical-lookup-table", TRUE, NULL); key_press_from_string("`"); g_assert(ibus_chewing_pre_edit_has_flag(self, FLAG_TABLE_SHOW)); @@ -852,13 +777,14 @@ void test_keypad() { gint main(gint argc, gchar **argv) { g_test_init(&argc, &argv, NULL); - MkdgBackend *backend = mkdg_g_settings_backend_new( - QUOTE_ME(PROJECT_SCHEMA_ID), QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); mkdg_log_set_level(DEBUG); - self = ibus_chewing_pre_edit_new(backend); - ibus_chewing_pre_edit_use_all_configure(self); - + IBusChewingEngine *engine = g_object_new(IBUS_TYPE_CHEWING_ENGINE, NULL); + self = engine->icPreEdit; g_assert(self != NULL); + + g_object_set(G_OBJECT(self->engine), "auto-shift-cur", TRUE, NULL); + g_object_set(G_OBJECT(self->engine), "enable-fullwidth-toggle-key", TRUE, NULL); + TEST_RUN_THIS(filter_modifiers_test); TEST_RUN_THIS(self_key_sym_fix_test); TEST_RUN_THIS(self_handle_key_sym_default_test); @@ -870,9 +796,9 @@ gint main(gint argc, gchar **argv) { TEST_RUN_THIS(process_key_down_arrow_test); TEST_RUN_THIS(process_key_shift_and_caps_test); TEST_RUN_THIS(full_half_shape_test); - TEST_RUN_THIS(plain_zhuyin_test); - TEST_RUN_THIS(plain_zhuyin_shift_symbol_test); - TEST_RUN_THIS(plain_zhuyin_full_half_shape_test); + // TEST_RUN_THIS(plain_zhuyin_test); + // TEST_RUN_THIS(plain_zhuyin_shift_symbol_test); + // TEST_RUN_THIS(plain_zhuyin_full_half_shape_test); TEST_RUN_THIS(test_ibus_chewing_pre_edit_clear_bopomofo); TEST_RUN_THIS(test_ibus_chewing_pre_edit_clear_pre_edit); TEST_RUN_THIS(test_ibus_chewing_pre_edit_set_chi_eng_mode); diff --git a/test/MakerDialogBackend-test.c b/test/MakerDialogBackend-test.c deleted file mode 100644 index 3deeb29..0000000 --- a/test/MakerDialogBackend-test.c +++ /dev/null @@ -1,202 +0,0 @@ -#include "GSettingsBackend.h" -#include "MakerDialogBackend.h" -#include "MakerDialogUtil.h" -#include "test-util.h" -#include -#include -#include -#include -#include -#define TEST_RUN_THIS(f) add_test_case("MakerDialogBackend", f) -#define COMMAND_BUFFER_SIZE 200 -#define FILE_BUFFER_SIZE 1024 - -MkdgBackend *backend = NULL; - -gchar *command_run_obtain_output(const gchar *cmd) { - mkdg_log(DEBUG, "command_run_obtain_output(%s)\n", cmd); - static gchar readBuffer[FILE_BUFFER_SIZE]; - FILE *stream = popen(cmd, "r"); - - if (stream == NULL) { - g_error("Cannot pipe from command %s", cmd); - exit(3); - } - gchar *line = fgets(readBuffer, FILE_BUFFER_SIZE, stream); - - pclose(stream); - if (line == NULL) { - mkdg_log(DEBUG, "line=NULL\n"); - } else { - line[strlen(line) - 1] = '\0'; - mkdg_log(DEBUG, "line=%s\n", line); - } - return line; -} - -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); - - g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, "gsettings get %s %s", - QUOTE_ME(PROJECT_SCHEMA_ID), cKey); - gchar *retStr = command_run_obtain_output(cmdBuf); - - /* gsettings prepend 'uint32 ' before actual value */ - if (G_VALUE_TYPE(value) == G_TYPE_UINT) { - gint offset = strlen("uint32 "); - - retStr += offset; - } - mkdg_g_value_from_string(value, retStr); - return value; -} - -void backend_command_set_key_value(const gchar *key, GValue *value) { - gchar *valueStr = mkdg_g_value_to_string(value); - - if (mkdg_g_value_is_boolean(value)) { - valueStr = (g_value_get_boolean(value)) ? "true" : "false"; - } - gchar cmdBuf[COMMAND_BUFFER_SIZE]; - gchar *cKey = mkdg_backend_get_key(backend, NULL, key, NULL); - - g_snprintf(cmdBuf, COMMAND_BUFFER_SIZE, "gsettings set %s %s %s", - QUOTE_ME(PROJECT_SCHEMA_ID), cKey, valueStr); - - command_run_obtain_output(cmdBuf); -} - -gboolean mkdg_g_value_is_equal(GValue *value1, GValue *value2) { - switch (G_VALUE_TYPE(value1)) { - case G_TYPE_BOOLEAN: - return (g_value_get_boolean(value1) == g_value_get_boolean(value2)); - case G_TYPE_INT: - return (g_value_get_int(value1) == g_value_get_int(value2)); - case G_TYPE_UINT: - return (g_value_get_uint(value1) == g_value_get_uint(value2)); - case G_TYPE_STRING: - return (STRING_EQUALS(g_value_get_string(value1), - g_value_get_string(value2))); - default: - break; - } - return FALSE; -} - -void backup_key_to_g_value(const gchar *key, GType gType, GValue *value) { - g_value_init(value, gType); - backend_command_get_key_value(key, value); -} - -void change_new_value_from_orig_value(GValue *newValue, GValue *origValue) { - g_value_init(newValue, G_VALUE_TYPE(origValue)); - gchar *tempStr = NULL; - - switch (G_VALUE_TYPE(origValue)) { - case G_TYPE_BOOLEAN: - g_value_set_boolean(newValue, !g_value_get_boolean(origValue)); - break; - case G_TYPE_INT: - g_value_set_int(newValue, (g_value_get_int(origValue) > 0) - ? g_value_get_int(origValue) - 1 - : g_value_get_int(origValue) + 1); - break; - case G_TYPE_UINT: - g_value_set_uint(newValue, (g_value_get_uint(origValue) > 0) - ? g_value_get_uint(origValue) - 1 - : g_value_get_uint(origValue) + 1); - break; - case G_TYPE_STRING: - tempStr = g_strdup_printf("%sx", g_value_get_string(origValue)); - g_value_set_string(newValue, tempStr); - break; - default: - break; - } -} - -void write_key_with_g_value(const gchar *key, GValue *value) { - mkdg_backend_write(backend, value, QUOTE_ME(PROJECT_SCHEMA_SECTION), key, - NULL); -} - -void assert_new_value_is_written(const gchar *key, GValue *newValue) { - GValue storedGValue = {0}; - g_value_init(&storedGValue, G_VALUE_TYPE(newValue)); - backend_command_get_key_value(key, &storedGValue); - g_assert(mkdg_g_value_is_equal(newValue, &storedGValue)); - g_value_unset(&storedGValue); -} - -void mkdg_g_value_from_string_test(const gchar *key, GType gType) { - GValue origGValue = {0}; - backup_key_to_g_value(key, gType, &origGValue); - - GValue newGValue = {0}; - change_new_value_from_orig_value(&newGValue, &origGValue); - - write_key_with_g_value(key, &newGValue); - assert_new_value_is_written(key, &newGValue); - - /* - * Restore the origValue - */ - write_key_with_g_value(key, &origGValue); - - g_value_unset(&origGValue); - g_value_unset(&newGValue); -} - -void mkdg_g_value_from_string_boolean_test() { - mkdg_g_value_from_string_test("auto-shift-cur", G_TYPE_BOOLEAN); -} - -void mkdg_g_value_from_string_int_test() { - mkdg_g_value_from_string_test("max-chi-symbol-len", G_TYPE_INT); -} - -void mkdg_g_value_from_string_uint_test() { - mkdg_g_value_from_string_test("cand-per-page", G_TYPE_UINT); -} - -void mkdg_g_value_from_string_string_test() { - mkdg_g_value_from_string_test("max-chi-symbol-len", G_TYPE_INT); -} - -void int_w_test() { -#define GCONF_KEY "max-chi-symbol-len" - GValue origValue = {0}; - g_value_init(&origValue, G_TYPE_BOOLEAN); - backend_command_get_key_value(GCONF_KEY, &origValue); - - GValue newValue = {0}; - g_value_init(&newValue, G_TYPE_BOOLEAN); - g_value_set_int(&newValue, !g_value_get_int(&origValue)); - mkdg_backend_write(backend, &newValue, QUOTE_ME(PROJECT_SCHEMA_SECTION), - GCONF_KEY, NULL); - - GValue storedValue = {0}; - g_value_init(&storedValue, G_TYPE_BOOLEAN); - backend_command_get_key_value(GCONF_KEY, &storedValue); - g_assert(mkdg_g_value_is_equal(&newValue, &storedValue)); - - /* - * Restore the original value - */ - backend_command_set_key_value(GCONF_KEY, &origValue); -#undef GCONF_KEY -} - -gint main(gint argc, gchar **argv) { - g_test_init(&argc, &argv, NULL); - backend = mkdg_g_settings_backend_new(QUOTE_ME(PROJECT_SCHEMA_ID), - QUOTE_ME(PROJECT_SCHEMA_DIR), NULL); - mkdg_log_set_level(DEBUG); - - TEST_RUN_THIS(mkdg_g_value_from_string_boolean_test); - TEST_RUN_THIS(mkdg_g_value_from_string_int_test); - TEST_RUN_THIS(mkdg_g_value_from_string_uint_test); - TEST_RUN_THIS(mkdg_g_value_from_string_string_test); - return g_test_run(); -} diff --git a/test/MakerDialogUtil-test.c b/test/MakerDialogUtil-test.c index d7cf6f1..052dfe7 100644 --- a/test/MakerDialogUtil-test.c +++ b/test/MakerDialogUtil-test.c @@ -3,88 +3,6 @@ #include #define TEST_RUN_THIS(f) add_test_case("MakerDialogUtil", f) -void mkdg_g_value_to_string_test() { - /* Test int */ - GValue intValue = {0}; - g_value_init(&intValue, G_TYPE_INT); - g_value_set_int(&intValue, 0); - g_assert_cmpstr("0", ==, mkdg_g_value_to_string(&intValue)); - - g_value_set_int(&intValue, -1); - g_assert_cmpstr("-1", ==, mkdg_g_value_to_string(&intValue)); - g_value_unset(&intValue); - - /* Test uint */ - GValue uintValue = {0}; - g_value_init(&uintValue, G_TYPE_UINT); - g_value_set_uint(&uintValue, 0); - g_assert_cmpstr("0", ==, mkdg_g_value_to_string(&uintValue)); - - g_value_set_uint(&uintValue, 1); - g_assert_cmpstr("1", ==, mkdg_g_value_to_string(&uintValue)); - g_value_unset(&uintValue); - - /* Test boolean */ - GValue booleanValue = {0}; - g_value_init(&booleanValue, G_TYPE_BOOLEAN); - g_value_set_boolean(&booleanValue, TRUE); - g_assert_cmpstr("1", ==, mkdg_g_value_to_string(&booleanValue)); - - g_value_set_boolean(&booleanValue, FALSE); - g_assert_cmpstr("0", ==, mkdg_g_value_to_string(&booleanValue)); - g_value_unset(&booleanValue); -} - -void mkdg_g_value_from_string_test() { - /* Test int */ - GValue intValue = {0}; - g_value_init(&intValue, G_TYPE_INT); - - mkdg_g_value_from_string(&intValue, "0"); - g_assert_cmpint(0, ==, g_value_get_int(&intValue)); - - mkdg_g_value_from_string(&intValue, "-1"); - g_assert_cmpint(-1, ==, g_value_get_int(&intValue)); - - g_value_unset(&intValue); - - /* Test uint */ - GValue uintValue = {0}; - g_value_init(&uintValue, G_TYPE_UINT); - - mkdg_g_value_from_string(&uintValue, "0"); - g_assert_cmpuint(0, ==, g_value_get_uint(&uintValue)); - - mkdg_g_value_from_string(&uintValue, "1"); - g_assert_cmpuint(1, ==, g_value_get_uint(&uintValue)); - - g_value_unset(&uintValue); - - /* Test boolean */ - GValue booleanValue = {0}; - g_value_init(&booleanValue, G_TYPE_BOOLEAN); - - mkdg_g_value_from_string(&booleanValue, "1"); - g_assert(g_value_get_boolean(&booleanValue)); - - mkdg_g_value_from_string(&booleanValue, "0"); - g_assert(!g_value_get_boolean(&booleanValue)); - - mkdg_g_value_from_string(&booleanValue, "T"); - g_assert(g_value_get_boolean(&booleanValue)); - - mkdg_g_value_from_string(&booleanValue, "F"); - g_assert(!g_value_get_boolean(&booleanValue)); - - mkdg_g_value_from_string(&booleanValue, "true"); - g_assert(g_value_get_boolean(&booleanValue)); - - mkdg_g_value_from_string(&booleanValue, "false"); - g_assert(!g_value_get_boolean(&booleanValue)); - - g_value_unset(&booleanValue); -} - /************************************** * String Utility Macros */ @@ -115,8 +33,6 @@ void STRING_EQUALS_test() { gint main(gint argc, gchar **argv) { g_test_init(&argc, &argv, NULL); - TEST_RUN_THIS(mkdg_g_value_to_string_test); - TEST_RUN_THIS(mkdg_g_value_from_string_test); TEST_RUN_THIS(QUOTE_ME_test); TEST_RUN_THIS(STRING_IS_EMPTY_test); #if 0 diff --git a/test/ibus-chewing-engine-test.c b/test/ibus-chewing-engine-test.c index 878c792..01d8ae9 100644 --- a/test/ibus-chewing-engine-test.c +++ b/test/ibus-chewing-engine-test.c @@ -3,6 +3,8 @@ #include "ibus-chewing-engine.h" #include "test-util.h" #include +#include + #define TEST_RUN_THIS(f) add_test_case("ibus-chewing-engine", f) static IBusChewingEngine *engine = NULL; @@ -11,8 +13,7 @@ IBusChewingEngine *ibus_chewing_engine_new() { return (IBusChewingEngine *)g_object_new(IBUS_TYPE_CHEWING_ENGINE, NULL); } -void check_output(const gchar *outgoing, const gchar *preEdit, - const gchar *aux) { +void check_output(const gchar *outgoing, const gchar *preEdit, const gchar *aux) { g_assert(engine->outgoingText); g_assert(engine->outgoingText->text); printf("outgoingText->text=%s\n", engine->outgoingText->text); @@ -24,38 +25,30 @@ void check_output(const gchar *outgoing, const gchar *preEdit, } void focus_out_then_focus_in_with_aux_text_test() { - gboolean cleanBufferFocusOut = ibus_chewing_pre_edit_get_property_boolean( - engine->icPreEdit, "clean-buffer-focus-out"); - - ibus_chewing_pre_edit_save_property_boolean(engine->icPreEdit, - "add-phrase-direction", TRUE); + gboolean cleanBufferFocusOut; + g_object_get(G_OBJECT(engine), "clean-buffer-focus-out", &cleanBufferFocusOut, NULL); + g_object_set(G_OBJECT(engine), "add-phrase-direction", TRUE, NULL); g_signal_emit_by_name(engine, "set_capabilities", IBUS_CAP_AUXILIARY_TEXT); ibus_chewing_engine_focus_in(IBUS_ENGINE(engine)); ibus_chewing_engine_enable(IBUS_ENGINE(engine)); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, 0); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, - IBUS_RELEASE_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, IBUS_RELEASE_MASK); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, 0); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, - IBUS_RELEASE_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, IBUS_RELEASE_MASK); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, 0); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, - IBUS_RELEASE_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), 'j', 0x24, IBUS_RELEASE_MASK); ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, 0); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, - IBUS_RELEASE_MASK); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '2', 0x03, - IBUS_CONTROL_MASK); - ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '2', 0x03, - IBUS_RELEASE_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '3', 0x04, IBUS_RELEASE_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '2', 0x03, IBUS_CONTROL_MASK); + ibus_chewing_engine_process_key_event(IBUS_ENGINE(engine), '2', 0x03, IBUS_RELEASE_MASK); check_output("", "五五", "已有:五五"); /* focus out should not touch Texts */ ibus_chewing_engine_focus_out(IBUS_ENGINE(engine)); - g_assert(cleanBufferFocusOut == - ibus_chewing_pre_edit_get_property_boolean( - engine->icPreEdit, "clean-buffer-focus-out")); + gboolean value; + g_object_get(G_OBJECT(engine), "clean-buffer-focus-out", &value, NULL); + g_assert(cleanBufferFocusOut == value); if (cleanBufferFocusOut) { check_output("", "", ""); @@ -72,14 +65,12 @@ void focus_out_then_focus_in_with_aux_text_test() { } void focus_out_then_focus_in_with_aux_text_clean_buffer_on_test() { - ibus_chewing_pre_edit_save_property_boolean(engine->icPreEdit, - "clean-buffer-focus-out", TRUE); + g_object_set(G_OBJECT(engine), "clean-buffer-focus-out", TRUE, NULL); focus_out_then_focus_in_with_aux_text_test(); } void focus_out_then_focus_in_with_aux_text_clean_buffer_off_test() { - ibus_chewing_pre_edit_save_property_boolean( - engine->icPreEdit, "clean-buffer-focus-out", FALSE); + g_object_set(G_OBJECT(engine), "clean-buffer-focus-out", FALSE, NULL); focus_out_then_focus_in_with_aux_text_test(); } @@ -87,16 +78,10 @@ gint main(gint argc, gchar **argv) { g_test_init(&argc, &argv, NULL); mkdg_log_set_level(DEBUG); engine = ibus_chewing_engine_new(); - ibus_chewing_pre_edit_save_property_int(engine->icPreEdit, - "max-chi-symbol-len", 8); - - gboolean cleanBufferFocusOut = ibus_chewing_pre_edit_get_property_boolean( - engine->icPreEdit, "clean-buffer-focus-out"); + g_object_set(G_OBJECT(engine), "max-chi-symbol-len", 8, NULL); TEST_RUN_THIS(focus_out_then_focus_in_with_aux_text_clean_buffer_off_test); TEST_RUN_THIS(focus_out_then_focus_in_with_aux_text_clean_buffer_on_test); - ibus_chewing_pre_edit_save_property_boolean( - engine->icPreEdit, "clean-buffer-focus-out", cleanBufferFocusOut); return g_test_run(); }