[Xfce4-commits] [xfce/libxfce4ui] 02/05: Fix the dialog widget placement in Gtk3

noreply at xfce.org noreply at xfce.org
Mon Jun 6 15:02:07 CEST 2016


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/libxfce4ui.

commit 82c11fd69c84f082d7a309b2844b6814f35aa73c
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Jun 5 21:06:24 2016 +0300

    Fix the dialog widget placement in Gtk3
    
    ...By making our own dialog and populating that.
---
 .gitignore                         |   7 ++
 libxfce4ui/Makefile.am             |   9 ++
 libxfce4ui/libxfce4ui-dialog-ui.ui |  79 ++++++++++++++++
 libxfce4ui/xfce-dialogs.c          | 182 ++++++++++++++++++++++++++++---------
 4 files changed, 235 insertions(+), 42 deletions(-)

diff --git a/.gitignore b/.gitignore
index bfd6ee5..6c46ac5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,12 +18,15 @@ libxfce4kbd-private/libxfce4kbd-private-3.pc
 libxfce4ui/libxfce4ui-1.pc
 libxfce4ui/libxfce4ui-2.pc
 libxfce4ui/libxfce4ui-config.h
+libxfce4ui/libxfce4ui-dialog-ui.h
+libxfce4ui/libxfce4ui-dialog-ui.ui~
 ltmain.sh
 m4/
 missing
 po/Makefile.in.in
 po/POTFILES
 po/stamp-it
+po/.intltool-merge-cache
 stamp-h1
 test-driver
 .deps/
@@ -32,6 +35,7 @@ Makefile.in
 
 # files generated by make
 ChangeLog
