diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index 7053e9c..0000000
--- a/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-wallpapoz-0.4.1-svn87_trunk.tar.bz2
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..05e45bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+wallpapoz-0.4.1-svn92_trunk.tar.bz2
+/wallpapoz-0.5.tar.bz2
+/wallpapoz-0.6.1.tar.bz2
+/wallpapoz-0.6.2.tar.bz2
+/wallpapoz-0.6.2-builder.tar.bz2
diff --git a/Makefile b/Makefile
deleted file mode 100644
index de8ef26..0000000
--- a/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# Makefile for source rpm: wallpapoz
-# $Id$
-NAME := wallpapoz
-SPECFILE = $(firstword $(wildcard *.spec))
-
-define find-makefile-common
-for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
-endef
-
-MAKEFILE_COMMON := $(shell $(find-makefile-common))
-
-ifeq ($(MAKEFILE_COMMON),)
-# attept a checkout
-define checkout-makefile-common
-test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
-endef
-
-MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
-endif
-
-include $(MAKEFILE_COMMON)
diff --git a/daemon_wallpapoz-wrapper b/daemon_wallpapoz-wrapper
new file mode 100644
index 0000000..bb0d5df
--- /dev/null
+++ b/daemon_wallpapoz-wrapper
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+which xprop &>/dev/null || exit 1
+sleep 2
+
+TRIAL=0
+FOUND=0
+PROGNAME=$0
+while true ; do
+ if test $TRIAL -ge 6 ; then
+ echo "$PROGNAME: not lauching daemon_wallpapoz"
+ exit 1
+ fi
+
+ COMMAND="xprop -root _NET_NUMBER_OF_DESKTOPS 2>/dev/null"
+ RESULT=$(eval "$COMMAND")
+ RESULT=${RESULT:36}
+ if ( (test -z "$RESULT" ) || ! (echo "$RESULT" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+
+ COMMAND="xprop -root _NET_DESKTOP_GEOMETRY 2>/dev/null"
+ RESULT=$(eval "$COMMAND")
+ RESULT=${RESULT:34}
+ WIDTH=$(echo $RESULT | sed -e 's|,.*$||')
+ HEIGHT=$(echo $RESULT | sed -e 's|^.*,||' | sed -e 's|^[ \t][ \t]*||')
+ if ( (test -z "$WIDTH" ) || ! (echo "$WIDTH" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+ if ( (test -z "$HEIGHT" ) || ! (echo "$HEIGHT" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+
+ COMMAND="xprop -root _NET_DESKTOP_VIEWPORT 2>/dev/null"
+ RESULT=$(eval "$COMMAND")
+ RESULT=${RESULT:34}
+ WIDTH=$(echo $RESULT | sed -e 's|,.*$||')
+ HEIGHT=$(echo $RESULT | sed -e 's|^.*,||' | sed -e 's|^[ \t][ \t]*||')
+ if ( (test -z "$WIDTH" ) || ! (echo "$WIDTH" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+ if ( (test -z "$HEIGHT" ) || ! (echo "$HEIGHT" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+
+ COMMAND="xprop -root _NET_CURRENT_DESKTOP 2>/dev/null"
+ RESULT=$(eval "$COMMAND")
+ RESULT=${RESULT:33}
+ if ( (test -z "$RESULT" ) || ! (echo "$RESULT" | grep -q "^[0-9]" ) ) ; then
+ # xprop failed
+ echo "daemon_wallpapoz: $COMMAND failed at startup, retrying after 3 seconds..."
+ TRIAL=$((TRIAL+1))
+ sleep 3
+ continue
+ fi
+
+ # succeeded
+ break
+done
+
+exec /usr/libexec/daemon_wallpapoz "$@"
+exit 1
diff --git a/sources b/sources
index 6758522..cd46ad5 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-dcdc89bee9b1e35e000f99f104a39774 wallpapoz-0.4.1-svn87_trunk.tar.bz2
+SHA512 (wallpapoz-0.6.2.tar.bz2) = 36ed198ba72e08f33ed92dca173f41eb7e7d307366ad42b7cfac2659511f42980351eeb4c02f155469fdf75be79fad37d77bb02118ad91f39da22dae5246860b
diff --git a/wallpapoz-0.4.1-rev92-delete-one-wallpaper.patch b/wallpapoz-0.4.1-rev92-delete-one-wallpaper.patch
new file mode 100644
index 0000000..88fb809
--- /dev/null
+++ b/wallpapoz-0.4.1-rev92-delete-one-wallpaper.patch
@@ -0,0 +1,107 @@
+--- wallpapoz-0.4.1-svn92_trunk/src/wallpapoz.deleteone 2010-06-13 03:08:43.000000000 +0900
++++ wallpapoz-0.4.1-svn92_trunk/src/wallpapoz 2010-06-13 17:33:06.000000000 +0900
+@@ -833,6 +833,16 @@
+ # list to put our lowest iter in every related workspace
+ lowest_iter_list = []
+
++ # FIXME
++ # FIXME
++ # Currently copy_iter_list can be NoneType, e.g. when
++ # - Select one wallpaper in a workspace
++ # - and delete it
++ # - next choose "Edit -> "Delete Wallpaperz""
++ # Well, bugish, however anyway workaround...
++ if not copy_iter_list:
++ return lowest_iter_list
++
+ # indication we have done with this workspace
+ done_workspace = True
+
+@@ -899,8 +909,16 @@
+ # do the remaining job, get the lowest iter from last workspace if we have not done withlast workspace
+ if not done_workspace:
+
+- lowest_iter_list.append(
+- self.store.get_iter( (parent_number_index, iter_workspace_index+1) ) )
++ # Umm... the original code raises ValueError if trying to delete
++ # a wallpaper from a workspace, if only one wallpaper existed.
++ # Need further investigation, however anyway workaround...
++ new_iter = []
++ try:
++ new_iter = self.store.get_iter((parent_number_index, iter_workspace_index + 1))
++ except ValueError:
++ pass
++ if new_iter:
++ lowest_iter_list.append(new_iter)
+
+ return lowest_iter_list
+
+@@ -983,6 +1001,11 @@
+ def cut_and_reordering_treeiter(self):
+ lowest_iter_list = self.reordering_node_after_cut_and_paste( self.selected_iter )
+
++ # workaround for the case that trying to remove a wallpaper from
++ # the workspace where only one wallpaper exists
++ if not lowest_iter_list:
++ return
++
+ # iterate to cut ( really!!! ) the iter from selected iter list
+ for single_iter in self.selected_iter:
+
+@@ -993,6 +1016,9 @@
+ for single_iter in lowest_iter_list:
+ self.order_treeiter_from_lowest_iter(single_iter)
+
++ # Finally update selection view
++ self.treeview_selection_changed(None)
++
+ # order treeiter in one workspace or in list mode from lowest iter ( more efficient )
+ def order_treeiter_from_lowest_iter(self, single_iter):
+ # get the path
+@@ -1209,6 +1235,22 @@
+ # it display another image, and disable/enable some menu
+ def treeview_selection_changed(self, widget):
+ position_iter = self.get_selected_iter_of_treeview("anything")
++
++ if not position_iter:
++ # Nothing is selected, unfortunately this can happen
++ self.main_window.get_widget("rename_workspace").set_sensitive(False)
++ self.rename_workspace_menu.set_sensitive(False)
++ self.main_window.get_widget("change_wallpaper").set_sensitive(False)
++ self.change_wallpaper_menu.set_sensitive(False)
++ self.main_window.get_widget("cut").set_sensitive(False)
++ self.cut_menu.set_sensitive(False)
++ self.main_window.get_widget("copy").set_sensitive(False)
++ self.copy_menu.set_sensitive(False)
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.delete_wallpapers_menu.set_sensitive(False)
++ # Nothing left
++ return
++
+ if type(self.store) == gtk.TreeStore:
+ parent = self.store.iter_parent(position_iter)
+ # parent node, enable: rename_workspace
+@@ -1224,8 +1266,21 @@
+ self.cut_menu.set_sensitive(True)
+ self.main_window.get_widget("copy").set_sensitive(True)
+ self.copy_menu.set_sensitive(True)
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(True)
+- self.delete_wallpapers_menu.set_sensitive(True)
++
++ # See create_configuration_file
++ # Check if there are at least 2 wallpapers
++ childiter = self.store.iter_children(parent)
++ childiter = self.store.iter_next(childiter)
++
++ # Only show "Delete wallpapers" menu if there are at least 2 wallpapers
++ # in a workspace
++ if childiter:
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(True)
++ self.delete_wallpapers_menu.set_sensitive(True)
++ else:
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.delete_wallpapers_menu.set_sensitive(False)
++
+ # parent node
+ else:
+ self.main_window.get_widget("rename_workspace").set_sensitive(True)
diff --git a/wallpapoz-0.4.1-rev92-noitem_selected.patch b/wallpapoz-0.4.1-rev92-noitem_selected.patch
new file mode 100644
index 0000000..75bd7a1
--- /dev/null
+++ b/wallpapoz-0.4.1-rev92-noitem_selected.patch
@@ -0,0 +1,15 @@
+--- wallpapoz-0.4.1-svn92_trunk/src/wallpapoz.noselect 2010-02-08 02:51:56.000000000 +0900
++++ wallpapoz-0.4.1-svn92_trunk/src/wallpapoz 2010-02-08 03:57:03.000000000 +0900
+@@ -213,6 +213,12 @@
+ # how many of selection do we have
+ length_of_path_list = len(pathlist)
+
++ # Well, it seems that in some cases no item is selected...
++ # (RedHat bug 555181)
++ if (not pathlist) or (not length_of_path_list) :
++ # simply ignore
++ return None
++
+ # add wallpapers, paste operation
+ # multiple selection are okay as long as in one workspace, parent and child node togeter are okay, these multiple selection
+ if type_selection == "wallpaper" or type_selection == "paste":
diff --git a/wallpapoz-0.4.1-rev92-paste-initialization.patch b/wallpapoz-0.4.1-rev92-paste-initialization.patch
new file mode 100644
index 0000000..cac28b7
--- /dev/null
+++ b/wallpapoz-0.4.1-rev92-paste-initialization.patch
@@ -0,0 +1,22 @@
+--- wallpapoz-0.4.1-svn92_trunk/src/wallpapoz.paste_init 2010-02-08 04:32:34.000000000 +0900
++++ wallpapoz-0.4.1-svn92_trunk/src/wallpapoz 2010-02-08 04:21:17.000000000 +0900
+@@ -94,6 +94,9 @@
+ # create the pop up menu when we right click the treeview widget
+ self.set_up_popup_menu()
+
++ # initially no item is pasted
++ self.selected_iter = None
++
+ # our signal and who handle that signal
+ dic = { "on_wallpapoz_window_destroy" : self.destroy,
+ "on_treeview_cursor_changed" : self.treeview_selection_changed,
+@@ -903,6 +906,9 @@
+
+ if position_iter == None:
+ return
++ # At first self.selected_iter is None
++ if not self.selected_iter:
++ return
+
+ # check first. User can not cut all wallpapers in workspace. Every workspace must have at least one wallpaper
+ temp_iter_list = []
diff --git a/wallpapoz-0.5-startup-warn-about-workspace-name.patch b/wallpapoz-0.5-startup-warn-about-workspace-name.patch
new file mode 100644
index 0000000..e4a397d
--- /dev/null
+++ b/wallpapoz-0.5-startup-warn-about-workspace-name.patch
@@ -0,0 +1,32 @@
+--- wallpapoz-0.5/src/wallpapoz.startupwarn 2011-05-06 00:21:06.000000000 +0900
++++ wallpapoz-0.5/src/wallpapoz 2011-05-06 15:41:58.000000000 +0900
+@@ -1296,9 +1296,14 @@
+
+ filename = self.store.get_value(position_iter, 1)
+
+- # display image properly
+- from glib import GError as glib_GError
+- try:
++ # display image properly, when cursor actually points to the contents of
++ # files' list (i.e. not pointing to desktop name)
++ if ( (type(self.store) == gtk.TreeStore) and
++ ( parent == None ) ):
++ self.image_widget.clear()
++ else:
++ from glib import GError as glib_GError
++ try:
+ anime = gtk.gdk.PixbufAnimation(filename)
+
+ if anime.is_static_image() :
+@@ -1318,9 +1323,9 @@
+ else:
+ self.image_widget.set_from_pixbuf(static_im.scale_simple(int((float(width)/height)*300),300,gtk.gdk.INTERP_BILINEAR))
+
+- except IOError:
++ except IOError:
+ self.image_widget.clear()
+- except glib_GError, (msg):
++ except glib_GError, (msg):
+ print msg
+ self.image_widget.clear()
+
diff --git a/wallpapoz-0.6.1-animated-image.patch b/wallpapoz-0.6.1-animated-image.patch
new file mode 100644
index 0000000..7690274
--- /dev/null
+++ b/wallpapoz-0.6.1-animated-image.patch
@@ -0,0 +1,40 @@
+--- wallpapoz-0.6.1/src/wallpapoz.anime 2011-12-30 14:53:04.000000000 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2011-12-30 15:02:40.000000000 +0900
+@@ -1228,15 +1228,32 @@
+ filename = self.store.get_value(position_iter, 1)
+
+ # display image properly
++ from glib import GError as glib_GError
+ try:
+- im = Image.open(filename)
+- # keep image proportions
+- if im.size[0] > im.size[1]:
+- self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, 400, int((float(im.size[1])/im.size[0]) * 400)))
++ anime = gtk.gdk.PixbufAnimation(filename)
++
++ if anime.is_static_image() :
++ im = Image.open(filename)
++ # keep image proportions
++ if im.size[0] > im.size[1]:
++ self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, 400, int((float(im.size[1])/im.size[0]) * 400)))
++ else:
++ self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, int(float(im.size[1])/im.size[0] * 300), 300))
++
+ else:
+- self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, int(float(im.size[1])/im.size[0] * 300), 300))
++ width = anime.get_width()
++ height = anime.get_height()
++ static_im = anime.get_static_image()
++ if width > height:
++ self.image_widget.set_from_pixbuf(static_im.scale_simple(400, int((float(height)/width)*400),gtk.gdk.INTERP_BILINEAR))
++ else:
++ self.image_widget.set_from_pixbuf(static_im.scale_simple(int((float(width)/height)*300),300,gtk.gdk.INTERP_BILINEAR))
++
+ except IOError:
+ self.image_widget.clear()
++ except glib_GError, (msg):
++ print msg
++ self.image_widget.clear()
+
+ # display image filename
+ self.wallpaper_filename.set_markup("" + os.path.basename(filename) + "")
diff --git a/wallpapoz-0.6.1-delete-first-in-desktop-mode.patch b/wallpapoz-0.6.1-delete-first-in-desktop-mode.patch
new file mode 100644
index 0000000..7c348ee
--- /dev/null
+++ b/wallpapoz-0.6.1-delete-first-in-desktop-mode.patch
@@ -0,0 +1,18 @@
+--- wallpapoz-0.6.1/src/wallpapoz.deletefirst 2011-12-30 15:35:31.000000000 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2011-12-30 15:38:56.000000000 +0900
+@@ -1062,13 +1062,13 @@
+ lowest_iter = self.store.get_iter((path_iter-1,))
+ else:
+ index_temp = 0
++ before_path_iter = 0
+ for single_iter in self.selected_iter[1:]:
+ path_iter = self.store.get_path(single_iter)[0]
+ if path_iter == (index_temp + 1):
+ index_temp = index_temp + 1
+ before_path_iter = path_iter
+- else:
+- lowest_iter = self.store.get_iter((before_path_iter+1,))
++ lowest_iter = self.store.get_iter((before_path_iter+1,))
+
+ # remove the iter
+ for single_iter in self.selected_iter:
diff --git a/wallpapoz-0.6.1-delete-one-wallpaper.patch b/wallpapoz-0.6.1-delete-one-wallpaper.patch
new file mode 100644
index 0000000..ef2ffe3
--- /dev/null
+++ b/wallpapoz-0.6.1-delete-one-wallpaper.patch
@@ -0,0 +1,107 @@
+--- wallpapoz-0.6.1/src/wallpapoz.deletelastone 2011-12-30 15:20:41.000000000 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2011-12-30 15:29:05.000000000 +0900
+@@ -832,6 +832,16 @@
+ # list to put our lowest iter in every related workspace
+ lowest_iter_list = []
+
++ # FIXME
++ # FIXME
++ # Currently copy_iter_list can be NoneType, e.g. when
++ # - Select one wallpaper in a workspace
++ # - and delete it
++ # - next choose "Edit -> "Delete Wallpaperz""
++ # Well, bugish, however anyway workaround...
++ if not copy_iter_list:
++ return lowest_iter_list
++
+ # indication we have done with this workspace
+ done_workspace = True
+
+@@ -898,8 +908,16 @@
+ # do the remaining job, get the lowest iter from last workspace if we have not done withlast workspace
+ if not done_workspace:
+
+- lowest_iter_list.append(
+- self.store.get_iter( (parent_number_index, iter_workspace_index+1) ) )
++ # Umm... the original code raises ValueError if trying to delete
++ # a wallpaper from a workspace, if only one wallpaper existed.
++ # Need further investigation, however anyway workaround...
++ new_iter = []
++ try:
++ new_iter = self.store.get_iter((parent_number_index, iter_workspace_index + 1))
++ except ValueError:
++ pass
++ if new_iter:
++ lowest_iter_list.append(new_iter)
+
+ return lowest_iter_list
+
+@@ -975,6 +993,11 @@
+ def cut_and_reordering_treeiter(self):
+ lowest_iter_list = self.reordering_node_after_cut_and_paste( self.selected_iter )
+
++ # workaround for the case that trying to remove a wallpaper from
++ # the workspace where only one wallpaper exists
++ if not lowest_iter_list:
++ return
++
+ # iterate to cut ( really!!! ) the iter from selected iter list
+ for single_iter in self.selected_iter:
+
+@@ -985,6 +1008,9 @@
+ for single_iter in lowest_iter_list:
+ self.order_treeiter_from_lowest_iter(single_iter)
+
++ # Finally update selection view
++ self.treeview_selection_changed(None)
++
+ # order treeiter in one workspace or in list mode from lowest iter ( more efficient )
+ def order_treeiter_from_lowest_iter(self, single_iter):
+ # get the path
+@@ -1201,6 +1227,22 @@
+ # it display another image, and disable/enable some menu
+ def treeview_selection_changed(self, widget):
+ position_iter = self.get_selected_iter_of_treeview("anything")
++
++ if not position_iter:
++ # Nothing is selected, unfortunately this can happen
++ self.main_window.get_widget("rename_workspace").set_sensitive(False)
++ self.rename_workspace_menu.set_sensitive(False)
++ self.main_window.get_widget("change_wallpaper").set_sensitive(False)
++ self.change_wallpaper_menu.set_sensitive(False)
++ self.main_window.get_widget("cut").set_sensitive(False)
++ self.cut_menu.set_sensitive(False)
++ self.main_window.get_widget("copy").set_sensitive(False)
++ self.copy_menu.set_sensitive(False)
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.delete_wallpapers_menu.set_sensitive(False)
++ # Nothing left
++ return
++
+ if type(self.store) == gtk.TreeStore:
+ parent = self.store.iter_parent(position_iter)
+ # parent node, enable: rename_workspace
+@@ -1216,8 +1258,21 @@
+ self.cut_menu.set_sensitive(True)
+ self.main_window.get_widget("copy").set_sensitive(True)
+ self.copy_menu.set_sensitive(True)
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(True)
+- self.delete_wallpapers_menu.set_sensitive(True)
++
++ # See create_configuration_file
++ # Check if there are at least 2 wallpapers
++ childiter = self.store.iter_children(parent)
++ childiter = self.store.iter_next(childiter)
++
++ # Only show "Delete wallpapers" menu if there are at least 2 wallpapers
++ # in a workspace
++ if childiter:
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(True)
++ self.delete_wallpapers_menu.set_sensitive(True)
++ else:
++ self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.delete_wallpapers_menu.set_sensitive(False)
++
+ # parent node
+ else:
+ self.main_window.get_widget("rename_workspace").set_sensitive(True)
diff --git a/wallpapoz-0.6.1-dircheck.patch b/wallpapoz-0.6.1-dircheck.patch
new file mode 100644
index 0000000..e9c53db
--- /dev/null
+++ b/wallpapoz-0.6.1-dircheck.patch
@@ -0,0 +1,84 @@
+--- wallpapoz-0.6.1/src/wallpapoz.dircheck 2011-07-24 00:54:43.000000000 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2011-12-30 14:28:16.000000000 +0900
+@@ -536,6 +536,9 @@
+ # if recursive, we use walktree
+ if recursive_widget.get_active():
+ # looping with walktree method
++ if not os.path.isdir(cur_dir):
++ return
++
+ for (basepath, children) in self.walktree(cur_dir,False):
+ for child in children:
+ # get the filename
+@@ -551,7 +554,11 @@
+ # if not just looping the directory with ordinary fashion
+ else:
+ # looping all files in this directory
+- for file in os.listdir(cur_dir):
++ try:
++ dlist = os.listdir(cur_dir)
++ except OSError:
++ return
++ for file in dlist:
+ # get the filename
+ filename = os.path.join(cur_dir, file)
+ # we interested in file, not directory
+@@ -573,6 +580,9 @@
+ # if recursive, we use walktree
+ if recursive_widget.get_active():
+ # looping with walktree method
++ if not os.path.isdir(cur_dir):
++ return
++
+ for (basepath, children) in self.walktree(cur_dir,False):
+ for child in children:
+ # get the filename
+@@ -588,7 +598,11 @@
+ # if not, just looping with ordinary fashion
+ else:
+ # looping all files in this directory
+- for file in os.listdir(cur_dir):
++ try:
++ ddir = os.listdir(cur_dir)
++ except OSError:
++ return
++ for file in ddir:
+ # get the filename
+ filename = os.path.join(cur_dir, file)
+ # we interested in file, not directory
+@@ -618,6 +632,9 @@
+ cur_dir = filechooser_widget.get_filename()
+ # if recursive, we use walktree
+ if recursive_widget.get_active():
++ if not os.path.isdir(cur_dir):
++ return
++
+ # looping with walktree method
+ for (basepath, children) in self.walktree(cur_dir,False):
+ for child in children:
+@@ -634,7 +651,11 @@
+ # if not recursive, just looping the directory with ordinary fashion
+ else:
+ # looping all files in this directory
+- for file in os.listdir(cur_dir):
++ try:
++ dlist = os.listdir(cur_dir)
++ except OSError:
++ return
++ for file in dlist:
+ # get the filename
+ filename = os.path.join(cur_dir, file)
+ # we interested in file, not directory
+@@ -1210,7 +1231,11 @@
+
+ # helping method
+ def walktree (self, top = ".", depthfirst = True):
+- names = os.listdir(top)
++ try:
++ names = os.listdir(top)
++ except OSError:
++ names = []
++ yield top, names
+ if not depthfirst:
+ yield top, names
+ for name in names:
diff --git a/wallpapoz-0.6.1-kill-multiple-daemon.patch b/wallpapoz-0.6.1-kill-multiple-daemon.patch
new file mode 100644
index 0000000..a602b91
--- /dev/null
+++ b/wallpapoz-0.6.1-kill-multiple-daemon.patch
@@ -0,0 +1,32 @@
+--- wallpapoz-0.6.1/share/wallpapoz/lib/wallpapoz_system.py.kill_multi 2011-12-30 14:49:25.000000000 +0900
++++ wallpapoz-0.6.1/share/wallpapoz/lib/wallpapoz_system.py 2011-12-30 14:49:25.000000000 +0900
+@@ -180,3 +180,17 @@
+ print "os.execvp failed, exiting..."
+ sys.exit(1)
+
++ def prevent_multiple_start(self):
++ cpid = os.getpid()
++ cid = os.getuid()
++
++ wallpapoz_cmd = "pgrep -U %i -f daemon_wallpapoz" %cid
++ python_cmd = "pgrep -U %i -f python" %cid
++
++ wallpapoz_id_list = os.popen(wallpapoz_cmd).read().splitlines()
++ python_id_list = os.popen(python_cmd).read().splitlines()
++
++ for id_list in wallpapoz_id_list:
++ if ( id_list in python_id_list ) and ( int(id_list) != cpid) :
++ os.kill(int(id_list), signal.SIGTERM)
++
+--- wallpapoz-0.6.1/src/daemon_wallpapoz.kill_multi 2011-12-30 14:49:25.000000000 +0900
++++ wallpapoz-0.6.1/src/daemon_wallpapoz 2011-12-30 14:52:08.000000000 +0900
+@@ -99,6 +99,9 @@
+ # by calling external program
+ wallpapoz_system = WallpapozSystem()
+
++ # Kill other daemon_wallpapoz if running
++ wallpapoz_system.prevent_multiple_start()
++
+ # type of window manager (gnome or xfce)
+ window_manager = wallpapoz_system.window_manager
+
diff --git a/wallpapoz-0.6.1-nonutf8-directory.patch b/wallpapoz-0.6.1-nonutf8-directory.patch
new file mode 100644
index 0000000..8de1d75
--- /dev/null
+++ b/wallpapoz-0.6.1-nonutf8-directory.patch
@@ -0,0 +1,22 @@
+--- wallpapoz-0.6.1/src/wallpapoz.nonutf8 2011-12-30 15:13:57.000000000 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2011-12-30 15:19:28.000000000 +0900
+@@ -542,6 +542,9 @@
+ num_of_child = self.store.iter_n_children(iter)
+ # what is the directory?
+ cur_dir = filechooser_widget.get_filename()
++ # get_filename can return NoneType (for non-UTF8 directory)
++ if not cur_dir:
++ return
+ # if recursive, we use walktree
+ if recursive_widget.get_active():
+ # looping with walktree method
+@@ -586,6 +589,9 @@
+ new_index = self.store.get_value(next_iter, 0) + 1
+ # what is the directory?
+ cur_dir = filechooser_widget.get_filename()
++ # get_filename can return NoneType (for non-UTF8 directory)
++ if not cur_dir:
++ return
+ # if recursive, we use walktree
+ if recursive_widget.get_active():
+ # looping with walktree method
diff --git a/wallpapoz-0.6.1-switch-from-wallpaper-to-desktop-with-workspace-increase.patch b/wallpapoz-0.6.1-switch-from-wallpaper-to-desktop-with-workspace-increase.patch
new file mode 100644
index 0000000..e2ab0d7
--- /dev/null
+++ b/wallpapoz-0.6.1-switch-from-wallpaper-to-desktop-with-workspace-increase.patch
@@ -0,0 +1,22 @@
+--- wallpapoz-0.6.1/src/wallpapoz.workspace_num_incr 2012-01-18 10:05:16.361577377 +0900
++++ wallpapoz-0.6.1/src/wallpapoz 2012-01-18 10:09:45.651470988 +0900
+@@ -722,12 +722,17 @@
+ # make the wallpaper list
+ wallpapoz_system = WallpapozSystem()
+ workspace_num = wallpapoz_system.get_total_workspaces()
++ ii = 0
+ for i in range(workspace_num):
+- parent = self.store.append(None, [i+1, worklist[i].pop(0), True])
++ if (ii >= len(worklist)):
++ ii = 0
++ tmplist = list(worklist[ii])
++ parent = self.store.append(None, [i+1, tmplist.pop(0), True])
+ j = 1
+- for wallpaper in worklist[i]:
++ for wallpaper in tmplist:
+ self.store.append(parent, [j, wallpaper, False])
+ j = j + 1
++ ii = ii + 1
+
+ # enable rename workspace menu
+ self.main_window.get_widget("rename_workspace").set_sensitive(True)
diff --git a/wallpapoz-0.6.1-workspace-num-respawn.patch b/wallpapoz-0.6.1-workspace-num-respawn.patch
new file mode 100644
index 0000000..5b16c20
--- /dev/null
+++ b/wallpapoz-0.6.1-workspace-num-respawn.patch
@@ -0,0 +1,74 @@
+--- wallpapoz-0.6.1/share/wallpapoz/lib/wallpapoz_system.py.respawn 2011-10-16 23:40:03.000000000 +0900
++++ wallpapoz-0.6.1/share/wallpapoz/lib/wallpapoz_system.py 2011-12-30 16:07:01.000000000 +0900
+@@ -25,15 +25,27 @@
+ # achieve goal by calling external program
+
+ import os
++import sys
+ import string
+
+ class WallpapozSystem:
+
++ # Define static variable to save the initial value of
++ # workspaces
++ static_finding_total_workspaces_called_p = False
++ static_total_workspaces = 0
++
+ def __init__(self):
+ self.finding_screen_resolution()
+ self.finding_total_workspaces()
+ self.finding_desktop_environment()
+
++ # Check if total_workspaces changed only here
++ if WallpapozSystem.static_total_workspaces != self.total_workspaces:
++ print "daemon_wallpapoz: the number of total workspaces changed during initialization process."
++ print "daemon_wallpapoz: respawning daemon_wallpapoz."
++ self.respawn_system()
++
+ def set_style(self, style):
+ self.wallpaper_style = style
+
+@@ -69,6 +81,11 @@
+ def finding_total_workspaces(self):
+ self.total_workspaces = int(os.popen("xprop -root _NET_NUMBER_OF_DESKTOPS").read()[36:38])
+
++ # Save this total_workspaces value
++ if not WallpapozSystem.static_finding_total_workspaces_called_p:
++ WallpapozSystem.static_finding_total_workspaces_called = True
++ WallpapozSystem.static_total_workspaces = self.total_workspaces
++
+ ## class method to find how many rows and columns of workspaces
+ def finding_row_and_column(self):
+ self.row_workspaces = self.geometry_height / self.screen_height
+@@ -117,3 +134,11 @@
+ return True
+ else:
+ return False
++
++ def respawn_system(self):
++ new_argv = []
++ new_argv.extend(sys.argv)
++ os.execvp('daemon_wallpapoz', new_argv)
++ print "os.execvp failed, exiting..."
++ sys.exit(1)
++
+--- wallpapoz-0.6.1/src/daemon_wallpapoz.respawn 2011-07-24 00:54:43.000000000 +0900
++++ wallpapoz-0.6.1/src/daemon_wallpapoz 2011-12-30 16:06:07.000000000 +0900
+@@ -145,11 +145,16 @@
+ if wallpapozxml.get_type() == "workspace":
+ while True:
+ # don't get rush
+- time.sleep(1)
++ # sleep a bit more
++ time.sleep(2)
+
+ # what workspace we are in now?
+ cur_desk = wallpapoz_system.current_desktop()
+
++ if cur_desk >= wallpapoz_system.get_total_workspaces():
++ # ignore
++ continue
++
+ # requirement for changing wallpaper
+ # 1. we change workspace
+ # 2. index of wallpaper list change
diff --git a/wallpapoz-0.6.2-CINNAMON.patch b/wallpapoz-0.6.2-CINNAMON.patch
new file mode 100644
index 0000000..3fe5866
--- /dev/null
+++ b/wallpapoz-0.6.2-CINNAMON.patch
@@ -0,0 +1,40 @@
+--- a/share/wallpapoz/lib/wallpapoz_system.py
++++ b/share/wallpapoz/lib/wallpapoz_system.py
+@@ -117,6 +117,8 @@ class WallpapozSystem:
+ self.window_manager = 'XFCE4'
+ elif wm_name=='Marco':
+ self.window_manager = 'MATE'
++ elif wm_name=='Mutter (Muffin)':
++ self.window_manager = 'CINNAMON'
+ else:
+ try:
+ output = os.popen("gnome-session --version")
+@@ -166,6 +168,9 @@ class WallpapozSystem:
+ elif self.window_manager == "MATE":
+ os.system('gsettings set org.mate.background picture-filename ' + '"' + wallpaper + '"')
+ os.system('gsettings set org.mate.background picture-options ' + self.wallpaper_style)
++ elif self.window_manager == "CINNAMON":
++ os.system("gsettings set org.cinnamon.desktop.background picture-uri 'file://" + wallpaper + "'")
++ os.system("gsettings set org.cinnamon.desktop.background picture-options " + self.wallpaper_style)
+ elif self.window_manager == "XFCE4":
+ os.system("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path -s " +
+ '"' + wallpaper + '"')
+@@ -183,6 +188,8 @@ class WallpapozSystem:
+ return os.popen("gsettings get org.gnome.desktop.background picture-uri").read()[8:-2]
+ elif self.window_manager == "MATE":
+ return os.popen("gsettings get org.mate.background picture-filename").read()[:-1]
++ elif self.window_manager == "CINNAMON":
++ return os.popen("gsettings get org.cinnamon.desktop.background picture-uri").read()[8:-2]
+ elif self.window_manager == "XFCE4":
+ return os.popen("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path").read()[:-1]
+ else:
+--- a/src/daemon_wallpapoz
++++ b/src/daemon_wallpapoz
+@@ -112,6 +112,7 @@ if __name__ == "__main__":
+ available_style['Gnome'] = { '3' : 'zoom', '2' : 'scaled', '1' : 'stretched',
+ '0' : 'centered', '4' : 'wallpaper' }
+ available_style['MATE'] = available_style['Gnome']
++ available_style['CINNAMON'] = available_style['Gnome']
+ available_style['Gnome3'] = available_style['Gnome']
+ available_style['XFCE4'] = { '3' : '5', '2' : '4', '1' : '3', '0' : '1',
+ '4' : '2' }
diff --git a/wallpapoz-0.6.2-LXDE.patch b/wallpapoz-0.6.2-LXDE.patch
new file mode 100644
index 0000000..aafcf16
--- /dev/null
+++ b/wallpapoz-0.6.2-LXDE.patch
@@ -0,0 +1,47 @@
+--- wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py.LXDE 2013-01-19 21:34:04.000000000 +0900
++++ wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py 2013-01-19 22:10:23.000000000 +0900
+@@ -105,6 +105,14 @@
+ wm_name = raw_wm_name[29:raw_wm_name.rfind('"')]
+ # default is Gnome3.
+ self.window_manager = 'Gnome3'
++ if wm_name == 'Openbox':
++ try:
++ env = os.environ['XDG_CURRENT_DESKTOP']
++ if env == 'LXDE':
++ self.window_manager = 'LXDE'
++ return
++ except:
++ pass
+ if wm_name=='Xfwm4':
+ self.window_manager = 'XFCE4'
+ else:
+@@ -158,6 +166,9 @@
+ '"' + wallpaper + '"')
+ os.system("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-style -s " +
+ self.wallpaper_style)
++ elif self.window_manager == "LXDE":
++ os.system("pcmanfm -w " + '"' + wallpaper + '"')
++ os.system("pcmanfm --wallpaper-mode=" + self.wallpaper_style)
+
+ ## class method to find current desktop wallpaper
+ def finding_current_wallpaper(self):
+@@ -167,6 +178,8 @@
+ return os.popen("gsettings get org.gnome.desktop.background picture-uri").read()[8:-2]
+ elif self.window_manager == "XFCE4":
+ return os.popen("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path").read()[:-1]
++ else:
++ return ""
+
+ ## class method to detect that we have changed workspace or not
+ def has_changed(self, previous_desktop, cur_desk):
+--- wallpapoz-0.6.2/src/daemon_wallpapoz.LXDE 2013-01-19 21:34:04.000000000 +0900
++++ wallpapoz-0.6.2/src/daemon_wallpapoz 2013-01-19 22:15:01.000000000 +0900
+@@ -114,6 +114,8 @@
+ available_style['Gnome3'] = available_style['Gnome']
+ available_style['XFCE4'] = { '3' : '5', '2' : '4', '1' : '3', '0' : '1',
+ '4' : '2' }
++ available_style['LXDE'] = {'0': 'center', '1' : 'stretch', '2' : 'fit',
++ '3': 'fit', '4': 'tile'}
+ style = available_style[window_manager][wallpapozxml.style()]
+ wallpapoz_system.set_style(style)
+
diff --git a/wallpapoz-0.6.2-MATE.patch b/wallpapoz-0.6.2-MATE.patch
new file mode 100644
index 0000000..8f31556
--- /dev/null
+++ b/wallpapoz-0.6.2-MATE.patch
@@ -0,0 +1,40 @@
+--- a/share/wallpapoz/lib/wallpapoz_system.py
++++ b/share/wallpapoz/lib/wallpapoz_system.py
+@@ -115,6 +115,8 @@ class WallpapozSystem:
+ pass
+ if wm_name=='Xfwm4':
+ self.window_manager = 'XFCE4'
++ elif wm_name=='Marco':
++ self.window_manager = 'MATE'
+ else:
+ try:
+ output = os.popen("gnome-session --version")
+@@ -161,6 +163,9 @@ class WallpapozSystem:
+ elif self.window_manager == "Gnome3":
+ os.system("gsettings set org.gnome.desktop.background picture-uri 'file://" + wallpaper + "'")
+ os.system("gsettings set org.gnome.desktop.background picture-options " + self.wallpaper_style)
++ elif self.window_manager == "MATE":
++ os.system('gsettings set org.mate.background picture-filename ' + '"' + wallpaper + '"')
++ os.system('gsettings set org.mate.background picture-options ' + self.wallpaper_style)
+ elif self.window_manager == "XFCE4":
+ os.system("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path -s " +
+ '"' + wallpaper + '"')
+@@ -176,6 +181,8 @@ class WallpapozSystem:
+ return os.popen("gconftool-2 -g /desktop/gnome/background/picture_filename").read()[:-1]
+ elif self.window_manager == "Gnome3":
+ return os.popen("gsettings get org.gnome.desktop.background picture-uri").read()[8:-2]
++ elif self.window_manager == "MATE":
++ return os.popen("gsettings get org.mate.background picture-filename").read()[:-1]
+ elif self.window_manager == "XFCE4":
+ return os.popen("xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path").read()[:-1]
+ else:
+--- a/src/daemon_wallpapoz
++++ b/src/daemon_wallpapoz
+@@ -111,6 +111,7 @@ if __name__ == "__main__":
+ available_style = {}
+ available_style['Gnome'] = { '3' : 'zoom', '2' : 'scaled', '1' : 'stretched',
+ '0' : 'centered', '4' : 'wallpaper' }
++ available_style['MATE'] = available_style['Gnome']
+ available_style['Gnome3'] = available_style['Gnome']
+ available_style['XFCE4'] = { '3' : '5', '2' : '4', '1' : '3', '0' : '1',
+ '4' : '2' }
diff --git a/wallpapoz-0.6.2-import-PIL-for-Image.patch b/wallpapoz-0.6.2-import-PIL-for-Image.patch
new file mode 100644
index 0000000..cab327b
--- /dev/null
+++ b/wallpapoz-0.6.2-import-PIL-for-Image.patch
@@ -0,0 +1,132 @@
+diff -ruN wallpapoz-0.6.2.orig/setup.py wallpapoz-0.6.2/setup.py
+--- wallpapoz-0.6.2.orig/setup.py 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/setup.py 2013-01-14 15:57:08.902128603 -0500
+@@ -123,7 +123,7 @@
+ print " !!! Python Glade ............. ", _("Not found")
+ required_found = False
+ try:
+- import Image
++ from PIL import Image
+ print " Python Imaging Library ....... OK"
+ except ImportError:
+ print " !!! Python Imaging Library ... ", _("Not found")
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz wallpapoz-0.6.2/src/wallpapoz
+--- wallpapoz-0.6.2.orig/src/wallpapoz 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz 2013-01-14 16:00:16.960947005 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.anime wallpapoz-0.6.2/src/wallpapoz.anime
+--- wallpapoz-0.6.2.orig/src/wallpapoz.anime 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.anime 2013-01-14 15:58:53.632027371 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.deletefirst wallpapoz-0.6.2/src/wallpapoz.deletefirst
+--- wallpapoz-0.6.2.orig/src/wallpapoz.deletefirst 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.deletefirst 2013-01-14 15:59:32.240990119 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.deletelastone wallpapoz-0.6.2/src/wallpapoz.deletelastone
+--- wallpapoz-0.6.2.orig/src/wallpapoz.deletelastone 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.deletelastone 2013-01-14 15:59:20.417001528 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.dircheck wallpapoz-0.6.2/src/wallpapoz.dircheck
+--- wallpapoz-0.6.2.orig/src/wallpapoz.dircheck 2013-01-14 15:56:24.057172107 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.dircheck 2013-01-14 15:57:32.238106009 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.noitem wallpapoz-0.6.2/src/wallpapoz.noitem
+--- wallpapoz-0.6.2.orig/src/wallpapoz.noitem 2013-01-14 15:56:24.057172107 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.noitem 2013-01-14 15:57:47.354091394 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.nonutf8 wallpapoz-0.6.2/src/wallpapoz.nonutf8
+--- wallpapoz-0.6.2.orig/src/wallpapoz.nonutf8 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.nonutf8 2013-01-14 15:59:04.928016478 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.patch_init wallpapoz-0.6.2/src/wallpapoz.patch_init
+--- wallpapoz-0.6.2.orig/src/wallpapoz.patch_init 2013-01-14 15:56:24.057172107 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.patch_init 2013-01-14 15:58:33.808046499 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.workspace_img wallpapoz-0.6.2/src/wallpapoz.workspace_img
+--- wallpapoz-0.6.2.orig/src/wallpapoz.workspace_img 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.workspace_img 2013-01-14 15:59:54.968968202 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
+diff -ruN wallpapoz-0.6.2.orig/src/wallpapoz.workspace_num_incr wallpapoz-0.6.2/src/wallpapoz.workspace_num_incr
+--- wallpapoz-0.6.2.orig/src/wallpapoz.workspace_num_incr 2013-01-14 15:56:24.058172106 -0500
++++ wallpapoz-0.6.2/src/wallpapoz.workspace_num_incr 2013-01-14 16:00:08.673954992 -0500
+@@ -35,7 +35,7 @@
+ import sys
+ import stat
+ import gettext
+-import Image
++from PIL import Image
+
+ try:
+ import gnome
diff --git a/wallpapoz-0.6.2-kill-daemon-without-x.patch b/wallpapoz-0.6.2-kill-daemon-without-x.patch
new file mode 100644
index 0000000..38eb35f
--- /dev/null
+++ b/wallpapoz-0.6.2-kill-daemon-without-x.patch
@@ -0,0 +1,94 @@
+--- wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py.kill_nox 2012-03-06 11:59:53.171834985 +0900
++++ wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py 2012-03-06 14:02:32.087891881 +0900
+@@ -24,9 +24,11 @@
+ ## wallpapoz_system.py -- finds current desktop and changes wallpaper
+ # achieve goal by calling external program
+
++import subprocess
+ import os
+ import sys
+ import string
++import signal
+
+ class WallpapozSystem:
+
+@@ -46,12 +48,48 @@
+ print "daemon_wallpapoz: respawning daemon_wallpapoz."
+ self.respawn_system()
+
++ def exec_cmd_under_X(self, cmd):
++ try:
++ p = subprocess.Popen(
++ cmd,
++ stdout = subprocess.PIPE,
++ stderr = subprocess.PIPE,
++ shell = True
++ )
++ except OSError:
++ print "daemon_wallpapoz: fork failed for %s, exiting." %cmd
++ sys.exit(1)
++
++ pstdout = p.stdout.read()
++ pstderr = p.stderr.read()
++ ret = p.wait()
++
++ kill_daemon = False
++
++ if (ret != 0) and (ret & 0xFF):
++ print "daemon_wallpapoz: %s returned status %i." %(cmd, ret)
++ print "daemon_wallpapoz: error message: %s" %pstderr
++ kill_daemon = True
++
++ if (cmd.find('xprop') >= 0) and (pstdout.find('no such atom') >= 0):
++ kill_daemon = True
++ if (cmd.find('xprop') >= 0) and (pstdout.find('not') >= 0):
++ kill_daemon = True
++
++ if kill_daemon:
++ ## No X resource available, kill daemon_wallpapoz
++ print "daemon_wallpapoz: X resource seems no longer available."
++ print "daemon_wallpapoz: killing daemon_wallpapoz."
++ sys.exit(1)
++
++ return pstdout
++
+ def set_style(self, style):
+ self.wallpaper_style = style
+
+ ## class method to find monitor resolution
+ def finding_screen_resolution(self):
+- raw_resolution = os.popen('xwininfo -root').read()
++ raw_resolution = self.exec_cmd_under_X('xwininfo -root')
+ start_width = raw_resolution.find('Width')
+ end_width = raw_resolution.find('\n',start_width)
+ start_height = raw_resolution.find('Height')
+@@ -61,9 +99,9 @@
+
+ ## class method to find which desktop environment user uses
+ def finding_desktop_environment(self):
+- raw_window_id = os.popen('xprop -root _NET_SUPPORTING_WM_CHECK').read()
++ raw_window_id = self.exec_cmd_under_X('xprop -root _NET_SUPPORTING_WM_CHECK')
+ window_id = raw_window_id[46:raw_window_id.find("\n")]
+- raw_wm_name = os.popen('xprop -id ' + window_id + ' 8s _NET_WM_NAME').read()
++ raw_wm_name = self.exec_cmd_under_X('xprop -id ' + window_id + ' 8s _NET_WM_NAME')
+ wm_name = raw_wm_name[29:raw_wm_name.rfind('"')]
+ # default is Gnome3.
+ self.window_manager = 'Gnome3'
+@@ -80,7 +118,7 @@
+
+ ## class method to find amount of workspaces in user desktop
+ def finding_total_workspaces(self):
+- self.total_workspaces = int(os.popen("xprop -root _NET_NUMBER_OF_DESKTOPS").read()[36:38])
++ self.total_workspaces = int(self.exec_cmd_under_X("xprop -root _NET_NUMBER_OF_DESKTOPS")[36:38])
+
+ # Save this total_workspaces value
+ if not WallpapozSystem.static_finding_total_workspaces_called_p:
+@@ -98,7 +136,7 @@
+
+ ## class method to know what workspace we are in now
+ def current_desktop(self):
+- raw_workspace = os.popen('xprop -root _NET_CURRENT_DESKTOP').read()
++ raw_workspace = self.exec_cmd_under_X('xprop -root _NET_CURRENT_DESKTOP')
+ workspace = int(raw_workspace[33] + raw_workspace[34])
+ return workspace
+
diff --git a/wallpapoz-0.6.2-python3-desktop-type.patch b/wallpapoz-0.6.2-python3-desktop-type.patch
new file mode 100644
index 0000000..5530f16
--- /dev/null
+++ b/wallpapoz-0.6.2-python3-desktop-type.patch
@@ -0,0 +1,114 @@
+--- wallpapoz-0.6.2/src/wallpapoz.py3.01 2019-11-25 15:36:39.502763400 +0900
++++ wallpapoz-0.6.2/src/wallpapoz 2019-11-28 13:16:27.404156561 +0900
+@@ -220,7 +220,7 @@
+ def get_selected_iter_of_treeview(self, type_selection):
+
+ # treeselection give 2-tuple.... ( model, path )
+- pathlist = self.treeselection.get_selected_rows()[1]
++ model, pathlist = self.treeselection.get_selected_rows()
+
+ # how many of selection do we have
+ length_of_path_list = len(pathlist)
+@@ -883,7 +883,14 @@
+ for copy_iter in copy_iter_list:
+
+ # get the parent and child number
+- copy_iter_parent_number, copy_iter_child_number = self.store.get_path(copy_iter)
++ if type(self.store) == gtk.TreeStore:
++ copy_iter_parent_number, copy_iter_child_number = self.store.get_path(copy_iter)
++ elif type(self.store) == gtk.ListStore:
++ # "desktop" type xml, workaround
++ copy_iter_child_number = self.store.get_path(copy_iter)[0]
++ copy_iter_parent_number = 0
++ else:
++ raise
+
+ # we are in new workspace
+ if copy_iter_parent_number != parent_number_index:
+@@ -931,7 +938,11 @@
+ # it is not in the same block but still in the same workspace
+ else:
+
+- lowest_iter_list.append(
++ if type(self.store) == gtk.ListStore:
++ lowest_iter_list.append(
++ self.store.get_iter(iter_workspace_index+1))
++ else:
++ lowest_iter_list.append(
+ self.store.get_iter( (copy_iter_parent_number, iter_workspace_index+1) ) )
+
+ done_workspace = True
+@@ -943,8 +954,13 @@
+ # a wallpaper from a workspace, if only one wallpaper existed.
+ # Need further investigation, however anyway workaround...
+ new_iter = []
++ if type(self.store) == gtk.ListStore:
++ parent_number_index = 0
+ try:
+- new_iter = self.store.get_iter((parent_number_index, iter_workspace_index + 1))
++ if type(self.store) == gtk.ListStore:
++ new_iter = self.store.get_iter(iter_workspace_index + 1)
++ else:
++ new_iter = self.store.get_iter((parent_number_index, iter_workspace_index + 1))
+ except ValueError:
+ pass
+ if new_iter:
+@@ -970,8 +986,8 @@
+ if self.store.get_path(single_iter)[0] != parent_number:
+ temp_iter_list = []
+ parent_number = self.store.get_path(single_iter)[0]
+- temp_iter_list.append(single_iter)
+- prev_iter = single_iter
++ temp_iter_list.append(single_iter)
++ prev_iter = single_iter
+
+ # do the remaining job
+ if self.store.iter_n_children( self.store.iter_parent(prev_iter) ) == len(temp_iter_list) and self.work_on_tree == "cut":
+@@ -986,11 +1002,17 @@
+ # if type(self.store) == gtk.TreeStore:
+ parent = self.store.iter_parent(position_iter)
+ new_index = self.store.get_value(position_iter, 0) + 1
+- # if it is child node
+- if parent != None:
++
++ # if it is child node in "workspace" xml or "desktop" type xml
++ if (type(self.store) == gtk.ListStore) or (parent != None):
+ for single_iter in self.selected_iter:
+ node_value = self.store.get_value(single_iter, 1)
+- position_iter = self.store.insert_after(parent, position_iter, [new_index, node_value, False])
++ if type(self.store) == gtk.ListStore:
++ # desktop type
++ position_iter = self.store.insert_after(position_iter, [new_index, node_value, False])
++ else:
++ # child node in workspace xml
++ position_iter = self.store.insert_after(parent, position_iter, [new_index, node_value, False])
+ new_index = new_index + 1
+
+ # after inserting new row, we must sort out the index number after it
+@@ -1108,6 +1130,7 @@
+ self.order_treeiter_from_lowest_iter(lowest_iter)
+
+ # select something after deleting treenodes
++ self.treeselection.unselect_all()
+ self.treeselection.select_path(0)
+
+ # create configuration file ( we call this method when we click save button )
+@@ -1274,6 +1297,18 @@
+ # Nothing left
+ return
+
++ if type(self.store) == gtk.ListStore:
++ #self.builder.get_object("rename_workspace").set_sensitive(False)
++ #self.rename_workspace_menu.set_sensitive(False)
++ self.builder.get_object("change_wallpaper").set_sensitive(True)
++ self.change_wallpaper_menu.set_sensitive(True)
++ self.builder.get_object("cut").set_sensitive(True)
++ self.cut_menu.set_sensitive(True)
++ self.builder.get_object("copy").set_sensitive(True)
++ self.copy_menu.set_sensitive(True)
++ self.builder.get_object("delete_wallpapers").set_sensitive(True)
++ self.delete_wallpapers_menu.set_sensitive(True)
++
+ if type(self.store) == gtk.TreeStore:
+ parent = self.store.iter_parent(position_iter)
+ # parent node, enable: rename_workspace
diff --git a/wallpapoz-0.6.2-python3.patch b/wallpapoz-0.6.2-python3.patch
new file mode 100644
index 0000000..533dcfb
--- /dev/null
+++ b/wallpapoz-0.6.2-python3.patch
@@ -0,0 +1,786 @@
+diff -urp wallpapoz-0.6.2.py2/setup.py wallpapoz-0.6.2.py3/setup.py
+--- wallpapoz-0.6.2.py2/setup.py 2019-09-02 14:04:36.124389528 +0900
++++ wallpapoz-0.6.2.py3/setup.py 2019-09-02 14:50:57.162142691 +0900
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python2
++#!/usr/bin/python3
+ # -*- coding: utf-8 -*-
+
+ #=============================================================================
+@@ -62,7 +62,7 @@ Options:
+ """)
+
+ def info():
+- print usage_info
++ print (usage_info)
+ sys.exit(1)
+
+ def install(src, dst):
+@@ -73,9 +73,9 @@ def install(src, dst):
+ if not os.path.isdir(os.path.dirname(dst)):
+ os.makedirs(os.path.dirname(dst))
+ shutil.copy2(src, dst)
+- print _("Installed"), dst
++ print (_("Installed"), dst)
+ except:
+- print _("Error while installing"), dst
++ print (_("Error while installing"), dst)
+
+ def uninstall(path):
+ try:
+@@ -86,71 +86,75 @@ def uninstall(path):
+ shutil.rmtree(path)
+ else:
+ return
+- print _("Removed"), path
++ print (_("Removed"), path)
+ except:
+- print _("Error while removing"), path
++ print (_("Error while removing"), path)
+
+ def check_dependencies():
+ required_found = True
+ recommended_found = True
+- print _("Checking dependencies...")
++ print (_("Checking dependencies..."))
+ print
+- print _("Required dependencies:")
++ print (_("Required dependencies:"))
+ print
+ # Should also check the PyGTK version. To do that we have to load the
+ # gtk module though, which normally can't be done while using `sudo`.
+ try:
+- import pygtk
+- print " PyGTK ........................ OK"
++ #import pygtk
++ import gi
++ gi.require_version("Gtk", "3.0")
++ from gi.repository import Gtk
++ print (" PyGTK ........................ OK")
+ except ImportError:
+- print " !!! PyGTK .................... ", _("Not found")
++ print (" !!! PyGTK .................... ", _("Not found"))
+ required_found = False
+ try:
+ # shutdown the warnings
+ import warnings
+ warnings.simplefilter("ignore", Warning)
+- import gtk.glade
+- print " Python Glade ................. OK"
+- except ImportError:
+- print " !!! Python Glade ............. ", _("Not found")
++ #import gtk.glade
++ Gtk.Builder()
++ print (" Python Glade ................. OK")
++ except (ImportError, AttributeError):
++ print (" !!! Python Glade ............. ", _("Not found"))
+ required_found = False
+ except RuntimeError:
+ # so we can check dependency when there is no DISPLAY
+ warnings.simplefilter("default", Warning)
+ if not os.environ.get("DISPLAY"):
+- print " Python Glade ................. SKIP"
++ print (" Python Glade ................. SKIP")
+ else:
+- print " !!! Python Glade ............. ", _("Not found")
+- required_found = False
++ print (" !!! Python Glade ............. ", _("Not found"))
++ #required_found = False
+ try:
+ from PIL import Image
+- print " Python Imaging Library ....... OK"
++ print (" Python Imaging Library ....... OK")
+ except ImportError:
+- print " !!! Python Imaging Library ... ", _("Not found")
++ print (" !!! Python Imaging Library ... ", _("Not found"))
+ required_found = False
+ try:
+ import gnome
+- print " Gnome Python ................. OK"
++ print (" Gnome Python ................. OK")
+ except ImportError:
+- print " !!! Gnome Python ............. ", _("Not found")
++ print (" !!! Gnome Python ............. ", _("Not found"))
+ recommended_found = False
+ out = os.popen('which xwininfo').readlines
+ if out == []:
+- print " Xwininfo tool ................ ", _("Not found")
++ print (" Xwininfo tool ................ ", _("Not found"))
+ required_found = False
+ else:
+- print " Xwininfo tool ................ OK"
++ print (" Xwininfo tool ................ OK")
+
+ if not required_found:
+ print
+- print _("Could not find all required dependencies!")
+- print _("Please install them and try again.")
++ print (_("Could not find all required dependencies!"))
++ print (_("Please install them and try again."))
+ print
+ sys.exit(1)
+ if not recommended_found:
+ print
+- print _("Gnome Python is not found. Wallpapoz still could be used and it has been installed.")
+- print _("But it means you can not access help documentation in your native language if it is available.")
++ print (_("Gnome Python is not found. Wallpapoz still could be used and it has been installed."))
++ print (_("But it means you can not access help documentation in your native language if it is available."))
+ print
+
+ install_dir = "/usr/local/"
+@@ -166,12 +170,12 @@ for opt, value in opts:
+ if opt == "--installdir":
+ install_dir = value
+ if not os.path.isdir(install_dir):
+- print _("\n*** Error:"), install_dir, _("does not exist.\n" )
++ print (_("\n*** Error:"), install_dir, _("does not exist.\n" ))
+ info()
+
+ if args == ["install"]:
+ check_dependencies()
+- print _("Installing Wallpapoz in"), install_dir, "...\n"
++ print (_("Installing Wallpapoz in"), install_dir, "...\n")
+ install("src/wallpapoz", "bin/wallpapoz")
+ install("src/daemon_wallpapoz", "bin/daemon_wallpapoz")
+ install("src/launcher_wallpapoz.sh", "bin/launcher_wallpapoz.sh")
+@@ -193,7 +197,7 @@ if args == ["install"]:
+ "share/gnome/help/wallpapoz/" + lang + "/legal.xml")
+
+ elif args == ["uninstall"]:
+- print _("Uninstalling Wallpapoz from"), install_dir, "...\n"
++ print (_("Uninstalling Wallpapoz from"), install_dir, "...\n")
+ uninstall("bin/wallpapoz")
+ uninstall("bin/daemon_wallpapoz")
+ uninstall("bin/launcher_wallpapoz.sh")
+@@ -211,11 +215,11 @@ elif args == ["uninstall"]:
+ uninstall("share/gnome/help/wallpapoz/" + lang + "/wallpapoz.xml")
+ uninstall("share/gnome/help/wallpapoz/" + lang + "/legal.xml")
+ print
+- print _("""
++ print (_("""
+ There might still be files in ~/.wallpapoz/ left on your system.
+ Please remove that directory manually if you do not plan to
+ install Wallpapoz again later.
+-""")
++"""))
+
+ else:
+ info()
+diff -urp wallpapoz-0.6.2.py2/share/wallpapoz/lib/wallpapoz_system.py wallpapoz-0.6.2.py3/share/wallpapoz/lib/wallpapoz_system.py
+--- wallpapoz-0.6.2.py2/share/wallpapoz/lib/wallpapoz_system.py 2019-09-02 14:04:36.105389275 +0900
++++ wallpapoz-0.6.2.py3/share/wallpapoz/lib/wallpapoz_system.py 2019-09-01 21:08:35.000000000 +0900
+@@ -44,8 +44,8 @@ class WallpapozSystem:
+
+ # Check if total_workspaces changed only here
+ if WallpapozSystem.static_total_workspaces != self.total_workspaces:
+- print "daemon_wallpapoz: the number of total workspaces changed during initialization process."
+- print "daemon_wallpapoz: respawning daemon_wallpapoz."
++ print ("daemon_wallpapoz: the number of total workspaces changed during initialization process.")
++ print ("daemon_wallpapoz: respawning daemon_wallpapoz.")
+ self.respawn_system()
+
+ def exec_cmd_under_X(self, cmd):
+@@ -57,32 +57,35 @@ class WallpapozSystem:
+ shell = True
+ )
+ except OSError:
+- print "daemon_wallpapoz: fork failed for %s, exiting." %cmd
++ print ("daemon_wallpapoz: fork failed for %s, exiting." %cmd)
+ sys.exit(1)
+
+ pstdout = p.stdout.read()
+ pstderr = p.stderr.read()
+ ret = p.wait()
++ # FIXME
++ pstdout_str = pstdout.decode('utf-8')
+
+ kill_daemon = False
+
+ if (ret != 0) and (ret & 0xFF):
+- print "daemon_wallpapoz: %s returned status %i." %(cmd, ret)
+- print "daemon_wallpapoz: error message: %s" %pstderr
++ print ("daemon_wallpapoz: %s returned status %i." %(cmd, ret))
++ print ("daemon_wallpapoz: error message: %s" %pstderr)
+ kill_daemon = True
+
+- if (cmd.find('xprop') >= 0) and (pstdout.find('no such atom') >= 0):
++ if (cmd.find('xprop') >= 0) and (pstdout_str.find('no such atom') >= 0):
+ kill_daemon = True
+- if (cmd.find('xprop') >= 0) and (pstdout.find('not') >= 0):
++ if (cmd.find('xprop') >= 0) and (pstdout_str.find('not') >= 0):
+ kill_daemon = True
+
+ if kill_daemon:
+ ## No X resource available, kill daemon_wallpapoz
+- print "daemon_wallpapoz: X resource seems no longer available."
+- print "daemon_wallpapoz: killing daemon_wallpapoz."
++ print ("daemon_wallpapoz: X resource seems no longer available.")
++ print ("daemon_wallpapoz: killing daemon_wallpapoz.")
+ sys.exit(1)
+
+- return pstdout
++ #FIXME
++ return pstdout_str
+
+ def set_style(self, style):
+ self.wallpaper_style = style
+@@ -209,7 +212,7 @@ class WallpapozSystem:
+ new_argv = []
+ new_argv.extend(sys.argv)
+ os.execvp('daemon_wallpapoz', new_argv)
+- print "os.execvp failed, exiting..."
++ print ("os.execvp failed, exiting...")
+ sys.exit(1)
+
+ def prevent_multiple_start(self):
+diff -urp wallpapoz-0.6.2.py2/share/wallpapoz/lib/xml_processing.py wallpapoz-0.6.2.py3/share/wallpapoz/lib/xml_processing.py
+--- wallpapoz-0.6.2.py2/share/wallpapoz/lib/xml_processing.py 2012-02-20 03:57:12.000000000 +0900
++++ wallpapoz-0.6.2.py3/share/wallpapoz/lib/xml_processing.py 2019-09-01 21:23:33.000000000 +0900
+@@ -28,7 +28,9 @@ import xml
+ import os
+ import sys
+ import gettext
+-import gtk
++import gi
++gi.require_version("Gtk", "3.0")
++from gi.repository import Gtk, GObject
+ from wallpapoz_system import WallpapozSystem
+
+ # i18n
+@@ -36,8 +38,8 @@ APP = "wallpapoz"
+ DIR = "../../locale"
+ gettext.bindtextdomain(APP, DIR)
+ gettext.textdomain(APP)
+-gtk.glade.bindtextdomain(APP, DIR)
+-gtk.glade.textdomain(APP)
++#gtk.glade.bindtextdomain(APP, DIR)
++#gtk.glade.textdomain(APP)
+ _ = gettext.gettext
+
+ ## XMLProcessing -- class for processing wallpapoz xml file
+@@ -64,7 +66,7 @@ class XMLProcessing:
+ # if wallpapoz run for the first time ( no configuration file )
+ # we make default list, for every workspace, we give one wallpaper that is our current wallpaper
+ if not os.path.exists(self.config_file):
+- print _("No configuration file. Use default configuration.")
++ print (_("No configuration file. Use default configuration."))
+ home = os.environ['HOME']
+ if not os.path.exists(home + '/.wallpapoz'):
+ os.makedirs(home + '/.wallpapoz')
+@@ -75,7 +77,7 @@ class XMLProcessing:
+ try:
+ self.xmldoc = minidom.parse(self.config_file)
+ except xml.parsers.expat.ExpatError:
+- print _("The configuration file is corrupted. Remove it then create a new one again with Wallpapoz!")
++ print (_("The configuration file is corrupted. Remove it then create a new one again with Wallpapoz!"))
+ sys.exit()
+
+ # wallpapoz node
+@@ -101,7 +103,7 @@ class XMLProcessing:
+ try:
+ self.xmldoc = minidom.parse(self.config_file)
+ except xml.parsers.expat.ExpatError:
+- print _("The configuration file is corrupted. Remove it then create a new one again with Wallpapoz!")
++ print (_("The configuration file is corrupted. Remove it then create a new one again with Wallpapoz!"))
+ sys.exit()
+
+ # wallpapoz node
+@@ -287,7 +289,7 @@ class XMLProcessing:
+ # save the xml file
+ def save(self):
+ xml_file = open(self.config_file, "w")
+- xml_file.write( self.xmldoc.toxml("utf-8") )
++ xml_file.write( self.xmldoc.toxml("utf-8").decode("utf-8") )
+
+ # fill list with default value
+ def default_fill_list(self, type):
+@@ -406,4 +408,4 @@ class XMLProcessing:
+
+ # create it
+ xml_file = open(self.config_file, "w")
+- xml_file.write( newdoc.toxml("utf-8") )
++ xml_file.write( newdoc.toxml("utf-8").decode("utf-8") )
+diff -urp wallpapoz-0.6.2.py2/src/daemon_wallpapoz wallpapoz-0.6.2.py3/src/daemon_wallpapoz
+--- wallpapoz-0.6.2.py2/src/daemon_wallpapoz 2019-09-02 14:04:36.168390114 +0900
++++ wallpapoz-0.6.2.py3/src/daemon_wallpapoz 2019-09-01 20:59:43.000000000 +0900
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python2
++#!/usr/bin/python3
+ # -*- coding: utf-8 -*-
+
+ #================================================
+@@ -33,7 +33,7 @@ import array
+ import time
+ import threading
+ import random
+-import gtk.glade
++#import gtk.glade
+ import string
+
+ # so we can call from anywhere
+@@ -133,7 +133,7 @@ if __name__ == "__main__":
+ total_workspaces = wallpapoz_system.get_total_workspaces()
+
+ # create the index for wallpaper list thread
+- number.fromlist( range( total_workspaces ) )
++ number.fromlist( list(range( total_workspaces ) ) )
+
+ # previous workspace
+ previous_desktop = -1
+diff -urp wallpapoz-0.6.2.py2/src/wallpapoz wallpapoz-0.6.2.py3/src/wallpapoz
+--- wallpapoz-0.6.2.py2/src/wallpapoz 2019-09-02 14:04:36.159389994 +0900
++++ wallpapoz-0.6.2.py3/src/wallpapoz 2019-09-02 14:13:50.533772653 +0900
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python2
++#!/usr/bin/python3
+ # -*- coding: utf-8 -*-
+
+ #=============================================================================
+@@ -27,10 +27,10 @@
+ ## wallpapoz.py -- the gui tool for creating configuration file and
+ # calling daemon program
+
+-import pygtk
+-pygtk.require('2.0')
+-import gtk.glade
+-import gobject
++import gi
++gi.require_version("Gtk", "3.0")
++from gi.repository import Gtk as gtk, GObject as gobject, Gdk as gdk
++from gi.repository import GdkPixbuf
+ import os
+ import sys
+ import stat
+@@ -55,8 +55,8 @@ APP = "wallpapoz"
+ DIR = "../share/locale"
+ gettext.bindtextdomain(APP, DIR)
+ gettext.textdomain(APP)
+-gtk.glade.bindtextdomain(APP, DIR)
+-gtk.glade.textdomain(APP)
++#gtk.glade.bindtextdomain(APP, DIR)
++#gtk.glade.textdomain(APP)
+ _ = gettext.gettext
+
+ # main class for the gui. This gui will contruct the configuration file that will be used by daemon
+@@ -69,25 +69,32 @@ class Wallpapoz:
+ # the contructor
+ def __init__(self):
+ # wallpapoz glade file
+- self.wallpapoz_glade_file = "../share/wallpapoz/glade/wallpapoz.glade"
++ #self.wallpapoz_glade_file = "../share/wallpapoz/glade/wallpapoz.glade"
++ self.wallpapoz_builder_file = "../share/wallpapoz/glade/wallpapoz-builder-wallpapoz_window.glade"
+
+ # call the xmlprocessing class to read it later on method related to treeview
+ self.wallpapozxml = XMLProcessing()
+
+ # Load the glade
+- self.main_window = gtk.glade.XML(self.wallpapoz_glade_file, "wallpapoz_window", APP)
++ self.builder = gtk.Builder()
++ self.builder.set_translation_domain(APP)
++ self.builder.add_from_file(self.wallpapoz_builder_file)
++ #self.main_window = gtk.glade.XML(self.wallpapoz_glade_file, "wallpapoz_window", APP)
++ self.main_window = self.builder.get_object("wallpapoz_window")
+
+ # window widget
+- self.main_window_widget = self.main_window.get_widget("wallpapoz_window")
++ self.main_window_widget = self.builder.get_object("wallpapoz_window")
+
+ # treeview widget
+- self.treeview_widget = self.main_window.get_widget("treeview")
++ self.treeview_widget = self.builder.get_object("treeview")
++ # FIXME set here
++ self.treeselection = self.treeview_widget.get_selection()
+
+ # image widget
+- self.image_widget = self.main_window.get_widget("wallpaper_image")
++ self.image_widget = self.builder.get_object("wallpaper_image")
+
+ # image filename widget
+- self.wallpaper_filename = self.main_window.get_widget("wallpaper_name_label")
++ self.wallpaper_filename = self.builder.get_object("wallpaper_name_label")
+
+ # create the pop up menu when we right click the treeview widget
+ self.set_up_popup_menu()
+@@ -121,7 +128,7 @@ class Wallpapoz:
+ "on_move_up_activate" : self.move_up_node,
+ "on_move_down_activate" : self.move_down_node,
+ "on_treeview_button_press_event" : self.right_click_menu }
+- self.main_window.signal_autoconnect(dic)
++ self.builder.connect_signals(dic)
+
+ # show treeview
+ self.load_treeview()
+@@ -132,16 +139,16 @@ class Wallpapoz:
+ # set up popup menu when we right click the treeview widget
+ def set_up_popup_menu(self):
+ self.popup_menu = gtk.Menu()
+- add_wallpapers_files_menu = gtk.MenuItem(_("Add Wallpapers (Files)"))
+- add_wallpapers_directory_menu = gtk.MenuItem(_("Add Wallpapers (Directory)"))
+- self.cut_menu = gtk.MenuItem(_("Cut"))
+- self.copy_menu = gtk.MenuItem(_("Copy"))
+- paste_menu = gtk.MenuItem(_("Paste"))
+- self.rename_workspace_menu = gtk.MenuItem(_("Rename Workspace"))
+- self.change_wallpaper_menu = gtk.MenuItem(_("Change Wallpaper"))
+- self.delete_wallpapers_menu = gtk.MenuItem(_("Delete Wallpapers"))
+- move_up_menu = gtk.MenuItem(_("Move Up"))
+- move_down_menu = gtk.MenuItem(_("Move Down"))
++ add_wallpapers_files_menu = gtk.MenuItem(label=_("Add Wallpapers (Files)"))
++ add_wallpapers_directory_menu = gtk.MenuItem(label=_("Add Wallpapers (Directory)"))
++ self.cut_menu = gtk.MenuItem(label=_("Cut"))
++ self.copy_menu = gtk.MenuItem(label=_("Copy"))
++ paste_menu = gtk.MenuItem(label=_("Paste"))
++ self.rename_workspace_menu = gtk.MenuItem(label=_("Rename Workspace"))
++ self.change_wallpaper_menu = gtk.MenuItem(label=_("Change Wallpaper"))
++ self.delete_wallpapers_menu = gtk.MenuItem(label=_("Delete Wallpapers"))
++ move_up_menu = gtk.MenuItem(label=_("Move Up"))
++ move_down_menu = gtk.MenuItem(label=_("Move Down"))
+ add_wallpapers_files_menu.connect("activate", self.add_wallpapers_files)
+ add_wallpapers_directory_menu.connect("activate", self.add_wallpapers_directory)
+ self.cut_menu.connect("activate", self.cut_treenode)
+@@ -175,8 +182,8 @@ class Wallpapoz:
+
+ # popup menu when user right-click the treeview widget
+ def right_click_menu(self, widget, event):
+- if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
+- self.popup_menu.popup(None, None, None, event.button, event.time)
++ if event.type == gdk.EventType.BUTTON_PRESS and event.button == 3:
++ self.popup_menu.popup(None, None, None, None, event.button, event.time)
+
+ def restart_daemon(self, widget):
+ self.stop_daemon(None)
+@@ -201,8 +208,12 @@ class Wallpapoz:
+
+ # when user click about menu item, show about dialog
+ def display_about(self, widget):
+- about_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "wallpapoz_about_dialog", APP)
+- aboutdlg_widget = about_dialog.get_widget("wallpapoz_about_dialog")
++ #about_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "wallpapoz_about_dialog", APP)
++ self.about_dialog_builder_file = "../share/wallpapoz/glade/wallpapoz-builder-wallpapoz_about_dialog.glade"
++ self.about_dialog_builder = gtk.Builder()
++ self.about_dialog_builder.set_translation_domain(APP)
++ self.about_dialog_builder.add_from_file(self.about_dialog_builder_file)
++ aboutdlg_widget = self.about_dialog_builder.get_object("wallpapoz_about_dialog")
+ aboutdlg_widget.connect('response', lambda w, e: aboutdlg_widget.destroy())
+
+ # get the selection iter
+@@ -326,15 +337,17 @@ class Wallpapoz:
+ dialog_title = _("Choose Wallpapers")
+
+ # our filechooser dialog
+- filechooser_dialog = gtk.FileChooserDialog(dialog_title, self.main_window_widget, gtk.FILE_CHOOSER_ACTION_OPEN)
++ filechooser_dialog = gtk.FileChooserDialog(dialog_title, self.main_window_widget, gtk.FileChooserAction.OPEN)
+
+ # our button
+- cancel_button = filechooser_dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
++ cancel_button = filechooser_dialog.add_button(gtk.STOCK_CANCEL, gtk.ResponseType.CANCEL)
+ if type_of_ok_button == "change":
+- ok_button = filechooser_dialog.add_button(_("Change"), gtk.RESPONSE_OK)
++ ok_button = filechooser_dialog.add_button(_("Change"), gtk.ResponseType.OK)
+ elif type_of_ok_button == "add":
+- ok_button = filechooser_dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
+- gtk.Tooltips().set_tip(ok_button, _("Add wallpapers"))
++ ok_button = filechooser_dialog.add_button(gtk.STOCK_OK, gtk.ResponseType.OK)
++ # FIXME
++ #gtk.Tooltips().set_tip(ok_button, _("Add wallpapers"))
++ ok_button.set_tooltip_text(_("Add wallpapers"))
+
+ # cancel will quit the filechooser dialog
+ cancel_button.connect("clicked", lambda w: filechooser_dialog.destroy())
+@@ -379,7 +392,7 @@ class Wallpapoz:
+ filechooser_dialog.set_select_multiple(True)
+
+ # if user choose the file, add his choice to treeview
+- if filechooser_dialog.run() == gtk.RESPONSE_OK:
++ if filechooser_dialog.run() == gtk.ResponseType.OK:
+ # get the list of filename that we choose to add
+ filenames = filechooser_dialog.get_filenames()
+
+@@ -436,15 +449,21 @@ class Wallpapoz:
+
+ # show up the preferences dialog
+ def preferences_option(self, widget):
+- self.preferences_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "preferences_dialog", APP)
+- preferences_dialog_widget = self.preferences_dialog.get_widget("preferences_dialog")
++ #self.preferences_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "preferences_dialog", APP)
++ self.preferences_dialog_builder_file = "../share/wallpapoz/glade/wallpapoz-builder-preferences_dialog.glade"
++ self.preferences_dialog_builder = gtk.Builder()
++ self.preferences_dialog_builder.set_translation_domain(APP)
++ self.preferences_dialog_builder.add_from_file(self.preferences_dialog_builder_file)
++ # FIXME
++ self.preferences_dialog = self.preferences_dialog_builder
++ preferences_dialog_widget = self.preferences_dialog.get_object("preferences_dialog")
+
+ # input widgets
+- time_changed_widget = self.preferences_dialog.get_widget("preferences_dialog_spin_button_time")
+- random_order_widget = self.preferences_dialog.get_widget("preferences_dialog_show_wallpaper_random_order")
+- changing_workspace_widget = self.preferences_dialog.get_widget("preferences_dialog_change_wallpaper_changing_workspace")
+- style_widget = self.preferences_dialog.get_widget("preferences_dialog_style_combobox")
+- size_widget = self.preferences_dialog.get_widget("preferences_dialog_size_combobox")
++ time_changed_widget = self.preferences_dialog.get_object("preferences_dialog_spin_button_time")
++ random_order_widget = self.preferences_dialog.get_object("preferences_dialog_show_wallpaper_random_order")
++ changing_workspace_widget = self.preferences_dialog.get_object("preferences_dialog_change_wallpaper_changing_workspace")
++ style_widget = self.preferences_dialog.get_object("preferences_dialog_style_combobox")
++ size_widget = self.preferences_dialog.get_object("preferences_dialog_size_combobox")
+
+ # load value from xml file
+ time_changed_widget.set_value(float(self.wallpapozxml.delay()))
+@@ -458,19 +477,19 @@ class Wallpapoz:
+ changing_workspace_widget.set_active(self.wallpapozxml.change_wallpaper_when_changing_workspace())
+
+ # button
+- cancel_button = self.preferences_dialog.get_widget("preferences_cancel_button")
++ cancel_button = self.preferences_dialog.get_object("preferences_cancel_button")
+ cancel_button.connect("clicked", lambda w: preferences_dialog_widget.destroy())
+
+- ok_button = self.preferences_dialog.get_widget("preferences_ok_button")
++ ok_button = self.preferences_dialog.get_object("preferences_ok_button")
+ ok_button.connect("clicked", self.ok_preferences_dialog)
+
+ def ok_preferences_dialog(self, widget):
+- time_changed_widget = self.preferences_dialog.get_widget("preferences_dialog_spin_button_time")
+- random_order_widget = self.preferences_dialog.get_widget("preferences_dialog_show_wallpaper_random_order")
+- changing_workspace_widget = self.preferences_dialog.get_widget("preferences_dialog_change_wallpaper_changing_workspace")
+- style_widget = self.preferences_dialog.get_widget("preferences_dialog_style_combobox")
+- size_widget = self.preferences_dialog.get_widget("preferences_dialog_size_combobox")
+- preferences_dialog_widget = self.preferences_dialog.get_widget("preferences_dialog")
++ time_changed_widget = self.preferences_dialog.get_object("preferences_dialog_spin_button_time")
++ random_order_widget = self.preferences_dialog.get_object("preferences_dialog_show_wallpaper_random_order")
++ changing_workspace_widget = self.preferences_dialog.get_object("preferences_dialog_change_wallpaper_changing_workspace")
++ style_widget = self.preferences_dialog.get_object("preferences_dialog_style_combobox")
++ size_widget = self.preferences_dialog.get_object("preferences_dialog_size_combobox")
++ preferences_dialog_widget = self.preferences_dialog.get_object("preferences_dialog")
+
+ # user change option for changing_workspace
+ if changing_workspace_widget.get_active():
+@@ -508,10 +527,17 @@ class Wallpapoz:
+ if iter == None:
+ return
+
+- choose_directory_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "add_wallpapers_directory_dialog", APP)
+- choose_directory_dialog_widget = choose_directory_dialog.get_widget("add_wallpapers_directory_dialog")
+- filechooser_widget = choose_directory_dialog.get_widget("filechooserwidget")
+- recursive_widget = choose_directory_dialog.get_widget("recursive_checkbutton")
++ #choose_directory_dialog = gtk.glade.XML(self.wallpapoz_glade_file, "add_wallpapers_directory_dialog", APP)
++ self.choose_directory_dialog_file = "../share/wallpapoz/glade/wallpapoz-builder-add_wallpapers_directory_dialog.glade"
++ self.choose_directory_dialog_builder = gtk.Builder()
++ self.choose_directory_dialog_builder.set_translation_domain(APP)
++ self.choose_directory_dialog_builder.add_from_file(self.choose_directory_dialog_file)
++ # FIXME
++ choose_directory_dialog = self.choose_directory_dialog_builder
++
++ choose_directory_dialog_widget = choose_directory_dialog.get_object("add_wallpapers_directory_dialog")
++ filechooser_widget = choose_directory_dialog.get_object("filechooserwidget")
++ recursive_widget = choose_directory_dialog.get_object("recursive_checkbutton")
+
+ # set it to last directory
+ if self.last_directory == None:
+@@ -528,7 +554,7 @@ class Wallpapoz:
+
+ dic = { "on_cancel_add_wallpapers_directory_button_clicked" : (self.cancel_button_add_wallpapers_directory, choose_directory_dialog_widget),
+ "on_add_wallpapers_directory_button_clicked" : (self.ok_button_add_wallpapers_directory, filechooser_widget, recursive_widget, choose_directory_dialog_widget, iter) }
+- choose_directory_dialog.signal_autoconnect(dic)
++ choose_directory_dialog.connect_signals(dic)
+
+ # ok, if we choose the directory ( accept filechooser, recursive checkbutton, iter pointing treenode ), function add_wallpapers_directory call this function
+ def ok_button_add_wallpapers_directory(self, widget, filechooser_widget, recursive_widget, choose_directory_dialog_widget, iter):
+@@ -735,7 +761,7 @@ class Wallpapoz:
+ ii = ii + 1
+
+ # enable rename workspace menu
+- self.main_window.get_widget("rename_workspace").set_sensitive(True)
++ self.builder.get_object("rename_workspace").set_sensitive(True)
+
+ # name of our left column
+ left_tvcolumn_name = _("Workspace")
+@@ -746,12 +772,12 @@ class Wallpapoz:
+ self.store = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
+
+ # disable cut, copy, paste, rename menu item
+- self.main_window.get_widget("cut").set_sensitive(False)
+- self.main_window.get_widget("copy").set_sensitive(False)
+- self.main_window.get_widget("paste").set_sensitive(False)
++ self.builder.get_object("cut").set_sensitive(False)
++ self.builder.get_object("copy").set_sensitive(False)
++ self.builder.get_object("paste").set_sensitive(False)
+
+ # enable change wallpaper menu item
+- self.main_window.get_widget("change_wallpaper").set_sensitive(True)
++ self.builder.get_object("change_wallpaper").set_sensitive(True)
+
+ # make the wallpaper list
+ for i in range(len(worklist)):
+@@ -786,7 +812,7 @@ class Wallpapoz:
+
+ # set mode to multiple selection
+ self.treeselection = self.treeview_widget.get_selection()
+- self.treeselection.set_mode(gtk.SELECTION_MULTIPLE)
++ self.treeselection.set_mode(gtk.SelectionMode.MULTIPLE)
+ self.treeselection.select_path(0)
+
+ # show image for liststore
+@@ -814,7 +840,7 @@ class Wallpapoz:
+ # status, copy or cut
+ self.work_on_tree = "copy"
+ # enable the paste menu item
+- self.main_window.get_widget("paste").set_sensitive(True)
++ self.builder.get_object("paste").set_sensitive(True)
+
+ # we call this method when we click cut menu action
+ def cut_treenode(self, widget):
+@@ -829,7 +855,7 @@ class Wallpapoz:
+ # status, copy or cut
+ self.work_on_tree = "cut"
+ # enable the paste menu item
+- self.main_window.get_widget("paste").set_sensitive(True)
++ self.builder.get_object("paste").set_sensitive(True)
+
+ # helper function for reordering node after cut&paste, returning list of all lowest not selected iter from the related workspace
+ def reordering_node_after_cut_and_paste(self, copy_iter_list):
+@@ -942,10 +968,10 @@ class Wallpapoz:
+ parent_number = self.store.get_path(self.selected_iter[0])[0]
+ for single_iter in self.selected_iter:
+ if self.store.get_path(single_iter)[0] != parent_number:
+- temp_iter_list = []
+- parent_number = self.store.get_path(single_iter)[0]
+- temp_iter_list.append(single_iter)
+- prev_iter = single_iter
++ temp_iter_list = []
++ parent_number = self.store.get_path(single_iter)[0]
++ temp_iter_list.append(single_iter)
++ prev_iter = single_iter
+
+ # do the remaining job
+ if self.store.iter_n_children( self.store.iter_parent(prev_iter) ) == len(temp_iter_list) and self.work_on_tree == "cut":
+@@ -990,7 +1016,7 @@ class Wallpapoz:
+ # make sure the status is reset
+ self.work_on_tree = None
+ # disable the paste menu item
+- self.main_window.get_widget("paste").set_sensitive(False)
++ self.builder.get_object("paste").set_sensitive(False)
+
+ self.cut_and_reordering_treeiter()
+
+@@ -1001,7 +1027,7 @@ class Wallpapoz:
+ # workaround for the case that trying to remove a wallpaper from
+ # the workspace where only one wallpaper exists
+ if not lowest_iter_list:
+- return
++ return
+
+ # iterate to cut ( really!!! ) the iter from selected iter list
+ for single_iter in self.selected_iter:
+@@ -1212,7 +1238,7 @@ class Wallpapoz:
+ # make the chooser dialog
+ filechooser_dialog = self.make_chooser_dialog("change")
+ # if user okay with his choice, then change the value
+- if filechooser_dialog.run() == gtk.RESPONSE_OK:
++ if filechooser_dialog.run() == gtk.ResponseType.OK:
+ # we interested in image file
+ if self.is_image_file(filechooser_dialog.get_filename()):
+ self.store.set_value(iter, 1, filechooser_dialog.get_filename())
+@@ -1235,15 +1261,15 @@ class Wallpapoz:
+
+ if not position_iter:
+ # Nothing is selected, unfortunately this can happen
+- self.main_window.get_widget("rename_workspace").set_sensitive(False)
++ self.builder.get_object("rename_workspace").set_sensitive(False)
+ self.rename_workspace_menu.set_sensitive(False)
+- self.main_window.get_widget("change_wallpaper").set_sensitive(False)
++ self.builder.get_object("change_wallpaper").set_sensitive(False)
+ self.change_wallpaper_menu.set_sensitive(False)
+- self.main_window.get_widget("cut").set_sensitive(False)
++ self.builder.get_object("cut").set_sensitive(False)
+ self.cut_menu.set_sensitive(False)
+- self.main_window.get_widget("copy").set_sensitive(False)
++ self.builder.get_object("copy").set_sensitive(False)
+ self.copy_menu.set_sensitive(False)
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.builder.get_object("delete_wallpapers").set_sensitive(False)
+ self.delete_wallpapers_menu.set_sensitive(False)
+ # Nothing left
+ return
+@@ -1255,13 +1281,13 @@ class Wallpapoz:
+
+ # child node
+ if parent != None:
+- self.main_window.get_widget("rename_workspace").set_sensitive(False)
++ self.builder.get_object("rename_workspace").set_sensitive(False)
+ self.rename_workspace_menu.set_sensitive(False)
+- self.main_window.get_widget("change_wallpaper").set_sensitive(True)
++ self.builder.get_object("change_wallpaper").set_sensitive(True)
+ self.change_wallpaper_menu.set_sensitive(True)
+- self.main_window.get_widget("cut").set_sensitive(True)
++ self.builder.get_object("cut").set_sensitive(True)
+ self.cut_menu.set_sensitive(True)
+- self.main_window.get_widget("copy").set_sensitive(True)
++ self.builder.get_object("copy").set_sensitive(True)
+ self.copy_menu.set_sensitive(True)
+
+ # See create_configuration_file
+@@ -1272,23 +1298,23 @@ class Wallpapoz:
+ # Only show "Delete wallpapers" menu if there are at least 2 wallpapers
+ # in a workspace
+ if childiter:
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(True)
++ self.builder.get_object("delete_wallpapers").set_sensitive(True)
+ self.delete_wallpapers_menu.set_sensitive(True)
+ else:
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.builder.get_object("delete_wallpapers").set_sensitive(False)
+ self.delete_wallpapers_menu.set_sensitive(False)
+
+ # parent node
+ else:
+- self.main_window.get_widget("rename_workspace").set_sensitive(True)
++ self.builder.get_object("rename_workspace").set_sensitive(True)
+ self.rename_workspace_menu.set_sensitive(True)
+- self.main_window.get_widget("change_wallpaper").set_sensitive(False)
++ self.builder.get_object("change_wallpaper").set_sensitive(False)
+ self.change_wallpaper_menu.set_sensitive(False)
+- self.main_window.get_widget("cut").set_sensitive(False)
++ self.builder.get_object("cut").set_sensitive(False)
+ self.cut_menu.set_sensitive(False)
+- self.main_window.get_widget("copy").set_sensitive(False)
++ self.builder.get_object("copy").set_sensitive(False)
+ self.copy_menu.set_sensitive(False)
+- self.main_window.get_widget("delete_wallpapers").set_sensitive(False)
++ self.builder.get_object("delete_wallpapers").set_sensitive(False)
+ self.delete_wallpapers_menu.set_sensitive(False)
+
+ filename = self.store.get_value(position_iter, 1)
+@@ -1297,19 +1323,19 @@ class Wallpapoz:
+ # files' list (i.e. not pointing to desktop name)
+ if ( (type(self.store) == gtk.TreeStore) and
+ ( parent == None ) ):
+- self.image_widget.clear()
++ self.image_widget.clear()
+ else:
+- from glib import GError as glib_GError
++ from gi.repository.GLib import GError as glib_GError
+ try:
+- anime = gtk.gdk.PixbufAnimation(filename)
++ anime = GdkPixbuf.PixbufAnimation.new_from_file(filename)
+
+ if anime.is_static_image() :
+ im = Image.open(filename)
+ # keep image proportions
+ if im.size[0] > im.size[1]:
+- self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, 400, int((float(im.size[1])/im.size[0]) * 400)))
++ self.image_widget.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_file_at_size(filename, 400, int((float(im.size[1])/im.size[0]) * 400)))
+ else:
+- self.image_widget.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(filename, int(float(im.size[1])/im.size[0] * 300), 300))
++ self.image_widget.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(float(im.size[1])/im.size[0] * 300), 300))
+
+ else:
+ width = anime.get_width()
+@@ -1322,8 +1348,8 @@ class Wallpapoz:
+
+ except IOError:
+ self.image_widget.clear()
+- except glib_GError, (msg):
+- print msg
++ except glib_GError as msg:
++ print (msg)
+ self.image_widget.clear()
+
+ # display image filename
diff --git a/wallpapoz-0.6.2-wm-return-to-default.patch b/wallpapoz-0.6.2-wm-return-to-default.patch
new file mode 100644
index 0000000..976589c
--- /dev/null
+++ b/wallpapoz-0.6.2-wm-return-to-default.patch
@@ -0,0 +1,20 @@
+--- wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py.default 2012-09-18 12:31:45.855406125 +0900
++++ wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py 2012-09-18 12:37:03.387072341 +0900
+@@ -108,6 +108,7 @@
+ if wm_name=='Xfwm4':
+ self.window_manager = 'XFCE4'
+ else:
++ try:
+ output = os.popen("gnome-session --version")
+ result = output.readlines()
+ version = result[0].split()[1].split('.')[0]
+@@ -115,6 +116,9 @@
+ self.window_manager = 'Gnome'
+ elif version == '3':
+ self.window_manager = 'Gnome3'
++ except:
++ # If something went wrong, just ignore
++ pass
+
+ ## class method to find amount of workspaces in user desktop
+ def finding_total_workspaces(self):
diff --git a/wallpapoz-autostart.desktop b/wallpapoz-autostart.desktop
new file mode 100644
index 0000000..04f17da
--- /dev/null
+++ b/wallpapoz-autostart.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Type=Application
+Name=wallpapoz-autostart
+Comment=Wallpapoz Autostarter
+Exec=daemon_wallpapoz
+Terminal=false
diff --git a/wallpapoz-glade-builder-convert.sh b/wallpapoz-glade-builder-convert.sh
new file mode 100644
index 0000000..57e0fab
--- /dev/null
+++ b/wallpapoz-glade-builder-convert.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/bash
+set -x
+set -e
+
+ORIG_XML=./share/wallpapoz/glade/wallpapoz.glade
+NEWTOPDIR=wallpapoz-0.6.2-builder
+DIR_XML=$(dirname $ORIG_XML)
+BASE_XML=$(basename $ORIG_XML)
+
+mkdir -p $NEWTOPDIR/$DIR_XML || true
+
+cat ./src/wallpapoz | sed -n -e '\@gtk.glade.XML@s|^.*"\(.*\)".*$|\1|p' | while read item
+do
+ SPLIT_ORIG_XML=${DIR_XML}/wallpapoz-old-${item}.glade
+ NEW_BUILDER_XML=${DIR_XML}/wallpapoz-builder-${item}.glade
+
+ > $NEWTOPDIR/$SPLIT_ORIG_XML
+ head -n 5 $ORIG_XML >> $NEWTOPDIR/$SPLIT_ORIG_XML
+ cat $ORIG_XML | sed -n -e "\@^\$@p" >> $NEWTOPDIR/$SPLIT_ORIG_XML
+ echo >> $NEWTOPDIR/$SPLIT_ORIG_XML
+ tail -n -1 $ORIG_XML >> $NEWTOPDIR/$SPLIT_ORIG_XML
+
+ gtk-builder-convert $NEWTOPDIR/$SPLIT_ORIG_XML $NEWTOPDIR/$NEW_BUILDER_XML
+ sed -i $NEWTOPDIR/$NEW_BUILDER_XML \
+ -e "\@has_resize_grip@d" \
+ -e "\@has_separator@d"
+done
diff --git a/wallpapoz.spec b/wallpapoz.spec
index 623dc0e..02a5901 100644
--- a/wallpapoz.spec
+++ b/wallpapoz.spec
@@ -1,49 +1,127 @@
# For svn version: do
-# $ svn checkout http://opensvn.csie.org/wallpapoz/trunk wallpapoz-%%{mainver}
+# $ svn checkout http://opensvn.csie.org/wallpapoz/trunk wallpapoz-%%{mainver}%%{?svnver:-svn%%svnver}
# $ tar -cjf %%{name}-%%{mainver}%%{?svnver:-svn%%svnver}.tar.bz2 %%{name}-%%{mainver}/
%define srcurl http://wallpapoz.akbarhome.com/
%define icondir %{_datadir}/icons/hicolor/128x128/apps
-%define mainver 0.4.1
+%define mainver 0.6.2
%undefine betaver
-%define svnver svn87_trunk
-%define fedorarel 7
+%define baserelease 20
-%define rel %{?betaver:0.}%{fedorarel}%{?svnver:.%svnver}%{?betaver:.%betaver}
+%define rel %{?betaver:0.}%{baserelease}%{?betaver:.%betaver}
Name: wallpapoz
Version: %{mainver}
Release: %{rel}%{?dist}
Summary: Gnome Multi Backgrounds and Wallpapers Configuration Tool
-Group: User Interface/Desktops
-License: GPLv2+
-URL: %{srcurl}
-Source0: %{srcurl}files/%{name}-%{mainver}%{?svnver:-%svnver}%{?betaver:%betaver}.tar.bz2
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# GPL-2.0-or-later README
+# GFDL-1.1-or-later share/gnome/help/wallpapoz/C/legal.xml
+# SPDX confirmed
+License: GPL-2.0-or-later AND GFDL-1.1-or-later
+
+URL: http://vajrasky.wordpress.com/wallpapoz/
+Source0: https://github.com/downloads/vajrasky/wallpapoz/%{name}-%{mainver}%{?betaver:%betaver}.tar.bz2
+Source11: wallpapoz-autostart.desktop
+# Install daemon_wallpapoz wrapper script, which may
+# fix 584980, 597687?
+# and 711541
+Source12: daemon_wallpapoz-wrapper
+#
+# Glade XML converted to GTK builder script
+# Source21: wallpapoz-0.6.2-builder.tar.bz2
+# Source21 is generated by the following script.
+# Note that the following script uses "gtk-builder-convert" in gtk2-devel
+# Now "gtk-builder-convert" is imported to python3, so don't use Source21
+Source22: wallpapoz-glade-builder-convert.sh
+#
+# Misc fixes for daemon_wallpapoz under compiz working,
+# containing fix for bug 531342, 542244, bug 567437, bug 573642
+Patch0: wallpapoz-0.6.1-workspace-num-respawn.patch
+# Check if selected item is really a directory when adding directory
+# bug 549219
+Patch2: wallpapoz-0.6.1-dircheck.patch
+# Avoid backtrace in case no item is selected yet (bug 555181)
+Patch3: wallpapoz-0.4.1-rev92-noitem_selected.patch
+# Intialization for pasting selected items
+Patch4: wallpapoz-0.4.1-rev92-paste-initialization.patch
+# Kill daemon_wallpapoz when X resource is no longer available
+# bug 531343, 538533, 541434, 556377, 569135, 571827
+# (and bug 566594)
+# (and bug 711541)
+Patch5: wallpapoz-0.6.2-kill-daemon-without-x.patch
+# Kill other daemon_wallpapoz if running
+Patch6: wallpapoz-0.6.1-kill-multiple-daemon.patch
+# Make wallpapoz gui handle animated image file
+# bug 602921
+Patch7: wallpapoz-0.6.1-animated-image.patch
+# Non-utf8 directory can return NoneType with filechooser_widget.get_filename
+# bug 603351
+Patch8: wallpapoz-0.6.1-nonutf8-directory.patch
+# Don't remove a wallpaper from a workspace if there is only one
+# wallpaper left.
+# bug 567136
+# Also some fixes about gtk menu sensitive issue (after doing some movement
+# for wallpapers)
+Patch9: wallpapoz-0.6.1-delete-one-wallpaper.patch
+# Fix backtrace when deleting first element in desktop (not workspace) mode
+# bug 597959
+Patch10: wallpapoz-0.6.1-delete-first-in-desktop-mode.patch
+# Port to gsettings
+#Patch11: wallpapoz-0.5-gsettings.patch
+# At startup, wallpapoz will try to show workspace name as "images"
+Patch12: wallpapoz-0.5-startup-warn-about-workspace-name.patch
+# Fix backtrace when switching from desktop style XML to workspace style one
+# with workspace number increased
+# bug 708769
+Patch13: wallpapoz-0.6.1-switch-from-wallpaper-to-desktop-with-workspace-increase.patch
+# Return to set default WM to GNOME3 when proper WM is not found
+# (bug 857587)
+Patch14: wallpapoz-0.6.2-wm-return-to-default.patch
+# Don't import Image directory and import PIL instead for
+# F-19 Pillow conversion
+# (bug 895217)
+Patch15: wallpapoz-0.6.2-import-PIL-for-Image.patch
+# Support LXDE
+Patch16: wallpapoz-0.6.2-LXDE.patch
+# Support MATE
+# https://bugzilla.redhat.com/show_bug.cgi?id=1029554#c31
+# https://bugzilla.redhat.com/show_bug.cgi?id=1029554#c38
+Patch17: wallpapoz-0.6.2-MATE.patch
+# Support CINNAMON
+# https://bugzilla.redhat.com/show_bug.cgi?id=1029554#c44
+Patch18: wallpapoz-0.6.2-CINNAMON.patch
+# Switch to python3
+Patch31: wallpapoz-0.6.2-python3.patch
+# bug 1773214 and etc, various fixes for "desktop" type xml
+Patch32: wallpapoz-0.6.2-python3-desktop-type.patch
BuildArch: noarch
BuildRequires: desktop-file-utils
BuildRequires: gettext
-BuildRequires: python-devel
-BuildRequires: pygtk2-libglade
-BuildRequires: python-imaging
-BuildRequires: gnome-python2
+BuildRequires: gobject-introspection
+BuildRequires: python3-devel
+BuildRequires: python3-imaging
+BuildRequires: gtk3
+BuildRequires: python3-gobject
+BuildRequires: /usr/bin/gtk-builder-convert
+#BuildRequires: gnome-python2
# See bug 456122
%if 0%{?fedora} >= 10
-BuildRequires: gnome-python2-gnome
+#BuildRequires: gnome-python2-gnome
%endif
-Requires: pygtk2-libglade
-Requires: python-imaging
-Requires: gnome-python2
-%if 0%{?fedora} >= 10
-Requires: gnome-python2-gnome
-%endif
-Requires: xorg-x11-utils
-Requires: %{_bindir}/kill
-Requires: %{_bindir}/pgrep
+# Because wallpapoz uses gconftool-2 or so
+Requires: GConf2
+Requires: gtk3
+Requires: gobject-introspection
+Requires: python3-gobject
+Requires: python3-imaging
+#Requires: gnome-python2-gnome
+Requires: xprop xwininfo
+Requires: /usr/bin/kill
+Requires: /usr/bin/pgrep
%description
This tool enables your Gnome desktop to have different
@@ -51,41 +129,346 @@ wallpapers for different workspaces or virtual desktops.
%prep
%setup -q -n %{name}-%{version}%{?svnver:-%svnver}
-sed -i.cs -e '/DOC_ISO_CODES/s|"ru"|"ru","cs"|' setup.py
+%patch -P0 -p1 -b .respawn
+%patch -P2 -p1 -b .dircheck
+%patch -P3 -p1 -b .noitem
+%patch -P4 -p1 -b .patch_init
+%patch -P5 -p1 -b .kill_nox
+%patch -P6 -p1 -b .kill_multi
+%patch -P7 -p1 -b .anime
+%patch -P8 -p1 -b .nonutf8
+%patch -P9 -p1 -b .deletelastone
+%patch -P10 -p1 -b .deletefirst
+%patch -P12 -p1 -b .workspace_img
+%patch -P13 -p1 -b .workspace_num_incr
+%patch -P14 -p1 -b .default
+%patch -P15 -p1 -b .pil
+%patch -P16 -p1 -b .LXDE
+%patch -P17 -p1 -b .MATE
+%patch -P18 -p1 -b .CINNAMON
+
+grep -rl --null '/usr/bin/env python$' . | \
+ xargs --null sed -i -e 's|/usr/bin/env python|/usr/bin/python2|'
+
+%patch -P31 -p1 -b .py3
+%patch -P32 -p1 -b .py3.desktop
+
+# For setup
+mkdir TMPBINDIR
+pushd TMPBINDIR
+ln -sf /bin/true xwininfo
+popd
+
+# Install C gnome help documents (bug 651522)
+ln -sf c share/gnome/help/wallpapoz/C
%build
+bash %{SOURCE22}
+find . -type f -print0 | xargs -0 chmod 0644
+grep -rl --null '#!/usr/bin' . | xargs -0 chmod 0755
%install
%{__rm} -rf $RPM_BUILD_ROOT
%{__mkdir_p} $RPM_BUILD_ROOT%{_prefix}
-%{__python} setup.py install --installdir=$RPM_BUILD_ROOT%{_prefix}
+export PATH=$(pwd)/TMPBINDIR:$PATH
+%{__python3} setup.py install --installdir=$RPM_BUILD_ROOT%{_prefix}
%{__sed} -i -e 's|%{name}\.png|%{name}|' \
$RPM_BUILD_ROOT%{_datadir}/applications/%{name}.desktop
desktop-file-install \
- --vendor fedora \
--dir $RPM_BUILD_ROOT%{_datadir}/applications \
--delete-original \
$RPM_BUILD_ROOT%{_datadir}/applications/%{name}.desktop
+# Install desktop application autostart stuff
+%{__mkdir_p} ${RPM_BUILD_ROOT}%{_sysconfdir}/xdg/autostart
+desktop-file-install \
+ --dir ${RPM_BUILD_ROOT}%{_sysconfdir}/xdg/autostart \
+ %{SOURCE11}
+
+# Install daemon_wallpapoz wrapper script
+pushd ${RPM_BUILD_ROOT}
+%{__mkdir_p} ./%{_libexecdir}
+%{__mv} ./%{_bindir}/daemon_wallpapoz ./%{_libexecdir}
+%{__install} -cp -m 0755 %{SOURCE12} ./%{_bindir}/daemon_wallpapoz
+popd
+# And as we use out custom wrapper script, the following
+# is not needed
+rm -f ${RPM_BUILD_ROOT}%{_bindir}/launcher_wallpapoz.sh
+
+# Manually install the following
+install -cpm 0644 \
+ wallpapoz-*/share/wallpapoz/glade/*builder*glade \
+ %{buildroot}%{_datadir}/%{name}/glade/
+
%{find_lang} %{name}
-%clean
-%{__rm} -rf $RPM_BUILD_ROOT
-
%files -f %{name}.lang
-%defattr(-,root,root,-)
-%doc COPYING README
-%{_bindir}/*%{name}
+%license COPYING
+%doc README
+%{_bindir}/%{name}
+%{_bindir}/daemon_wallpapoz
+%{_libexecdir}/daemon_wallpapoz
-%{_datadir}/%{name}/
+%{_sysconfdir}/xdg/autostart/wallpapoz-autostart.desktop
+
+%dir %{_datadir}/%{name}/
+%{_datadir}/%{name}/glade/
+%{_datadir}/%{name}/lib/
%{_datadir}/gnome/help/%{name}/
%{_datadir}/pixmaps/%{name}.png
-%{_datadir}/applications/fedora-%{name}.desktop
+%{_datadir}/applications/*%{name}.desktop
%changelog
+* Sat Nov 08 2025 Mamoru TASAKA - 0.6.2-20
+- Add dep for gobject-introspection explicitly
+
+* Fri Jul 25 2025 Fedora Release Engineering - 0.6.2-19
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
+
+* Sun Jan 19 2025 Fedora Release Engineering - 0.6.2-18
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
+
+* Sat Jul 20 2024 Fedora Release Engineering - 0.6.2-17
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
+
+* Sat Jan 27 2024 Fedora Release Engineering - 0.6.2-16
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
+* Tue Nov 21 2023 Mamoru TASAKA - 0.6.2-15
+- Clean up release number and some spec file stuff
+- SPDX migration
+
+* Sat Jul 22 2023 Mamoru TASAKA - 0.6.2-14.3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
+
+* Sat Jan 21 2023 Fedora Release Engineering - 0.6.2-13.3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
+
+* Sat Jul 23 2022 Fedora Release Engineering - 0.6.2-13.2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
+
+* Sat Jan 22 2022 Fedora Release Engineering - 0.6.2-13.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
+
+* Fri Nov 5 2021 Mamoru TASAKA - 0.6.2-13
+- Use python3-ported gtk-builder-convert in build time instead of
+ glade files generated preliminarily
+
+* Fri Jul 23 2021 Fedora Release Engineering - 0.6.2-12.3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
+
+* Wed Jan 27 2021 Fedora Release Engineering - 0.6.2-12.2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Tue Jul 28 2020 Adam Jackson - 0.6.2-12.1
+- Require xprop xwininfo, not xorg-x11-utils
+
+* Fri Jan 31 2020 Fedora Release Engineering - 0.6.2-11.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Thu Nov 28 2019 Mamoru TASAKA - 0.6.2-11
+- bug 1773214 and etc, various fixes for "desktop" type xml
+
+* Mon Sep 2 2019 Mamoru TASAKA - 0.6.2-10
+- Switch to python3
+
+* Sun Sep 1 2019 Mamoru TASAKA - 0.6.2-8.1
+- Escape white spaces in wallpaper name properly
+
+* Fri Aug 23 2019 Mamoru TASAKA - 0.6.2-9
+- F-31+: Drop gnome-python2-gnome dependency for now
+
+* Sat Jul 27 2019 Fedora Release Engineering - 0.6.2-8.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Mon Feb 4 2019 Mamoru TASAKA - 0.6.2-8
+- Use python2 explicitly
+
+* Sun Feb 03 2019 Fedora Release Engineering - 0.6.2-7.9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Sat Jul 14 2018 Fedora Release Engineering - 0.6.2-7.8
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Wed Feb 28 2018 Iryna Shcherbina - 0.6.2-7.7
+- Update Python 2 dependency declarations to new packaging standards
+ (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
+
+* Fri Feb 09 2018 Fedora Release Engineering - 0.6.2-7.6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Thu Jul 27 2017 Fedora Release Engineering - 0.6.2-7.5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Sat Feb 11 2017 Fedora Release Engineering - 0.6.2-7.4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Fri Feb 05 2016 Fedora Release Engineering - 0.6.2-7.3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Fri Jun 19 2015 Fedora Release Engineering - 0.6.2-7.2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Sun Jun 08 2014 Fedora Release Engineering - 0.6.2-7.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Thu Dec 12 2013 Mamoru TASAKA - 0.6.2-7
+- Support CINNAMON (bug 1029554, leigh scott)
+
+* Wed Nov 27 2013 Mamoru TASAKA - 0.6.2-6
+- Support MATE (bug 1029554, leigh scott, Wolfgang Ulbrich)
+
+* Sun Aug 04 2013 Fedora Release Engineering - 0.6.2-5.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Sat Feb 9 2013 Mamoru TASAKA - 0.6.2-5
+- F-19: kill vendorization of desktop file (fpc#247)
+
+* Sat Jan 19 2013 Mamoru TASAKA - 0.6.2-4
+- Support LXDE
+
+* Tue Jan 15 2013 Mamoru TASAKA - 0.6.2-3
+- Don't import Image directly and import PIL instead for
+ F-19 Pillow conversion
+ Patch from Stephen Gallagher
+ (bug 895217)
+
+* Tue Sep 18 2012 Mamoru Tasaka - 0.6.2-2
+- Return to set default WM to GNOME3 when proper WM is not found
+ (bug 857587)
+
+* Sun Jul 22 2012 Fedora Release Engineering - 0.6.2-1.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Tue Mar 6 2012 Mamoru Tasaka - 0.6.2-1
+- 0.6.2
+
+* Wed Jan 18 2012 Mamoru Tasaka - 0.6.1-2
+- Fix error on Patch13 which causes unneeded entry to show up
+ in wallpapoz GUI
+
+* Sat Jan 14 2012 Fedora Release Engineering - 0.6.1-1.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Fri Dec 30 2011 Mamoru Tasaka - 0.6.1-1
+- Update to 0.6.1
+
+* Fri Dec 30 2011 Mamoru Tasaka - 0.5-10
+- Forgot to apply patch13...
+
+* Mon Nov 28 2011 Mamoru Tasaka - 0.5-9
+- More strict check on daemon_wallpapoz startup for xprop
+ (bug 711541)
+
+* Wed Jun 1 2011 Mamoru Tasaka - 0.5-8
+- Fix crash witching from desktop style XML to workspace style one
+ with workspace number increased (bug 708769)
+
+* Mon May 9 2011 Mamoru Tasaka - 0.5-6.1
+- F-14: kill gsettings patch explicitly: F-14 gsettings crashes
+ every time key is not found
+
+* Fri May 6 2011 Mamoru Tasaka - 0.5-6
+- Fix crash on wallpapoz with desktop style xml which was introduced
+ in -5 (bug 702538)
+
+* Fri May 5 2011 Mamoru Tasaka - 0.5-5
+- And more fix for gsettings key name change
+- Kill warnings on startup when wallpapoz tries to show workspace name
+ as "images"
+
+* Sat Apr 16 2011 Mamoru Tasaka - 0.5-4
+- Modify for gsettings key name change
+
+* Mon Feb 07 2011 Fedora Release Engineering - 0.5-3.1
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Thu Dec 7 2010 Mamoru Tasaka - 0.5-3
+- Port to gsettings
+
+* Thu Nov 11 2010 Mamoru Tasaka - 0.5-2
+- Install C gnome help documents correctly (bug 651522)
+
+* Thu Oct 7 2010 Mamoru Tasaka - 0.5-1
+- Update to 0.5
+
+* Fri Jul 23 2010 Mamoru Tasaka
+- F-14: rebuild against python 2.7
+
+* Tue Jun 15 2010 Mamoru Tasaka - 0.4.1-24.svn92_trunk
+- Fix backtrace when deleting first element in desktop (not workspace) mode
+ (bug 597959)
+- Install daemon_wallpapoz wrapper script to check if xprop really works before
+ launching daemon (may fix 584980, 597687??)
+
+* Sun Jun 13 2010 Mamoru Tasaka - 0.4.1-23.svn92_trunk
+- Don't remove a wallpaper from workspace when only one wallpaper is left
+ (bug 567136)
+- Also some fixes for gtk menu sensitive issue (after some movement for
+ wallpapers)
+
+* Sun Jun 13 2010 Mamoru Tasaka - 0.4.1-22.svn92_trunk
+- Make wallpapoz gui ignore non-utf8 directory correctly
+ (filechooser_widget.get_filename can return NoneType, bug 603351)
+
+* Sat Jun 12 2010 Mamoru Tasaka - 0.4.1-21.svn92_trunk
+- Make wallpapoz gui handle animated image file (bug 602921)
+
+* Thu Mar 18 2010 Mamoru Tasaka - 0.4.1-20.svn92_trunk
+- Handle another potentially race condition under compiz (may fix 573642)
+
+* Wed Mar 10 2010 Mamoru Tasaka - 0.4.1-19.svn92_trunk
+- Kill daemon_wallpapoz in more cases (may fix bug 571827)
+
+* Mon Mar 1 2010 Mamoru Tasaka - 0.4.1-18.svn92_trunk
+- -compiz-respawn.patch: simplify
+- Handle more cases where X is no longer available (bug 569135)
+- Handle fork() failure (bug 566594)
+
+* Fri Feb 26 2010 Mamoru Tasaka - 0.4.1-17.svn92_trunk
+- Another try for race condition on checking compiz status
+ (bug 567437)
+
+* Wed Feb 10 2010 Mamoru Tasaka - 0.4.1-16.svn92_trunk
+- Don't update compiz status to fix race (bug 562943)
+
+* Tue Feb 9 2010 Mamoru Tasaka - 0.4.1-15.svn92_trunk
+- Change the way to fix backtrace with no X resource issue
+
+* Mon Feb 8 2010 Mamoru Tasaka - 0.4.1-14.svn92_trunk
+- Check if the selected item is really a directory on directory
+ chooser dialog (bug 549219)
+- Avoid backtrace in case no item is selected yet (bug 555181)
+- Avoid backtrace when trying to paste when no item is copyed yet
+
+* Thu Feb 4 2010 Mamoru Tasaka - 0.4.1-12.svn92_trunk
+- Some fixes for daemon_wallpapoz under compiz
+ (bug 531342, 542244)
+- Kill daemon_wallpapoz when X resource is no longer avaiable
+ (bug 531343, 538533, 541434, 556377)
+
+* Wed Sep 23 2009 Mamoru Tasaka - 0.4.1-11.svn92_trunk
+- Explicitly add R: GConf2 (as wallpapoz really needs this)
+
+* Sun Aug 30 2009 Mamoru Tasaka - 0.4.1-10.svn92_trunk
+- Update to rev 92
+- Install desktop application autostart stuff on F-12+
+
+* Sat Jul 25 2009 Mamoru Tasaka - 0.4.1-9.svn87_trunk
+- F-12: Mass rebuild
+
+* Tue Feb 24 2009 Mamoru Tasaka
+- F-11: Mass rebuild
+
+* Wed Jan 21 2009 Mamoru Tasaka - 0.4.1-8.svn87_trunk
+- Always once kill daemon_wallpapoz process if it exists before start
+
+* Mon Dec 01 2008 Ignacio Vazquez-Abrams
+- F-11: Rebuild for Python 2.6
+
* Wed Aug 27 2008 Mamoru Tasaka - 0.4.1-7.svn87_trunk
- F-10+: Add (Build)Requires: gnome-python2-gnome (bug 456122, 460022)