[Xfce4-commits] r30282 - in terminal/trunk: . terminal

Nick Schermer nick at xfce.org
Sat Jul 11 19:06:34 CEST 2009


Author: nick
Date: 2009-07-11 17:06:34 +0000 (Sat, 11 Jul 2009)
New Revision: 30282

Added:
   terminal/trunk/terminal/xfce-heading.c
   terminal/trunk/terminal/xfce-heading.h
   terminal/trunk/terminal/xfce-titled-dialog.c
   terminal/trunk/terminal/xfce-titled-dialog.h
Modified:
   terminal/trunk/configure.in.in
   terminal/trunk/terminal/Makefile.am
   terminal/trunk/terminal/terminal-preferences-dialog.c
   terminal/trunk/terminal/terminal-preferences-dialog.h
Log:
Drop libxfce4ui dependency and include titled dialog code.


Modified: terminal/trunk/configure.in.in
===================================================================
--- terminal/trunk/configure.in.in	2009-07-11 16:40:46 UTC (rev 30281)
+++ terminal/trunk/configure.in.in	2009-07-11 17:06:34 UTC (rev 30282)
@@ -85,7 +85,6 @@
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
 XDT_CHECK_PACKAGE([VTE], [vte], [0.17.1])
 XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.16.0])
-XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.5.0])
 
 dnl *************************************************
 dnl *** Optional support for startup notification ***

Modified: terminal/trunk/terminal/Makefile.am
===================================================================
--- terminal/trunk/terminal/Makefile.am	2009-07-11 16:40:46 UTC (rev 30281)
+++ terminal/trunk/terminal/Makefile.am	2009-07-11 17:06:34 UTC (rev 30282)
@@ -1,88 +1,96 @@
 # $Id$
 
-INCLUDES =								\
-	-DBINDIR=\"$(bindir)\"						\
-	-DDATADIR=\"$(datadir)\"					\
-	-DEXO_DISABLE_DEPRECATED					\
-	-DG_LOG_DOMAIN=\"Terminal\"					\
-	-DLIBEXECDIR=\"$(libexecdir)\"					\
-	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"				\
-	-DSN_API_NOT_YET_FROZEN						\
-	-I$(top_srcdir)							\
+INCLUDES = \
+	-DBINDIR=\"$(bindir)\" \
+	-DDATADIR=\"$(datadir)\" \
+	-DEXO_DISABLE_DEPRECATED\
+	-DG_LOG_DOMAIN=\"Terminal\" \
+	-DLIBEXECDIR=\"$(libexecdir)\" \
+	-DPACKAGE_LOCALE_DIR=\"$(localedir)\" \
+	-DSN_API_NOT_YET_FROZEN \
+	-I$(top_srcdir) \
 	$(PLATFORM_CPPFLAGS)
 
-bin_PROGRAMS = 								\
+bin_PROGRAMS = \
 	Terminal
 
-Terminal_built_sources =						\
-	terminal-enum-types.c						\
-	terminal-enum-types.h						\
-	terminal-marshal.c						\
+Terminal_built_sources = \
+	terminal-enum-types.c \
+	terminal-enum-types.h \
+	terminal-marshal.c \
 	terminal-marshal.h
 
-Terminal_dbus_sources =							\
-	terminal-dbus.c							\
+Terminal_dbus_sources = \
+	terminal-dbus.c \
 	terminal-dbus.h
 
-Terminal_headers =							\
-	terminal-accel-map.h						\
-	terminal-app.h							\
-	terminal-dialogs.h						\
-	terminal-image-loader.h						\
-	terminal-options.h						\
-	terminal-preferences.h						\
-	terminal-preferences-dialog.h					\
-	terminal-private.h						\
-	terminal-screen.h						\
-	terminal-shortcut-editor.h					\
-	terminal-stock.h						\
-	terminal-toolbars-model.h					\
-	terminal-toolbars-view.h					\
-	terminal-widget.h						\
-	terminal-window.h						\
+Terminal_headers = \
+	terminal-accel-map.h \
+	terminal-app.h \
+	terminal-dialogs.h \
+	terminal-image-loader.h \
+	terminal-options.h \
+	terminal-preferences.h \
+	terminal-preferences-dialog.h \
+	terminal-private.h \
+	terminal-screen.h \
+	terminal-shortcut-editor.h \
+	terminal-stock.h \
+	terminal-toolbars-model.h \
+	terminal-toolbars-view.h \
+	terminal-widget.h \
+	terminal-window.h \
 	terminal-window-ui.h
 
-Terminal_SOURCES =							\
-	$(Terminal_built_sources)					\
-	$(Terminal_headers)						\
-	main.c								\
-	terminal-accel-map.c						\
-	terminal-app.c							\
-	terminal-dialogs.c						\
-	terminal-image-loader.c						\
-	terminal-options.c						\
-	terminal-preferences.c						\
-	terminal-preferences-dialog.c					\
-	terminal-screen.c						\
-	terminal-shortcut-editor.c					\
-	terminal-stock.c						\
-	terminal-toolbars-model.c					\
-	terminal-toolbars-view.c					\
-	terminal-widget.c						\
+Terminal_tmp_sources = \
+	xfce-heading.c \
+	xfce-heading.h \
+	xfce-titled-dialog.c \
+	xfce-titled-dialog.h
+
+Terminal_SOURCES = \
+	$(Terminal_built_sources) \
+	$(Terminal_headers) \
+	$(Terminal_tmp_sources) \
+	main.c \
+	terminal-accel-map.c \
+	terminal-app.c \
+	terminal-dialogs.c \
+	terminal-image-loader.c \
+	terminal-options.c \
+	terminal-preferences.c \
+	terminal-preferences-dialog.c \
+	terminal-screen.c \
+	terminal-shortcut-editor.c \
+	terminal-stock.c \
+	terminal-toolbars-model.c \
+	terminal-toolbars-view.c \
+	terminal-widget.c \
 	terminal-window.c
 