+mkinstalldirs
 .libs/
 po/*.gmo
 docs/html/
@@ -65,4 +69,7 @@ xfce4-about/xfce4-about
 xfce4-about/xfce4-about.desktop
 xfce4-about/xfce4_about-main.o
 glade/libxfce4ui.xml
+glade/libxfce4ui-2.xml
 libxfce4ui-*.tar.bz2
+tests/test-ui-gtk2
+tests/test-ui-gtk3
diff --git a/libxfce4ui/Makefile.am b/libxfce4ui/Makefile.am
index 7822226..82bfca6 100644
--- a/libxfce4ui/Makefile.am
+++ b/libxfce4ui/Makefile.am
@@ -84,6 +84,9 @@ pkgconfig_DATA = libxfce4ui-1.pc
 ##
 if ENABLE_GTK3_LIBRARY
 
+libxfce4ui_built_sources += \
+	libxfce4ui-dialog-ui.h
+
 libxfce4ui2_includedir = \
 	$(includedir)/xfce4/libxfce4ui-2/libxfce4ui
 
@@ -183,6 +186,12 @@ libxfce4ui-enum-types.c: $(libxfce4ui_enum_headers) Makefile
 		$(libxfce4ui_enum_headers) ) > xgen-letc
 	cp xgen-letc libxfce4ui-enum-types.c
 	rm -f xgen-letc
+
+if ENABLE_GTK3_LIBRARY
+libxfce4ui-dialog-ui.h: libxfce4ui-dialog-ui.ui
+	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=xfce4ui_dialog_ui $< >$@
+endif
+
 endif
 
 # required for gtk-doc
diff --git a/libxfce4ui/libxfce4ui-dialog-ui.ui b/libxfce4ui/libxfce4ui-dialog-ui.ui
new file mode 100644
index 0000000..73ff28e
--- /dev/null
+++ b/libxfce4ui/libxfce4ui-dialog-ui.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkDialog" id="xfce4ui-dialog">
+    <property name="can_focus">False</property>
+    <property name="type_hint">dialog</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area">
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="homogeneous">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="box1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkImage" id="icon_stock_id">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xpad">20</property>
+                <property name="stock">gtk-missing-image</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="label-box">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">1</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="padding">8</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/libxfce4ui/xfce-dialogs.c b/libxfce4ui/xfce-dialogs.c
index 8b4aa40..24464ed 100644
--- a/libxfce4ui/xfce-dialogs.c
+++ b/libxfce4ui/xfce-dialogs.c
@@ -42,7 +42,9 @@
 #include <libxfce4ui/libxfce4ui-private.h>
 #include <libxfce4ui/libxfce4ui-alias.h>
 
-
+#if GTK_CHECK_VERSION (3, 0, 0)
+#include "libxfce4ui-dialog-ui.h"
+#endif
 
 static void
 xfce_dialog_show_help_auto_toggled (GtkWidget *button)
@@ -540,6 +542,142 @@ xfce_message_dialog_new_valist (GtkWindow   *parent,
                                 const gchar *first_button_text,
                                 va_list      args)
 {
+#if GTK_CHECK_VERSION (3, 0, 0)
+  GtkBuilder  *gxml;
+  GError      *error = NULL;
+  GtkWidget   *dialog;
+  GtkWidget   *dialog_image;
+  GtkWidget   *image;
+  GtkWidget   *button;
+  GtkWidget   *label_box;
+  const gchar *text = first_button_text;
+  const gchar *label;
+  const gchar *stock_id;
+  gint         response;
+  GdkPixbuf   *pixbuf, *scaled;
+  gint         w, h;
+
+  g_return_val_if_fail (primary_text != NULL || secondary_text != NULL, NULL);
+  g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
+
+  gxml = gtk_builder_new();
+  if (!gtk_builder_add_from_string (gxml, xfce4ui_dialog_ui, xfce4ui_dialog_ui_length, &error))
+    {
+      g_printerr ("Failed to parse UI description: %s\n", error->message);
+      g_clear_error (&error);
+      return NULL;
+    }
+
+  dialog = GTK_WIDGET(gtk_builder_get_object(gxml, "xfce4ui-dialog"));
+  label_box = GTK_WIDGET(gtk_builder_get_object(gxml, "label-box"));
+  dialog_image = GTK_WIDGET(gtk_builder_get_object(gxml, "icon_stock_id"));
+
+  if (parent)
+    {
+      gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
+    }
+
+  if (primary_text != NULL)
+    {
+      /* Add a top line of large bold text */
+      GtkWidget *primary_label = gtk_label_new (NULL);
+      gchar *markedup_text = g_strdup_printf ("<span weight='bold' size='large'>%s</span>", primary_text);
+
+      gtk_label_set_markup (GTK_LABEL (primary_label), markedup_text);
+
+      gtk_container_add (GTK_CONTAINER (label_box), primary_label);
+      gtk_widget_show (primary_label);
+
+      g_free (markedup_text);
+    }
+
+  if (secondary_text != NULL)
+    {
+      /* Add the secondary text, no special formatting done */
+      GtkWidget *secondary_label = gtk_label_new (secondary_text);
+      gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
+
+      gtk_container_add (GTK_CONTAINER (label_box), secondary_label);
+      gtk_widget_show (secondary_label);
+    }
+
+  if (title != NULL)
+    gtk_window_set_title (GTK_WINDOW (dialog), title);
+
+  /* put the dialog on the active screen if no parent is defined */
+  if (parent == NULL)
+    xfce_gtk_window_center_on_active_screen (GTK_WINDOW (dialog));
+
+  /* add buttons */
+  while (text != NULL)
+    {
+      if (strcmp (text, XFCE_BUTTON_TYPE_MIXED) == 0)
+        {
+          /* get arguments */
+          stock_id = va_arg (args, const gchar *);
+          label = va_arg (args, const gchar *);
+          response = va_arg (args, gint);
+
+          /* add a mixed button to the dialog */
+          button = xfce_gtk_button_new_mixed (stock_id, label);
+          gtk_widget_set_can_default (button, TRUE);
+          gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response);
+          gtk_widget_show (button);
+        }
+      else if (strcmp (text, XFCE_BUTTON_TYPE_PIXBUF) == 0)
+        {
+          /* get arguments */
+          pixbuf = va_arg (args, GdkPixbuf *);
+          label = va_arg (args, const gchar *);
+          response = va_arg (args, gint);
+
+          /* lookup real icons size for button icons */
+          gtk_icon_size_lookup (GTK_ICON_SIZE_BUTTON, &w, &h);
+
+          /* scale the pixbuf if needed */
+          if (gdk_pixbuf_get_width (pixbuf) != w || gdk_pixbuf_get_height (pixbuf) != h)
+            scaled = gdk_pixbuf_scale_simple (pixbuf, w, h, GDK_INTERP_BILINEAR);
+          else
+            scaled = NULL;
+
+          image = gtk_image_new_from_pixbuf (scaled ? scaled : pixbuf);
+
+          /* release scaled image */
+          if (scaled != NULL)
+            g_object_unref (G_OBJECT (scaled));
+
+          /* create button and add it to the dialog */
+          button = gtk_button_new_with_label (label);
+          gtk_button_set_image (GTK_BUTTON (button), image);
+          gtk_widget_set_can_default (button, TRUE);
+          gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response);
+          gtk_widget_show (button);
+        }
+      else /* stock button */
+        {
+          /* get arguments */
+          stock_id = text;
+          response = va_arg (args, gint);
+
+          /* add a stock button to the dialog */
+          gtk_dialog_add_button (GTK_DIALOG (dialog), stock_id, response);
+        }
+
+      /* get the next argument */
+      text = va_arg (args, const gchar *);
+    }
+
+  if (icon_stock_id != NULL)
+    {
+      /* set dialog and window icon */
+      gtk_image_set_from_icon_name (GTK_IMAGE (dialog_image), icon_stock_id, GTK_ICON_SIZE_DIALOG);
+
+      gtk_widget_show (dialog_image);
+      gtk_window_set_icon_name (GTK_WINDOW (dialog), icon_stock_id);
+    }
+
+  return dialog;
+#else /* GTK2 */
   GtkWidget   *dialog;
   GtkWidget   *image;
   GtkWidget   *button;
