From 481c20e2da6f9092a662b82dfb1293b7eda62c4e Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Fri, 3 Apr 2020 06:38:28 +0500 Subject: interactive-dialog: Make a GTK template --- data/ui/screenshot-interactive-dialog.ui | 24 ++-- src/screenshot-interactive-dialog.c | 217 ++++++++++++++----------------- src/screenshot-interactive-dialog.h | 8 ++ 3 files changed, 122 insertions(+), 127 deletions(-) diff --git a/data/ui/screenshot-interactive-dialog.ui b/data/ui/screenshot-interactive-dialog.ui index c19dd2a..4b22d98 100644 --- a/data/ui/screenshot-interactive-dialog.ui +++ b/data/ui/screenshot-interactive-dialog.ui @@ -2,8 +2,9 @@ - + - 100 - 1 - 10 + 0 + 99 + 1 + 1
diff --git a/src/screenshot-interactive-dialog.c b/src/screenshot-interactive-dialog.c index 69f36d4..2276f7a 100644 --- a/src/screenshot-interactive-dialog.c +++ b/src/screenshot-interactive-dialog.c @@ -30,138 +30,97 @@ #include "screenshot-interactive-dialog.h" #include "screenshot-utils.h" -static GtkWidget *pointer_row = NULL; - #define TARGET_TOGGLE_DESKTOP 0 #define TARGET_TOGGLE_WINDOW 1 #define TARGET_TOGGLE_AREA 2 +struct _ScreenshotInteractiveDialog +{ + GtkApplicationWindow parent_instance; + + GtkWidget *capture_button; + GtkWidget *listbox; + GtkWidget *pointer; + GtkWidget *pointer_row; + GtkWidget *delay; + GtkAdjustment *delay_adjustment; + + GtkWidget *screen; + GtkWidget *window; + GtkWidget *selection; + + CaptureClickedCallback callback; + gpointer user_data; +}; + +G_DEFINE_TYPE (ScreenshotInteractiveDialog, screenshot_interactive_dialog, GTK_TYPE_APPLICATION_WINDOW) + static void -set_mode (gint mode) +set_mode (ScreenshotInteractiveDialog *self, + gint mode) { gboolean take_window_shot = (mode == TARGET_TOGGLE_WINDOW); gboolean take_area_shot = (mode == TARGET_TOGGLE_AREA); - gtk_widget_set_sensitive (pointer_row, !take_area_shot); + gtk_widget_set_sensitive (self->pointer_row, !take_area_shot); screenshot_config->take_window_shot = take_window_shot; screenshot_config->take_area_shot = take_area_shot; } static void -target_toggled_cb (GtkToggleButton *button, - gpointer data) +screen_toggled_cb (GtkToggleButton *button, + ScreenshotInteractiveDialog *self) { - int target_toggle = GPOINTER_TO_INT (data); - if (gtk_toggle_button_get_active (button)) - set_mode (target_toggle); + set_mode (self, TARGET_TOGGLE_DESKTOP); } static void -delay_spin_value_changed_cb (GtkSpinButton *button) +window_toggled_cb (GtkToggleButton *button, + ScreenshotInteractiveDialog *self) { - screenshot_config->delay = gtk_spin_button_get_value_as_int (button); + if (gtk_toggle_button_get_active (button)) + set_mode (self, TARGET_TOGGLE_WINDOW); } static void -include_pointer_toggled_cb (GtkSwitch *toggle, - gpointer data) +selection_toggled_cb (GtkToggleButton *button, + ScreenshotInteractiveDialog *self) { - screenshot_config->include_pointer = gtk_switch_get_active (toggle); - gtk_switch_set_state (toggle, gtk_switch_get_active (toggle)); + if (gtk_toggle_button_get_active (button)) + set_mode (self, TARGET_TOGGLE_AREA); } static void -connect_effects_frame (GtkBuilder *ui) +delay_spin_value_changed_cb (GtkSpinButton *button) { - GtkWidget *pointer; - - /** Include pointer **/ - pointer = GTK_WIDGET (gtk_builder_get_object (ui, "pointer")); - gtk_switch_set_active (GTK_SWITCH (pointer), screenshot_config->include_pointer); - g_signal_connect (pointer, "state-set", - G_CALLBACK (include_pointer_toggled_cb), - NULL); + screenshot_config->delay = gtk_spin_button_get_value_as_int (button); } static void -connect_screenshot_frame (GtkBuilder *ui) +include_pointer_toggled_cb (GtkSwitch *toggle, + gpointer data) { - GtkAdjustment *adjust; - GtkWidget *screen; - GtkWidget *selection; - GtkWidget *window; - GtkWidget *delay; - GSList *group; - - /** Grab whole screen **/ - group = NULL; - screen = GTK_WIDGET (gtk_builder_get_object (ui, "screen")); - - if (screenshot_config->take_window_shot || - screenshot_config->take_area_shot) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (screen), FALSE); - - g_signal_connect (screen, "toggled", - G_CALLBACK (target_toggled_cb), - GINT_TO_POINTER (TARGET_TOGGLE_DESKTOP)); - group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (screen)); - - /** Grab current window **/ - window = GTK_WIDGET (gtk_builder_get_object (ui, "window")); - gtk_radio_button_set_group (GTK_RADIO_BUTTON (window), group); - - if (screenshot_config->take_window_shot) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (window), TRUE); - g_signal_connect (window, "toggled", - G_CALLBACK (target_toggled_cb), - GINT_TO_POINTER (TARGET_TOGGLE_WINDOW)); - group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (window)); - - /** Grab area of the desktop **/ - selection = GTK_WIDGET (gtk_builder_get_object (ui, "selection")); - - if (screenshot_config->take_area_shot) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (selection), TRUE); - g_signal_connect (selection, "toggled", - G_CALLBACK (target_toggled_cb), - GINT_TO_POINTER (TARGET_TOGGLE_AREA)); - pointer_row = GTK_WIDGET (gtk_builder_get_object (ui, "pointerrow")); - gtk_widget_set_sensitive (pointer_row, !screenshot_config->take_area_shot); - - /** Grab after delay **/ - delay = GTK_WIDGET (gtk_builder_get_object (ui, "delay")); - - adjust = GTK_ADJUSTMENT (gtk_adjustment_new ((gdouble) screenshot_config->delay, - 0.0, 99.0, - 1.0, 1.0, - 0.0)); - - gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (delay), adjust); - g_signal_connect (delay, "value-changed", - G_CALLBACK (delay_spin_value_changed_cb), - NULL); + screenshot_config->include_pointer = gtk_switch_get_active (toggle); + gtk_switch_set_state (toggle, gtk_switch_get_active (toggle)); } -typedef struct { - GtkWidget *widget; - CaptureClickedCallback callback; - gpointer user_data; -} CaptureData; - static void -capture_button_clicked_cb (GtkButton *button, CaptureData *data) +capture_button_clicked_cb (GtkButton *button, + ScreenshotInteractiveDialog *self) { - gtk_widget_destroy (data->widget); - data->callback (data->user_data); - g_free (data); + CaptureClickedCallback callback = self->callback; + gpointer user_data = self->user_data; + + gtk_widget_destroy (GTK_WIDGET (self)); + callback (user_data); } static void -screenshot_listbox_update_header_func (GtkListBoxRow *row, - GtkListBoxRow *before, - gpointer user_data) +header_func (GtkListBoxRow *row, + GtkListBoxRow *before, + ScreenshotInteractiveDialog *self) { GtkWidget *current; @@ -180,43 +139,65 @@ screenshot_listbox_update_header_func (GtkListBoxRow *row, } } +static void +screenshot_interactive_dialog_class_init (ScreenshotInteractiveDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, + "/org/gnome/Screenshot/ui/screenshot-interactive-dialog.ui"); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, capture_button); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, listbox); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, pointer); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, pointer_row); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, delay); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, delay_adjustment); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, screen); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, window); + gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, selection); + gtk_widget_class_bind_template_callback (widget_class, screen_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, window_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, selection_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, delay_spin_value_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, include_pointer_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, capture_button_clicked_cb); +} + +static void +screenshot_interactive_dialog_init (ScreenshotInteractiveDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_list_box_set_header_func (GTK_LIST_BOX (self->listbox), + (GtkListBoxUpdateHeaderFunc) header_func, + self, + NULL); +} + GtkWidget * screenshot_interactive_dialog_new (CaptureClickedCallback f, gpointer user_data) { ScreenshotApplication *self = user_data; - GtkWidget *dialog; - GtkWidget *capture_button; - GtkWidget *listbox; - GtkBuilder *ui; - CaptureData *data; + ScreenshotInteractiveDialog *dialog; - ui = gtk_builder_new_from_resource ("/org/gnome/Screenshot/ui/screenshot-interactive-dialog.ui"); - - dialog = GTK_WIDGET (gtk_builder_get_object (ui, "screenshot_window")); + dialog = g_object_new (SCREENSHOT_TYPE_INTERACTIVE_DIALOG, NULL); gtk_window_set_application (GTK_WINDOW (dialog), GTK_APPLICATION (self)); - capture_button = GTK_WIDGET (gtk_builder_get_object (ui, "capture_button")); + dialog->callback = f; + dialog->user_data = user_data; - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); + gtk_widget_show_all (GTK_WIDGET (dialog)); - listbox = GTK_WIDGET (gtk_builder_get_object (ui, "listbox")); - gtk_list_box_set_header_func (GTK_LIST_BOX (listbox), - screenshot_listbox_update_header_func, - user_data, - NULL); + if (screenshot_config->take_window_shot) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->window), TRUE); - data = g_new (CaptureData, 1); - data->widget = dialog; - data->callback = f; - data->user_data = user_data; - g_signal_connect (capture_button, "clicked", G_CALLBACK (capture_button_clicked_cb), data); - gtk_widget_set_can_default (capture_button, TRUE); - gtk_widget_grab_default (capture_button); + if (screenshot_config->take_area_shot) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->selection), TRUE); - gtk_widget_show_all (dialog); + gtk_widget_set_sensitive (dialog->pointer_row, !screenshot_config->take_area_shot); + gtk_switch_set_active (GTK_SWITCH (dialog->pointer), screenshot_config->include_pointer); - connect_screenshot_frame (ui); - connect_effects_frame (ui); + gtk_adjustment_set_value (dialog->delay_adjustment, (gdouble) screenshot_config->delay); - return dialog; + return GTK_WIDGET (dialog); } diff --git a/src/screenshot-interactive-dialog.h b/src/screenshot-interactive-dialog.h index 1c2d23e..022b662 100644 --- a/src/screenshot-interactive-dialog.h +++ b/src/screenshot-interactive-dialog.h @@ -24,6 +24,14 @@ #include +G_BEGIN_DECLS + +#define SCREENSHOT_TYPE_INTERACTIVE_DIALOG (screenshot_interactive_dialog_get_type()) + +G_DECLARE_FINAL_TYPE (ScreenshotInteractiveDialog, screenshot_interactive_dialog, SCREENSHOT, INTERACTIVE_DIALOG, GtkApplicationWindow) + typedef void (*CaptureClickedCallback) (gpointer *user_data); GtkWidget *screenshot_interactive_dialog_new (CaptureClickedCallback f, gpointer user_data); + +G_END_DECLS -- cgit v1.2.1