Git Repositories

Adding the thunar-wallpaper-plugin to the thunar package
authorStephan Arts <stephan@xfce.org>
Fri, 24 Oct 2008 23:06:03 +0000 (23:06 +0000)
committerStephan Arts <stephan@xfce.org>
Fri, 24 Oct 2008 23:06:03 +0000 (23:06 +0000)
(Old svn revision: 28402)

ChangeLog
acinclude.m4
configure.in.in
plugins/Makefile.am
plugins/thunar-wallpaper/Makefile.am [new file with mode: 0644]
plugins/thunar-wallpaper/thunar-wallpaper-plugin.c [new file with mode: 0644]
plugins/thunar-wallpaper/twp-provider.c [new file with mode: 0644]
plugins/thunar-wallpaper/twp-provider.h [new file with mode: 0644]

index 5bde458..b41b3de 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-10-25  Stephan Arts <stephan@xfce.org>
+
+       * plugins/thunar-wallpaper:
+         Add thunar-wallpaper-plugin which can be used to set the wallpaper
+         on xfdesktop >= 4.5.90
+
 2008-08-25     Brian Tarricone <kelnos@xfce.org>
 
        * thunar/{Makefile.am,thunar-settings,thunar-settings.desktop.in}:
index b6ce99e..bd13e05 100644 (file)
@@ -90,6 +90,20 @@ AM_CONDITIONAL([THUNAR_PLUGIN_UCA], [test x"$ac_bm_thunar_plugin_uca" = x"yes"])
 AC_MSG_RESULT([$ac_bm_thunar_plugin_uca])
 ])
 