@@ -643,55 +781,15 @@ xfce_message_dialog_new_valist (GtkWindow   *parent,
   if (icon_stock_id != NULL)
     {
       /* set dialog and window icon */
-#if GTK_CHECK_VERSION (3, 10, 0)
-      /* This is fun. We want to put the image back on the left. Best way to
-       * do that is create an hbox, put the image in position 0, then pack
-       * in a vbox with all the children of the dialog.
-       */
-      GtkWidget *content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-      GList     *children = gtk_container_get_children (GTK_CONTAINER (content));
-      GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-      GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
-      GList     *iter;
-
-      image = gtk_image_new_from_icon_name (icon_stock_id, GTK_ICON_SIZE_DIALOG);
-
-      /* Add the image first */
-      gtk_container_add (GTK_CONTAINER (hbox), image);
-      /* next add the vbox */
-      gtk_container_add (GTK_CONTAINER (hbox), vbox);
-
-      /* move the widgets from the parent to the vbox */
-      for (iter = g_list_first (children); iter != NULL; iter = g_list_next (iter))
-        {
-          /* Skip the action area */
-          if (GTK_IS_BOX (iter->data))
-            continue;
-
-          /* keep the widget alive */
-          g_object_ref (iter->data);
-          /* remove from parent */
-          gtk_container_remove (GTK_CONTAINER (content), iter->data);
-          /* add to vbox */
-          gtk_container_add (GTK_CONTAINER (vbox), iter->data);
-          /* new container has a ref, we don't need ours anymore */
-          g_object_unref (iter->data);
-        }
-
-      /* Finally add the hbox to the parent */
-      gtk_container_add (GTK_CONTAINER (content), hbox);
-      gtk_widget_show (hbox);
-      gtk_widget_show (vbox);
-#else
       image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG);
       gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
-#endif
 
       gtk_widget_show (image);
       gtk_window_set_icon_name (GTK_WINDOW (dialog), icon_stock_id);
     }
 
   return dialog;
+#endif /* GTK_CHECK_VERSION */
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list