[Xfce4-commits] <ristretto:master> Implement basic 'set as wallpaper' functionality for xfdesktop, simmilar to the 0.0.x versions (only set on screen0, monitor0)

Stephan Arts noreply at xfce.org
Sat Sep 26 09:10:01 CEST 2009


Updating branch refs/heads/master
         to 6ec49be460af0d05d5d38573821aa3f34ba8f3da (commit)
       from 29e052d12745196ba251b64bb5f699275ec5cb60 (commit)

commit 6ec49be460af0d05d5d38573821aa3f34ba8f3da
Author: Stephan Arts <stephan at xfce.org>
Date:   Sat Sep 26 09:03:40 2009 +0200

    Implement basic 'set as wallpaper' functionality for xfdesktop, simmilar to the 0.0.x versions (only set on screen0, monitor0)

 src/Makefile.am              |    2 +
 src/image.h                  |    2 +
 src/main_window.c            |   29 ++++--
 src/wallpaper_manager.c      |   79 +++++++++++++++
 src/wallpaper_manager.h      |   49 ++++++++++
 src/xfce_wallpaper_manager.c |  217 ++++++++++++++++++++++++++++++++++++++++++
 src/xfce_wallpaper_manager.h |   65 +++++++++++++
 7 files changed, 435 insertions(+), 8 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 9a88f24..2467eba 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -9,6 +9,8 @@ ristretto_SOURCES = \
 	preferences_dialog.h preferences_dialog.c \
 	main_window_ui.h \
 	main_window.c main_window.h \
+    wallpaper_manager.c wallpaper_manager.h \
+    xfce_wallpaper_manager.c xfce_wallpaper_manager.h \
     app_menu_item.c app_menu_item.h \
 	thumbnail_bar.c thumbnail_bar.h \
 	thumbnail.c thumbnail.h \
