Hello.

I wrote a Compiz plugin to set the mouse cursor theme.

I'm attaching the code here, but of course I'm open to resubmit it on
launchpad or modify it as needed.  My point here is mostly to discuss
and show what I did, which might be controversial.

Mouse themes would be conceptually simple: there is only a theme to
select among the ones installed under /usr/share/icons (not all of which
are necessarily *mouse* themes; only directories with a "cursors/"
subdirectory count), and a cursor size.  The libXcursor library accepts
a theme name (which corresponds to a directory in /usr/share/icons or in
$XCURSOR_PATH), and a cursor size in pixels; the size which is closest
to the requested one is used.

Of course only "well-behaved" program will obey our settings; each X
application is free to use its own policy for setting cursors and
disregard what we tell it.  All modern large applications however do
respond to cursor theme or size changes, normally using gsettings -- but
each desktop environment has its own different schema; moreover GTK has
its own way of specifying cursor themes in ~/.icons/default/index.theme
, and old-school X applications (that I've ignored) use X resources
instead.

The main target for us at Hypra consists in low-vision users who are not
necessarily technically minded, so we absolutely need a configuration
GUI.  CCSM is great, but its way of specifying options is not a perfect
fit for the mouse theming problem.  As far as I can see from the code
the configuration of Compiz and its plugins is specified in XML (.in)
files which contain the type, range and default values of each option.
The XML files are used to generate C++ code holding configuration data
structures, and also installed to be consulted at run time by CCSM.

Differently from every other case I've seen, the mouse theme plugin
needs to present a choice of one among a set of options which are only
known at run time -- the currently installed mouse themes.  The ideal
way to do that would be with an option of type "int" and a _name
subelement, which CCSM renders as nice combo boxes; but that won't work
in our case because the set of installed themes would need to be
specified in the XML file, which is much too early; the set of installed
themes can change even after compiz is installed.

My solution, which is admittedly kludgy, consists in specifying an
option of type "list" where the first element is the one which is
actually selected; the plugin C++ initialization code searches for the
installed themes and fills the list at run time --- which is
unfortunately not possible using a combo box without huge changes in the
XSLT code generator and CCSM itself, as far as I can see.

The dynamic initialization of the list, if naïvely performed at every
plugin initialization as specified above, would override the user
selection of her current theme.  In order to prevent that I added a
second option storing the set of *installed* themes (alphabetically
sorted for normalization).  The initialization code checks whether the
actually installed themes have changed with respect to the saved value
of the option; if not, the list of *selected* themes is not touched.
This is clunky and it would be best to make the list of installed themes
invisible to the user (I think that could be done with a new "invisible"
type of hint to be specified in the XML file), but I find the current
interface already not too terrible.

I've uploaded a demo screencast at
http://ageinghacker.net/scratch-hypra/mousetheme.webm .

The user can also set a shell command line to actually set the theme
for running applications, and of course the cursor size.

The C++ code in Compiz is responsible for updating the cursor in the
root window, for every screen.  In order to make that cursor dynamically
changeable I had to modify screen.h and screen.cpp, but that is not
intrusive: Compiz only uses a "normal" and a "busy" cursor, so I simply
added two methods setNormalCursor and setBusyCursor accepting a
parameter of type Cursor.  The window manager decorator is separate, and
behaves as an ordinary process.

What do you think of all this?  I'm open to any suggestion.

Thanks,

-- 
Luca Saiu
Hypra team (Accessible website in construction)
commit ecaf8a3016ccc9aaba9e897ce10e49ebf9c4515e
Author: Luca Saiu <ls...@hypra.fr>
Date:   Fri Mar 20 14:05:38 2015 +0000

    mousetheme: add plugin
    
    Implement a mouse cursor theming plugin.
    
    * compizconfig/ccsm/images/scalable/apps/plugin-mousetheme.svg: New.
    * compizconfig/ccsm/installed_files: Here.
    * debian/compiz-dev.install: Here.
    * debian/compiz-plugins-default.install: Here.
    * include/core/screen.h: Here.
    * plugins/mousetheme/CMakeLists.txt: New.
    * plugins/mousetheme/compiz-mousetheme.pc.in: New.
    * plugins/mousetheme/include/mousetheme/mousetheme.h: New.
    * plugins/mousetheme/mousetheme.xml.in: New.
    * plugins/mousetheme/src/mousetheme.cpp: New.
    * plugins/mousetheme/src/private.h: New.
    * src/main.cpp: Here.
    * src/privatescreen.h: Here.
    * src/screen.cpp: Here.

diff --git a/compizconfig/ccsm/images/scalable/apps/plugin-mousetheme.svg b/compizconfig/ccsm/images/scalable/apps/plugin-mousetheme.svg
new file mode 100644
index 0000000..02738db
--- /dev/null
+++ b/compizconfig/ccsm/images/scalable/apps/plugin-mousetheme.svg
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   inkscape:export-ydpi="90.000000"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   width="48"
+   height="48"
+   id="svg11300"
+   sodipodi:version="0.32"
+   inkscape:version="0.47+devel r9425"
+   sodipodi:docname="plugin-mousetheme.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:modified="true"
+   version="1.0">
+  <defs
+     id="defs3">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8719">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop8721" />
+      <stop
+         style="stop-color:#2e3436;stop-opacity:0;"
+         offset="1"
+         id="stop8723" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient8711">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop8713" />
+      <stop
+         style="stop-color:#2e3436;stop-opacity:0;"
+         offset="1"
+         id="stop8715" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient124">
+      <stop
+         id="stop125"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop126"
+         offset="1"
+         style="stop-color:silver;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient10554"
+       inkscape:collect="always">
+      <stop
+         id="stop10556"
+         offset="0"
+         style="stop-color:white;stop-opacity:1;" />
+      <stop
+         id="stop10558"
+         offset="1"
+         style="stop-color:white;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient124"
+       id="linearGradient4372"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4019046,3.2381864,-0.8095466,0.3504761,-482.91339,-745.38115)"
+       x1="253.75711"
+       y1="-129.52815"
+       x2="252.00447"
+       y2="-135.47408" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient124"
+       id="radialGradient4374"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.279254,0,0,1.7073246,-321.71546,-587.15241)"
+       cx="307.7507"
+       cy="361.47824"
+       fx="307.7507"
+       fy="361.47824"
+       r="12.509617" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient10554"
+       id="linearGradient8701"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5347684,0,0,1.4230823,-296.72742,-584.34298)"
+       x1="240.9062"
+       y1="425.18195"
+       x2="248.28683"
+       y2="437.96558" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8711"
+       id="radialGradient7943"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.14720959,22.589166,-19.429158,0.13069851,447.45093,-309.12557)"
+       cx="9.3125"
+       cy="20.963842"
+       fx="9.3125"
+       fy="20.963842"
+       r="5.3512397" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8719"
+       id="radialGradient7945"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.35385085,25.403194,-24.734304,0.35708639,530.76914,-191.64723)"
+       cx="3.6239223"
+       cy="21.124912"
+       fx="3.6239223"
+       fy="21.124912"
+       r="2.807694" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8711"
+       id="radialGradient3760"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.01895661,2.9088731,-2.5019495,0.01683043,57.209169,-9.0336234)"
+       cx="9.3125"
+       cy="20.963842"
+       fx="9.3125"
+       fy="20.963842"
+       r="5.3512397" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8719"
+       id="radialGradient3762"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.04556641,3.2712436,-3.1851088,0.04598306,67.938304,6.094408)"
+       cx="3.6239223"
+       cy="21.124912"
+       fx="3.6239223"
+       fy="21.124912"
+       r="2.807694" />
+  </defs>
+  <sodipodi:namedview
+     stroke="#ef2929"
+     fill="#eeeeec"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="0.25490196"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.5572037"
+     inkscape:cx="24"
+     inkscape:cy="24"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1278"
+     inkscape:window-height="710"
+     inkscape:window-x="0"
+     inkscape:window-y="49"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     showborder="true"
+     inkscape:snap-global="false"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid7912"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Patrick Niklaus</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source />
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"; />
+        <dc:title>State</dc:title>
+        <dc:subject>
+          <rdf:Bag />
+        </dc:subject>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/GPL/2.0/";>
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction"; />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution"; />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice"; />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks"; />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike"; />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/SourceCode"; />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,16)">
+    <g
+       id="g3764"
+       transform="matrix(0.18725024,0,0,0.18725024,0.17333918,25.773434)">
+      <g
+         transform="matrix(5.6201277,0,0,5.5997966,-317.16889,-268.54228)"
+         id="g4366">
+        <path
+           inkscape:connector-curvature="0"
+           id="rect16"
+           d="m 71.401064,17.737975 0,21.977386 6.978408,-4.269247 4.268574,9.161092 3.501191,-1.423081 -4.172651,-8.938737 6.28196,-0.622598 -16.857482,-15.884815 z"
+           style="fill:none;stroke:#888a85;stroke-width:1.44304895;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           sodipodi:nodetypes="cccccccc" />
+        <path
+           sodipodi:type="inkscape:offset"
+           inkscape:radius="0.35630482"
+           inkscape:original="M -22.21875 19.46875 L -24.625 20.46875 L -23.84375 25.84375 L -22.34375 25.78125 L -17.625 36.6875 L -15.1875 35.65625 L -19.75 25.125 L -18.90625 24 L -22.21875 19.46875 z "
+           style="fill:url(#linearGradient4372);fill-opacity:1;fill-rule:evenodd;stroke:none"
+           id="path2887"
+           d="m -22.34375,19.125 -2.40625,1 a 0.35634045,0.35634045 0 0 0 -0.21875,0.40625 l 0.78125,5.375 a 0.35634045,0.35634045 0 0 0 0.34375,0.28125 l 1.28125,-0.0625 4.625,10.71875 a 0.35634045,0.35634045 0 0 0 0.03125,0.0625 0.35634045,0.35634045 0 0 0 0.40625,0.125 L -15.0625,36 a 0.35634045,0.35634045 0 0 0 0.1875,-0.5 l -4.46875,-10.3125 0.71875,-0.96875 a 0.35634045,0.35634045 0 0 0 0,-0.4375 L -21.9375,19.25 a 0.35634045,0.35634045 0 0 0 -0.03125,-0.03125 0.35634045,0.35634045 0 0 0 -0.375,-0.09375 z"
+           transform="matrix(0.8698963,0,0,0.8065934,98.369116,14.067108)" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:url(#radialGradient4374);fill-opacity:1;fill-rule:evenodd;stroke:none"
+           d="m 72.11552,19.307879 c 0.01837,0.02654 0.01847,12.775815 -0.108483,19.275851 l 7.613907,-4.666125 c 2.274689,-0.29736 7.119272,-0.855529 7.15059,-0.86363 L 72.11552,19.307879 z"
+           id="path2891"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           d="m 72.8125,20.9375 c 2.09e-4,0.478984 0.0011,1.006779 0,1.71875 -0.0027,1.734621 -0.02482,4.036564 -0.03125,6.34375 -0.0064,2.307186 0.0044,4.615929 0,6.34375 -0.002,0.799454 -0.03053,1.44271 -0.03125,1.9375 L 79.28125,33.25 a 0.51342608,0.51342608 0 0 1 0.25,-0.0625 c 1.099144,-0.0947 2.772464,-0.281085 4.1875,-0.4375 0.573809,-0.06343 1.042525,-0.1395 1.46875,-0.1875 -0.364911,-0.34733 -0.812198,-0.748898 -1.375,-1.28125 C 82.5017,30.041371 80.755813,28.37032 79,26.71875 77.244187,25.06718 75.480062,23.42471 74.15625,22.1875 73.601221,21.66878 73.181788,21.27997 72.8125,20.9375 z"
+           id="path8699"
+           style="fill:none;stroke:url(#linearGradient8701);stroke-width:1.44304895;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           inkscape:original="M 72.28125 19.75 C 72.308434 19.786317 72.236734 38.231507 72.25 38.21875 L 79.5625 33.6875 C 81.782403 33.496235 86.332488 32.96244 86.34375 32.96875 C 86.382631 32.954521 72.347636 19.74392 72.28125 19.75 z "
+           inkscape:radius="-0.51337475"
+           sodipodi:type="inkscape:offset" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="csc"
+         id="path7910"
+         d="m 85.152186,-192.38038 c -25.570049,17.33283 -43.288913,54.2329 -43.288913,97.070113 0,42.864026 17.693005,79.751111 43.288913,97.0700932"
+         style="fill:none;stroke:url(#radialGradient7943);stroke-width:15.53121376;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path8693"
+         d="m 24.101232,-153.55235 c -8.294057,17.2492 -13.148648,38.08703 -13.148648,60.554782 0,23.857461 5.458833,45.867095 14.698819,63.694965"
+         style="fill:none;stroke:url(#radialGradient7945);stroke-width:15.53121376;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <g
+         transform="matrix(-7.7656074,0,0,7.7656074,250.55962,-238.97403)"
+         id="g7935">
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="csc"
+           id="path7931"
+           d="M 10.554902,5.9999999 C 7.2621702,8.2319963 4.9804616,12.983727 4.9804616,18.5 c 1e-7,5.519726 2.2783744,10.269784 5.5744404,12.5"
+           style="fill:none;stroke:url(#radialGradient3760);stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path7933"
+           d="M 2.6931867,10.999999 C 1.6251377,13.221231 0.99999998,15.904575 0.99999998,18.797813 1.0000001,21.870008 1.7029538,24.704253 2.8928092,27"
+           style="fill:none;stroke:url(#radialGradient3762);stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/compizconfig/ccsm/installed_files b/compizconfig/ccsm/installed_files
index 7b47d8b..9591c9d 100644
--- a/compizconfig/ccsm/installed_files
+++ b/compizconfig/ccsm/installed_files
@@ -1,228 +1,230 @@
-/lib/python2.7/dist-packages/ccm/Widgets.py
-/lib/python2.7/dist-packages/ccm/Settings.py
-/lib/python2.7/dist-packages/ccm/Conflicts.py
-/lib/python2.7/dist-packages/ccm/Utils.py
-/lib/python2.7/dist-packages/ccm/Window.py
-/lib/python2.7/dist-packages/ccm/__init__.py
-/lib/python2.7/dist-packages/ccm/Pages.py
-/lib/python2.7/dist-packages/ccm/Constants.py
-/lib/python2.7/dist-packages/ccm/Widgets.pyc
-/lib/python2.7/dist-packages/ccm/Settings.pyc
-/lib/python2.7/dist-packages/ccm/Conflicts.pyc
-/lib/python2.7/dist-packages/ccm/Utils.pyc
-/lib/python2.7/dist-packages/ccm/Window.pyc
-/lib/python2.7/dist-packages/ccm/__init__.pyc
-/lib/python2.7/dist-packages/ccm/Pages.pyc
-/lib/python2.7/dist-packages/ccm/Constants.pyc
+/lib/python2.7/site-packages/ccm/Conflicts.py
+/lib/python2.7/site-packages/ccm/__init__.py
+/lib/python2.7/site-packages/ccm/Window.py
+/lib/python2.7/site-packages/ccm/Widgets.py
+/lib/python2.7/site-packages/ccm/Constants.py
+/lib/python2.7/site-packages/ccm/Settings.py
+/lib/python2.7/site-packages/ccm/Utils.py
+/lib/python2.7/site-packages/ccm/Pages.py
+/lib/python2.7/site-packages/ccm/Conflicts.pyc
+/lib/python2.7/site-packages/ccm/__init__.pyc
+/lib/python2.7/site-packages/ccm/Window.pyc
+/lib/python2.7/site-packages/ccm/Widgets.pyc
+/lib/python2.7/site-packages/ccm/Constants.pyc
+/lib/python2.7/site-packages/ccm/Settings.pyc
+/lib/python2.7/site-packages/ccm/Utils.pyc
+/lib/python2.7/site-packages/ccm/Pages.pyc
 /bin/ccsm
 /share/applications/ccsm.desktop
-/share/icons/hicolor/16x16/apps/ccsm.png
-/share/icons/hicolor/22x22/apps/ccsm.png
-/share/icons/hicolor/22x22/apps/ccsm.svg
-/share/ccsm/icons/hicolor/22x22/devices/video-display.png
-/share/ccsm/icons/hicolor/22x22/devices/input-mouse.png
-/share/ccsm/icons/hicolor/22x22/devices/input-keyboard.png
-/share/ccsm/icons/hicolor/22x22/mimetypes/audio-x-generic.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-image_loading.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-all.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-extras.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-utility.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-effects.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-accessibility.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-search.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-uncategorized.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-profiles.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-window_management.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-desktop.png
-/share/ccsm/icons/hicolor/22x22/categories/plugins-general.png
-/share/icons/hicolor/24x24/apps/ccsm.png
 /share/icons/hicolor/32x32/apps/ccsm.png
 /share/icons/hicolor/32x32/apps/ccsm.svg
-/share/icons/hicolor/48x48/apps/ccsm.png
-/share/ccsm/icons/hicolor/scalable/apps/plugin-animationplus.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-fadedesktop.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-wallpaper.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-elements.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-crashhandler.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-scalefilter.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-shift.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-fs.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-snow.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-desktop.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-uncategorized.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-window_management.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-utility.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-general.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-effects.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-image_loading.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-profiles.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-extras.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-accessibility.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-all.svg
+/share/ccsm/icons/hicolor/scalable/categories/plugins-search.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-clone.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-text.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-wizard.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-putplus.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-kde.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mswitch.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-glib.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-sound.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-titleinfo.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-resizeinfo.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-expo.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-animation.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-widget.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-smartput.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-fireflies.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-scaleaddon.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-fade.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-animationaddon.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-showrepaint.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-trip.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-colorfilter.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-fakeargb.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-switcher.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-bench.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-mousepoll.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-resize.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-ghost.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-swap.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-vidcap.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-animationsim.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-clone.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-rotate.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-put.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-shift.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-anaglyph.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-scale.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-td.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-kde.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-autumn.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-splash.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-compiztoolbox.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-cube.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-animationjc.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-showdesktop.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-group.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-cubeaddon.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-grid.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-showmouse.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-staticswitcher.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-resize.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-maximumize.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-annotate.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mousetheme.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-imgsvg.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-snowglobe.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-firepaint.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-widget.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-animationplus.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-startup.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-workarounds.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-animation.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-showrepaint.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-copytex.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-photowheel.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-inotify.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-group.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-put.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mblur.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-ghost.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-water.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-swapper.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-addhelper.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-stars.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-mswitch.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-blur.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-scaleaddon.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-kdecompat.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-regex.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mag.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-imgpng.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mousegestures.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-place.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-workspacenames.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-opacify.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-dialog.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-gears.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-dbus.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-anaglyph.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-atlantis.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-unknown.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-winrules.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-stackswitch.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-bubbles.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-titleinfo.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-3d.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-thumbnail.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-zoom.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-screenshot.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-commands.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-regex.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-trailfocus.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-stackswitch.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-photo.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-session.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-glib.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-firepaint.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-text.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-mag.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-splash.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-smartput.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-ezoom.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-ring.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-move.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-compiztoolbox.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-reflex.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-wall.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-place.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-kdecompat.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-inotify.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-shelf.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-rotate.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-dbus.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-opengl.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-fireflies.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-unknown.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-obs.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-resizeinfo.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-freewins.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-animationaddon.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-zoom.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-cubemodel.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-putplus.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-schemep.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-imgsvg.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-annotate.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-vpswitch.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-composite.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-snow.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-decor.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-showdesktop.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-expo.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-stars.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-fade.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-scalefilter.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-gears.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-grid.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-fadedesktop.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-winreflect.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-mousepoll.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-cube.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-debug.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-static.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-flash.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-gnomecompat.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-dialog.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-trailfocus.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-core.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-copytex.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-mblur.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-notification.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-blur.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-move.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-wizard.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-loginout.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-session.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-vidcap.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-autumn.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-tile.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-animationjc.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-screenshot.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-extrawm.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-wallpaper.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-video.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-winrules.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-bicubic.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-animationsim.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-showmouse.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-trip.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-vpswitch.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-toggledeco.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-photo.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-fs.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-imgjpeg.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-snowglobe.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-notification.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-thumbnail.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-elements.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-wobbly.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-neg.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-workspacenames.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-workarounds.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-ring.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-opengl.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-water.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-swapper.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-mousegestures.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-gnomecompat.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-loginout.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-minimize.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-debug.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-obs.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-switcher.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-ezoom.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-toggledeco.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-swap.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-atlantis.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-shelf.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-colorfilter.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-snap.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-cubeaddon.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-schemep.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-minimize.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-wall.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-neg.svg
 /share/ccsm/icons/hicolor/scalable/apps/plugin-screensaver.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-tile.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-composite.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-decor.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-bicubic.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-freewins.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-maximumize.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-extrawm.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-flash.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-scale.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-fakeargb.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-winreflect.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-startup.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-photowheel.svg
-/share/ccsm/icons/hicolor/scalable/apps/plugin-imgpng.svg
+/share/ccsm/icons/hicolor/scalable/apps/plugin-crashhandler.svg
 /share/icons/hicolor/scalable/apps/ccsm.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-image_loading.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-all.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-extras.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-utility.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-effects.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-accessibility.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-search.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-uncategorized.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-profiles.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-window_management.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-desktop.svg
-/share/ccsm/icons/hicolor/scalable/categories/plugins-general.svg
-/share/ccsm/images/display.png
+/share/ccsm/icons/hicolor/22x22/devices/input-mouse.png
+/share/ccsm/icons/hicolor/22x22/devices/input-keyboard.png
+/share/ccsm/icons/hicolor/22x22/devices/video-display.png
+/share/ccsm/icons/hicolor/22x22/mimetypes/audio-x-generic.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-uncategorized.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-utility.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-effects.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-extras.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-window_management.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-desktop.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-image_loading.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-search.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-accessibility.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-profiles.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-general.png
+/share/ccsm/icons/hicolor/22x22/categories/plugins-all.png
+/share/icons/hicolor/22x22/apps/ccsm.png
+/share/icons/hicolor/22x22/apps/ccsm.svg
+/share/icons/hicolor/24x24/apps/ccsm.png
+/share/icons/hicolor/16x16/apps/ccsm.png
+/share/icons/hicolor/48x48/apps/ccsm.png
 /share/ccsm/images/modifier.png
-/share/locale/zh_CN/LC_MESSAGES/ccsm.mo
+/share/ccsm/images/display.png
 /share/locale/zh_HK/LC_MESSAGES/ccsm.mo
-/share/locale/be/LC_MESSAGES/ccsm.mo
+/share/locale/or/LC_MESSAGES/ccsm.mo
+/share/locale/mnk/LC_MESSAGES/ccsm.mo
+/share/locale/pt_BR/LC_MESSAGES/ccsm.mo
 /share/locale/bg/LC_MESSAGES/ccsm.mo
-/share/locale/ar/LC_MESSAGES/ccsm.mo
-/share/locale/as/LC_MESSAGES/ccsm.mo
-/share/locale/ca/LC_MESSAGES/ccsm.mo
-/share/locale/bn/LC_MESSAGES/ccsm.mo
-/share/locale/da/LC_MESSAGES/ccsm.mo
-/share/locale/de/LC_MESSAGES/ccsm.mo
-/share/locale/cs/LC_MESSAGES/ccsm.mo
-/share/locale/el/LC_MESSAGES/ccsm.mo
-/share/locale/fa/LC_MESSAGES/ccsm.mo
-/share/locale/es/LC_MESSAGES/ccsm.mo
-/share/locale/fi/LC_MESSAGES/ccsm.mo
+/share/locale/ko/LC_MESSAGES/ccsm.mo
 /share/locale/eu/LC_MESSAGES/ccsm.mo
-/share/locale/fr/LC_MESSAGES/ccsm.mo
 /share/locale/gl/LC_MESSAGES/ccsm.mo
-/share/locale/he/LC_MESSAGES/ccsm.mo
 /share/locale/hi/LC_MESSAGES/ccsm.mo
-/share/locale/gu/LC_MESSAGES/ccsm.mo
-/share/locale/id/LC_MESSAGES/ccsm.mo
-/share/locale/hr/LC_MESSAGES/ccsm.mo
-/share/locale/hu/LC_MESSAGES/ccsm.mo
-/share/locale/ja/LC_MESSAGES/ccsm.mo
-/share/locale/it/LC_MESSAGES/ccsm.mo
-/share/locale/ko/LC_MESSAGES/ccsm.mo
-/share/locale/nb/LC_MESSAGES/ccsm.mo
-/share/locale/nl/LC_MESSAGES/ccsm.mo
 /share/locale/pa/LC_MESSAGES/ccsm.mo
-/share/locale/or/LC_MESSAGES/ccsm.mo
-/share/locale/pl/LC_MESSAGES/ccsm.mo
-/share/locale/pt/LC_MESSAGES/ccsm.mo
-/share/locale/ru/LC_MESSAGES/ccsm.mo
-/share/locale/sk/LC_MESSAGES/ccsm.mo
+/share/locale/fi/LC_MESSAGES/ccsm.mo
 /share/locale/sv/LC_MESSAGES/ccsm.mo
+/share/locale/pt/LC_MESSAGES/ccsm.mo
+/share/locale/es/LC_MESSAGES/ccsm.mo
+/share/locale/it/LC_MESSAGES/ccsm.mo
+/share/locale/gu/LC_MESSAGES/ccsm.mo
+/share/locale/nl/LC_MESSAGES/ccsm.mo
+/share/locale/da/LC_MESSAGES/ccsm.mo
+/share/locale/zh_CN/LC_MESSAGES/ccsm.mo
 /share/locale/tr/LC_MESSAGES/ccsm.mo
+/share/locale/sk/LC_MESSAGES/ccsm.mo
 /share/locale/wo/LC_MESSAGES/ccsm.mo
-/share/locale/en_GB/LC_MESSAGES/ccsm.mo
-/share/locale/bn_IN/LC_MESSAGES/ccsm.mo
-/share/locale/mnk/LC_MESSAGES/ccsm.mo
+/share/locale/pl/LC_MESSAGES/ccsm.mo
 /share/locale/ml_IN/LC_MESSAGES/ccsm.mo
-/share/locale/pt_BR/LC_MESSAGES/ccsm.mo
-/lib/python2.7/dist-packages/ccsm-0.9.12.egg-info
\ No newline at end of file
+/share/locale/bn/LC_MESSAGES/ccsm.mo
+/share/locale/he/LC_MESSAGES/ccsm.mo
+/share/locale/el/LC_MESSAGES/ccsm.mo
+/share/locale/as/LC_MESSAGES/ccsm.mo
+/share/locale/be/LC_MESSAGES/ccsm.mo
+/share/locale/hr/LC_MESSAGES/ccsm.mo
+/share/locale/de/LC_MESSAGES/ccsm.mo
+/share/locale/bn_IN/LC_MESSAGES/ccsm.mo
+/share/locale/ru/LC_MESSAGES/ccsm.mo
+/share/locale/ar/LC_MESSAGES/ccsm.mo
+/share/locale/ja/LC_MESSAGES/ccsm.mo
+/share/locale/nb/LC_MESSAGES/ccsm.mo
+/share/locale/fr/LC_MESSAGES/ccsm.mo
+/share/locale/fa/LC_MESSAGES/ccsm.mo
+/share/locale/hu/LC_MESSAGES/ccsm.mo
+/share/locale/en_GB/LC_MESSAGES/ccsm.mo
+/share/locale/ca/LC_MESSAGES/ccsm.mo
+/share/locale/id/LC_MESSAGES/ccsm.mo
+/share/locale/cs/LC_MESSAGES/ccsm.mo
+/lib/python2.7/site-packages/ccsm-0.9.12-py2.7.egg-info
+/share/ccsm/icons/hicolor/icon-theme.cache
\ No newline at end of file
diff --git a/debian/compiz-dev.install b/debian/compiz-dev.install
index 964df71..d1dad39 100644
--- a/debian/compiz-dev.install
+++ b/debian/compiz-dev.install
@@ -7,6 +7,7 @@ debian/tmp/usr/lib/pkgconfig/compiz-compiztoolbox.pc /usr/lib/${DEB_HOST_MULTIAR
 debian/tmp/usr/lib/pkgconfig/compiz-composite.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-composite.pc
 debian/tmp/usr/lib/pkgconfig/compiz-cube.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-cube.pc
 debian/tmp/usr/lib/pkgconfig/compiz-mousepoll.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-mousepoll.pc
+debian/tmp/usr/lib/pkgconfig/compiz-mousetheme.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-mousetheme.pc
 debian/tmp/usr/lib/pkgconfig/compiz-opengl.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-opengl.pc
 debian/tmp/usr/lib/pkgconfig/compiz.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz.pc
 debian/tmp/usr/lib/pkgconfig/compiz-scale.pc /usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/compiz-scale.pc
diff --git a/debian/compiz-plugins-default.install b/debian/compiz-plugins-default.install
index 830d6cc..6c3006c 100644
--- a/debian/compiz-plugins-default.install
+++ b/debian/compiz-plugins-default.install
@@ -11,6 +11,7 @@ debian/tmp/usr/*/compiz/*gnomecompat.*
 debian/tmp/usr/*/compiz/*grid.*
 debian/tmp/usr/*/compiz/*imgpng.*
 debian/tmp/usr/*/compiz/*mousepoll.*
+debian/tmp/usr/*/compiz/*mousetheme.*
 debian/tmp/usr/*/compiz/*move.*
 debian/tmp/usr/*/compiz/*opengl.*
 debian/tmp/usr/*/compiz/*place.*
diff --git a/include/core/screen.h b/include/core/screen.h
index 6777022..e494c40 100644
--- a/include/core/screen.h
+++ b/include/core/screen.h
@@ -390,6 +390,8 @@ public:
     virtual const char * displayString () = 0;
     virtual CompRect getCurrentOutputExtents () = 0;
     virtual Cursor normalCursor () = 0;
+    virtual void setNormalCursor (Cursor c) = 0;
+    virtual void setBusyCursor (Cursor c) = 0;
     virtual bool grabbed () = 0;
     virtual SnDisplay * snDisplay () = 0;
 
diff --git a/plugins/mousetheme/CMakeLists.txt b/plugins/mousetheme/CMakeLists.txt
new file mode 100644
index 0000000..6b8ee62
--- /dev/null
+++ b/plugins/mousetheme/CMakeLists.txt
@@ -0,0 +1,29 @@
+find_package (Compiz REQUIRED)
+
+PKG_CHECK_MODULES (X11 x11)
+INCLUDE_DIRECTORIES (
+  ${X11_INCLUDE_DIRS}
+)
+
+include (CompizPlugin)
+
+check_library_exists(Xcursor XcursorImageCreate "" CAN_XCURSOR)
+if(CAN_XCURSOR)
+  set(ALLEGRO_XWINDOWS_WITH_XCURSOR 1)
+  find_library(XCURSOR_LIB "Xcursor")
+  list(APPEND X11_LIBRARIES "${XCURSOR_LIB}")
+else(CAN_XCURSOR)
+  message(FATAL_ERROR "X11 support requires Xcursor library.")
+endif(CAN_XCURSOR)
+
+find_package(Boost 1.45.0 COMPONENTS system filesystem)
+if(Boost_FOUND)
+  include_directories(${Boost_INCLUDE_DIRS}) 
+endif()
+
+compiz_plugin (mousetheme)
+
+TARGET_LINK_LIBRARIES(
+  mousetheme
+   ${X11_LIBRARIES} ${Boost_LIBRARIES}
+)
diff --git a/plugins/mousetheme/compiz-mousetheme.pc.in b/plugins/mousetheme/compiz-mousetheme.pc.in
new file mode 100644
index 0000000..3bde61e
--- /dev/null
+++ b/plugins/mousetheme/compiz-mousetheme.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: compiz-mousetheme
+Description: Mousetheme plugin for compiz
+Version: @VERSION@
+
+Requires: compiz
+Libs: -L${libdir}/compiz -lmousetheme
+Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz
diff --git a/plugins/mousetheme/include/mousetheme/mousetheme.h b/plugins/mousetheme/include/mousetheme/mousetheme.h
new file mode 100644
index 0000000..d9159e1
--- /dev/null
+++ b/plugins/mousetheme/include/mousetheme/mousetheme.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Compiz mouse cursor theming plugin
+ *
+ * Copyright : (C) 2015 by Hypra
+ * http://hypra.fr
+ *
+ * Copyright : (C) 2008 by Dennis Kasprzyk
+ * E-mail    : onest...@opencompositing.org
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _COMPIZ_MOUSETHEME_H
+#define _COMPIZ_MOUSETHEME_H
+
+#define COMPIZ_MOUSETHEME_ABI 1
+
+class MouseThemer
+{
+    public:
+
+	typedef boost::function<void (const CompPoint &)> CallBack;
+
+	MouseThemer ();
+	~MouseThemer ();
+
+	void
+	setCallback (CallBack callback);
+
+	void
+	start ();
+
+	void
+	stop ();
+
+	bool
+	active ();
+
+    private:
+
+	bool 	  mActive;
+	CallBack  mCallback;
+
+    friend class MousethemeScreen;
+};
+
+#endif
diff --git a/plugins/mousetheme/mousetheme.xml.in b/plugins/mousetheme/mousetheme.xml.in
new file mode 100644
index 0000000..16a2278
--- /dev/null
+++ b/plugins/mousetheme/mousetheme.xml.in
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<compiz>
+    <plugin name="mousetheme" useBcop="true">
+      <_short>Mouse cursor theme</_short>
+      <_long>Change how cursors look like</_long>
+      <category>Desktop</category>
+      <!-- <deps> -->
+        <!--
+	    <relation type="after">
+	    <plugin>opengl</plugin>
+	    <plugin>composite</plugin>
+	    <plugin>decor</plugin>
+	    </relation>
+        -->
+      <!-- </deps> -->
+      <options>
+	<_short>Misc</_short>
+	<option type="int" name="cursor_size">
+	  <_short>Cursor size</_short>
+	  <_long>How large the cursor should be, in pixels.</_long>
+          <default>32</default>
+	  <min>8</min>
+	  <max>512</max>
+	</option>
+	<option name="theme" type="list">
+	  <_short>Cursor theme (the first one is used)</_short>
+	  <_long>How the pointer cursor looks like.  Move the theme you want to the top.</_long>
+	  <type>string</type>
+	  <hints>directory;</hints>
+          <default>
+            <value>default</value>
+            <!-- This is dynamically filled by C++ code. -->
+          </default>
+	</option>
+	<subgroup>
+	  <_short>Shell commands</_short>
+	  <option type="string" name="command">
+	    <_short>Set theme</_short>
+	    <_long>A Bourne shell command executed to globally change the cursor
+	    theme and size.  The command is executed in an environment where the
+	    THEME variable is bound to the theme name and the SIZE variable is
+	    bound to the cursor size.
+
+            You currently can't use double quotes (&quot;).
+            You can use ${VARIABLE} instead of &quot;$VARIABLE&quot;</_long>
+            <hints>command;</hints>
+	    <default>gsettings set org.mate.peripherals-mouse cursor-theme ${THEME}; gsettings set org.mate.peripherals-mouse cursor-size ${SIZE}; gsettings set org.gnome.desktop.interface cursor-theme ${THEME}; gsettings set org.gnome.desktop.interface cursor-size ${SIZE}; echo [Icon Theme] > ~/.icons/default/index.theme; echo Inherits=${THEME} >> ~/.icons/default/index.theme; echo Size=${SIZE} >> ~/.icons/default/index.theme; xrefresh; echo mate-panel --replace&amp; echo emerald --replace &amp;</default>
+	  </option>
+	</subgroup>
+	<subgroup>
+	  <_short>Internal dirty stuff</_short>
+	  <option name="available_themes" type="string">
+            <!-- I would like to make this invisible in CCSM. -->
+            <_short>blah</_short>
+            <_long>blah</_long>
+	    <type>string</type>
+            <value>default</value>
+	  </option>
+        </subgroup>
+      </options>
+    </plugin>
+</compiz>
diff --git a/plugins/mousetheme/src/mousetheme.cpp b/plugins/mousetheme/src/mousetheme.cpp
new file mode 100644
index 0000000..d134a6f
--- /dev/null
+++ b/plugins/mousetheme/src/mousetheme.cpp
@@ -0,0 +1,279 @@
+/*
+ *
+ * Compiz mouse cursor theming plugin
+ *
+ * mousetheme.cpp
+ *
+ * Copyright : (C) 2015 by Hypra
+ * http://hypra.fr
+ *
+ * Copyright : (C) 2008 by Dennis Kasprzyk
+ * E-mail    : onest...@opencompositing.org
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+
+#include <boost/lexical_cast.hpp>
+#include <boost/tokenizer.hpp>
+#include <boost/filesystem.hpp>
+
+#include <X11/Xlib.h>
+#include <X11/Xcursor/Xcursor.h>
+#include <X11/cursorfont.h>
+#include <X11/extensions/XInput2.h>
+
+#include "private.h"
+
+COMPIZ_PLUGIN_20090315 (mousetheme, MousethemePluginVTable);
+
+void
+MouseThemer::setCallback (MouseThemer::CallBack callback)
+{
+    bool wasActive = mActive;
+
+    if (mActive)
+	stop ();
+
+    mCallback = callback;
+
+    if (wasActive)
+	start ();
+}
+
+void
+MouseThemer::start ()
+{
+    MOUSETHEME_SCREEN (screen);
+
+    if (!ms)
+    {
+	compLogMessage ("mousetheme", CompLogLevelWarn,
+			"Plugin version mismatch, can't start mouse themer.");
+
+	return;
+    }
+
+    if (mCallback.empty ())
+    {
+	compLogMessage ("mousetheme", CompLogLevelWarn,
+			"Can't start mouse themer without callback.");
+	return;
+    }
+
+    ms->availableThemesUpdate ();
+    ms->everythingUpdate ();
+
+    mActive = true;
+}
+
+void
+MouseThemer::stop ()
+{
+    MOUSETHEME_SCREEN (screen);
+
+    /* Prevent broken plugins from calling stop () twice */
+
+    if (!mActive)
+	return;
+
+    if (!ms)
+    {
+	compLogMessage ("mousetheme",
+			CompLogLevelWarn,
+			"Plugin version mismatch, can't stop mouse themer.");
+	return;
+    }
+
+    mActive = false;
+}
+
+bool
+MouseThemer::active ()
+{
+    return mActive;
+}
+
+MouseThemer::MouseThemer () :
+    mActive (false),
+    mCallback (NULL)
+{
+}
+
+MouseThemer::~MouseThemer ()
+{
+    if (mActive)
+	stop ();
+}
+
+template class PluginClassHandler <MousethemeScreen, CompScreen, COMPIZ_MOUSETHEME_ABI>;
+
+MousethemeScreen::MousethemeScreen (CompScreen *cscreen) :
+    PluginClassHandler <MousethemeScreen, CompScreen, COMPIZ_MOUSETHEME_ABI> (cscreen)
+    , previousTheme ("") // an intentionally invalid initial value
+{
+    optionSetThemeNotify (boost::bind (&MousethemeScreen::themeUpdate, this));
+    optionSetCursorSizeNotify (boost::bind (&MousethemeScreen::everythingUpdate, this));
+    optionSetCommandNotify (boost::bind (&MousethemeScreen::everythingUpdate, this));
+}
+
+const std::vector<std::string>
+MousethemeScreen::availableThemes ()
+{
+    std::vector<std::string> res;
+    char *path_from_variable = std::getenv ("XCURSOR_PATH");
+    std::string path
+      = path_from_variable ? path_from_variable : "/usr/share/icons";
+    boost::char_separator<char> separator(":");
+    boost::tokenizer<boost::char_separator<char> > tokens(path, separator);
+    foreach (const std::string& directory, tokens)
+    {
+        if (! boost::filesystem::is_directory (directory))
+            continue;
+        const boost::filesystem::directory_iterator end;
+        for (boost::filesystem::directory_iterator dir_itr (directory);
+             dir_itr != end;
+             ++dir_itr)
+        {
+            std::string candidate_path = dir_itr->path ().generic_string ();
+            std::string candidate_path_cursors = candidate_path + "/cursors";
+            if (! boost::filesystem::exists (candidate_path_cursors)
+                || ! boost::filesystem::is_directory (candidate_path_cursors))
+                continue;
+            res.push_back (dir_itr->path ().filename ().generic_string ());
+        } // for
+    }
+    std::sort (res.begin(), res.end());
+    return res;
+}
+
+void
+MousethemeScreen::availableThemesUpdate ()
+{
+    // Check if the installed themes are still the same as the ones saved in
+    // the "available_themes" option (normalized by sorting).
+    std::string new_available_themes_as_string;
+    std::vector<std::string> new_available_themes = availableThemes ();
+    foreach (const std::string &s, new_available_themes)
+        new_available_themes_as_string += s + ";";
+
+    // If they are still the same we have nothing to do.
+    if (optionGetAvailableThemes () == new_available_themes_as_string)
+        return;
+
+    // The installed themes have changed since the last time.  Update
+    // "available_themes" option so as not to redo this next time...
+    CompOption::Value value;
+    value.set (CompString(new_available_themes_as_string));
+    screen->setOptionForPlugin ("mousetheme", "available_themes", value);
+
+    // ...And propose the themes as alternatives among which to choose
+    // "theme".
+    CompOption::Value::Vector vector_value;
+    foreach (const std::string &s, new_available_themes)
+        vector_value.push_back (s);
+    value.set (CompOption::TypeString, vector_value);
+    screen->setOptionForPlugin ("mousetheme", "theme", value);
+}
+
+void
+MousethemeScreen::actuallyUpdateCursorTheme (const std::string &theme,
+                                             int cursor_size,
+                                             const std::string &command)
+{
+    Display *display = screen->dpy ();
+    // FIXME: I'm assuming that Compiz manages *all* screens.
+    int screen_no = ScreenCount (display);
+    if (! XcursorSetTheme (display, theme.c_str ()))
+    {
+        std::cerr << "Warning: ignoring invalid cursor theme \"" << theme
+                  << "\"\n";
+        if (! XcursorSetTheme (display, NULL))
+            std::cerr << "Warning: setting the default theme failed as well.  "
+                      << "Hell will break loose.\n";
+    }
+    XcursorSetDefaultSize (display, cursor_size);
+
+    Cursor normalCursor
+      = XcursorLibraryLoadCursor (display, "left_ptr");
+    Cursor busyCursor
+      = XcursorLibraryLoadCursor (display, "watch");
+    screen->setNormalCursor (normalCursor);
+    screen->setBusyCursor (busyCursor);
+
+    int screen;
+    for (screen = 0; screen < screen_no; screen ++)
+    {
+        Window root = XRootWindow (display, screen);
+        int pointer_id;
+        XIGetClientPointer (display, None, &pointer_id);
+        XIDefineCursor (display, pointer_id, root, normalCursor);
+    } // for
+    XFlush (display);
+
+    std::string complete_command
+      = "export THEME=\"" + theme + "\"; "
+      + std::string("export SIZE=\"")
+      + boost::lexical_cast<std::string> (cursor_size) + "\"; "
+      + command;
+    std::system (complete_command.c_str ());
+}
+
+std::string
+MousethemeScreen::currentTheme ()
+{
+  const CompOption::Value::Vector& all_themes = optionGetTheme ();
+  if (all_themes.size () == 0)
+      return "default";
+  else
+      return all_themes[0].get<CompString> ();
+}
+
+bool
+MousethemeScreen::everythingUpdate ()
+{
+    std::string theme = currentTheme ();
+    int cursor_size = optionGetCursorSize ();
+    std::string command = optionGetCommand ();
+
+    actuallyUpdateCursorTheme (theme, cursor_size, command);
+
+    return true;
+}
+
+bool
+MousethemeScreen::themeUpdate ()
+{
+    // Do nothing unless the *first* item in the list changed.
+    std::string theme = currentTheme ();
+    if (previousTheme == theme)
+        return false;
+
+    previousTheme = theme;
+    everythingUpdate ();
+    return true;
+}
+
+bool
+MousethemePluginVTable::init ()
+{
+    if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION))
+	return true;
+
+    return false;
+}
diff --git a/plugins/mousetheme/src/private.h b/plugins/mousetheme/src/private.h
new file mode 100644
index 0000000..95f097a
--- /dev/null
+++ b/plugins/mousetheme/src/private.h
@@ -0,0 +1,75 @@
+/*
+ *
+ * Compiz mouse cursor theming plugin
+ *
+ * private.h
+ *
+ * Copyright : (C) 2015 by Hypra
+ * http://hypra.fr
+ *
+ * Copyright : (C) 2008 by Dennis Kasprzyk
+ * E-mail    : onest...@opencompositing.org
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <core/core.h>
+#include <core/pluginclasshandler.h>
+#include <core/timer.h>
+
+#include <mousetheme/mousetheme.h>
+
+#include "mousetheme_options.h"
+
+typedef enum _MousethemeOptions
+{
+    MP_DISPLAY_OPTION_NUM
+} MousethemeDisplayOptions;
+
+class MousethemeScreen;
+extern template class PluginClassHandler <MousethemeScreen, CompScreen, COMPIZ_MOUSETHEME_ABI>;
+
+class MousethemeScreen :
+    public PluginClassHandler <MousethemeScreen, CompScreen, COMPIZ_MOUSETHEME_ABI>,
+    public MousethemeOptions
+{
+    public:
+        std::string previousTheme;
+        std::vector<std::string> theAvailableThemes;
+
+        const std::vector<std::string> availableThemes ();
+
+        void availableThemesUpdate ();
+        std::string currentTheme ();
+        void actuallyUpdateCursorTheme (const std::string &theme,
+                                        int cursor_size,
+                                        const std::string &command);
+
+	MousethemeScreen (CompScreen *screen);
+
+        bool everythingUpdate ();
+        bool themeUpdate ();
+};
+
+#define MOUSETHEME_SCREEN(s)						\
+    MousethemeScreen *ms = MousethemeScreen::get (s)
+
+#define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption))
+
+class MousethemePluginVTable :
+    public CompPlugin::VTableForScreen<MousethemeScreen, COMPIZ_MOUSETHEME_ABI>
+{
+    public:
+
+	bool init ();
+};
diff --git a/src/main.cpp b/src/main.cpp
index b62083c..3cb0a31 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -38,6 +38,11 @@
 #include "privatescreen.h"
 #include "privatestackdebugger.h"
 
+namespace
+{
+bool autoAddCCP = true;
+}
+
 void
 CompManager::usage ()
 {
@@ -52,6 +57,7 @@ CompManager::usage ()
             "  --debug               Enable debug mode\n"
             "  --version             Show the program version\n"
             "  --help                Show this summary\n"
+	    "  --no-auto-add-ccp     Do not automatically load the ccp plugin\n"
             , programName);
 }
 
@@ -116,6 +122,11 @@ CompManager::parseArguments (int argc, char **argv)
 	    if (i + 1 < argc)
 		clientId = argv[++i];
 	}
+	else if (!strcmp (argv[i], "--no-auto-add-ccp"))
+	{
+	    compLogMessage ("core", CompLogLevelInfo, "running without the ccp plugin, no settings will be loaded");
+	    autoAddCCP = false;
+	}
 	else if (*argv[i] == '-')
 	{
 	    compLogMessage ("core", CompLogLevelWarn,
@@ -151,6 +162,9 @@ CompManager::init ()
 
     modHandler = new ModifierHandler ();
 
+    if (initialPlugins.empty () && autoAddCCP)
+	initialPlugins.push_back ("ccp");
+
     if (!screen->init (displayName))
 	return false;
 
diff --git a/src/privatescreen.h b/src/privatescreen.h
index 38857f5..a358c41 100644
--- a/src/privatescreen.h
+++ b/src/privatescreen.h
@@ -624,6 +624,10 @@ class PrivateScreen :
 					   XButtonEvent       *event,
 					   CompOption::Vector &arguments);
 
+        void setNormalCursor (Cursor c);
+
+        void setBusyCursor (Cursor c);
+
 	bool shouldTriggerKeyPressAction (CompAction *action,
 					  XKeyEvent  *event);
 
@@ -954,6 +958,8 @@ class CompScreenImpl : public CompScreen,
 	void unhookServerWindow (CompWindow *w);
 
 	Cursor normalCursor ();
+        void setNormalCursor (Cursor c);
+        void setBusyCursor (Cursor c);
 
 	Cursor invisibleCursor ();
 
diff --git a/src/screen.cpp b/src/screen.cpp
index 10eb7d3..73a1e53 100644
--- a/src/screen.cpp
+++ b/src/screen.cpp
@@ -46,6 +46,7 @@
 #include <boost/foreach.hpp>
 #define foreach BOOST_FOREACH
 
+#include <X11/X.h> // for None
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <X11/Xproto.h>
@@ -621,6 +622,22 @@ CompScreenImpl::displayString ()
 }
 
 void
+PrivateScreen::setNormalCursor (Cursor c)
+{
+    if (normalCursor != None)
+        XFreeCursor (dpy, normalCursor);
+    normalCursor = c;
+}
+
+void
+PrivateScreen::setBusyCursor (Cursor c)
+{
+    if (busyCursor != None)
+        XFreeCursor (dpy, busyCursor);
+    busyCursor = c;
+}
+
+void
 PrivateScreen::updateScreenInfo ()
 {
     if (xineramaExtension)
@@ -2078,9 +2095,9 @@ cps::StartupSequenceImpl::updateStartupFeedback ()
     if (priv->initialized)
     {
 	if (!emptySequence())
-	    XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->busyCursor);
+            XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->busyCursor);
 	else
-	    XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->normalCursor);
+            XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->normalCursor);
     }
 }
 
@@ -3015,6 +3032,18 @@ CompScreenImpl::normalCursor ()
     return privateScreen.normalCursor;
 }
 
+void
+CompScreenImpl::setNormalCursor (Cursor c)
+{
+    privateScreen.setNormalCursor (c);
+}
+
+void
+CompScreenImpl::setBusyCursor (Cursor c)
+{
+    privateScreen.setBusyCursor (c);
+}
+
 Cursor
 CompScreenImpl::invisibleCursor ()
 {
_______________________________________________
compiz mailing list
compiz@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to