diff options
-rw-r--r-- | data/ui/screenshot-interactive-dialog.ui | 24 | ||||
-rw-r--r-- | src/screenshot-interactive-dialog.c | 217 | ||||
-rw-r--r-- | 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 @@ <!-- Generated with glade 3.22.0 --> <interface> <requires lib="gtk+" version="3.20"/> - <object class="GtkApplicationWindow" id="screenshot_window"> + <template class="ScreenshotInteractiveDialog" parent="GtkApplicationWindow"> <property name="resizable">False</property> + <property name="window-position">center</property> <child> <object class="GtkBox"> <property name="visible">True</property> @@ -38,7 +39,7 @@ <property name="receives_default">True</property> <property name="draw_indicator">False</property> <property name="group">selection</property> - <signal name="toggled" handler="on_screen" swapped="no"/> + <signal name="toggled" handler="screen_toggled_cb"/> <child> <object class="GtkBox"> <property name="visible">True</property> @@ -71,7 +72,7 @@ <property name="active">True</property> <property name="draw_indicator">False</property> <property name="group">screen</property> - <signal name="toggled" handler="on_window" swapped="no"/> + <signal name="toggled" handler="window_toggled_cb"/> <child> <object class="GtkBox"> <property name="visible">True</property> @@ -103,7 +104,7 @@ <property name="receives_default">True</property> <property name="draw_indicator">False</property> <property name="group">screen</property> - <signal name="toggled" handler="on_selection" swapped="no"/> + <signal name="toggled" handler="selection_toggled_cb"/> <child> <object class="GtkBox"> <property name="visible">True</property> @@ -142,7 +143,7 @@ <class name="frame"/> </style> <child> - <object class="GtkListBoxRow" id="pointerrow"> + <object class="GtkListBoxRow" id="pointer_row"> <property name="visible">True</property> <property name="can_focus">True</property> <child> @@ -164,6 +165,7 @@ <child> <object class="GtkSwitch" id="pointer"> <property name="visible">True</property> + <signal name="state-set" handler="include_pointer_toggled_cb"/> </object> </child> </object> @@ -200,6 +202,7 @@ <property name="climb_rate">1</property> <property name="snap_to_ticks">True</property> <property name="numeric">True</property> + <signal name= "value-changed" handler="delay_spin_value_changed_cb"/> </object> </child> </object> @@ -221,6 +224,8 @@ <property name="receives_default">True</property> <property name="action_name">app.screen-shot</property> <property name="use_underline">True</property> + <property name="can-default">True</property> + <signal name="clicked" handler="capture_button_clicked_cb"/> <style> <class name="suggested-action"/> </style> @@ -244,11 +249,12 @@ </child> </object> </child> - </object> + </template> <object class="GtkAdjustment" id="delay_adjustment"> - <property name="upper">100</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> + <property name="lower">0</property> + <property name="upper">99</property> + <property name="step-increment">1</property> + <property name="page-increment">1</property> </object> <menu id="primary_menu"> <section> 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 <gtk/gtk.h> +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 |