Blob Blame Raw
From b0462c5b29b78961e4ec4a8ee706baa25b936d43 Mon Sep 17 00:00:00 2001
From: Jakub Filak <jfilak@redhat.com>
Date: Wed, 30 Jul 2014 09:33:54 +0200
Subject: [PATCH 16/20] gui: conver report-gtk to GtkApplication

- improves compatibility with GNOME
- allows us to move "Preferences" to the application menu

Signed-off-by: Jakub Filak <jfilak@redhat.com>
---
 src/gui-wizard-gtk/main.c       | 60 ++++++++++++++++++++++++++++++++++++-----
 src/gui-wizard-gtk/wizard.c     | 26 ++++--------------
 src/gui-wizard-gtk/wizard.glade | 39 ---------------------------
 src/gui-wizard-gtk/wizard.h     |  2 +-
 4 files changed, 60 insertions(+), 67 deletions(-)

diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
index 0bfa45c..697b91f 100644
--- a/src/gui-wizard-gtk/main.c
+++ b/src/gui-wizard-gtk/main.c
@@ -72,6 +72,55 @@ void problem_data_reload_from_dump_dir(void)
     g_cd = new_cd;
 }
 
+static void
+preferences_activated(GSimpleAction *action,
+                           GVariant *parameter,
+                           gpointer data)
+{
+    GtkApplication *app = GTK_APPLICATION(data);
+    show_config_list_dialog(GTK_WINDOW(gtk_application_get_active_window(app)));
+}
+
+static void
+quit_activated(GSimpleAction *action,
+                           GVariant *parameter,
+                           gpointer data)
+{
+    g_application_quit(G_APPLICATION(data));
+}
+
+static GActionEntry app_entries[] =
+{
+    { "preferences", preferences_activated, NULL, NULL, NULL },
+    { "quit", quit_activated, NULL, NULL, NULL }
+};
+
+static void
+startup_wizard(GApplication *app,
+                gpointer user_data)
+{
+    g_action_map_add_action_entries(G_ACTION_MAP (app),
+            app_entries, G_N_ELEMENTS (app_entries),
+            app);
+
+    GMenu *app_menu = g_menu_new();
+    g_menu_append(app_menu, _("Preferences"), "app.preferences");
+
+    GMenu *service_app_menu_sec = g_menu_new();
+    g_menu_append(service_app_menu_sec, _("Quit"), "app.quit");
+    g_menu_append_section(app_menu, /*no title*/NULL, G_MENU_MODEL(service_app_menu_sec));
+
+    gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL(app_menu));
+}
+
+static void
+activate_wizard(GApplication *app,
+                gpointer user_data)
+{
+    create_assistant(GTK_APPLICATION(app), (bool)user_data);
+    update_gui_state_from_problem_data(UPDATE_SELECTED_EVENT);
+}
+
 int main(int argc, char **argv)
 {
     bool expert_mode = false;
@@ -166,14 +215,13 @@ int main(int argc, char **argv)
 
     problem_data_reload_from_dump_dir();
 
-    create_assistant(expert_mode);
-
     g_custom_logger = &show_error_as_msgbox;
-
-    update_gui_state_from_problem_data(UPDATE_SELECTED_EVENT);
-
+    GtkApplication *app = gtk_application_new("org.freedesktop.libreport.report", G_APPLICATION_FLAGS_NONE);
+    g_signal_connect(app, "activate", G_CALLBACK(activate_wizard), (gpointer)expert_mode);
+    g_signal_connect(app, "startup",  G_CALLBACK(startup_wizard),  NULL);
     /* Enter main loop */
-    gtk_main();
+    g_application_run(G_APPLICATION(app), argc, argv);
+    g_object_unref(app);
 
     if (opts & OPT_d)
         delete_dump_dir_possibly_using_abrtd(g_dump_dir_name);
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 993b602..5c4bd6a 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -2174,12 +2174,6 @@ static void on_log_changed(GtkTextBuffer *buffer, gpointer user_data)
     gtk_widget_show(GTK_WIDGET(g_exp_report_log));
 }
 