diff --git a/src/image.h b/src/image.h
index 8b483b5..50e91d0 100644
--- a/src/image.h
+++ b/src/image.h
@@ -1,4 +1,6 @@
 /*
+ *  Copyright (C) Stephan Arts 2006-2009 <stephan at xfce.org>
+ *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
diff --git a/src/main_window.c b/src/main_window.c
index 97931a5..a1615e5 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -38,6 +38,8 @@
 #include "main_window.h"
 #include "main_window_ui.h"
 #include "thumbnail_bar.h"
+#include "wallpaper_manager.h"
+#include "xfce_wallpaper_manager.h"
 
 #include "preferences_dialog.h"
 #include "app_menu_item.h"
@@ -71,6 +73,7 @@ struct _RsttoMainWindowPriv
     GtkUIManager     *ui_manager;
     GtkRecentManager *recent_manager;
     RsttoSettings    *settings_manager;
+    RsttoWallpaperManager *wallpaper_manager;
 
     GtkWidget *menubar;
     GtkWidget *toolbar;
@@ -385,6 +388,7 @@ rstto_main_window_init (RsttoMainWindow *window)
     gtk_window_set_title (GTK_WINDOW (window), RISTRETTO_APP_TITLE);
 
     window->priv = g_new0(RsttoMainWindowPriv, 1);
+    window->priv->wallpaper_manager = RSTTO_WALLPAPER_MANAGER (rstto_xfce_wallpaper_manager_new());
 
     window->priv->iter = NULL;
 
@@ -710,8 +714,8 @@ rstto_main_window_image_list_iter_changed (RsttoMainWindow *window)
     const gchar *content_type;
     GtkWidget *open_with_menu = gtk_menu_new();
     GtkWidget *open_with_window_menu = gtk_menu_new();
-    gtk_menu_item_set_submenu (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu"), open_with_menu);
-    gtk_menu_item_set_submenu (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/open-with-menu"), open_with_window_menu);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/image-viewer-menu/open-with-menu")), open_with_menu);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget ( window->priv->ui_manager, "/main-menu/edit-menu/open-with-menu")), open_with_window_menu);
 
     if (window->priv->props.image_list)
     {
@@ -1209,7 +1213,18 @@ cb_rstto_main_window_navigationtoolbar_position_changed (GtkRadioAction *action,
 static void
 cb_rstto_main_window_set_as_wallpaper (GtkWidget *widget, RsttoMainWindow *window)
 {
-    
+    RsttoImage *image = NULL;
+    if (window->priv->iter)
+        image = rstto_image_list_iter_get_image (window->priv->iter);
+    g_return_if_fail (image);
+
+    if (rstto_wallpaper_manager_check_running (window->priv->wallpaper_manager))
+    {
+        if (rstto_wallpaper_manager_configure_dialog_run (window->priv->wallpaper_manager, image) == GTK_RESPONSE_OK)
+        {
+            rstto_wallpaper_manager_set (window->priv->wallpaper_manager, image);
+        }
+    }
 }
 
 static void
@@ -1243,8 +1258,6 @@ cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event,
                 gtk_widget_hide (window->priv->thumbnailbar);
             }
 
-            /*rstto_picture_viewer_zoom_fit (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer));*/
-
             gtk_ui_manager_add_ui (window->priv->ui_manager,
                                    window->priv->toolbar_unfullscreen_merge_id,
                                    "/navigation-toolbar/placeholder-fullscreen",
@@ -1303,9 +1316,9 @@ cb_rstto_main_window_motion_notify_event (RsttoMainWindow *window,
     gint width, height;
     if(gdk_window_get_state(GTK_WIDGET(window)->window) & GDK_WINDOW_STATE_FULLSCREEN)
     {
-	gdk_drawable_get_size (GDK_DRAWABLE(GTK_WIDGET(window)->window), &width, &height);
-        //if ((event->state == 0) && (event->window == event->subwindow))
-	if ((event->x_root == 0) || (event->y_root == 0) || (((gint)event->x_root) == (width-1)) || (((gint)event->y_root) == (height-1)))
+        gdk_drawable_get_size (GDK_DRAWABLE(GTK_WIDGET(window)->window), &width, &height);
+
+        if ((event->x_root == 0) || (event->y_root == 0) || (((gint)event->x_root) == (width-1)) || (((gint)event->y_root) == (height-1)))
         {
             gtk_widget_show (window->priv->image_list_toolbar);
             window->priv->fs_toolbar_sticky = TRUE;
diff --git a/src/wallpaper_manager.c b/src/wallpaper_manager.c
new file mode 100644
index 0000000..4ac5997
--- /dev/null
+++ b/src/wallpaper_manager.c
@@ -0,0 +1,79 @@
+/*
+ *  Copyright (C) Stephan Arts 2009 <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <gio/gio.h>
+
+
+
+#include "image.h"
+
+#include "wallpaper_manager.h"
+
+gint 
+rstto_wallpaper_manager_configure_dialog_run (RsttoWallpaperManager *self, RsttoImage *image)
+{
+    RSTTO_WALLPAPER_MANAGER_GET_IFACE (self)->configure_dialog_run(self, image);
+}
+
+gboolean 
+rstto_wallpaper_manager_check_running (RsttoWallpaperManager *self)
+{
+    RSTTO_WALLPAPER_MANAGER_GET_IFACE (self)->check_running (self);
+}
+
+gboolean
+rstto_wallpaper_manager_set (RsttoWallpaperManager *self, RsttoImage *image)
+{
+    RSTTO_WALLPAPER_MANAGER_GET_IFACE (self)->set (self, image);
+}
+
+
+static void
+rstto_wallpaper_manager_iface_init (gpointer         g_iface,
+                                    gpointer         iface_data)
+{
+    RsttoWallpaperManagerIface *iface = (RsttoWallpaperManagerIface *)g_iface;
+    iface->configure_dialog_run = rstto_wallpaper_manager_configure_dialog_run;
+}
+
+
+GType 
+rstto_wallpaper_manager_get_type (void)
+{
+    static GType iface_type = 0;
+    if (iface_type == 0)
+    {
+        static const GTypeInfo info = {
+            sizeof (RsttoWallpaperManagerIface),
+            rstto_wallpaper_manager_iface_init,   /* base_init */
+            NULL,   /* base_finalize */
+        };
+
+        iface_type = g_type_register_static (G_TYPE_INTERFACE, "RsttoWallpaperManagerIface",
+                               &info, 0);
+    }
+
+    return iface_type;
+
+}
diff --git a/src/wallpaper_manager.h b/src/wallpaper_manager.h
new file mode 100644
index 0000000..69316d1
--- /dev/null
+++ b/src/wallpaper_manager.h
@@ -0,0 +1,49 @@
+/*
+ *  Copyright (C) Stephan Arts 2009 <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_WALLPAPER_MANAGER_IFACE__
+#define __RISTRETTO_WALLPAPER_MANAGER_IFACE__
+
+G_BEGIN_DECLS
+
+#define RSTTO_WALLPAPER_MANAGER_TYPE    rstto_wallpaper_manager_get_type ()
+#define RSTTO_WALLPAPER_MANAGER(obj)    (G_TYPE_CHECK_INSTANCE_CAST ((obj), RSTTO_WALLPAPER_MANAGER_TYPE, RsttoWallpaperManager))
+#define RSTTO_IS_WALLPAPER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RSTTO_WALLPAPER_MANAGER_TYPE))
+#define RSTTO_WALLPAPER_MANAGER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), RSTTO_WALLPAPER_MANAGER_TYPE, RsttoWallpaperManagerIface))
+
+typedef struct _RsttoWallpaperManager RsttoWallpaperManager; /* dummy object */
+typedef struct _RsttoWallpaperManagerIface RsttoWallpaperManagerIface;
+
+struct _RsttoWallpaperManagerIface {
+    GTypeInterface parent;
+
+    gint (*configure_dialog_run) (RsttoWallpaperManager *self, RsttoImage *image);
+    gboolean (*set) (RsttoWallpaperManager *self, RsttoImage *image);
+    gboolean (*check_running) (RsttoWallpaperManager *self);
+};
+
+GType rstto_wallpaper_manager_get_type (void);
+
+gboolean rstto_wallpaper_manager_check_running (RsttoWallpaperManager *self);
+
+gint rstto_wallpaper_manager_configure_dialog_run (RsttoWallpaperManager *self, RsttoImage *image);
+gboolean rstto_wallpaper_manager_set (RsttoWallpaperManager *self, RsttoImage *image);
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_WALLPAPER_MANAGER_IFACE__ */
diff --git a/src/xfce_wallpaper_manager.c b/src/xfce_wallpaper_manager.c
new file mode 100644
index 0000000..f69e944
--- /dev/null
+++ b/src/xfce_wallpaper_manager.c
@@ -0,0 +1,217 @@
+/*
+ *  Copyright (c) 2009 Stephan Arts <stephan at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <X11/Xlib.h>
+#include <xfconf/xfconf.h>
+#include <libxfce4util/libxfce4util.h>
+#include <gio/gio.h>
+
+#include "image.h"
+
+#include "wallpaper_manager.h"
+#include "xfce_wallpaper_manager.h"
+
+#define XFDESKTOP_SELECTION_FMT "XFDESKTOP_SELECTION_%d"
+
+static void
+rstto_xfce_wallpaper_manager_init (GObject *);
+static void
+rstto_xfce_wallpaper_manager_class_init (GObjectClass *);
+
+static void
+rstto_xfce_wallpaper_manager_dispose (GObject *object);
+static void
+rstto_xfce_wallpaper_manager_finalize (GObject *object);
+
+static GObjectClass *parent_class = NULL;
+
+static RsttoXfceWallpaperManager *xfce_wallpaper_manager_object;
+
+struct _RsttoXfceWallpaperManagerPriv
+{
+    XfconfChannel *channel;
+};
+
+
+enum
+{
+    PROP_0,
+};
+
+static gint 
+rstto_xfce_wallpaper_manager_configure_dialog_run (RsttoWallpaperManager *self, RsttoImage *image)
+{
+    return GTK_RESPONSE_OK;
+}
+
+static gboolean
+rstto_xfce_wallpaper_manager_check_running (RsttoWallpaperManager *self)
+{
+    gchar selection_name[100];
+
+    GdkScreen *gdk_screen = gdk_screen_get_default();
+    gint xscreen = gdk_screen_get_number(gdk_screen);
+
+    g_snprintf(selection_name, 100, XFDESKTOP_SELECTION_FMT, xscreen);
+
+    Atom xfce_selection_atom = XInternAtom (gdk_display, selection_name, False);
+    if((XGetSelectionOwner(GDK_DISPLAY(), xfce_selection_atom)))
+    {
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean
+rstto_xfce_wallpaper_manager_set (RsttoWallpaperManager *self, RsttoImage *image)
+{
+    RsttoXfceWallpaperManager *manager = RSTTO_XFCE_WALLPAPER_MANAGER (self);
+    GFile *file = rstto_image_get_file (image);
+    gchar *uri = g_file_get_path (file);
+
+    xfconf_channel_set_string (manager->priv->channel, "/backdrop/screen0/monitor0/image-path", uri);
+    xfconf_channel_set_bool   (manager->priv->channel, "/backdrop/screen0/monitor0/image-show", TRUE);
+    xfconf_channel_set_int    (manager->priv->channel, "/backdrop/screen0/monitor0/image-style", 4);
+
+    return FALSE;
+}
+
+static void
+rstto_xfce_wallpaper_manager_iface_init (RsttoWallpaperManagerIface *iface)
+{
+    iface->configure_dialog_run = rstto_xfce_wallpaper_manager_configure_dialog_run;
+    iface->check_running = rstto_xfce_wallpaper_manager_check_running;
+    iface->set = rstto_xfce_wallpaper_manager_set;
+}
+
+GType
+rstto_xfce_wallpaper_manager_get_type (void)
+{
+    static GType rstto_xfce_wallpaper_manager_type = 0;
+
+    if (!rstto_xfce_wallpaper_manager_type)
+    {
+        static const GTypeInfo rstto_xfce_wallpaper_manager_info = 
+        {
+            sizeof (RsttoXfceWallpaperManagerClass),
+            (GBaseInitFunc) NULL,
+            (GBaseFinalizeFunc) NULL,
+            (GClassInitFunc) rstto_xfce_wallpaper_manager_class_init,
+            (GClassFinalizeFunc) NULL,
+            NULL,
+            sizeof (RsttoXfceWallpaperManager),
+            0,
+            (GInstanceInitFunc) rstto_xfce_wallpaper_manager_init,
+            NULL
+        };
+
+        rstto_xfce_wallpaper_manager_type = g_type_register_static (G_TYPE_OBJECT, "RsttoXfceWallpaperManager", &rstto_xfce_wallpaper_manager_info, 0);
+
+        static const GInterfaceInfo wallpaper_manager_iface_info = 
+        {
+            (GInstanceInitFunc) rstto_xfce_wallpaper_manager_iface_init,
+            NULL,
+            NULL
+        };
+
+        g_type_add_interface_static (rstto_xfce_wallpaper_manager_type, RSTTO_WALLPAPER_MANAGER_TYPE,  &wallpaper_manager_iface_info);
+
+    }
+    return rstto_xfce_wallpaper_manager_type;
+}
+
+
+static void
+rstto_xfce_wallpaper_manager_init (GObject *object)
+{
+    gchar *accelmap_path = NULL;
+
+    RsttoXfceWallpaperManager *xfce_wallpaper_manager = RSTTO_XFCE_WALLPAPER_MANAGER (object);
+
+    xfce_wallpaper_manager->priv = g_new0 (RsttoXfceWallpaperManagerPriv, 1);
+    xfce_wallpaper_manager->priv->channel = xfconf_channel_new ("xfce4-desktop");
+}
+
+
+static void
+rstto_xfce_wallpaper_manager_class_init (GObjectClass *object_class)
+{
+    GParamSpec *pspec;
+
+    RsttoXfceWallpaperManagerClass *xfce_wallpaper_manager_class = RSTTO_XFCE_WALLPAPER_MANAGER_CLASS (object_class);
+
+    parent_class = g_type_class_peek_parent (xfce_wallpaper_manager_class);
+
+    object_class->dispose = rstto_xfce_wallpaper_manager_dispose;
+    object_class->finalize = rstto_xfce_wallpaper_manager_finalize;
+}
+
+/**
+ * rstto_xfce_wallpaper_manager_dispose:
+ * @object:
+ *
+ */
+static void
+rstto_xfce_wallpaper_manager_dispose (GObject *object)
+{
+    RsttoXfceWallpaperManager *xfce_wallpaper_manager = RSTTO_XFCE_WALLPAPER_MANAGER (object);
+
+    if (xfce_wallpaper_manager->priv)
+    {
+        g_free (xfce_wallpaper_manager->priv);
+        xfce_wallpaper_manager->priv = NULL;
+    }
+}
+
+/**
+ * rstto_xfce_wallpaper_manager_finalize:
+ * @object:
+ *
+ */
+static void
+rstto_xfce_wallpaper_manager_finalize (GObject *object)
+{
+}
+
+
+
+/**
+ * rstto_xfce_wallpaper_manager_new:
+ *
+ *
+ * Singleton
+ */
+RsttoXfceWallpaperManager *
+rstto_xfce_wallpaper_manager_new (void)
+{
+    if (xfce_wallpaper_manager_object == NULL)
+    {
+        xfce_wallpaper_manager_object = g_object_new (RSTTO_TYPE_XFCE_WALLPAPER_MANAGER, NULL);
+    }
+    else
+    {
+        g_object_ref (xfce_wallpaper_manager_object);
+    }
+
+    return xfce_wallpaper_manager_object;
+}
diff --git a/src/xfce_wallpaper_manager.h b/src/xfce_wallpaper_manager.h
new file mode 100644
index 0000000..76f9d9f
--- /dev/null
+++ b/src/xfce_wallpaper_manager.h
@@ -0,0 +1,65 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RISTRETTO_XFCE_WALLPAPER_MANAGER_H__
+#define __RISTRETTO_XFCE_WALLPAPER_MANAGER_H__
+
+G_BEGIN_DECLS
+
+#define RSTTO_TYPE_XFCE_WALLPAPER_MANAGER rstto_xfce_wallpaper_manager_get_type()
+
+#define RSTTO_XFCE_WALLPAPER_MANAGER(obj)( \
+        G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                RSTTO_TYPE_XFCE_WALLPAPER_MANAGER, \
+                RsttoXfceWallpaperManager))
+
+#define RSTTO_IS_XFCE_WALLPAPER_MANAGER(obj)( \
+        G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                RSTTO_TYPE_XFCE_WALLPAPER_MANAGER))
+
+#define RSTTO_XFCE_WALLPAPER_MANAGER_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_CAST ((klass), \
+                RSTTO_TYPE_XFCE_WALLPAPER_MANAGER, \
+                RsttoXfceWallpaperManagerClass))
+
+#define RSTTO_IS_XFCE_WALLPAPER_MANAGER_CLASS(klass)( \
+        G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                RSTTO_TYPE_XFCE_WALLPAPER_MANAGER()))
+
+
+typedef struct _RsttoXfceWallpaperManager RsttoXfceWallpaperManager;
+typedef struct _RsttoXfceWallpaperManagerPriv RsttoXfceWallpaperManagerPriv;
+
+struct _RsttoXfceWallpaperManager
+{
+    GObject parent;
+
+    RsttoXfceWallpaperManagerPriv *priv;
+};
+
+typedef struct _RsttoXfceWallpaperManagerClass RsttoXfceWallpaperManagerClass;
+
+struct _RsttoXfceWallpaperManagerClass
+{
+    GObjectClass parent_class;
+};
+
+RsttoXfceWallpaperManager *rstto_xfce_wallpaper_manager_new (void);
+GType          rstto_xfce_wallpaper_manager_get_type (void);
+
+G_END_DECLS
+
+#endif /* __RISTRETTO_XFCE_WALLPAPER_MANAGER_H__ */



More information about the Xfce4-commits mailing list