diff --git a/src/gtk/assertdlg_gtk.cpp b/src/gtk/assertdlg_gtk.cpp index 3efdc27b13..12cc36109f 100644 --- a/src/gtk/assertdlg_gtk.cpp +++ b/src/gtk/assertdlg_gtk.cpp @@ -37,13 +37,10 @@ GtkAssertDialog helpers ---------------------------------------------------------------------------- */ +// This function is called only for GTK+ < 3.10 static GtkWidget *gtk_assert_dialog_add_button_to (GtkBox *box, const gchar *label, -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - const gchar *icon) -#else const gchar *stock) -#endif // GTK >= 3.10 / < 3.10 { /* create the button */ GtkWidget *button = gtk_button_new_with_mnemonic (label); @@ -51,13 +48,11 @@ GtkWidget *gtk_assert_dialog_add_button_to (GtkBox *box, const gchar *label, /* add a stock icon inside it */ #ifdef __WXGTK4__ - gtk_button_set_icon_name (GTK_BUTTON (button), icon); + gtk_button_set_icon_name (GTK_BUTTON (button), stock); #else - #if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - GtkWidget *image = gtk_image_new_from_icon_name(icon, GTK_ICON_SIZE_BUTTON); - #else + wxGCC_WARNING_SUPPRESS(deprecated-declarations) GtkWidget *image = gtk_image_new_from_stock (stock, GTK_ICON_SIZE_BUTTON); - #endif // GTK >= 3.10 / < 3.10 + wxGCC_WARNING_RESTORE() gtk_button_set_image (GTK_BUTTON (button), image); #endif @@ -72,6 +67,7 @@ GtkWidget *gtk_assert_dialog_add_button_to (GtkBox *box, const gchar *label, return button; } +// This function is called only for GTK+ < 3.10 static GtkWidget *gtk_assert_dialog_add_button (GtkAssertDialog *dlg, const gchar *label, const gchar *stock, gint response_id) @@ -87,6 +83,7 @@ GtkWidget *gtk_assert_dialog_add_button (GtkAssertDialog *dlg, const gchar *labe #if wxUSE_STACKWALKER +// This function is called only for GTK+ < 3.10 static void gtk_assert_dialog_append_text_column (GtkWidget *treeview, const gchar *name, int index) { @@ -101,6 +98,7 @@ void gtk_assert_dialog_append_text_column (GtkWidget *treeview, const gchar *nam gtk_tree_view_column_set_reorderable (column, TRUE); } +// This function is called only for GTK+ < 3.10 static GtkWidget *gtk_assert_dialog_create_backtrace_list_model () { @@ -256,6 +254,9 @@ static void gtk_assert_dialog_continue_callback(GtkWidget*, GtkAssertDialog* dlg ---------------------------------------------------------------------------- */ extern "C" { +#if GTK_CHECK_VERSION(3,10,0) +static void gtk_assert_dialog_class_init(gpointer g_class, void*); +#endif // GTK+ >= 3.10 static void gtk_assert_dialog_init(GTypeInstance* instance, void*); } @@ -270,7 +271,11 @@ GType gtk_assert_dialog_get_type() sizeof (GtkAssertDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ +#if GTK_CHECK_VERSION(3,10,0) + gtk_assert_dialog_class_init, /* class init */ +#else NULL, +#endif // GTK+ >= 3.10 / < 3.10 NULL, /* class_finalize */ NULL, /* class_data */ sizeof (GtkAssertDialog), @@ -285,139 +290,530 @@ GType gtk_assert_dialog_get_type() } extern "C" { +// For GTK+ >= 3.10, Composite Widget Templates are used to define composite widgets. +#if GTK_CHECK_VERSION(3,10,0) +static void gtk_assert_dialog_class_init(gpointer g_class, void*) +{ + if (gtk_check_version(3,10,0) == NULL) + { + // GtkBuilder XML to be bound to the dialog class data + static const char dlgTempl[] = + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "True" + "False" + "go-next" + "" + "" + "True" + "False" + "edit-copy" + "" + "" + "True" + "False" + "document-save" + "" + "" + "True" + "False" + "application-exit" + "" + "" + ""; + + // Verify numeric values of response codes hard-coded in the XML + wxASSERT(GTK_ASSERT_DIALOG_STOP == 0); + wxASSERT(GTK_ASSERT_DIALOG_CONTINUE == 1); + + GtkWidgetClass* widgetClass = GTK_WIDGET_CLASS(g_class); + + GBytes* templBytes = g_bytes_new_static(dlgTempl, sizeof(dlgTempl)-1); + gtk_widget_class_set_template(widgetClass, templBytes); + + // Define the relationship of the entries in GtkAssertDialog and entries defined in the XML + gtk_widget_class_bind_template_child(widgetClass, GtkAssertDialog, message); +#if wxUSE_STACKWALKER + gtk_widget_class_bind_template_child(widgetClass, GtkAssertDialog, expander); + gtk_widget_class_bind_template_child(widgetClass, GtkAssertDialog, treeview); +#endif // wxUSE_STACKWALKER + gtk_widget_class_bind_template_child(widgetClass, GtkAssertDialog, shownexttime); + + // Bind connections defined in the GtkBuilder XML + // with callbacks exposed by GtkAssertDialog. +#if wxUSE_STACKWALKER + gtk_widget_class_bind_template_callback(widgetClass, gtk_assert_dialog_expander_callback); + gtk_widget_class_bind_template_callback(widgetClass, gtk_assert_dialog_save_backtrace_callback); + gtk_widget_class_bind_template_callback(widgetClass, gtk_assert_dialog_copy_callback); +#endif // wxUSE_STACKWALKER + gtk_widget_class_bind_template_callback(widgetClass, gtk_assert_dialog_continue_callback); + } +} +#endif // GTK+ >= 3.10 + static void gtk_assert_dialog_init(GTypeInstance* instance, void*) { - GtkAssertDialog* dlg = GTK_ASSERT_DIALOG(instance); - GtkWidget *continuebtn; - + // For GTK+ >= 3.10 create and initialize the dialog from the already assigned template + // or create the dialog "manually" otherwise. +#if GTK_CHECK_VERSION(3,10,0) + if (gtk_check_version(3,10,0) == NULL) { - GtkWidget *vbox, *hbox, *image; - - /* start the main vbox */ - gtk_widget_push_composite_child (); - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_container_set_border_width (GTK_CONTAINER(vbox), 8); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg))), vbox, true, true, 5); - - - /* add the icon+message hbox */ - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - - /* icon */ -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - image = gtk_image_new_from_icon_name("dialog-error", GTK_ICON_SIZE_DIALOG); -#else - image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); -#endif // GTK >= 3.10 / < 3.10 - gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 12); + GtkAssertDialog* dlg = GTK_ASSERT_DIALOG(instance); + gtk_widget_init_template(GTK_WIDGET(dlg)); + /* complete creation */ + dlg->callback = NULL; + dlg->userdata = NULL; + } + else +#endif // GTK+ >= 3.10 + { + GtkAssertDialog* dlg = GTK_ASSERT_DIALOG(instance); + GtkWidget *continuebtn; + // This code is called only for GTK+ < 3.10 { - GtkWidget *vbox2, *info; + GtkWidget *vbox, *hbox, *image; - /* message */ - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0); - info = gtk_label_new ("An assertion failed!"); - gtk_box_pack_start (GTK_BOX(vbox2), info, TRUE, TRUE, 8); + /* start the main vbox */ + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + gtk_widget_push_composite_child (); + wxGCC_WARNING_RESTORE() + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_container_set_border_width (GTK_CONTAINER(vbox), 8); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg))), vbox, true, true, 5); - /* assert message */ - dlg->message = gtk_label_new (NULL); - gtk_label_set_selectable (GTK_LABEL (dlg->message), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (dlg->message), TRUE); - gtk_label_set_justify (GTK_LABEL (dlg->message), GTK_JUSTIFY_LEFT); - gtk_widget_set_size_request (GTK_WIDGET(dlg->message), 450, -1); - gtk_box_pack_end (GTK_BOX(vbox2), GTK_WIDGET(dlg->message), TRUE, TRUE, 8); + /* add the icon+message hbox */ + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + /* icon */ + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); + wxGCC_WARNING_RESTORE() + gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 12); + + { + GtkWidget *vbox2, *info; + + /* message */ + vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0); + info = gtk_label_new ("An assertion failed!"); + gtk_box_pack_start (GTK_BOX(vbox2), info, TRUE, TRUE, 8); + + /* assert message */ + dlg->message = gtk_label_new (NULL); + gtk_label_set_selectable (GTK_LABEL (dlg->message), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (dlg->message), TRUE); + gtk_label_set_justify (GTK_LABEL (dlg->message), GTK_JUSTIFY_LEFT); + gtk_widget_set_size_request (GTK_WIDGET(dlg->message), 450, -1); + + gtk_box_pack_end (GTK_BOX(vbox2), GTK_WIDGET(dlg->message), TRUE, TRUE, 8); + } + +#if wxUSE_STACKWALKER + /* add the expander */ + dlg->expander = gtk_expander_new_with_mnemonic ("Back_trace:"); + gtk_box_pack_start (GTK_BOX(vbox), dlg->expander, TRUE, TRUE, 0); + g_signal_connect (dlg->expander, "activate", + G_CALLBACK(gtk_assert_dialog_expander_callback), dlg); +#endif // wxUSE_STACKWALKER } - #if wxUSE_STACKWALKER - /* add the expander */ - dlg->expander = gtk_expander_new_with_mnemonic ("Back_trace:"); - gtk_box_pack_start (GTK_BOX(vbox), dlg->expander, TRUE, TRUE, 0); - g_signal_connect (dlg->expander, "activate", - G_CALLBACK(gtk_assert_dialog_expander_callback), dlg); -#endif // wxUSE_STACKWALKER - } -#if wxUSE_STACKWALKER - { - GtkWidget *hbox, *vbox, *button, *sw; + { + GtkWidget *hbox, *vbox, *button, *sw; - /* create expander's vbox */ - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (dlg->expander), vbox); + /* create expander's vbox */ + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (dlg->expander), vbox); - /* add a scrollable window under the expander */ - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX(vbox), sw, TRUE, TRUE, 8); + /* add a scrollable window under the expander */ + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_box_pack_start (GTK_BOX(vbox), sw, TRUE, TRUE, 8); - /* add the treeview to the scrollable window */ - dlg->treeview = gtk_assert_dialog_create_backtrace_list_model (); - gtk_widget_set_size_request (GTK_WIDGET(dlg->treeview), -1, 180); - gtk_container_add (GTK_CONTAINER (sw), dlg->treeview); + /* add the treeview to the scrollable window */ + dlg->treeview = gtk_assert_dialog_create_backtrace_list_model (); + gtk_widget_set_size_request (GTK_WIDGET(dlg->treeview), -1, 180); + gtk_container_add (GTK_CONTAINER (sw), dlg->treeview); - /* create button's hbox */ - hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - gtk_box_pack_end (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - gtk_button_box_set_layout (GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); + /* create button's hbox */ + hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); + gtk_box_pack_end (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_button_box_set_layout (GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); - /* add the buttons */ - button = gtk_assert_dialog_add_button_to (GTK_BOX(hbox), "Save to _file", -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - "document-save"); -#else - GTK_STOCK_SAVE); -#endif // GTK >= 3.10 / < 3.10 - g_signal_connect (button, "clicked", - G_CALLBACK(gtk_assert_dialog_save_backtrace_callback), dlg); + /* add the buttons */ + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + button = gtk_assert_dialog_add_button_to (GTK_BOX(hbox), "Save to _file", GTK_STOCK_SAVE); + wxGCC_WARNING_RESTORE() + g_signal_connect (button, "clicked", + G_CALLBACK(gtk_assert_dialog_save_backtrace_callback), dlg); - button = gtk_assert_dialog_add_button_to (GTK_BOX(hbox), "Copy to clip_board", -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - "edit-copy"); -#else - GTK_STOCK_COPY); -#endif // GTK >= 3.10 / < 3.10 - g_signal_connect (button, "clicked", G_CALLBACK(gtk_assert_dialog_copy_callback), dlg); - } + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + button = gtk_assert_dialog_add_button_to (GTK_BOX(hbox), "Copy to clip_board", GTK_STOCK_COPY); + wxGCC_WARNING_RESTORE() + g_signal_connect (button, "clicked", G_CALLBACK(gtk_assert_dialog_copy_callback), dlg); + } #endif // wxUSE_STACKWALKER - /* add the checkbutton */ - dlg->shownexttime = gtk_check_button_new_with_mnemonic("Show this _dialog the next time"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dlg->shownexttime), TRUE); - gtk_box_pack_end(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dlg))), dlg->shownexttime, false, true, 8); + /* add the checkbutton */ + dlg->shownexttime = gtk_check_button_new_with_mnemonic("Show this _dialog the next time"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dlg->shownexttime), TRUE); + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + gtk_box_pack_end(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dlg))), dlg->shownexttime, false, true, 8); + wxGCC_WARNING_RESTORE() - /* add the stop button */ - gtk_assert_dialog_add_button (dlg, "_Stop", -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - "application-exit", -#else - GTK_STOCK_QUIT, -#endif // GTK >= 3.10 / < 3.10 - GTK_ASSERT_DIALOG_STOP); + /* add the stop button */ + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + gtk_assert_dialog_add_button (dlg, "_Stop", GTK_STOCK_QUIT, GTK_ASSERT_DIALOG_STOP); + wxGCC_WARNING_RESTORE() - /* add the continue button */ - continuebtn = gtk_assert_dialog_add_button (dlg, "_Continue", -#if defined(__WXGTK3__) && GTK_CHECK_VERSION(3,10,0) - "go-next", -#else - GTK_STOCK_YES, -#endif - GTK_ASSERT_DIALOG_CONTINUE); - gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_ASSERT_DIALOG_CONTINUE); - g_signal_connect (continuebtn, "clicked", G_CALLBACK(gtk_assert_dialog_continue_callback), dlg); + /* add the continue button */ + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + continuebtn = gtk_assert_dialog_add_button (dlg, "_Continue", GTK_STOCK_YES, GTK_ASSERT_DIALOG_CONTINUE); + wxGCC_WARNING_RESTORE() + gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_ASSERT_DIALOG_CONTINUE); + g_signal_connect (continuebtn, "clicked", G_CALLBACK(gtk_assert_dialog_continue_callback), dlg); - /* complete creation */ - dlg->callback = NULL; - dlg->userdata = NULL; + /* complete creation */ + dlg->callback = NULL; + dlg->userdata = NULL; - /* the resizable property of this window is modified by the expander: - when it's collapsed, the window must be non-resizable! */ - gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE); - gtk_widget_pop_composite_child (); - gtk_widget_show_all (GTK_WIDGET(dlg)); + /* the resizable property of this window is modified by the expander: + when it's collapsed, the window must be non-resizable! */ + gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE); + wxGCC_WARNING_SUPPRESS(deprecated-declarations) + gtk_widget_pop_composite_child (); + wxGCC_WARNING_RESTORE() + gtk_widget_show_all (GTK_WIDGET(dlg)); + } } }