[compiz] Metadata improvements

Sam Spilsbury
Sat, 02 Jun 2007 14:35:35 -0000

I was just thinking, with the metadata files allowing us to make up
settings pages, there is a problem that we could address here.

It seems ever-so-evident that developers are splitting up plugins into
much smaller plugins to reduce the amount of bloat. This is good
because it speeds things up but bad for the user in two ways

-We've got multiple settings pages which really adress the same thing,
just different parts of it
-Users have a hard time finding the option they are after because of
all the trial and error navigation

So what are some examples of this?

A famous one is the Cube+Rotate+3D issue
A user is not going to know where everything is, so when they first
get introduced to the settings interface, they will be confused to
find the option they want.

Example: John is frustrated with the edge-flip move option as he finds
it distracting. He knows it has something to do with the cube plugin
so he looks in there and cannot find it. Later, he finds it in the
'Rotate' plugin, which is not where he expected it to be

Example 2: Robert wants to know info about his windows size. Because
of experience with previous window managers, he looks in the 'Resize
window' section but cannot find it. He knows he as seen it somewhere

So what is the solution?

Well, we instead of having metadata files for each plugin, we can have
them for each function.

<function=cube>
   <short>Desktop Cube</short>
    <enable name="cube">
     <short>The Cube itself</short>
       <default>true</default>
     </enable>
   <short>Cube Rotation</short>
    <enable name="rotate">
     <short>Ability to rotate the cube</short>
       <default>true</default>
     </enable>
   <short>3D window layering</short>
    <enable name="3d">
     <short>Windows have space between them and stacking can be
seen</short>
       <default>true</default>
     </enable>
    <plugin="cube">
    <etc with relation>
        <group>
            <short>Cube appearance</short>

                  <short>View the cube from the inside</short>
                     <long>Rotate around the cube so it looks like you
are inside it</long>
                       <default>false</default>

          </group>
     <plugin=rotate>
         <etc with relation></relation>
               <group>
                  <short>Edge Flip</short>
                    <option="edge_flip_pointer">
                      <short>Flip viewport when the pointer bumps the
edge of the screen</short>
                        <long>When the pointer hits a screen edge,
rotate the desktop cube to where the pointer is going</long>

               </group>
          </plugin>
     <plugin=rotate>
         <etc with relation></relation>
               <group>
                  <short>Edge Flip</short>
                    <option="edge_flip_pointer">
                      <short>Flip viewport when the pointer bumps the
edge of the screen</short>
                        <long>When the pointer hits a screen edge,
rotate the desktop cube to where the pointer is going</long>
                            <default>false</default>

               </group>
          </plugin>
</function>

This way we can still have loads of plugins and less settings pages to
confuse the users. The beauty of this system is that we can create
entirely new functions out of stuff scattered around in core and
plugins.

For example, we can list Opacity from core, and brightness and
saturation, Negative and fakeargb under one settings page called 'Real
time window effects'

We can also take the matching interface out of core.xml and add window
attribs to the WinRules plugin. They are there on the settings page
but remain in core 'physically'