-Terminal_CFLAGS =							\
-	$(DBUS_CFLAGS)							\
-	$(EXO_CFLAGS)							\
-	$(GTK_CFLAGS)							\
-	$(GIO_CFLAGS)							\
-	$(LIBSTARTUP_NOTIFICATION_CFLAGS)				\
-	$(LIBX11_CFLAGS)						\
-	$(VTE_CFLAGS)							\
-	$(LIBXFCE4UI_CFLAGS)						\
+Terminal_CFLAGS = \
+	$(DBUS_CFLAGS) \
+	$(EXO_CFLAGS) \
+	$(GTK_CFLAGS) \
+	$(GIO_CFLAGS) \
+	$(LIBSTARTUP_NOTIFICATION_CFLAGS) \
+	$(LIBX11_CFLAGS)\
+	$(VTE_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
-Terminal_LDFLAGS =							\
-	-no-undefined							\
-	$(DBUS_LIBS)							\
-	$(EXO_LIBS)							\
-	$(GTK_LIBS)							\
-	$(GIO_LIBS)							\
-	$(LIBSTARTUP_NOTIFICATION_LIBS)					\
-	$(LIBX11_LDFLAGS)						\
-	$(LIBX11_LIBS)							\
-	$(VTE_LIBS)							\
-	$(LIBXFCE4UI_LIBS)						\
+Terminal_LDFLAGS = \
+	-no-undefined \
+	$(PLATFORM_LDFLAGS)
+
+Terminal_LDADD = \
+	$(DBUS_LIBS) \
+	$(EXO_LIBS) \
+	$(GTK_LIBS) \
+	$(GIO_LIBS) \
+	$(LIBSTARTUP_NOTIFICATION_LIBS) \
+	$(LIBX11_LDFLAGS) \
+	$(LIBX11_LIBS) \
+	$(VTE_LIBS) \
 	$(TERMINAL_LIBS)
 
 # install symlink to 'terminal'
@@ -91,10 +99,10 @@
 	-( cd $(DESTDIR)$(bindir) ; test -x terminal || ln -sf Terminal terminal )
 
 if HAVE_DBUS
-Terminal_CFLAGS +=							\
+Terminal_CFLAGS += \
 	-DDBUS_API_SUBJECT_TO_CHANGE
 
-Terminal_SOURCES +=							\
+Terminal_SOURCES += \
 	$(Terminal_dbus_sources)
 endif
 
@@ -109,20 +117,20 @@
 ## files as part of the dist tarball.
 ##
 if MAINTAINER_MODE
-CLEANFILES =								\
-	xgen-tetc							\
-	xgen-teth							\
-	xgen-tmc							\
+CLEANFILES = \
+	xgen-tetc \
+	xgen-teth \
+	xgen-tmc \
 	xgen-tmh
 
-DISTCLEANFILES =							\
-	stamp-terminal-enum-types.h					\
-	stamp-terminal-marshal.h					\
-	terminal-window-ui.h						\
+DISTCLEANFILES = \
+	stamp-terminal-enum-types.h \
+	stamp-terminal-marshal.h \
+	terminal-window-ui.h \
 	$(Terminal_built_sources)
 
-BUILT_SOURCES =								\
-	terminal-window-ui.h						\
+BUILT_SOURCES = \
+	terminal-window-ui.h \
 	$(Terminal_built_sources)
 
 terminal-window-ui.h: Makefile $(srcdir)/terminal-window-ui.xml
@@ -132,22 +140,22 @@
 	@true
 stamp-terminal-enum-types.h: terminal-preferences.h Makefile
 	( cd $(srcdir) && glib-mkenums \
-		--fhead "#ifndef __TERMINAL_ENUM_TYPES_H__\n#define __TERMINAL_ENUM_TYPES_H__\n#include <exo/exo.h>\nG_BEGIN_DECLS\n" \
-		--fprod "/* enumerations from \"@filename@\" */\n" \
-		--vhead "GType @enum_name at _get_type (void);\n#define TERMINAL_TYPE_ at ENUMSHORT@ (@enum_name at _get_type())\n" \
-		--ftail "G_END_DECLS\n\n#endif /* !__TERMINAL_ENUM_TYPES_H__ */" \
-		terminal-preferences.h ) >> xgen-teth \
+--fhead "#ifndef __TERMINAL_ENUM_TYPES_H__\n#define __TERMINAL_ENUM_TYPES_H__\n#include <exo/exo.h>\nG_BEGIN_DECLS\n" \
+--fprod "/* enumerations from \"@filename@\" */\n" \
+--vhead "GType @enum_name at _get_type (void);\n#define TERMINAL_TYPE_ at ENUMSHORT@ (@enum_name at _get_type())\n" \
+--ftail "G_END_DECLS\n\n#endif /* !__TERMINAL_ENUM_TYPES_H__ */" \
+terminal-preferences.h ) >> xgen-teth \
 	&& (cmp -s xgen-teth terminal-enum-types.h || cp xgen-teth terminal-enum-types.h ) \
 	&& rm -f xgen-teth \
 	&& echo timestamp > $(@F)
 terminal-enum-types.c: terminal-preferences.h Makefile
 	( cd $(srcdir) && glib-mkenums \
-		--fhead "#ifdef HAVE_CONFIG_H\n#include <config.h>\n#endif\n#undef GTK_DISABLE_DEPRECATED\n#define GTK_ENABLE_BROKEN\n#include <terminal/terminal-enum-types.h>\n#include <terminal/terminal-app.h>\n#include <terminal/terminal-preferences.h>" \
-		--fprod "\n/* enumerations from \"@filename@\" */" \
-		--vhead "GType\n at enum_name@_get_type (void)\n{\n\tstatic GType type = 0;\n\tif (type == 0) {\n\tstatic const G at Type@Value values[] = {"\
-		--vprod "\t{ @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
-		--vtail "\t{ 0, NULL, NULL }\n\t};\n\ttype = g_ at type@_register_static (\"@EnumName@\", values);\n  }\n\treturn type;\n}\n" \
-		terminal-preferences.h ) >> xgen-tetc \
+--fhead "#ifdef HAVE_CONFIG_H\n#include <config.h>\n#endif\n#undef GTK_DISABLE_DEPRECATED\n#define GTK_ENABLE_BROKEN\n#include <terminal/terminal-enum-types.h>\n#include <terminal/terminal-app.h>\n#include <terminal/terminal-preferences.h>" \
+--fprod " \n/* enumerations from \"@filename@\" */" \
+--vhead "GType\n at enum_name@_get_type (void)\n{\n\tstatic GType type = 0;\n\tif (type == 0) {\n\tstatic const G at Type@Value values[] = {" \
+--vprod " \t{ @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
+--vtail " \t{ 0, NULL, NULL }\n\t};\n\ttype = g_ at type@_register_static (\"@EnumName@\", values);\n  }\n\treturn type;\n}\n" \
+terminal-preferences.h ) >> xgen-tetc \
 	&& cp xgen-tetc terminal-enum-types.c \
 	&& rm -f xgen-tetc
 
