[gnome-screenshot] screenshoot-dialog: make it a full GtkApplicationWindow
- From: Jonh Wendell <jwendell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-screenshot] screenshoot-dialog: make it a full GtkApplicationWindow
- Date: Mon, 8 Jul 2013 16:55:27 +0000 (UTC)
commit e451e07b6a8581aa2faf35fe0f7f58a698e4c00d
Author: Jonh Wendell <jonh wendell intel com>
Date: Mon Jul 8 11:03:25 2013 -0300
screenshoot-dialog: make it a full GtkApplicationWindow
this brings back the app menu and the WM close button.
https://bugzilla.gnome.org/show_bug.cgi?id=701952
src/screenshot-application.c | 26 ++--
src/screenshot-dialog.c | 56 +++++++--
src/screenshot-dialog.h | 21 ++-
src/screenshot-dialog.ui | 315 ++++++++++++++++--------------------------
4 files changed, 194 insertions(+), 224 deletions(-)
---
diff --git a/src/screenshot-application.c b/src/screenshot-application.c
index 98e5e69..3cdddf5 100644
--- a/src/screenshot-application.c
+++ b/src/screenshot-application.c
@@ -117,6 +117,7 @@ save_pixbuf_handle_success (ScreenshotApplication *self)
save_folder_to_settings (self);
gtk_widget_destroy (dialog->dialog);
+ g_free (dialog);
}
else
{
@@ -401,18 +402,12 @@ screenshot_save_to_clipboard (ScreenshotApplication *self)
}
static void
-screenshot_dialog_response_cb (GtkDialog *d,
- gint response_id,
- gpointer user_data)
+screenshot_dialog_response_cb (ScreenshotResponse response,
+ ScreenshotApplication *self)
{
- ScreenshotApplication *self = user_data;
-
- switch (response_id)
+ switch (response)
{
- case GTK_RESPONSE_HELP:
- screenshot_display_help (GTK_WINDOW (d));
- break;
- case GTK_RESPONSE_OK:
+ case SCREENSHOT_RESPONSE_SAVE:
/* update to the new URI */
g_free (self->priv->save_uri);
self->priv->save_uri = screenshot_dialog_get_uri (self->priv->dialog);
@@ -422,7 +417,7 @@ screenshot_dialog_response_cb (GtkDialog *d,
screenshot_save_to_clipboard (self);
break;
default:
- gtk_widget_destroy (GTK_WIDGET (d));
+ g_assert_not_reached ();
break;
}
}
@@ -479,11 +474,10 @@ build_filename_ready_cb (GObject *source,
if (screenshot_config->interactive)
{
- self->priv->dialog = screenshot_dialog_new (self->priv->screenshot, self->priv->save_uri);
- g_signal_connect (self->priv->dialog->dialog,
- "response",
- G_CALLBACK (screenshot_dialog_response_cb),
- self);
+ self->priv->dialog = screenshot_dialog_new (self->priv->screenshot,
+ self->priv->save_uri,
+ (SaveScreenshotCallback)screenshot_dialog_response_cb,
+ self);
}
else
{
diff --git a/src/screenshot-dialog.c b/src/screenshot-dialog.c
index a990fc6..f3dc5d3 100644
--- a/src/screenshot-dialog.c
+++ b/src/screenshot-dialog.c
@@ -118,9 +118,42 @@ drag_begin (GtkWidget *widget,
dialog->drag_x, dialog->drag_y);
}
+static gboolean
+dialog_key_press_cb (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data)
+{
+ if (event->keyval == GDK_KEY_F1)
+ {
+ screenshot_display_help (GTK_WINDOW (widget));
+ return TRUE;
+ }
+
+ if (event->keyval == GDK_KEY_Escape)
+ {
+ gtk_widget_destroy (widget);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+button_clicked (GtkWidget *button, ScreenshotDialog *dialog)
+{
+ ScreenshotResponse res;
+
+ res = (button == dialog->save_button) ? SCREENSHOT_RESPONSE_SAVE
+ : SCREENSHOT_RESPONSE_COPY;
+
+ dialog->callback (res, dialog->user_data);
+}
+
ScreenshotDialog *
-screenshot_dialog_new (GdkPixbuf *screenshot,
- char *initial_uri)
+screenshot_dialog_new (GdkPixbuf *screenshot,
+ char *initial_uri,
+ SaveScreenshotCallback f,
+ gpointer user_data)
{
ScreenshotDialog *dialog;
GtkBuilder *ui;
@@ -146,6 +179,8 @@ screenshot_dialog_new (GdkPixbuf *screenshot,
dialog = g_new0 (ScreenshotDialog, 1);
dialog->screenshot = screenshot;
+ dialog->callback = f;
+ dialog->user_data = user_data;
ui = gtk_builder_new ();
res = gtk_builder_add_from_resource (ui, "/org/gnome/screenshot/screenshot-dialog.ui", NULL);
@@ -159,23 +194,26 @@ screenshot_dialog_new (GdkPixbuf *screenshot,
dialog->dialog = GTK_WIDGET (gtk_builder_get_object (ui, "toplevel"));
gtk_window_set_application (GTK_WINDOW (dialog->dialog), GTK_APPLICATION (g_application_get_default ()));
- gtk_window_set_resizable (GTK_WINDOW (dialog->dialog), FALSE);
- gtk_window_set_title (GTK_WINDOW (dialog->dialog), _("Save Screenshot"));
- gtk_window_set_position (GTK_WINDOW (dialog->dialog), GTK_WIN_POS_CENTER);
gtk_widget_realize (dialog->dialog);
+ g_signal_connect (dialog->dialog, "key-press-event",
+ G_CALLBACK (dialog_key_press_cb),
+ NULL);
aspect_frame = GTK_WIDGET (gtk_builder_get_object (ui, "aspect_frame"));
preview_darea = GTK_WIDGET (gtk_builder_get_object (ui, "preview_darea"));
dialog->filename_entry = GTK_WIDGET (gtk_builder_get_object (ui, "filename_entry"));
file_chooser_box = GTK_WIDGET (gtk_builder_get_object (ui, "file_chooser_box"));
- g_object_unref (ui);
- dialog->save_widget = gtk_file_chooser_button_new (_("Select a folder"),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
- gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog->save_widget), FALSE);
+ dialog->save_widget = GTK_WIDGET (gtk_builder_get_object (ui, "save_widget"));
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog->save_widget), current_folder);
gtk_entry_set_text (GTK_ENTRY (dialog->filename_entry), current_name);
- gtk_box_pack_start (GTK_BOX (file_chooser_box), dialog->save_widget, TRUE, TRUE, 0);
+ dialog->save_button = GTK_WIDGET (gtk_builder_get_object (ui, "save_button"));
+ g_signal_connect (dialog->save_button, "clicked", G_CALLBACK (button_clicked), dialog);
+ dialog->copy_button = GTK_WIDGET (gtk_builder_get_object (ui, "copy_button"));
+ g_signal_connect (dialog->copy_button, "clicked", G_CALLBACK (button_clicked), dialog);
+
+ g_object_unref (ui);
g_free (current_folder);
gtk_widget_set_size_request (preview_darea, width, height);
diff --git a/src/screenshot-dialog.h b/src/screenshot-dialog.h
index 7e45891..7b7ce26 100644
--- a/src/screenshot-dialog.h
+++ b/src/screenshot-dialog.h
@@ -22,6 +22,13 @@
#include <gtk/gtk.h>
+typedef enum {
+ SCREENSHOT_RESPONSE_SAVE,
+ SCREENSHOT_RESPONSE_COPY
+} ScreenshotResponse;
+
+typedef void (*SaveScreenshotCallback) (ScreenshotResponse response, gpointer *user_data);
+
typedef struct {
GdkPixbuf *screenshot;
GdkPixbuf *preview_image;
@@ -29,16 +36,20 @@ typedef struct {
GtkWidget *dialog;
GtkWidget *save_widget;
GtkWidget *filename_entry;
+ GtkWidget *save_button;
+ GtkWidget *copy_button;
gint drag_x;
gint drag_y;
-} ScreenshotDialog;
-/* Keep in sync with the value defined in the UI file */
-#define SCREENSHOT_RESPONSE_COPY 1
+ SaveScreenshotCallback callback;
+ gpointer user_data;
+} ScreenshotDialog;
-ScreenshotDialog *screenshot_dialog_new (GdkPixbuf *screenshot,
- char *initial_uri);
+ScreenshotDialog *screenshot_dialog_new (GdkPixbuf *screenshot,
+ char *initial_uri,
+ SaveScreenshotCallback f,
+ gpointer user_data);
char *screenshot_dialog_get_uri (ScreenshotDialog *dialog);
char *screenshot_dialog_get_folder (ScreenshotDialog *dialog);
diff --git a/src/screenshot-dialog.ui b/src/screenshot-dialog.ui
index 7560e8b..e1babea 100644
--- a/src/screenshot-dialog.ui
+++ b/src/screenshot-dialog.ui
@@ -1,230 +1,157 @@
-<?xml version="1.0"?>
-<!--*- mode: xml -*-->
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
- <object class="GtkDialog" id="toplevel">
+ <!-- interface-requires gtk+ 3.8 -->
+ <object class="GtkApplicationWindow" id="toplevel">
+ <property name="can_focus">False</property>
<property name="border_width">5</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="modal">False</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <child internal-child="vbox">
- <object class="GtkVBox" id="dialog-vbox1">
+ <property name="title" translatable="yes">Save Screenshot</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center</property>
+ <child>
+ <object class="GtkGrid" id="grid1">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
- <child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="margin_left">5</property>
+ <property name="margin_right">5</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">8</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkAspectFrame" id="aspect_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkDrawingArea" id="preview_darea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="yes">_Name:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">filename_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="yes">Save in _folder:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">save_widget</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="filename_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">start</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">32</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="buttonbox1">
<property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="can_focus">False</property>
<child>
<object class="GtkButton" id="copy_button">
+ <property name="label" translatable="yes">C_opy to Clipboard</property>
<property name="visible">True</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
+ <property name="receives_default">True</property>
<property name="use_underline">True</property>
- <property name="label" translatable="yes">C_opy to Clipboard</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <accelerator key="C" modifiers="GDK_CONTROL_MASK" signal="activate"/>
</object>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
- <property name="secondary">True</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="ok_button">
+ <object class="GtkButton" id="save_button">
+ <property name="label">gtk-save</property>
<property name="visible">True</property>
+ <property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-save</property>
+ <property name="receives_default">True</property>
<property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">3</property>
+ <property name="height">1</property>
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox3">
- <property name="border_width">5</property>
+ <object class="GtkFileChooserButton" id="save_widget">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">18</property>
- <child>
- <object class="GtkHBox" id="hbox6">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="top_padding">0</property>
- <property name="bottom_padding">0</property>
- <property name="left_padding">0</property>
- <property name="right_padding">0</property>
- <child>
- <object class="GtkAspectFrame" id="aspect_frame">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="ratio">1</property>
- <property name="obey_child">True</property>
- <child>
- <object class="GtkDrawingArea" id="preview_darea">
- <property name="visible">True</property>
- <signal handler="on_preview_draw" name="draw"/>
- <signal handler="on_preview_configure_event" name="configure_event"/>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
- <child>
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Name:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">filename_entry</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Save in _folder:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="filename_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">True</property>
- <property name="width_chars">32</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="file_chooser_box">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="vexpand">True</property>
+ <property name="action">select-folder</property>
+ <property name="local_only">False</property>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
</packing>
</child>
</object>
</child>
- <action-widgets>
- <action-widget response="-5">ok_button</action-widget>
- <action-widget response="1">copy_button</action-widget>
- </action-widgets>
</object>
</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]