[gnome-screenshot/gnome-3-8] screenshoot-dialog: make it a full GtkApplicationWindow



commit e3b4b41783da9f0207e0cd39f9bc0757efa9a585
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]