David Reveman wrote:
On Wed, 2006-11-15 at 02:16 +0000, Ben Reeves wrote:
David, is there any chance that the gconf (or dbus) changes will be
introduced into the git? because i would really like to get my
configurator released, and i can't do it until the option type is
available.

Sure, I'll look at Mike's dbus patch as soon as he thinks it's ready to
land in head.

Here it is, I think it looks good enough to be accepted.

I have changed a few things for the api to make it
clearer and more intuitive.

get and set were renamed to getValue and setValue
I felt that get and set were a bit generic and seemed
like they would return a reference to the option
rather than the value.  I have included get and set
still and I will remove them after version 0.5.0.  I
doubt anyone is actually using them yet, but we
should start as we mean to go along.

I changed getOptionMetadata to getMetadata since
the path is given at the option level.

There is an additional function to get a string from
an option type.  This seemed better to be in the core,
feel free to move it back into the dbus plugin, but I
feel it could be useful for other plugins too.

There is also a change to the action function to make
the method return true or false.  Previously the error
messages were very misleading and methods should
return something.

I have also added a quick typo fix to the instructions.

While I was testing the get and set, I found that if you
try to get an action option value it crashes.  The
problem was related to the edge, dbus seems very
particular about how it is passed strings.  I could not
get to the bottom of the problem so I have just left it.
Maybe other people do not see the crash?

