From 8633bf7d567854c6fce0827a2489f6a369f98ef7 Mon Sep 17 00:00:00 2001 From: Kan-Ru Chen Date: Sun, 4 Feb 2024 01:41:48 +0900 Subject: [PATCH] feat(wip)!: use gtk4 --- .github/workflows/ci.yml | 4 ++-- CMakeLists.txt | 2 +- src/CMakeLists.txt | 2 +- src/MakerDialogWidget.c | 44 +++++++++++++----------------------- src/ibus-setup-chewing.c | 31 ++++++++++++++++++-------- src/main.c | 2 +- src/maker-dialog.c | 48 ++++++++++++++++++++-------------------- 7 files changed, 66 insertions(+), 67 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6008450..1eee193 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v3 - name: Install build dependencies - run: sudo apt install -y libgtk-3-dev libibus-1.0-dev libx11-dev libchewing3-dev ibus gettext xvfb + run: sudo apt install -y libgtk-4-dev libibus-1.0-dev libx11-dev libchewing3-dev ibus gettext xvfb - name: Build run: | @@ -35,7 +35,7 @@ jobs: - uses: actions/checkout@v3 - name: Install build dependencies - run: sudo apt install -y libgtk-3-dev libibus-1.0-dev libx11-dev libchewing3-dev ibus gettext xvfb + run: sudo apt install -y libgtk-4-dev libibus-1.0-dev libx11-dev libchewing3-dev ibus gettext xvfb - name: Install llvm run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 4caa625..bf78457 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,7 +49,7 @@ add_compile_definitions( ) pkg_check_modules(GLIB2 REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GTK3 REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GTK4 REQUIRED IMPORTED_TARGET gtk4) pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) set(CMAKE_C_STANDARD 99) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f334a98..8afd623 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,7 @@ endif() target_link_libraries(gui-core PUBLIC common PkgConfig::GLIB2 - PkgConfig::GTK3 + PkgConfig::GTK4 PkgConfig::X11 PkgConfig::IBUS PkgConfig::CHEWING diff --git a/src/MakerDialogWidget.c b/src/MakerDialogWidget.c index 2b00123..af9f637 100644 --- a/src/MakerDialogWidget.c +++ b/src/MakerDialogWidget.c @@ -179,7 +179,7 @@ static void on_entry_activate_wrap(GtkEntry * entry, gpointer userData) MkdgWidget *mWidget = (MkdgWidget *) userData; GValue gValue = { 0 }; g_value_init(&gValue, mWidget->ctx->spec->valueType); - g_value_set_string(&gValue, gtk_entry_get_text(entry)); + g_value_set_string(&gValue, gtk_editable_get_text(GTK_EDITABLE(entry))); mkdg_log(INFO, "on_entry_activate_wrap(), key=%s value=%s", mWidget->ctx->spec->key, g_value_get_string(&gValue)); on_value_change(mWidget, &gValue); @@ -234,10 +234,11 @@ static void on_toggleButton_toggled_wrap(GtkToggleButton * button, gint mkdg_wgt_get_width(MkdgWgt * wgt) { - GtkRequisition requisition; + GtkRequisition min_size; + GtkRequisition natural_size; - gtk_widget_size_request(wgt, &requisition); - return requisition.width; + gtk_widget_get_preferred_size(wgt, &min_size, &natural_size); + return natural_size.width; } void mkdg_wgt_set_width(MkdgWgt * wgt, gint width) @@ -247,7 +248,8 @@ void mkdg_wgt_set_width(MkdgWgt * wgt, gint width) void mkdg_wgt_set_alignment(MkdgWgt * wgt, gfloat xAlign, gfloat yAlign) { - gtk_misc_set_alignment(GTK_MISC(wgt), xAlign, yAlign); + gtk_widget_set_halign(wgt, xAlign); + gtk_widget_set_valign(wgt, yAlign); if (GTK_IS_LABEL(wgt)) { /* gtk_label_set_justify takes no effect on single line label, * but multi-lined label need this @@ -256,22 +258,6 @@ void mkdg_wgt_set_alignment(MkdgWgt * wgt, gfloat xAlign, gfloat yAlign) } } -void mkdg_wgt_show(MkdgWgt * wgt) -{ - gtk_widget_show(wgt); -} - -void mkdg_wgt_show_all(MkdgWgt * wgt) -{ - gtk_widget_show_all(wgt); -} - -void mkdg_wgt_destroy(MkdgWgt * wgt) -{ - gtk_widget_destroy(wgt); -} - - /*===================================== * MkdgWidgetContainer subroutines */ @@ -302,10 +288,10 @@ void mkdg_widget_container_add_widget(MkdgWidgetContainer * container, MkdgWgt *labelWgt = MKDG_WGT(mWidget->label); MkdgWgt *wgt = mWidget->wgt; - gtk_box_pack_start(GTK_BOX(hbox), labelWgt, FALSE, FALSE, 0); - mkdg_wgt_show(labelWgt); - gtk_box_pack_start(GTK_BOX(hbox), wgt, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_box_prepend(GTK_BOX(hbox), labelWgt); + // mkdg_wgt_show(labelWgt); + gtk_box_prepend(GTK_BOX(hbox), wgt); + gtk_box_prepend(GTK_BOX(vbox), hbox); g_ptr_array_add(container->children, mWidget); container->childrenLabelWidth = @@ -375,7 +361,7 @@ MkdgWidget *mkdg_widget_new(PropertyContext * ctx, MkdgWidgetFlag widgetFlags) switch (ctx->spec->valueType) { case G_TYPE_BOOLEAN: bValue = g_value_get_boolean(property_context_get(ctx)); - wgt = gtk_check_button_new(); + wgt = gtk_toggle_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wgt), bValue); g_signal_connect(wgt, "toggled", G_CALLBACK(on_toggleButton_toggled_wrap), mWidget); @@ -452,7 +438,7 @@ MkdgWidget *mkdg_widget_new(PropertyContext * ctx, MkdgWidgetFlag widgetFlags) if (ctx->spec->max >= 0) { gtk_entry_set_max_length(GTK_ENTRY(wgt), ctx->spec->max); } - gtk_entry_set_text(GTK_ENTRY(wgt), strValue); + gtk_editable_set_text(GTK_EDITABLE(wgt), strValue); gtk_editable_set_editable(GTK_EDITABLE(wgt), !(ctx->spec->propertyFlags & MKDG_PROPERTY_FLAG_NO_NEW)); @@ -525,7 +511,7 @@ GValue *mkdg_widget_get_widget_value(MkdgWidget * mWidget, GValue * value) g_value_unset(strValue); } else { g_value_set_string(value, - gtk_entry_get_text(GTK_ENTRY(mWidget->wgt))); + gtk_editable_get_text(GTK_EDITABLE(mWidget->wgt))); } break; default: @@ -571,7 +557,7 @@ gboolean mkdg_widget_set_widget_value(MkdgWidget * mWidget, GValue * value) gtk_combo_box_set_active(GTK_COMBO_BOX(mWidget->wgt), index); } else { g_value_set_string(value, - gtk_entry_get_text(GTK_ENTRY(mWidget->wgt))); + gtk_editable_get_text(GTK_EDITABLE(mWidget->wgt))); } break; default: diff --git a/src/ibus-setup-chewing.c b/src/ibus-setup-chewing.c index a65fb6f..1d25dbe 100644 --- a/src/ibus-setup-chewing.c +++ b/src/ibus-setup-chewing.c @@ -52,6 +52,15 @@ static const GOptionEntry entries[] = { {NULL}, }; + +void save_values(GtkDialog *sDialog, gint response_id, gpointer mDialog) +{ + if (response_id != GTK_RESPONSE_OK) { + return; + } + maker_dialog_save_all_widgets_values(mDialog, NULL); +} + gint start_dialog() { #ifdef USE_GSETTINGS @@ -76,14 +85,15 @@ gint start_dialog() MKDG_BUTTON_FLAG_OK | MKDG_BUTTON_FLAG_CANCEL); GtkWidget *sDialog = GTK_WIDGET(mDialog); - gtk_widget_show_all(sDialog); - gint result = gtk_dialog_run(GTK_DIALOG(sDialog)); + gtk_window_present(GTK_WINDOW(mDialog)); + g_signal_connect(sDialog, "response", G_CALLBACK(save_values), mDialog); + // gint result = gtk_dialog_run(GTK_DIALOG(sDialog)); - gtk_widget_hide(sDialog); - if (result != GTK_RESPONSE_OK) { - return 3; - } - maker_dialog_save_all_widgets_values(mDialog, NULL); + // gtk_widget_hide(sDialog); + // if (result != GTK_RESPONSE_OK) { + // return 3; + // } + // maker_dialog_save_all_widgets_values(mDialog, NULL); return 0; } @@ -92,7 +102,7 @@ gint main(gint argc, gchar * argv[]) GError *error = NULL; GOptionContext *context; - gtk_init(&argc, &argv); + gtk_init(); /* Init i18n messages */ setlocale(LC_ALL, ""); @@ -117,7 +127,10 @@ gint main(gint argc, gchar * argv[]) return 0; } mkdg_log_set_level(verbose); - return start_dialog(); + start_dialog(); + while (true) + g_main_context_iteration (NULL, TRUE); + return 0; } /* vim:set et sts=4: */ diff --git a/src/main.c b/src/main.c index 997044f..cc46588 100644 --- a/src/main.c +++ b/src/main.c @@ -166,7 +166,7 @@ int main(gint argc, gchar * argv[]) GError *error = NULL; GOptionContext *context; - gtk_init(&argc, &argv); + gtk_init(); /* Init i18n messages */ setlocale(LC_ALL, ""); diff --git a/src/maker-dialog.c b/src/maker-dialog.c index 4d0b636..df0a912 100644 --- a/src/maker-dialog.c +++ b/src/maker-dialog.c @@ -125,7 +125,7 @@ ___finalize(GObject *obj_self) #define __GOB_FUNCTION__ "Maker:Dialog::finalize" MakerDialog *self G_GNUC_UNUSED = MAKER_DIALOG (obj_self); gpointer priv G_GNUC_UNUSED = self->_priv; - if(self->notebookWgt) { mkdg_wgt_destroy ((gpointer) self->notebookWgt); self->notebookWgt = NULL; } + if(self->notebookWgt) { g_object_unref ((gpointer) self->notebookWgt); self->notebookWgt = NULL; } if(self->_priv->containerTable) { g_hash_table_destroy ((gpointer) self->_priv->containerTable); self->_priv->containerTable = NULL; } if(self->_priv->widgetTable) { g_hash_table_destroy ((gpointer) self->_priv->widgetTable); self->_priv->widgetTable = NULL; } if(self->_priv->notebookContentTable) { g_hash_table_destroy ((gpointer) self->_priv->notebookContentTable); self->_priv->notebookContentTable = NULL; } @@ -213,7 +213,7 @@ maker_dialog_new_full (MkdgProperties * properties, const gchar * title, MkdgWid GtkDialog * dialog = GTK_DIALOG(self); gtk_window_set_title(GTK_WINDOW(dialog), title); gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + // gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); self->wFlags = wFlags; self->_priv->properties = properties; @@ -231,11 +231,11 @@ maker_dialog_new_full (MkdgProperties * properties, const gchar * title, MkdgWid /* Create Notebook */ self->notebookWgt = gtk_notebook_new(); - gtk_container_set_border_width(GTK_CONTAINER(self->notebookWgt), 5); - mkdg_wgt_show(self->notebookWgt); + // gtk_container_set_border_width(GTK_CONTAINER(self->notebookWgt), 5); + // mkdg_wgt_show(self->notebookWgt); GtkWidget *dialogVboxWgt = gtk_dialog_get_content_area(GTK_DIALOG(self)); - mkdg_wgt_show(dialogVboxWgt); - gtk_box_pack_start(GTK_BOX(dialogVboxWgt), self->notebookWgt, TRUE, TRUE, 0); + // mkdg_wgt_show(dialogVboxWgt); + gtk_box_prepend(GTK_BOX(dialogVboxWgt), self->notebookWgt); self_prepare(self); return self; @@ -280,15 +280,15 @@ maker_dialog_add_property (MakerDialog * self, PropertyContext * ctx) /* Do we need a new container/page? */ if (container == NULL) { MkdgWgt * vboxWgt = gtk_box_new(GTK_ORIENTATION_VERTICAL, MKDG_VBOX_SPACING_DEFAULT); - gtk_container_set_border_width(GTK_CONTAINER (vboxWgt), 10); - mkdg_wgt_show(vboxWgt); + // gtk_container_set_border_width(GTK_CONTAINER (vboxWgt), 10); + // mkdg_wgt_show(vboxWgt); container = mkdg_widget_container_new(vboxWgt); g_hash_table_insert(self->_priv->containerTable, (gpointer) pageName, (gpointer) container); /* new notebook page */ MkdgWgt * pageLabelWgt = gtk_label_new(_(pageName)); - mkdg_wgt_show(pageLabelWgt); + // mkdg_wgt_show(pageLabelWgt); gtk_notebook_append_page(GTK_NOTEBOOK(self->notebookWgt), vboxWgt, pageLabelWgt); } @@ -496,22 +496,22 @@ maker_dialog_set_widget_value (MakerDialog * self, const gchar * key, GValue * v }} #undef __GOB_FUNCTION__ -/** - * maker_dialog_show: - * @self: A MakerDialog. - * - **/ -void -maker_dialog_show (MakerDialog * self) -{ -#define __GOB_FUNCTION__ "Maker:Dialog::show" - g_return_if_fail (self != NULL); - g_return_if_fail (MAKER_IS_DIALOG (self)); -{ +// /** +// * maker_dialog_show: +// * @self: A MakerDialog. +// * +// **/ +// void +// maker_dialog_show (MakerDialog * self) +// { +// #define __GOB_FUNCTION__ "Maker:Dialog::show" +// g_return_if_fail (self != NULL); +// g_return_if_fail (MAKER_IS_DIALOG (self)); +// { - mkdg_wgt_show_all(GTK_WIDGET(self)); - }} -#undef __GOB_FUNCTION__ +// mkdg_wgt_show_all(GTK_WIDGET(self)); +// }} +// #undef __GOB_FUNCTION__ MkdgWidget * maker_dialog_get_widget_by_key (MakerDialog * self, const gchar * key)