-
-static void on_show_event_list_cb(GtkWidget *button, gpointer user_data)
-{
-    show_config_list_dialog(GTK_WINDOW(g_wnd_assistant));
-}
-
 #if 0
 static void log_ready_state(void)
 {
@@ -3237,16 +3231,6 @@ static void add_pages(void)
     gtk_widget_override_font(GTK_WIDGET(g_tv_event_log), g_monospace_font);
     fix_all_wrapped_labels(GTK_WIDGET(g_assistant));
 
-    /* Configure btn on select analyzers page */
-    GtkWidget *img_config_btn = gtk_image_new_from_icon_name("preferences-system", GTK_ICON_SIZE_BUTTON);
-    GtkWidget *config_btn = GTK_WIDGET(gtk_builder_get_object(g_builder, "button_cfg1"));
-    if (config_btn)
-    {
-        g_signal_connect(G_OBJECT(config_btn), "clicked", G_CALLBACK(on_show_event_list_cb), NULL);
-        gtk_button_set_image(GTK_BUTTON(config_btn), img_config_btn);
-        gtk_button_set_image_position(GTK_BUTTON(config_btn), GTK_POS_RIGHT);
-    }
-
     g_signal_connect(g_cb_no_comment, "toggled", G_CALLBACK(on_no_comment_toggled), NULL);
 
     g_signal_connect(g_rb_forbidden_words, "toggled", G_CALLBACK(on_forbidden_words_toggled), NULL);
@@ -3342,7 +3326,7 @@ static void assistant_quit_cb(void *obj, void *data)
         g_loaded_texts = NULL;
     }
 
-    gtk_main_quit();
+    gtk_widget_destroy(GTK_WIDGET(data));
 }
 
 static void on_btn_startcast(GtkWidget *btn, gpointer user_data)
@@ -3398,7 +3382,7 @@ static bool is_screencast_available()
     return status == 0;
 }
 
-void create_assistant(bool expert_mode)
+void create_assistant(GtkApplication *app, bool expert_mode)
 {
     g_loaded_texts = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 
@@ -3487,7 +3471,7 @@ void create_assistant(bool expert_mode)
     gtk_widget_hide(g_btn_onfail);
     gtk_widget_show(g_btn_next);
 
-    g_wnd_assistant = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
+    g_wnd_assistant = GTK_WINDOW(gtk_application_window_new(app));
     gtk_container_add(GTK_CONTAINER(g_wnd_assistant), GTK_WIDGET(g_box_assistant));
 
     gtk_window_set_default_size(g_wnd_assistant, DEFAULT_WIDTH, DEFAULT_HEIGHT);
@@ -3502,12 +3486,12 @@ void create_assistant(bool expert_mode)
 
     create_details_treeview();
 
-    g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), NULL);
+    g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
     g_signal_connect(g_btn_stop, "clicked", G_CALLBACK(on_btn_cancel_event), NULL);
     g_signal_connect(g_btn_onfail, "clicked", G_CALLBACK(on_btn_failed_cb), NULL);
     g_signal_connect(g_btn_next, "clicked", G_CALLBACK(on_next_btn_cb), NULL);
 
-    g_signal_connect(g_wnd_assistant, "destroy", G_CALLBACK(assistant_quit_cb), NULL);
+    g_signal_connect(g_wnd_assistant, "destroy", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
     g_signal_connect(g_assistant, "switch-page", G_CALLBACK(on_page_prepare), NULL);
 
     g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL);
diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade
index 9e43cce..854a402 100644
--- a/src/gui-wizard-gtk/wizard.glade
+++ b/src/gui-wizard-gtk/wizard.glade
@@ -618,45 +618,6 @@
             <property name="position">1</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkHBox" id="hbox2">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <child>
-              <object class="GtkButton" id="button_cfg1">
-                <property name="label">_Preferences</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkAlignment" id="alignment3">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
       </object>
     </child>
   </object>
diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h
index a6d8b5d..4c891dc 100644
--- a/src/gui-wizard-gtk/wizard.h
+++ b/src/gui-wizard-gtk/wizard.h
@@ -21,7 +21,7 @@
 
 #include "internal_libreport_gtk.h"
 
-void create_assistant(bool expert_mode);
+void create_assistant(GtkApplication *app, bool expert_mode);
 
 enum
 {
-- 
2.0.4