@@ -155,8 +163,8 @@
 	@true
 stamp-terminal-marshal.h: terminal-marshal.list Makefile
 	( cd $(srcdir) && glib-genmarshal \
-		--prefix=_terminal_marshal \
-		--header terminal-marshal.list ) >> xgen-tmh \
+--prefix=_terminal_marshal \
+--header terminal-marshal.list ) >> xgen-tmh \
 	&& ( cmp -s xgen-tmh terminal-marshal.h || cp xgen-tmh terminal-marshal.h ) \
 	&& rm -f xgen-tmh \
 	&& echo timestamp > $(@F)
@@ -164,8 +172,8 @@
 terminal-marshal.c: terminal-marshal.list Makefile
 	echo "#include <terminal/terminal-marshal.h>" > xgen-tmc \
 	&& ( cd $(srcdir) && glib-genmarshal \
-		--prefix=_terminal_marshal \
-		--body terminal-marshal.list ) >> xgen-tmc \
+--prefix=_terminal_marshal \
+--body terminal-marshal.list ) >> xgen-tmc \
 	&& cp xgen-tmc terminal-marshal.c \
 	&& rm -f xgen-tmc
 endif
@@ -174,9 +182,9 @@
 clean-local:
 	rm -f *.core core core.*
 
-EXTRA_DIST =								\
-	terminal-config.h.in						\
-	terminal-marshal.list						\
+EXTRA_DIST =\
+	terminal-config.h.in \
+	terminal-marshal.list \
 	terminal-window-ui.xml
 
 # vi:set ts=8 sw=8 noet ai nocindent:

Modified: terminal/trunk/terminal/terminal-preferences-dialog.c
===================================================================
--- terminal/trunk/terminal/terminal-preferences-dialog.c	2009-07-11 16:40:46 UTC (rev 30281)
+++ terminal/trunk/terminal/terminal-preferences-dialog.c	2009-07-11 17:06:34 UTC (rev 30282)
@@ -29,6 +29,7 @@
 #include <terminal/terminal-shortcut-editor.h>
 #include <terminal/terminal-stock.h>
 #include <terminal/terminal-private.h>
+#include <terminal/xfce-titled-dialog.h>
 
 
 

Modified: terminal/trunk/terminal/terminal-preferences-dialog.h
===================================================================
--- terminal/trunk/terminal/terminal-preferences-dialog.h	2009-07-11 16:40:46 UTC (rev 30281)
+++ terminal/trunk/terminal/terminal-preferences-dialog.h	2009-07-11 17:06:34 UTC (rev 30282)
@@ -23,7 +23,6 @@
 #define __TERMINAL_PREFERENCES_DIALOG_H__
 
 #include <exo/exo.h>
-#include <libxfce4ui/libxfce4ui.h>
 
 #include <terminal/terminal-preferences.h>
 

