summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <alexm@gnome.org>2020-04-03 06:38:28 +0500
committerAlexander Mikhaylenko <alexm@gnome.org>2020-04-03 09:53:36 +0500
commit481c20e2da6f9092a662b82dfb1293b7eda62c4e (patch)
treec055bbd6cebdb4e8588ed2c9850d19d27de7b113
parent08954b025dc1e7ee7ef6b916ba8ba2f6f6d361ba (diff)
downloadgnome-screenshot-481c20e2da6f9092a662b82dfb1293b7eda62c4e.tar.gz
interactive-dialog: Make a GTK template
-rw-r--r--data/ui/screenshot-interactive-dialog.ui24
-rw-r--r--src/screenshot-interactive-dialog.c217
-rw-r--r--src/screenshot-interactive-dialog.h8
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