+dnl # BM_THUNAR_PLUGIN_WALLPAPER()
+dnl #
+dnl # Check whether the "Wallpaper" plugin
+dnl # should be built and installed.
+dnl #
+AC_DEFUN([BM_THUNAR_PLUGIN_WALLPAPER],
+[
+AC_ARG_ENABLE([wallpaper-plugin], AC_HELP_STRING([--disable-wallpaper-plugin], [Don't build the thunar-wallpaper plugin, see plugins/thunar-wallpaper/README]),
+  [ac_bm_thunar_plugin_wallpaper=$enableval], [ac_bm_thunar_plugin_wallpaper=yes])
+AC_MSG_CHECKING([whether to build the thunar-wallpaper plugin])
+AM_CONDITIONAL([THUNAR_PLUGIN_WALLPAPER], [test x"$ac_bm_thunar_plugin_wallpaper" = x"yes"])
+AC_MSG_RESULT([$ac_bm_thunar_plugin_wallpaper])
+XDT_CHECK_OPTIONAL_PACKAGE([XFCONF], [libxfconf-0], [4.5.91], [xfconf], [Xfconf support])
+])
 
 
 dnl # BM_THUNAR_VFS_MONITOR_IMPL()
index d50bbbc..4f4f71e 100644 (file)
@@ -406,6 +406,7 @@ BM_THUNAR_PLUGIN_APR()
 BM_THUNAR_PLUGIN_SBR()
 BM_THUNAR_PLUGIN_TPA()
 BM_THUNAR_PLUGIN_UCA()
+BM_THUNAR_PLUGIN_WALLPAPER()
 
 AC_OUTPUT([
 Makefile
@@ -460,6 +461,7 @@ plugins/thunar-sbr/Makefile
 plugins/thunar-sendto-email/Makefile
 plugins/thunar-tpa/Makefile
 plugins/thunar-uca/Makefile
+plugins/thunar-wallpaper/Makefile
 po/Makefile.in
 po-doc/Makefile
 tdb/Makefile
@@ -507,4 +509,5 @@ echo "* Advanced Properties:       $ac_bm_thunar_plugin_apr"
 echo "* Simple Builting Renamers:  $ac_bm_thunar_plugin_sbr"
 echo "* Trash Panel Applet:        $ac_bm_thunar_plugin_tpa"
 echo "* User Customizable Actions: $ac_bm_thunar_plugin_uca"
+echo "* Wallpaper support: $ac_bm_thunar_plugin_wallpaper"
 echo
index f9f06c6..53cb3ef 100644 (file)
@@ -16,11 +16,16 @@ if THUNAR_PLUGIN_UCA
 THUNAR_UCA_SUBDIRS = thunar-uca
 endif
 
+if THUNAR_PLUGIN_WALLPAPER
+THUNAR_WALLPAPER_SUBDIRS = thunar-wallpaper
+endif
+
 SUBDIRS =                                                              \
        $(THUNAR_APR_SUBDIRS)                                           \
        $(THUNAR_SBR_SUBDIRS)                                           \
        $(THUNAR_TPA_SUBDIRS)                                           \
        $(THUNAR_UCA_SUBDIRS)                                           \
+       $(THUNAR_WALLPAPER_SUBDIRS)                                     \
        thunar-sendto-email
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/thunar-wallpaper/Makefile.am b/plugins/thunar-wallpaper/Makefile.am
new file mode 100644 (file)
index 0000000..0bb79cb
--- /dev/null
@@ -0,0 +1,33 @@
+INCLUDES =                                                                             \
+       -I$(top_builddir)                                                       \
+       -I$(top_srcdir)                                                         \
+       -DG_LOG_DOMAIN=\"thunar-wallpaper-plugin\"      \
+       -DEXO_API_SUBJECT_TO_CHANGE                                     \
+       -DLIBEXECDIR=\"$(libexecdir)\"                          \
+       -DPACKAGE_LOCALE_DIR=\"$(localedir)\"           \
+       $(PLATFORM_CPPFLAGS)
+
+extensionsdir = $(libdir)/thunarx-1
+extensions_LTLIBRARIES =                                       \
+       thunar-wallpaper-plugin.la
+
+thunar_wallpaper_plugin_la_SOURCES =           \
+       twp-provider.h                                                  \
+       twp-provider.c                                                  \
+       thunar-wallpaper-plugin.c
+
+thunar_wallpaper_plugin_la_CFLAGS =                    \
+       $(PLATFORM_CFLAGS)                                              \
+       $(THUNARX_CFLAGS)                                               \
+       $(XFCONF_CFLAGS)                                                \
+       $(EXO_CFLAGS)                                                   \
+       $(THUNAR_VFS_CFLAGS)
+
+thunar_wallpaper_plugin_la_LDFLAGS =           \
+       -avoid-version                                                  \
+       -export-dynamic                                                 \
+       -module                                                                 \
+       $(PLATFORM_LDFLAGS)                                             \
+       $(THUNARX_LDFLAGS)                                              \
+       $(XFCONF_LIBS)                                                  \
+       $(THUNAR_VFS_LDFLAGS)
diff --git a/plugins/thunar-wallpaper/thunar-wallpaper-plugin.c b/plugins/thunar-wallpaper/thunar-wallpaper-plugin.c
new file mode 100644 (file)
index 0000000..bab5858
--- /dev/null
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2008 Stephan Arts <stephan@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
+
+#include <exo/exo.h>
+
+#include "twp-provider.h"
+
+
+
+static GType type_list[1];
+
+
+
+G_MODULE_EXPORT void
+thunar_extension_initialize (ThunarxProviderPlugin *plugin)
+{
+  const gchar *mismatch;
+
+  /* verify that the thunarx versions are compatible */
+  mismatch = thunarx_check_version (THUNARX_MAJOR_VERSION, THUNARX_MINOR_VERSION, THUNARX_MICRO_VERSION);
+  if (G_UNLIKELY (mismatch != NULL))
+    {
+      g_warning ("Version mismatch: %s", mismatch);
+      return;
+    }
+
+  /* setup i18n support */
+  bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+#endif
+
+#ifdef G_ENABLE_DEBUG
+  g_message ("Initializing thunar-wallpaper-plugin extension");
+#endif
+
+  /* register the types provided by this plugin */
+  twp_provider_register_type (plugin);
+
+  /* setup the plugin provider type list */
+  type_list[0] = TWP_TYPE_PROVIDER;
+}
+
+
+
+G_MODULE_EXPORT void
+thunar_extension_shutdown (void)
+{
+#ifdef G_ENABLE_DEBUG
+  g_message ("Shutting down thunar-wallpaper-plugin extension");
+#endif
+}
+
+
+
+G_MODULE_EXPORT void
+thunar_extension_list_types (const GType **types,
+                             gint         *n_types)
+{
+  *types = type_list;
+  *n_types = G_N_ELEMENTS (type_list);
+}
+
+
+
+
diff --git a/plugins/thunar-wallpaper/twp-provider.c b/plugins/thunar-wallpaper/twp-provider.c
new file mode 100644 (file)
index 0000000..08672cc
--- /dev/null
@@ -0,0 +1,252 @@
+/*-
+ * Copyright (c) 2008 Stephan Arts <stephan@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_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <xfconf/xfconf.h>
+#include <thunar-vfs/thunar-vfs.h>
+#include <gdk/gdkx.h>
+#include <X11/Xlib.h>
+
+#include "twp-provider.h"
+
+#define XFDESKTOP_SELECTION_FMT "XFDESKTOP_SELECTION_%d"
+
+static void   twp_provider_class_init           (TwpProviderClass         *klass);
+static void   twp_provider_menu_provider_init   (ThunarxMenuProviderIface *iface);
+static void   twp_provider_property_page_provider_init (ThunarxPropertyPageProviderIface *iface);
+static void   twp_provider_init                 (TwpProvider              *twp_provider);
+static void   twp_provider_finalize             (GObject                  *object);
+static GList *twp_provider_get_file_actions     (ThunarxMenuProvider      *menu_provider,
+                                                 GtkWidget                *window,
+                                                 GList                    *files);
+static GList *twp_provider_get_folder_actions   (ThunarxMenuProvider      *menu_provider,
+                                                 GtkWidget                *window,
+                                                 ThunarxFileInfo          *folder);
+
+static
+twp_action_set_wallpaper (GtkAction *action, gpointer user_data);
+
+
+
+struct _TwpProviderClass
+{
+  GObjectClass __parent__;
+};
+
+struct _TwpProvider
+{
+  GObject         __parent__;
+
+  gchar          *child_watch_path;
+  gint            child_watch_id;
+};
+
+
+
+THUNARX_DEFINE_TYPE_WITH_CODE (TwpProvider,
+                               twp_provider,
+                               G_TYPE_OBJECT,
+                               THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_MENU_PROVIDER,
+                                                            twp_provider_menu_provider_init)
+                               THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_PROPERTY_PAGE_PROVIDER,
+                                                            twp_provider_property_page_provider_init));
+
+
+static void
+twp_provider_class_init (TwpProviderClass *klass)
+{
+  GObjectClass *gobject_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = twp_provider_finalize;
+}
+
+
+
+static void
+twp_provider_menu_provider_init (ThunarxMenuProviderIface *iface)
+{
+  iface->get_file_actions = twp_provider_get_file_actions;
+}
+
+
+
+static void
+twp_provider_property_page_provider_init (ThunarxPropertyPageProviderIface *iface)
+{
+}
+
+
+
+static void
+twp_provider_init (TwpProvider *twp_provider)
+{
+    xfconf_init(NULL);
+       //twp_gpg_backend_init();
+}
+
+
+
+static void
+twp_provider_finalize (GObject *object)
+{
+    TwpProvider *twp_provider = TWP_PROVIDER (object);
+    GSource     *source;
+    xfconf_shutdown();
+
+   (*G_OBJECT_CLASS (twp_provider_parent_class)->finalize) (object);
+}
+
+static GList*
+twp_provider_get_file_actions (ThunarxMenuProvider *menu_provider,
+                               GtkWidget           *window,
+                               GList               *files)
+{
+       ThunarVfsPathScheme scheme;
+       ThunarVfsInfo      *info;
+       GtkWidget          *action;
+       GList              *actions = NULL;
+    gint                n_files = 0;
+    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);
+
+    Window root_window = GDK_ROOT_WINDOW();
+    Atom xfce_selection_atom = XInternAtom (gdk_display, selection_name, False);
+    if(!(XGetSelectionOwner(GDK_DISPLAY(), xfce_selection_atom)))
+    {
+        return NULL;
+    }
+
+    /* we can only set a single wallpaper */
+       if (files->next == NULL)
+       {
+               /* check if the file is a local file */
+               info = thunarx_file_info_get_vfs_info (files->data);
+               scheme = thunar_vfs_path_get_scheme (info->path);
+               thunar_vfs_info_unref (info);
+
+               /* unable to handle non-local files */
+               if (G_UNLIKELY (scheme != THUNAR_VFS_PATH_SCHEME_FILE))
+                       return NULL;
+
+               if (!thunarx_file_info_is_directory (files->data))
+               {
+            if (thunarx_file_info_has_mime_type (files->data, "image/jpeg")
+              ||thunarx_file_info_has_mime_type (files->data, "image/png")
+              ||thunarx_file_info_has_mime_type (files->data, "image/svg+xml")
+              ||thunarx_file_info_has_mime_type (files->data, "image/svg+xml-compressed"))
+            {
+                action = g_object_new (GTK_TYPE_ACTION,
+                            "name", "Twp::setwallpaper",
+                            "label", _("Set as Wallpaper"),
+                            NULL);
+                g_signal_connect (action, "activate", G_CALLBACK (twp_action_set_wallpaper), files->data);
+
+                actions = g_list_append (actions, action);
+            }
+               }
+       }
+
+  return actions;
+}
+
+
+static GList*
+twp_Provider_get_pages (ThunarxPropertyPageProvider *page_provider, GList *files)
+{
+  GList *pages = NULL;
+  return pages;
+}
+
+static
+twp_action_set_wallpaper (GtkAction *action, gpointer user_data)
+{
+    ThunarxFileInfo *file_info = user_data;
+    GdkDisplay *display = gdk_display_get_default();
+    gint n_screens = gdk_display_get_n_screens (display);
+    gint screen_nr = 0;
+    gint n_monitors;
+    gint monitor_nr = 0;
+    GdkScreen *screen;
+    gchar *image_path_prop;
+    gchar *image_show_prop;
+    gchar *image_style_prop;
+    gchar *file_uri;
+    gchar *file_name;
+    gchar *hostname = NULL;
+
+    XfconfChannel *xfdesktop_channel = xfconf_channel_new("xfce4-desktop");
+
+    file_uri = thunarx_file_info_get_uri (file_info);
+    file_name = g_filename_from_uri (file_uri, &hostname, NULL);
+    if (hostname == NULL)
+    {
+        if (n_screens > 1)
+        {
+            screen = gdk_display_get_default_screen (display);
+        }
+        else
+        {
+            screen = gdk_display_get_screen (display, 0);
+        }
+
+        n_monitors = gdk_screen_get_n_monitors (screen);
+
+        if (n_monitors > 1)
+        {
+
+        }
+        
+        image_path_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-path", screen_nr, monitor_nr);
+        image_show_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-show", screen_nr, monitor_nr);
+        image_style_prop = g_strdup_printf("/backdrop/screen%d/monitor%d/image-style", screen_nr, monitor_nr);
+
+
+        if(xfconf_channel_set_string(xfdesktop_channel, image_path_prop, file_name) == TRUE)
+        {
+            xfconf_channel_set_bool(xfdesktop_channel, image_show_prop, TRUE);
+            xfconf_channel_set_int(xfdesktop_channel, image_style_prop, 4);
+        }
+
+        g_free(image_path_prop);
+        g_free(image_show_prop);
+        g_free(image_style_prop);
+
+    }
+    g_free(file_uri);
+    g_free(file_name);
+    g_object_unref(xfdesktop_channel);
+
+    
+}
diff --git a/plugins/thunar-wallpaper/twp-provider.h b/plugins/thunar-wallpaper/twp-provider.h
new file mode 100644 (file)
index 0000000..670d63f
--- /dev/null
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2008 Stephan Arts <stephan@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 __TWP_PROVIDER_H__
+#define __TWP_PROVIDER_H__
+
+#include <thunarx/thunarx.h>
+
+G_BEGIN_DECLS;
+
+typedef struct _TwpProviderClass TwpProviderClass;
+typedef struct _TwpProvider      TwpProvider;
+
+#define TWP_TYPE_PROVIDER             (twp_provider_get_type ())
+#define TWP_PROVIDER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), TWP_TYPE_PROVIDER, TwpProvider))
+#define TWP_PROVIDER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), TWP_TYPE_PROVIDER, TwpProviderClass))
+#define TWP_IS_PROVIDER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TWP_TYPE_PROVIDER))
+#define TWP_IS_PROVIDER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), TWP_TYPE_PROVIDER))
+#define TWP_PROVIDER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), TWP_TYPE_PROVIDER, TwpProviderClass))
+
+GType twp_provider_get_type      (void) G_GNUC_CONST G_GNUC_INTERNAL;
+void  twp_provider_register_type (ThunarxProviderPlugin *plugin) G_GNUC_INTERNAL;
+
+G_END_DECLS;
+
+#endif /* !__TWP_PROVIDER_H__ */
+