Added: terminal/trunk/terminal/xfce-heading.c
===================================================================
--- terminal/trunk/terminal/xfce-heading.c	                        (rev 0)
+++ terminal/trunk/terminal/xfce-heading.c	2009-07-11 17:06:34 UTC (rev 30282)
@@ -0,0 +1,739 @@
+/* $Id: xfce-heading.c 30220 2009-07-08 08:47:01Z nick $ */
+/*-
+ * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <terminal/xfce-heading.h>
+
+
+
+#define XFCE_HEADING_BORDER      6
+#define XFCE_HEADING_SPACING    12
+#define XFCE_HEADING_ICON_SIZE  48
+
+#define XFCE_HEADING_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFCE_TYPE_HEADING, XfceHeadingPrivate))
+
+
+
+/* Property identifiers */
+enum
+{
+  PROP_0,
+  PROP_ICON,
+  PROP_ICON_NAME,
+  PROP_SUBTITLE,
+  PROP_TITLE,
+};
+
+
+
+static void         xfce_heading_finalize       (GObject          *object);
+static void         xfce_heading_get_property   (GObject          *object,
+                                                 guint             prop_id,
+                                                 GValue           *value,
+                                                 GParamSpec       *pspec);
+static void         xfce_heading_set_property   (GObject          *object,
+                                                 guint             prop_id,
+                                                 const GValue     *value,
+                                                 GParamSpec       *pspec);
+static void         xfce_heading_realize        (GtkWidget        *widget);
+static void         xfce_heading_size_request   (GtkWidget        *widget,
+                                                 GtkRequisition   *requisition);
+static void         xfce_heading_style_set      (GtkWidget        *widget,
+                                                 GtkStyle         *previous_style);
+static gboolean     xfce_heading_expose_event   (GtkWidget        *widget,
+                                                 GdkEventExpose   *event);
+static AtkObject   *xfce_heading_get_accessible (GtkWidget        *widget);
+static PangoLayout *xfce_heading_make_layout    (XfceHeading      *heading);
+static GdkPixbuf   *xfce_heading_make_pixbuf    (XfceHeading      *heading);
+static GdkPixbuf   *xfce_heading_get_icon       (XfceHeading      *heading);
+static const gchar *xfce_heading_get_icon_name  (XfceHeading      *heading);
+static const gchar *xfce_heading_get_subtitle   (XfceHeading      *heading);
+static const gchar *xfce_heading_get_title      (XfceHeading      *heading);
+
+
+
+struct _XfceHeadingPrivate
+{
+  GdkPixbuf *icon;
+  gchar     *icon_name;
+  gchar     *subtitle;
+  gchar     *title;
+};
+
+
+
+G_DEFINE_TYPE (XfceHeading, xfce_heading, GTK_TYPE_WIDGET)
+
+
+
+static void
+xfce_heading_class_init (XfceHeadingClass *klass)
+{
+  GtkWidgetClass *gtkwidget_class;
+  GObjectClass   *gobject_class;
+
+  /* add our private data to the class */
+  g_type_class_add_private (klass, sizeof (XfceHeadingPrivate));
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = xfce_heading_finalize;
+  gobject_class->get_property = xfce_heading_get_property;
+  gobject_class->set_property = xfce_heading_set_property;
+
+  gtkwidget_class = GTK_WIDGET_CLASS (klass);
+  gtkwidget_class->realize = xfce_heading_realize;
+  gtkwidget_class->size_request = xfce_heading_size_request;
+  gtkwidget_class->style_set = xfce_heading_style_set;
+  gtkwidget_class->expose_event = xfce_heading_expose_event;
+  gtkwidget_class->get_accessible = xfce_heading_get_accessible;
+
+  /**
+   * XfceHeading:icon:
+   *
+   * The #GdkPixbuf to display as icon, or %NULL to use the
+   * "icon-name" property.
+   *
+   * Since: 4.4.0
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_ICON,
+                                   g_param_spec_object ("icon",
+                                                        "icon",
+                                                        "icon",
+                                                        GDK_TYPE_PIXBUF,
+                                                        G_PARAM_READWRITE
+                                                        | G_PARAM_STATIC_STRINGS));
+
+  /**
+   * XfceHeading:icon-name:
+   *
+   * If the "icon" property value is %NULL this is the name of
+   * the icon to display instead (looked up using the icon theme).
+   * If this property is also %NULL or the specified icon does not
+   * exist in the selected icon theme, no icon will be displayed.
+   *
+   * Since: 4.4.0
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_ICON_NAME,
+                                   g_param_spec_string ("icon-name",
+                                                        "icon-name",
+                                                        "icon-name",
+                                                        NULL,
+                                                        G_PARAM_READWRITE
+                                                        | G_PARAM_STATIC_STRINGS));
+
+  /**
+   * XfceHeading:subtitle:
+   *
+   * The sub title that should be displayed below the
+   * title. May be %NULL or the empty string to display
+   * only the title.
+   *
+   * Since: 4.4.0
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_SUBTITLE,
+                                   g_param_spec_string ("subtitle",
+                                                        "subtitle",
+                                                        "subtitle",
+                                                        NULL,
+                                                        G_PARAM_READWRITE
+                                                        | G_PARAM_STATIC_STRINGS));
+
+  /**
+   * XfceHeading:title:
+   *
+   * The title text to display in the heading.
+   *
+   * Since: 4.4.0
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_TITLE,
+                                   g_param_spec_string ("title",
+                                                        "title",
+                                                        "title",
+                                                        NULL,
+                                                        G_PARAM_READWRITE
+                                                        | G_PARAM_STATIC_STRINGS));
+}
+
+
+
+static void
+xfce_heading_init (XfceHeading *heading)
+{
+  /* setup the private data */
+  heading->priv = XFCE_HEADING_GET_PRIVATE (heading);
+
+  /* setup the widget parameters */
+  GTK_WIDGET_UNSET_FLAGS (heading, GTK_NO_WINDOW);
+}
+
+
+
+static void
+xfce_heading_finalize (GObject *object)
+{
+  XfceHeading *heading = XFCE_HEADING (object);
+
+  /* release the private data */
+  if (G_UNLIKELY (heading->priv->icon != NULL))
+    g_object_unref (G_OBJECT (heading->priv->icon));
+
+  g_free (heading->priv->icon_name);
+  g_free (heading->priv->subtitle);
+  g_free (heading->priv->title);
+
+  (*G_OBJECT_CLASS (xfce_heading_parent_class)->finalize) (object);
+}
+
+
+
+static void
+xfce_heading_get_property (GObject    *object,
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  XfceHeading *heading = XFCE_HEADING (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON:
+      g_value_set_object (value, xfce_heading_get_icon (heading));
+      break;
+
+    case PROP_ICON_NAME:
+      g_value_set_string (value, xfce_heading_get_icon_name (heading));
+      break;
+
+    case PROP_SUBTITLE:
+      g_value_set_string (value, xfce_heading_get_subtitle (heading));
+      break;
+
+    case PROP_TITLE:
+      g_value_set_string (value, xfce_heading_get_title (heading));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
+xfce_heading_set_property (GObject      *object,
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  XfceHeading *heading = XFCE_HEADING (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON:
+      xfce_heading_set_icon (heading, g_value_get_object (value));
+      break;
+
+    case PROP_ICON_NAME:
+      xfce_heading_set_icon_name (heading, g_value_get_string (value));
+      break;
+
+    case PROP_SUBTITLE:
+      xfce_heading_set_subtitle (heading, g_value_get_string (value));
+      break;
+
+    case PROP_TITLE:
+      xfce_heading_set_title (heading, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
+xfce_heading_realize (GtkWidget *widget)
+{
+  GdkWindowAttr attributes;
+
+  /* mark the widget as realized */
+  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+
+  /* setup the window attributes */
+  attributes.x = widget->allocation.x;
+  attributes.y = widget->allocation.y;
+  attributes.width = widget->allocation.width;
+  attributes.height = widget->allocation.height;
+  attributes.wclass = GDK_INPUT_OUTPUT;
+  attributes.window_type = GDK_WINDOW_CHILD;
+  attributes.visual = gtk_widget_get_visual (widget);
+  attributes.colormap = gtk_widget_get_colormap (widget);
+  attributes.event_mask = gtk_widget_get_events (widget)
+                        | GDK_EXPOSURE_MASK;
+
+  /* allocate the widget window */
+  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes,
+                                   GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP);
+  gdk_window_set_user_data (widget->window, widget);
+
+  /* connect the style to the window */
+  widget->style = gtk_style_attach (widget->style, widget->window);
+
+  /* set background color (using the base color) */
+  gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
+}
+
+
+
+static void
+xfce_heading_size_request (GtkWidget      *widget,
+                           GtkRequisition *requisition)
+{
+  XfceHeading *heading = XFCE_HEADING (widget);
+  PangoLayout *layout;
+  GdkPixbuf   *pixbuf;
+  gint         layout_width;
+  gint         layout_height;
+  gint         pixbuf_width = 0;
+  gint         pixbuf_height = 0;
+
+  /* determine the dimensions of the title text */
+  layout = xfce_heading_make_layout (heading);
+  pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
+  g_object_unref (G_OBJECT (layout));
+
+  /* determine the dimensions of the pixbuf */
+  pixbuf = xfce_heading_make_pixbuf (heading);
+  if (G_LIKELY (pixbuf != NULL))
+    {
+      pixbuf_width = gdk_pixbuf_get_width (pixbuf);
+      pixbuf_height = gdk_pixbuf_get_height (pixbuf);
+      g_object_unref (G_OBJECT (pixbuf));
+    }
+
+  /* determine the base dimensions */
+  requisition->width = layout_width + pixbuf_width + ((pixbuf_width > 0) ? XFCE_HEADING_SPACING : 0);
+  requisition->height = MAX (XFCE_HEADING_ICON_SIZE, MAX (pixbuf_height, layout_height));
+
+  /* add border size */
+  requisition->width += 2 * XFCE_HEADING_BORDER;
+  requisition->height += 2 * XFCE_HEADING_BORDER;
+}
+
+
+
+static void
+xfce_heading_style_set (GtkWidget *widget,
+                        GtkStyle  *previous_style)
+{
+  /* check if we're already realized */
+  if (GTK_WIDGET_REALIZED (widget))
+    {
+      /* set background color (using the base color) */
+      gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
+    }
+}
+
+
+
+static gboolean
+xfce_heading_expose_event (GtkWidget      *widget,
+                           GdkEventExpose *event)
+{
+  XfceHeading *heading = XFCE_HEADING (widget);
+  PangoLayout *layout;
+  GdkPixbuf   *pixbuf;
+  gboolean     rtl;
+  gint         width;
+  gint         height;
+  gint         x;
+  gint         y;
+
+  /* check if we should render from right to left */
+  rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
+
+  /* determine the initial horizontal position */
+  x = (rtl ? widget->allocation.width - XFCE_HEADING_BORDER : XFCE_HEADING_BORDER);
+
+  /* check if we have a pixbuf to render */
+  pixbuf = xfce_heading_make_pixbuf (heading);
+  if (G_LIKELY (pixbuf != NULL))
+    {
+      /* determine the pixbuf dimensions */
+      width = gdk_pixbuf_get_width (pixbuf);
+      height = gdk_pixbuf_get_height (pixbuf);
+
+      /* determine the vertical position */
+      y = (widget->allocation.height - height) / 2;
+
+      /* render the pixbuf */
+      gdk_draw_pixbuf (widget->window, widget->style->black_gc, pixbuf, 0, 0,
+                       (rtl ? x - width : x), y, width, height,
+                       GDK_RGB_DITHER_NORMAL, 0, 0);
+
+      /* release the pixbuf */
+      g_object_unref (G_OBJECT (pixbuf));
+
+      /* advance the horizontal position */
+      x += (rtl ? -1 : 1) * (width + XFCE_HEADING_SPACING);
+    }
+
+  /* generate the title layout */
+  layout = xfce_heading_make_layout (heading);
+  pango_layout_get_pixel_size (layout, &width, &height);
+
+  /* determine the vertical position */
+  y = (widget->allocation.height - height) / 2;
+
+  /* render the title */
+  gtk_paint_layout (widget->style, widget->window, GTK_WIDGET_STATE (widget), TRUE, &event->area,
+                    widget, "heading", (rtl ? x - width : x), y, layout);
+
+  /* release the layout */
+  g_object_unref (G_OBJECT (layout));
+
+  return FALSE;
+}
+
+
+
+static AtkObject*
+xfce_heading_get_accessible (GtkWidget *widget)
+{
+  AtkObject *object;
+
+  object = (*GTK_WIDGET_CLASS (xfce_heading_parent_class)->get_accessible) (widget);
+  atk_object_set_role (object, ATK_ROLE_HEADER);
+
+  return object;
+}
+
+
+
+static PangoLayout*
+xfce_heading_make_layout (XfceHeading *heading)
+{
+  PangoAttribute *attribute;
+  PangoAttrList  *attr_list;
+  PangoLayout    *layout;
+  GString        *text;
+  gint            title_length = 0;
+
+  /* generate the full text */
+  text = g_string_sized_new (128);
+  if (G_LIKELY (heading->priv->title != NULL))
+    {
+      /* add the main title */
+      title_length = strlen (heading->priv->title);
+      g_string_append (text, heading->priv->title);
+    }
+  if (heading->priv->subtitle != NULL && *heading->priv->subtitle != '\0')
+    {
+      /* add an empty line between the title and the subtitle */
+      if (G_LIKELY (heading->priv->title != NULL))
+        g_string_append (text, "\n");
+
+      /* add the subtitle */
+      g_string_append (text, heading->priv->subtitle);
+    }
+
+  /* allocate and setup a new layout from the widget's context */
+  layout = gtk_widget_create_pango_layout (GTK_WIDGET (heading), text->str);
+
+  /* allocate an attribute list (large bold title) */
+  attr_list = pango_attr_list_new ();
+  attribute = pango_attr_scale_new (PANGO_SCALE_LARGE); /* large title */
+  attribute->start_index = 0;
+  attribute->end_index = title_length;
+  pango_attr_list_insert (attr_list, attribute);
+  attribute = pango_attr_weight_new (PANGO_WEIGHT_BOLD); /* bold title */
+  attribute->start_index = 0;
+  attribute->end_index = title_length;
+  pango_attr_list_insert (attr_list, attribute);
+  pango_layout_set_attributes (layout, attr_list);
+  pango_attr_list_unref (attr_list);
+
+  /* cleanup */
+  g_string_free (text, TRUE);
+
+  return layout;
+}
+
+
+
+static GdkPixbuf*
+xfce_heading_make_pixbuf (XfceHeading *heading)
+{
+  GtkIconTheme *icon_theme;
+  GdkPixbuf    *pixbuf = NULL;
+  GdkScreen    *screen;
+
+  if (G_UNLIKELY (heading->priv->icon != NULL))
+    {
+      /* just use the specified icon */
+      pixbuf = g_object_ref (G_OBJECT (heading->priv->icon));
+    }
+  else if (G_LIKELY (heading->priv->icon_name != NULL))
+    {
+      /* determine the icon theme for the current screen */
+      screen = gtk_widget_get_screen (GTK_WIDGET (heading));
+      icon_theme = gtk_icon_theme_get_for_screen (screen);
+
+      /* try to load the icon from the icon theme */
+      pixbuf = gtk_icon_theme_load_icon (icon_theme, heading->priv->icon_name,
+                                         XFCE_HEADING_ICON_SIZE,
+                                         GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+    }
+
+  return pixbuf;
+}
+
+
+
+/**
+ * xfce_heading_new:
+ *
+ * Allocates a new #XfceHeading instance.
+ *
+ * Return value: the newly allocated #XfceHeading.
+ **/
+GtkWidget*
+xfce_heading_new (void)
+{
+  return g_object_new (XFCE_TYPE_HEADING, NULL);
+}
+
+
+
+/**
+ * xfce_heading_get_icon:
+ * @heading : a #XfceHeading.
+ *
+ * Returns the #GdkPixbuf that was set as icon for
+ * @heading or %NULL if no icon is set. The returned
+ * #GdkPixbuf object is owned by @heading.
+ *
+ * Return value: the icon for @heading, or %NULL.
+ **/
+static GdkPixbuf*
+xfce_heading_get_icon (XfceHeading *heading)
+{
+  g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
+  return heading->priv->icon;
+}
+
+
+
+/**
+ * xfce_heading_set_icon:
+ * @heading : a #XfceHeading.
+ * @icon    : the new icon or %NULL.
+ *
+ * If @icon is not %NULL, @heading will display the new @icon
+ * aside the title. Else, if @icon is %NULL no icon is displayed
+ * unless an icon name was set with xfce_heading_set_icon_name().
+ **/
+void
+xfce_heading_set_icon (XfceHeading *heading,
+                       GdkPixbuf   *icon)
+{
+  g_return_if_fail (XFCE_IS_HEADING (heading));
+  g_return_if_fail (icon == NULL || GDK_IS_PIXBUF (icon));
+
+  /* check if we have a new icon */
+  if (G_LIKELY (heading->priv->icon != icon))
+    {
+      /* disconnect from the previous icon */
+      if (G_LIKELY (heading->priv->icon != NULL))
+        g_object_unref (G_OBJECT (heading->priv->icon));
+
+      /* activate the new icon */
+      heading->priv->icon = icon;
+
+      /* connect to the new icon */
+      if (G_LIKELY (icon != NULL))
+        g_object_ref (G_OBJECT (icon));
+
+      /* schedule a resize */
+      gtk_widget_queue_resize (GTK_WIDGET (heading));
+
+      /* notify listeners */
+      g_object_notify (G_OBJECT (heading), "icon");
+    }
+}
+
+
+
+/**
+ * xfce_heading_get_icon_name:
+ * @heading : a #XfceHeading.
+ *
+ * Returns the icon name previously set by a call to
+ * xfce_heading_set_icon_name() or %NULL if no icon name
+ * is set for @heading.
+ *
+ * Return value: the icon name for @heading, or %NULL.
+ **/
+static const gchar*
+xfce_heading_get_icon_name (XfceHeading *heading)
+{
+  g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
+  return heading->priv->icon_name;
+}
+
+
+
+/**
+ * xfce_heading_set_icon_name:
+ * @heading   : a #XfceHeading.
+ * @icon_name : the new icon name, or %NULL.
+ *
+ * If @icon_name is not %NULL and the "icon" property is set to
+ * %NULL, see xfce_heading_set_icon(), the @heading will display
+ * the name icon identified by the @icon_name.
+ **/
+void
+xfce_heading_set_icon_name (XfceHeading *heading,
+                            const gchar *icon_name)
+{
+  g_return_if_fail (XFCE_IS_HEADING (heading));
+
+  /* release the previous icon name */
+  g_free (heading->priv->icon_name);
+
+  /* activate the new icon name */
+  heading->priv->icon_name = g_strdup (icon_name);
+
+  /* schedule a resize */
+  gtk_widget_queue_resize (GTK_WIDGET (heading));
+
+  /* notify listeners */
+  g_object_notify (G_OBJECT (heading), "icon-name");
+}
+
+
+
+/**
+ * xfce_heading_get_subtitle:
+ * @heading : a #XfceHeading.
+ *
+ * Returns the sub title displayed below the
+ * main title of the @heading, or %NULL if
+ * no subtitle is set.
+ *
+ * Return value: the subtitle of @heading, or %NULL.
+ **/
+static const gchar*
+xfce_heading_get_subtitle (XfceHeading *heading)
+{
+  g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
+  return heading->priv->subtitle;
+}
+
+
+
+/**
+ * xfce_heading_set_subtitle:
+ * @heading  : a #XfceHeading.
+ * @subtitle : the new subtitle for @heading, or %NULL.
+ *
+ * If @subtitle is not %NULL and not the empty string, it
+ * will be displayed by @heading below the main title.
+ **/
+void
+xfce_heading_set_subtitle (XfceHeading *heading,
+                           const gchar *subtitle)
+{
+  g_return_if_fail (XFCE_IS_HEADING (heading));
+  g_return_if_fail (subtitle == NULL || g_utf8_validate (subtitle, -1, NULL));
+
+  /* release the previous subtitle */
+  g_free (heading->priv->subtitle);
+
+  /* activate the new subtitle */
+  heading->priv->subtitle = g_strdup (subtitle);
+
+  /* schedule a resize */
+  gtk_widget_queue_resize (GTK_WIDGET (heading));
+
+  /* notify listeners */
+  g_object_notify (G_OBJECT (heading), "subtitle");
+}
+
+
+
+/**
+ * xfce_heading_get_title:
+ * @heading : a #XfceHeading.
+ *
+ * Returns the title displayed by the @heading.
+ *
+ * Return value: the title displayed by the @heading.
+ **/
+static const gchar*
+xfce_heading_get_title (XfceHeading *heading)
+{
+  g_return_val_if_fail (XFCE_IS_HEADING (heading), NULL);
+  return heading->priv->title;
+}
+
+
+
+/**
+ * xfce_heading_set_title:
+ * @heading : a #XfceHeading.
+ * @title   : the new title for the @heading.
+ *
+ * Sets the title displayed by the @heading to the
+ * specified @title.
+ **/
+void
+xfce_heading_set_title (XfceHeading *heading,
+                        const gchar *title)
+{
+  g_return_if_fail (XFCE_IS_HEADING (heading));
+  g_return_if_fail (title == NULL || g_utf8_validate (title, -1, NULL));
+
+  /* release the previous title */
+  g_free (heading->priv->title);
+
+  /* activate the new title */
+  heading->priv->title = g_strdup (title);
+
+  /* schedule a resize */
+  gtk_widget_queue_resize (GTK_WIDGET (heading));
+
+  /* notify listeners */
+  g_object_notify (G_OBJECT (heading), "title");
+}

Added: terminal/trunk/terminal/xfce-heading.h
===================================================================
--- terminal/trunk/terminal/xfce-heading.h	                        (rev 0)
+++ terminal/trunk/terminal/xfce-heading.h	2009-07-11 17:06:34 UTC (rev 30282)
@@ -0,0 +1,67 @@
+/* $Id: xfce-heading.h 29017 2008-12-13 11:21:37Z nick $ */
+/*-
+ * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __XFCE_HEADING_H__
+#define __XFCE_HEADING_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _XfceHeadingPrivate XfceHeadingPrivate;
+typedef struct _XfceHeadingClass   XfceHeadingClass;
+typedef struct _XfceHeading        XfceHeading;
+
+#define XFCE_TYPE_HEADING             (xfce_heading_get_type ())
+#define XFCE_HEADING(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_HEADING, XfceHeading))
+#define XFCE_HEADING_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_HEADING, XfceHeadingClass))
+#define XFCE_IS_HEADING(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_HEADING))
+#define XFCE_IS_HEADING_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_HEADING))
+#define XFCE_HEADING_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_HEADING, XfceHeadingClass))
+
+struct _XfceHeadingClass
+{
+  /*< private >*/
+  GtkWidgetClass __parent__;
+};
+
+struct _XfceHeading
+{
+  /*< private >*/
+  GtkWidget           __parent__;
+  XfceHeadingPrivate *priv;
+};
+
+GType      xfce_heading_get_type      (void) G_GNUC_CONST;
+
+GtkWidget *xfce_heading_new           (void) G_GNUC_MALLOC;
+
+void       xfce_heading_set_icon      (XfceHeading *heading,
+                                       GdkPixbuf   *icon);
+void       xfce_heading_set_icon_name (XfceHeading *heading,
+                                       const gchar *icon_name);
+void       xfce_heading_set_subtitle  (XfceHeading *heading,
+                                       const gchar *subtitle);
+void       xfce_heading_set_title     (XfceHeading *heading,
+                                       const gchar *title);
+
+G_END_DECLS
+
+#endif /* !__XFCE_HEADING_H__ */

Added: terminal/trunk/terminal/xfce-titled-dialog.c
===================================================================
--- terminal/trunk/terminal/xfce-titled-dialog.c	                        (rev 0)
+++ terminal/trunk/terminal/xfce-titled-dialog.c	2009-07-11 17:06:34 UTC (rev 30282)
@@ -0,0 +1,272 @@
+/* $Id: xfce-titled-dialog.c 30220 2009-07-08 08:47:01Z nick $ */
+/*-
+ * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#include <gdk/gdkkeysyms.h>
+
+#include <terminal/xfce-heading.h>
+#include <terminal/xfce-titled-dialog.h>
+
+
+#define XFCE_TITLED_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogPrivate))
+
+
+
+/* Property identifiers */
+enum
+{
+  PROP_0,
+  PROP_SUBTITLE,
+};
+
+
+
+static void xfce_titled_dialog_finalize       (GObject                *object);
+static void xfce_titled_dialog_get_property   (GObject                *object,
+                                               guint                   prop_id,
+                                               GValue                 *value,
+                                               GParamSpec             *pspec);
+static void xfce_titled_dialog_set_property   (GObject                *object,
+                                               guint                   prop_id,
+                                               const GValue           *value,
+                                               GParamSpec             *pspec);
+static void xfce_titled_dialog_close          (GtkDialog              *dialog);
+static void xfce_titled_dialog_update_heading (XfceTitledDialog       *titled_dialog);
+static void xfce_titled_dialog_set_subtitle   (XfceTitledDialog       *titled_dialog,
+                                               const gchar            *subtitle);
+
+
+struct _XfceTitledDialogPrivate
+{
+  GtkWidget *heading;
+  gchar     *subtitle;
+};
+
+
+
+G_DEFINE_TYPE (XfceTitledDialog, xfce_titled_dialog, GTK_TYPE_DIALOG)
+
+
+
+static void
+xfce_titled_dialog_class_init (XfceTitledDialogClass *klass)
+{
+  GtkDialogClass *gtkdialog_class;
+  GtkBindingSet  *binding_set;
+  GObjectClass   *gobject_class;
+
+  /* add our private data to the class */
+  g_type_class_add_private (klass, sizeof (XfceTitledDialogPrivate));
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = xfce_titled_dialog_finalize;
+  gobject_class->get_property = xfce_titled_dialog_get_property;
+  gobject_class->set_property = xfce_titled_dialog_set_property;
+
+  gtkdialog_class = GTK_DIALOG_CLASS (klass);
+  gtkdialog_class->close = xfce_titled_dialog_close;
+
+  /**
+   * XfceTitledDialog:subtitle:
+   *
+   * The subtitle displayed below the main dialog title.
+   **/
+  g_object_class_install_property (gobject_class,
+                                   PROP_SUBTITLE,
+                                   g_param_spec_string ("subtitle",
+                                                        "subtitle",
+                                                        "subtitle",
+                                                        NULL,
+                                                        G_PARAM_READWRITE
+                                                        | G_PARAM_STATIC_STRINGS));
+
+  /* connect additional key bindings to the GtkDialog::close action signal */
+  binding_set = gtk_binding_set_by_class (klass);
+  gtk_binding_entry_add_signal (binding_set, GDK_w, GDK_CONTROL_MASK, "close", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_W, GDK_CONTROL_MASK, "close", 0);
+}
+
+
+
+static void
+xfce_titled_dialog_init (XfceTitledDialog *titled_dialog)
+{
+  GtkWidget *line;
+  GtkWidget *vbox;
+
+  /* connect the private data */
+  titled_dialog->priv = XFCE_TITLED_DIALOG_GET_PRIVATE (titled_dialog);
+
+  /* remove the main dialog box from the window */
+  g_object_ref (G_OBJECT (GTK_DIALOG (titled_dialog)->vbox));
+  gtk_container_remove (GTK_CONTAINER (titled_dialog), GTK_DIALOG (titled_dialog)->vbox);
+
+  /* add a new vbox w/o border to the main window */
+  vbox = gtk_vbox_new (FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (titled_dialog), vbox);
+  gtk_widget_show (vbox);
+
+  /* add the heading to the window */
+  titled_dialog->priv->heading = xfce_heading_new ();
+  gtk_box_pack_start (GTK_BOX (vbox), titled_dialog->priv->heading, FALSE, FALSE, 0);
+  gtk_widget_show (titled_dialog->priv->heading);
+
+  /* add the separator between header and content */
+  line = gtk_hseparator_new ();
+  gtk_box_pack_start (GTK_BOX (vbox), line, FALSE, FALSE, 0);
+  gtk_widget_show (line);
+
+  /* add the main dialog box to the new vbox */
+  gtk_box_pack_start (GTK_BOX (vbox), GTK_DIALOG (titled_dialog)->vbox, TRUE, TRUE, 0);
+  g_object_unref (G_OBJECT (GTK_DIALOG (titled_dialog)->vbox));
+
+  /* make sure to update the heading whenever one of the relevant window properties changes */
+  g_signal_connect (G_OBJECT (titled_dialog), "notify::icon", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
+  g_signal_connect (G_OBJECT (titled_dialog), "notify::icon-name", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
+  g_signal_connect (G_OBJECT (titled_dialog), "notify::title", G_CALLBACK (xfce_titled_dialog_update_heading), NULL);
+
+  /* initially update the heading properties */
+  xfce_titled_dialog_update_heading (titled_dialog);
+}
+
+
+
+
+static void
+xfce_titled_dialog_finalize (GObject *object)
+{
+  XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
+
+  /* release the subtitle */
+  g_free (titled_dialog->priv->subtitle);
+
+  (*G_OBJECT_CLASS (xfce_titled_dialog_parent_class)->finalize) (object);
+}
+
+
+
+static void
+xfce_titled_dialog_get_property (GObject    *object,
+                                 guint       prop_id,
+                                 GValue     *value,
+                                 GParamSpec *pspec)
+{
+  XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_SUBTITLE:
+      g_value_set_string (value, titled_dialog->priv->subtitle);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
+xfce_titled_dialog_set_property (GObject      *object,
+                                 guint         prop_id,
+                                 const GValue *value,
+                                 GParamSpec   *pspec)
+{
+  XfceTitledDialog *titled_dialog = XFCE_TITLED_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_SUBTITLE:
+      xfce_titled_dialog_set_subtitle (titled_dialog, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+
+static void
+xfce_titled_dialog_close (GtkDialog *dialog)
+{
+  GdkEvent *event;
+
+  /* verify that the dialog is realized */
+  if (G_LIKELY (GTK_WIDGET_REALIZED (dialog)))
+    {
+      /* send a delete event to the dialog */
+      event = gdk_event_new (GDK_DELETE);
+      event->any.window = g_object_ref (GTK_WIDGET (dialog)->window);
+      event->any.send_event = TRUE;
+      gtk_main_do_event (event);
+      gdk_event_free (event);
+    }
+}
+
+
+
+static void
+xfce_titled_dialog_update_heading (XfceTitledDialog *titled_dialog)
+{
+  /* update the heading properties using the window property values */
+  xfce_heading_set_icon (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_icon (GTK_WINDOW (titled_dialog)));
+  xfce_heading_set_icon_name (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_icon_name (GTK_WINDOW (titled_dialog)));
+  xfce_heading_set_title (XFCE_HEADING (titled_dialog->priv->heading), gtk_window_get_title (GTK_WINDOW (titled_dialog)));
+}
+
+
+
+/**
+ * xfce_titled_dialog_set_subtitle:
+ * @titled_dialog : a #XfceTitledDialog.
+ * @subtitle      : the new subtitle for the @titled_dialog, or %NULL.
+ *
+ * Sets the subtitle displayed by @titled_dialog to @subtitle; if
+ * @subtitle is %NULL no subtitle will be displayed by the @titled_dialog.
+ **/
+static void
+xfce_titled_dialog_set_subtitle (XfceTitledDialog *titled_dialog,
+                                 const gchar      *subtitle)
+{
+  g_return_if_fail (XFCE_IS_TITLED_DIALOG (titled_dialog));
+  g_return_if_fail (subtitle == NULL || g_utf8_validate (subtitle, -1, NULL));
+
+  /* release the previous subtitle */
+  g_free (titled_dialog->priv->subtitle);
+
+  /* activate the new subtitle */
+  titled_dialog->priv->subtitle = g_strdup (subtitle);
+
+  /* update the subtitle for the heading */
+  xfce_heading_set_subtitle (XFCE_HEADING (titled_dialog->priv->heading), subtitle);
+
+  /* notify listeners */
+  g_object_notify (G_OBJECT (titled_dialog), "subtitle");
+}

Added: terminal/trunk/terminal/xfce-titled-dialog.h
===================================================================
--- terminal/trunk/terminal/xfce-titled-dialog.h	                        (rev 0)
+++ terminal/trunk/terminal/xfce-titled-dialog.h	2009-07-11 17:06:34 UTC (rev 30282)
@@ -0,0 +1,64 @@
+/* $Id: xfce-titled-dialog.h 26543 2008-01-05 21:19:49Z nick $ */
+/*-
+ * Copyright (c) 2006 Benedikt Meurer <benny at xfce.org>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __XFCE_TITLED_DIALOG_H__
+#define __XFCE_TITLED_DIALOG_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _XfceTitledDialogPrivate XfceTitledDialogPrivate;
+typedef struct _XfceTitledDialogClass   XfceTitledDialogClass;
+typedef struct _XfceTitledDialog        XfceTitledDialog;
+
+#define XFCE_TYPE_TITLED_DIALOG             (xfce_titled_dialog_get_type ())
+#define XFCE_TITLED_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialog))
+#define XFCE_TITLED_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogClass))
+#define XFCE_IS_TITLED_DIALOG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_TITLED_DIALOG))
+#define XFCE_IS_TITLED_DIALOG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_TITLED_DIALOG))
+#define XFCE_TITLED_DIALOG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_TITLED_DIALOG, XfceTitledDialogClass))
+
+struct _XfceTitledDialogClass
+{
+  /*< private >*/
+  GtkDialogClass __parent__;
+
+  /* reserved for future expansion */
+  void (*reserved0) (void);
+  void (*reserved1) (void);
+  void (*reserved2) (void);
+  void (*reserved3) (void);
+  void (*reserved4) (void);
+  void (*reserved5) (void);
+};
+
+struct _XfceTitledDialog
+{
+  /*< private >*/
+  GtkDialog                __parent__;
+  XfceTitledDialogPrivate *priv;
+};
+
+GType xfce_titled_dialog_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* !__XFCE_TITLED_DIALOG_H__ */




More information about the Xfce4-commits mailing list