raveit 8d2b955
Author: Sebastien Bacher <seb128@canonical.com>
raveit 8d2b955
Description: add cursor theme and size support
raveit 8d2b955
Origin: vendor, ubuntu (1:0.3.6-1ubuntu4)
raveit 8d2b955
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/86184
raveit 8d2b955
raveit 8d2b955
Author: Jasmine Hassan <jasmine.aura@gmail.com>
raveit 8d2b955
Description: Updated to migrate to Mate Desktop
raveit 8d2b955
Origin: <other>, build for LMDE/Debian Testing
raveit 8d2b955
Last-Updated: 2012-10-09
raveit 8d2b955
raveit 8d2b955
--- a/configure.ac
raveit 8d2b955
+++ b/configure.ac
raveit 8d2b955
@@ -125,6 +125,7 @@ COMPIZ_REQUIRES="x11        \
raveit 8d2b955
 		 xdamage    \
raveit 8d2b955
 		 xrandr	    \
raveit 8d2b955
 		 xinerama   \
raveit 8d2b955
+		 xcursor    \
raveit 8d2b955
 		 ice	    \
raveit 8d2b955
 		 sm	    \
raveit 8d2b955
 		 libxml-2.0 \
raveit 8d2b955
@@ -301,6 +302,7 @@ AC_ARG_ENABLE(mate-keybindings,
raveit 8d2b955
 if test "x$use_gtk" = "xyes"; then
raveit 8d2b955
   PKG_CHECK_MODULES(GTK_WINDOW_DECORATOR,
raveit 8d2b955
 		    xrender >= 0.8.4  \
raveit 8d2b955
+		    xcursor \
raveit 8d2b955
 		    gtk+-2.0 >= 2.8.0 \
raveit 8d2b955
 		    libwnck-1.0	      \
raveit 8d2b955
 		    pangocairo,
raveit 8d2b955
--- a/gtk/window-decorator/gtk-window-decorator.c
raveit 8d2b955
+++ b/gtk/window-decorator/gtk-window-decorator.c
raveit 8d2b955
@@ -30,6 +30,7 @@
raveit 8d2b955
 #include <X11/cursorfont.h>
raveit 8d2b955
 #include <X11/extensions/Xrender.h>
raveit 8d2b955
 #include <X11/Xregion.h>
raveit 8d2b955
+#include <X11/Xcursor/Xcursor.h>
raveit 8d2b955
 
raveit 8d2b955
 #include <gtk/gtk.h>
raveit 8d2b955
 #include <gdk/gdkx.h>
raveit 8d2b955
@@ -75,6 +76,14 @@
raveit 8d2b955
 #include <marco-private/theme.h>
raveit 8d2b955
 #endif
raveit 8d2b955
 
raveit 8d2b955
+#define MATE_MOUSE_DIR "/desktop/mate/peripherals/mouse"
raveit 8d2b955
+
raveit 8d2b955
+#define MATE_CURSOR_THEME_KEY		\
raveit 8d2b955
+    MATE_MOUSE_DIR "/cursor_theme"
raveit 8d2b955
+
raveit 8d2b955
+#define MATE_CURSOR_SIZE_KEY		\
raveit 8d2b955
+    MATE_MOUSE_DIR "/cursor_size"
raveit 8d2b955
+
raveit 8d2b955
 #define MARCO_MATECONF_DIR "/apps/marco/general"
raveit 8d2b955
 
raveit 8d2b955
 #define COMPIZ_USE_SYSTEM_FONT_KEY		    \
raveit 8d2b955
@@ -138,6 +147,13 @@
raveit 8d2b955
 #define WHEEL_ACTION_KEY   \
raveit 8d2b955
     MATECONF_DIR "/mouse_wheel_action"
raveit 8d2b955
 
raveit 8d2b955
+#define COMPIZ_MATECONF_DIR2 "/apps/compiz/general/allscreens/options"
raveit 8d2b955
+#define COMPIZ_CURSOR_THEME_KEY          \
raveit 8d2b955
+    COMPIZ_MATECONF_DIR2 "/cursor_theme"
raveit 8d2b955
+
raveit 8d2b955
+#define COMPIZ_CURSOR_SIZE_KEY           \
raveit 8d2b955
+    COMPIZ_MATECONF_DIR2 "/cursor_size"
raveit 8d2b955
+
raveit 8d2b955
 #define DBUS_DEST       "org.freedesktop.compiz"
raveit 8d2b955
 #define DBUS_PATH       "/org/freedesktop/compiz/decoration/allscreens"
raveit 8d2b955
 #define DBUS_INTERFACE  "org.freedesktop.compiz"
raveit 8d2b955
@@ -6462,6 +6478,44 @@ button_layout_changed (MateConfClient *c
raveit 8d2b955
 }
raveit 8d2b955
 
raveit 8d2b955
 static void
raveit 8d2b955
+cursor_theme_changed (MateConfClient *client)
raveit 8d2b955
+{
raveit 8d2b955
+    gchar *theme;
raveit 8d2b955
+    gint size;
raveit 8d2b955
+
raveit 8d2b955
+    theme = mateconf_client_get_string(client, MATE_CURSOR_THEME_KEY, NULL);
raveit 8d2b955
+    size = mateconf_client_get_int(client, MATE_CURSOR_SIZE_KEY, NULL);
raveit 8d2b955
+
raveit 8d2b955
+    mateconf_client_set_string(client, COMPIZ_CURSOR_THEME_KEY, theme, NULL);
raveit 8d2b955
+
raveit 8d2b955
+    mateconf_client_set_int(client, COMPIZ_CURSOR_SIZE_KEY, size, NULL);
raveit 8d2b955
+
raveit 8d2b955
+    if (theme && strlen(theme))
raveit 8d2b955
+    {
raveit 8d2b955
+	gint i, j;
raveit 8d2b955
+	GdkDisplay *gdkdisplay = gdk_display_get_default ();
raveit 8d2b955
+	Display *xdisplay   = gdk_x11_display_get_xdisplay (gdkdisplay);
raveit 8d2b955
+
raveit 8d2b955
+
raveit 8d2b955
+	XcursorSetTheme (xdisplay, theme);
raveit 8d2b955
+	XcursorSetDefaultSize (xdisplay, size);
raveit 8d2b955
+
raveit 8d2b955
+	for (i = 0; i < 3; i++)
raveit 8d2b955
+	{
raveit 8d2b955
+	    for (j = 0; j < 3; j++)
raveit 8d2b955
+	    {
raveit 8d2b955
+		if (cursor[i][j].shape != XC_left_ptr)
raveit 8d2b955
+		{
raveit 8d2b955
+		    XFreeCursor (xdisplay, cursor[i][j].cursor);
raveit 8d2b955
+		    cursor[i][j].cursor =
raveit 8d2b955
+			XCreateFontCursor (xdisplay, cursor[i][j].shape);
raveit 8d2b955
+		}
raveit 8d2b955
+	    }
raveit 8d2b955
+	}
raveit 8d2b955
+    }
raveit 8d2b955
+}
raveit 8d2b955
+
raveit 8d2b955
+static void
raveit 8d2b955
 value_changed (MateConfClient *client,
raveit 8d2b955
 	       const gchar *key,
raveit 8d2b955
 	       MateConfValue  *value,
raveit 8d2b955
@@ -6539,6 +6593,11 @@ value_changed (MateConfClient *client,
raveit 8d2b955
 	if (theme_opacity_changed (client))
raveit 8d2b955
 	    changed = TRUE;
raveit 8d2b955
     }
raveit 8d2b955
+    else if (strcmp (key, MATE_CURSOR_THEME_KEY) == 0 ||
raveit 8d2b955
+	     strcmp (key, MATE_CURSOR_SIZE_KEY) == 0)
raveit 8d2b955
+    {
raveit 8d2b955
+	cursor_theme_changed (client);
raveit 8d2b955
+    }
raveit 8d2b955
 
raveit 8d2b955
     if (changed)
raveit 8d2b955
 	decorations_changed (data);
raveit 8d2b955
@@ -6702,6 +6761,11 @@ init_settings (WnckScreen *screen)
raveit 8d2b955
 			  NULL);
raveit 8d2b955
 
raveit 8d2b955
     mateconf_client_add_dir (mateconf,
raveit 8d2b955
+			  MATE_MOUSE_DIR,
raveit 8d2b955
+			  MATECONF_CLIENT_PRELOAD_ONELEVEL,
raveit 8d2b955
+			  NULL);
raveit 8d2b955
+
raveit 8d2b955
+    mateconf_client_add_dir (mateconf,
raveit 8d2b955
 			  COMPIZ_MATECONF_DIR1,
raveit 8d2b955
 			  MATECONF_CLIENT_PRELOAD_ONELEVEL,
raveit 8d2b955
 			  NULL);
raveit 8d2b955
@@ -6710,6 +6774,9 @@ init_settings (WnckScreen *screen)
raveit 8d2b955
 		      "value_changed",
raveit 8d2b955
 		      G_CALLBACK (value_changed),
raveit 8d2b955
 		      screen);
raveit 8d2b955
+
raveit 8d2b955
+    cursor_theme_changed(mateconf);
raveit 8d2b955
+
raveit 8d2b955
 #elif USE_DBUS_GLIB
raveit 8d2b955
     DBusConnection *connection;
raveit 8d2b955
     DBusMessage	   *reply;
raveit 8d2b955
--- a/metadata/core.xml.in.in
raveit 8d2b955
+++ b/metadata/core.xml.in.in
raveit 8d2b955
@@ -35,6 +35,18 @@
raveit 8d2b955
 		<min>0</min>
raveit 8d2b955
 		<max>10000</max>
raveit 8d2b955
 	    </option>
raveit 8d2b955
+	    <option name="cursor_theme" type="string">
raveit 8d2b955
+		<_short>Cursor theme</_short>
raveit 8d2b955
+		<_long>Cursor theme name</_long>
raveit 8d2b955
+		<default></default>
raveit 8d2b955
+	    </option>
raveit 8d2b955
+	    <option name="cursor_size" type="int">
raveit 8d2b955
+		<_short>Cursor size</_short>
raveit 8d2b955
+		<_long>Size of the cursor</_long>
raveit 8d2b955
+		<default>18</default>
raveit 8d2b955
+		<min>8</min>
raveit 8d2b955
+		<max>128</max>
raveit 8d2b955
+	    </option>
raveit 8d2b955
 	    <option name="ping_delay" type="int">
raveit 8d2b955
 		<_short>Ping Delay</_short>
raveit 8d2b955
 		<_long>Interval between ping messages</_long>
raveit 8d2b955
--- a/src/display.c
raveit 8d2b955
+++ b/src/display.c
raveit 8d2b955
@@ -41,6 +41,8 @@
raveit 8d2b955
 #include <X11/extensions/Xcomposite.h>
raveit 8d2b955
 #include <X11/extensions/Xrandr.h>
raveit 8d2b955
 #include <X11/extensions/shape.h>
raveit 8d2b955
+#include <X11/Xcursor/Xcursor.h>
raveit 8d2b955
+#include <X11/cursorfont.h>
raveit 8d2b955
 
raveit 8d2b955
 #include <compiz-core.h>
raveit 8d2b955
 
raveit 8d2b955
@@ -474,6 +476,32 @@ shade (CompDisplay     *d,
raveit 8d2b955
     return TRUE;
raveit 8d2b955
 }
raveit 8d2b955
 
raveit 8d2b955
+static void
raveit 8d2b955
+compDisplaySetCursorTheme (CompDisplay *display)
raveit 8d2b955
+{
raveit 8d2b955
+    char *theme = display->opt[COMP_DISPLAY_OPTION_CURSOR_THEME].value.s;
raveit 8d2b955
+    int size = display->opt[COMP_DISPLAY_OPTION_CURSOR_SIZE].value.i;
raveit 8d2b955
+
raveit 8d2b955
+    if (theme && strlen(theme))
raveit 8d2b955
+    {
raveit 8d2b955
+	CompScreen *s;
raveit 8d2b955
+
raveit 8d2b955
+	XcursorSetTheme (display->display, theme);
raveit 8d2b955
+	XcursorSetDefaultSize (display->display, size);
raveit 8d2b955
+	for (s = display->screens; s; s = s->next)
raveit 8d2b955
+	{
raveit 8d2b955
+	    XFreeCursor (display->display, s->normalCursor);
raveit 8d2b955
+	    s->busyCursor = XCreateFontCursor (display->display, XC_watch);
raveit 8d2b955
+	    XFlush (display->display);
raveit 8d2b955
+
raveit 8d2b955
+	    XFreeCursor (display->display, s->normalCursor);
raveit 8d2b955
+	    s->normalCursor = XCreateFontCursor (display->display, XC_left_ptr);
raveit 8d2b955
+	    XDefineCursor (display->display, s->root, s->normalCursor);
raveit 8d2b955
+	    XFlush (display->display);
raveit 8d2b955
+	}
raveit 8d2b955
+    }
raveit 8d2b955
+}
raveit 8d2b955
+
raveit 8d2b955
 const CompMetadataOptionInfo coreDisplayOptionInfo[COMP_DISPLAY_OPTION_NUM] = {
raveit 8d2b955
     { "abi", "int", 0, 0, 0 },
raveit 8d2b955
     { "active_plugins", "list", "<type>string</type>", 0, 0 },
raveit 8d2b955
@@ -510,7 +538,9 @@ const CompMetadataOptionInfo coreDisplay
raveit 8d2b955
     { "toggle_window_shaded_key", "key", 0, shade, 0 },
raveit 8d2b955
     { "ignore_hints_when_maximized", "bool", 0, 0, 0 },
raveit 8d2b955
     { "ping_delay", "int", "<min>1000</min>", 0, 0 },
raveit 8d2b955
-    { "edge_delay", "int", "<min>0</min>", 0, 0 }
raveit 8d2b955
+    { "edge_delay", "int", "<min>0</min>", 0, 0 },
raveit 8d2b955
+    { "cursor_theme", "string", 0, 0, 0 },
raveit 8d2b955
+    { "cursor_size", "int", 0, 0, 0 }
raveit 8d2b955
 };
raveit 8d2b955
 
raveit 8d2b955
 CompOption *
raveit 8d2b955
@@ -661,6 +691,20 @@ setDisplayOption (CompPlugin	  *plugin,
raveit 8d2b955
 	    return TRUE;
raveit 8d2b955
 	}
raveit 8d2b955
 	break;
raveit 8d2b955
+    case COMP_DISPLAY_OPTION_CURSOR_THEME:
raveit 8d2b955
+	if (compSetStringOption(o, value))
raveit 8d2b955
+	{
raveit 8d2b955
+	    compDisplaySetCursorTheme(display);
raveit 8d2b955
+	    return TRUE;
raveit 8d2b955
+	}
raveit 8d2b955
+	break;
raveit 8d2b955
+    case COMP_DISPLAY_OPTION_CURSOR_SIZE:
raveit 8d2b955
+	if (compSetIntOption(o, value))
raveit 8d2b955
+	{
raveit 8d2b955
+	    compDisplaySetCursorTheme(display);
raveit 8d2b955
+	    return TRUE;
raveit 8d2b955
+	}
raveit 8d2b955
+	break;
raveit 8d2b955
     default:
raveit 8d2b955
 	if (compSetDisplayOption (display, o, value))
raveit 8d2b955
 	    return TRUE;
raveit 8d2b955
--- a/include/compiz-core.h
raveit 8d2b955
+++ b/include/compiz-core.h
raveit 8d2b955
@@ -776,7 +776,10 @@ removeFileWatch (CompFileWatchHandle han
raveit 8d2b955
 #define COMP_DISPLAY_OPTION_IGNORE_HINTS_WHEN_MAXIMIZED      31
raveit 8d2b955
 #define COMP_DISPLAY_OPTION_PING_DELAY			     32
raveit 8d2b955
 #define COMP_DISPLAY_OPTION_EDGE_DELAY                       33
raveit 8d2b955
-#define COMP_DISPLAY_OPTION_NUM				     34
raveit 8d2b955
+#define COMP_DISPLAY_OPTION_CURSOR_THEME                     34
raveit 8d2b955
+#define COMP_DISPLAY_OPTION_CURSOR_SIZE                      35
raveit 8d2b955
+#define COMP_DISPLAY_OPTION_NUM				     36
raveit 8d2b955
+
raveit 8d2b955
 
raveit 8d2b955
 typedef void (*HandleEventProc) (CompDisplay *display,
raveit 8d2b955
 				 XEvent	     *event);