diff --git a/include/compiz.h b/include/compiz.h
index cfb2942..1a46277 100644
--- a/include/compiz.h
+++ b/include/compiz.h
@@ -495,6 +495,8 @@ stringToColor (const char     *color,
 char *
 colorToString (unsigned short *rgba);
 
+char *
+optionTypeToString (CompOptionType type);
 
 /* display.c */
 
--- ../../clean/plugins/dbus.c  2006-11-15 20:22:38.961551784 +0000
+++ dbus.c      2006-11-16 16:45:32.182596168 +0000
@@ -32,11 +32,15 @@
 
 #include <compiz.h>
 
-#define COMPIZ_DBUS_SERVICE_NAME          "org.freedesktop.compiz"
-#define COMPIZ_DBUS_ACTIVATE_MEMBER_NAME   "activate"
-#define COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME "deactivate"
-#define COMPIZ_DBUS_SET_MEMBER_NAME        "set"
-#define COMPIZ_DBUS_GET_MEMBER_NAME        "get"
+#define COMPIZ_DBUS_SERVICE_NAME                    "org.freedesktop.compiz"
+#define COMPIZ_DBUS_ACTIVATE_MEMBER_NAME             "activate"
+#define COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME           "deactivate"
+#define COMPIZ_DBUS_SET_MEMBER_NAME_DEP              "set"
+#define COMPIZ_DBUS_GET_MEMBER_NAME_DEP              "get"
+#define COMPIZ_DBUS_SET_MEMBER_NAME                  "setValue"
+#define COMPIZ_DBUS_GET_MEMBER_NAME                  "getValue"
+#define COMPIZ_DBUS_GET_OPTIONS_MEMBER_NAME          "getOptions"
+#define COMPIZ_DBUS_GET_OPTION_META_MEMBER_NAME      "getMetadata"
 
 typedef enum {
     DbusActionIndexKeyBinding    = 0,
@@ -119,6 +123,23 @@
     return NULL;
 }
 
+void
+dbusReturnBool (DBusConnection *connection,
+               DBusMessage *message,
+               Bool value)
+{
+    DBusMessage *reply;
+    Bool    msgBool = TRUE;
+    reply = dbus_message_new_method_return (message);
+    dbus_message_append_args (reply,
+                                 DBUS_TYPE_BOOLEAN, &msgBool,
+                                 DBUS_TYPE_INVALID);
+    dbus_connection_send (connection, reply, NULL);
+    dbus_connection_flush (connection);
+    dbus_message_unref (reply);
+}
+
+
 /*
  * Activate can be used to trigger any existing action. Arguments
  * should be a pair of { string, bool|int32|double|string }.
@@ -140,15 +161,14 @@
  * /org/freedesktop/compiz/cube/allscreens/unfold            \
  * org.freedesktop.compiz.activate                           \
  * string:'root'                                             \
- * int32:`xwininfo -root | grep id: | awk '{ print $4 }'`     \
- * string:'face' int32:1
+ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'`
  *
  * dbus-send --type=method_call --dest=org.freedesktop.compiz \
  * /org/freedesktop/compiz/cube/allscreens/unfold            \
  * org.freedesktop.compiz.deactivate                         \
  * string:'root'                                             \
- * int32:`xwininfo -root | grep id: | awk '{ print $4 }'`     \
- * string:'face' int32:1
+ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'`
+ *
  */
 static Bool
 dbusHandleActionMessage (DBusConnection *connection,
@@ -702,13 +722,152 @@
     return FALSE;
 }
 
+static Bool
+dbusHandleGetOptionsMessage (DBusConnection *connection,
+                            DBusMessage    *message,
+                            CompDisplay           *d,
+                            char          **path)
+{
+    CompScreen *s;
+    CompOption *option;
+    int               nOption;
+
+    option = dbusGetOptionsFromPath (d, path, &s, &nOption);
+    if (!option)
+       return FALSE;
+
+    DBusMessage *reply;
+
+    reply = dbus_message_new_method_return (message);
+
+    while (nOption--)
+    {
+        dbus_message_append_args (reply,
+                                 DBUS_TYPE_STRING, &option->name,
+                                 DBUS_TYPE_INVALID);
+       option++;
+    }
+    dbus_connection_send (connection, reply, NULL);
+    dbus_connection_flush (connection);
+
+    dbus_message_unref (reply);
+
+    return TRUE;
+
+}
+
+static Bool
+dbusHandleGetOptionMetadataMessage (DBusConnection *connection,
+                                   DBusMessage    *message,
+                                   CompDisplay    *d,
+                                   char           **path)
+{
+    CompScreen *s;
+    CompOption *option;
+    int                nOption;
+    Bool       handled = FALSE;
+    int i;
+
+    double min;
+    double max;
+    double precision;
+
+    char *sPossible;
+
+    char *datatype;
+    char *listtype;
+
+    DBusMessage *reply;
+
+    reply = dbus_message_new_method_return (message);
+
+
+    option = dbusGetOptionsFromPath (d, path, &s, &nOption);
+    if (!option)
+       return FALSE;
+
+    while (nOption--)
+    {
+       if (strcmp (option->name, path[2]) == 0)
+       {
+
+           datatype = optionTypeToString (option->type);
+
+            dbus_message_append_args (reply,
+                                     DBUS_TYPE_STRING, &option->shortDesc,
+                                     DBUS_TYPE_STRING, &option->longDesc,
+                                     DBUS_TYPE_STRING, &datatype,
+                                     DBUS_TYPE_INVALID);
+
+           if (option->type == CompOptionTypeList)
+           {
+               listtype = optionTypeToString (option->value.list.type);
+                dbus_message_append_args (reply,
+                                         DBUS_TYPE_STRING, &listtype,
+                                         DBUS_TYPE_INVALID);
+           }
+
+           if (option->type == CompOptionTypeInt ||
+               ( (option->type == CompOptionTypeList) &&
+                  (option->value.list.type == CompOptionTypeInt) ) )
+               dbus_message_append_args (reply,
+                                         DBUS_TYPE_INT32, &option->rest.i.min,
+                                         DBUS_TYPE_INT32, &option->rest.i.max,
+                                         DBUS_TYPE_INVALID);
+
+           else if (option->type == CompOptionTypeFloat ||
+                    ( (option->type == CompOptionTypeList) &&
+                       (option->value.list.type == CompOptionTypeFloat) ) )
+           {
+               min = option->rest.f.min;
+               max = option->rest.f.max;
+               precision = option->rest.f.precision;
+               dbus_message_append_args (reply,
+                                         DBUS_TYPE_DOUBLE, &min,
+                                         DBUS_TYPE_DOUBLE, &max,
+                                         DBUS_TYPE_DOUBLE, &precision,
+                                         DBUS_TYPE_INVALID);
+           }
+           else if (option->type == CompOptionTypeString ||
+                    ( (option->type == CompOptionTypeList) &&
+                       (option->value.list.type == CompOptionTypeString) ) )
+           {
+               if (option->rest.s.nString)
+               {
+                   for ( i=0; i < option->rest.s.nString; i++ )
+                   {
+                       sPossible = option->rest.s.string[i];
+                       dbus_message_append_args (reply,
+                                                 DBUS_TYPE_STRING, &sPossible,
+                                                 DBUS_TYPE_INVALID);
+                   }
+               }
+           }
+           handled = TRUE;
+       }
+       option++;
+    }
+
+    if (!handled)
+       return FALSE;
+
+    dbus_connection_send (connection, reply, NULL);
+    dbus_connection_flush (connection);
+
+    dbus_message_unref (reply);
+
+    return TRUE;
+
+}
+
 static DBusHandlerResult
 dbusHandleMessage (DBusConnection *connection,
                   DBusMessage    *message,
                   void           *userData)
 {
     CompDisplay *d = (CompDisplay *) userData;
-    Bool       status = FALSE;
+    Bool       status  = FALSE;
+    Bool       handled = FALSE;
     char       **path;
     const char  *service, *interface, *member;
 
@@ -728,7 +887,7 @@
     if (!dbus_message_get_path_decomposed (message, &path))
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-    if (!path[0] || !path[1] || !path[2] || !path[3] || !path[4] || !path[5])
+    if (!path[0] || !path[1] || !path[2] || !path[3] || !path[4])
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
     if (strcmp (path[0], "org")               ||
@@ -736,32 +895,70 @@
        strcmp (path[2], "compiz"))
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-    if (dbus_message_has_member (message, COMPIZ_DBUS_ACTIVATE_MEMBER_NAME))
-    {
-       status = dbusHandleActionMessage (connection, message, d, &path[3],
-                                         TRUE);
-    }
-    else if (dbus_message_has_member (message,
-                                     COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME))
-    {
-       status = dbusHandleActionMessage (connection, message, d, &path[3],
-                                         FALSE);
-    }
-    else if (dbus_message_has_member (message, COMPIZ_DBUS_SET_MEMBER_NAME))
+    if (path[5])  /* option level */
     {
-       status = dbusHandleSetOptionMessage (connection, message, d, &path[3]);
+       /* actions */
+        if (dbus_message_has_member (message, 
COMPIZ_DBUS_ACTIVATE_MEMBER_NAME))
+        {
+           status = dbusHandleActionMessage (connection, message, d, &path[3],
+                                             TRUE);
+           handled = TRUE;
+        }
+        else if (dbus_message_has_member (message,
+                                         COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME))
+        {
+           status = dbusHandleActionMessage (connection, message, d, &path[3],
+                                             FALSE);
+           handled = TRUE;
+        }
+       /* get/set option values */
+        else if (dbus_message_has_member (message,
+                                         COMPIZ_DBUS_SET_MEMBER_NAME) ||
+               dbus_message_has_member (message,
+                                        COMPIZ_DBUS_SET_MEMBER_NAME_DEP))
+        {
+           status = dbusHandleSetOptionMessage (connection, message, d,
+                                                &path[3]);
+           handled = TRUE;
+        }
+        else if (dbus_message_has_member (message,
+                                         COMPIZ_DBUS_GET_MEMBER_NAME) ||
+               dbus_message_has_member (message,
+                                        COMPIZ_DBUS_GET_MEMBER_NAME_DEP))
+        {
+           status = dbusHandleGetOptionMessage (connection, message, d,
+                                                &path[3]);
+           handled = TRUE;
+        }
+        else if (dbus_message_has_member (message,
+                                          
COMPIZ_DBUS_GET_OPTION_META_MEMBER_NAME))
+        {
+           status = dbusHandleGetOptionMetadataMessage (connection, message, d,
+                                                        &path[3]);
+           handled = TRUE;
+        }
     }
-    else if (dbus_message_has_member (message, COMPIZ_DBUS_GET_MEMBER_NAME))
+    else if (path[4])  /* plugin screen/display level */
     {
-       status = dbusHandleGetOptionMessage (connection, message, d, &path[3]);
+
+        if (dbus_message_has_member (message,
+                                         COMPIZ_DBUS_GET_OPTIONS_MEMBER_NAME))
+        {
+           status = dbusHandleGetOptionsMessage (connection, message, d,
+                                                 &path[3]);
+           handled = TRUE;
+        }
     }
 
     dbus_free_string_array (path);
 
-    if (status)
-       return DBUS_HANDLER_RESULT_HANDLED;
+    if (handled)
+       dbusReturnBool (connection, message, status);
+    else
+       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+    return DBUS_HANDLER_RESULT_HANDLED;
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
 static Bool
diff --git a/src/option.c b/src/option.c
index 0b61592..eb6e689 100644
--- a/src/option.c
+++ b/src/option.c
@@ -53,6 +53,20 @@ struct _Modifier {
 
 #define N_MODIFIERS (sizeof (modifiers) / sizeof (struct _Modifier))
 
+struct _Datatype {
+    char *name;
+    int  type;
+} datatypes[] = {
+    { "Action",         CompOptionTypeAction   },
+    { "Bool",          CompOptionTypeBool      },
+    { "Int",           CompOptionTypeInt       },
+    { "Float",         CompOptionTypeFloat     },
+    { "String",                CompOptionTypeString    },
+    { "Color",         CompOptionTypeColor     },
+    { "List",          CompOptionTypeList      },
+};
+#define N_DATATYPES (sizeof (datatypes) / sizeof (struct _Datatype))
+
 static char *edgeName[] = {
     N_("Left"),
     N_("Right"),
@@ -667,3 +681,21 @@ colorToString (unsigned short *rgba)
 
     return strdup (tmp);
 }
+
+char *
+optionTypeToString (CompOptionType type)
+{
+    char *datatype = NULL;
+    int  i;
+
+    for (i = 0; i < N_DATATYPES; i++)
+    {
+       if (type == datatypes[i].type)
+       {
+           datatype = stringAppend (datatype, datatypes[i].name);
+           return datatype;
+       }
+    }
+
+    return datatype;
+}
_______________________________________________
compiz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to