Updating branch refs/heads/master
         to ce3fa5e8c556e14a8127d67192484fe2f59b5595 (commit)
       from df6a5c2da0203f6704379da333bfadafc837949f (commit)

commit ce3fa5e8c556e14a8127d67192484fe2f59b5595
Author: Danny Milosavljevic <[email protected]>
Date:   Fri Jan 14 20:54:35 2011 +0100

    add wrapper for xfce_spawn_on_screen_with_child_watch .

 examples/spawn/testspawn.py |    7 +++++-
 ui/spawn.override           |   46 +++++++++++++++++++++++++++++++++++++++++++
 ui/ui.py                    |   36 +++++++++++++++++++--------------
 3 files changed, 73 insertions(+), 16 deletions(-)

diff --git a/examples/spawn/testspawn.py b/examples/spawn/testspawn.py
index 17bfd31..78abfc6 100644
--- a/examples/spawn/testspawn.py
+++ b/examples/spawn/testspawn.py
@@ -9,4 +9,9 @@ import xfce4.ui
 import xfce4.util
 import shlex
 
-xfce4.ui.spawn_on_screen(gtk.gdk.screen_get_default(), "/", ["xterm"], 
os.environ, set(["search_path"]), False, gtk.get_current_event_time(), "xterm")
+def watch(inst, status):
+       print(status)
+
+#xfce4.ui.spawn_on_screen(gtk.gdk.screen_get_default(), "/", ["xterm"], 
os.environ, set(["search_path"]), False, gtk.get_current_event_time(), "xterm")
+xfce4.ui.spawn_on_screen_with_child_watch(gtk.gdk.screen_get_default(), "/", 
["xterm"], os.environ, set(["search_path"]), False, 
gtk.get_current_event_time(), "xterm", watch)
+gtk.main()
diff --git a/ui/spawn.override b/ui/spawn.override
index 2d6826a..01b0684 100644
--- a/ui/spawn.override
+++ b/ui/spawn.override
@@ -70,3 +70,49 @@ _wrap_xfce_spawn_on_screen(PyObject *self, PyObject *args, 
PyObject *kwargs)
         return NULL;
     return PyBool_FromLong(ret);
 }
+%%
+override xfce_spawn_on_screen_with_child_watch kwargs
+static PyObject *
+_wrap_xfce_spawn_on_screen_with_child_watch(PyObject *self, PyObject *args, 
PyObject *kwargs)
+{
+    static char *kwlist[] = { "screen", "working_directory", "argv", "envp", 
"flags", "startup_notify", "startup_timestamp", "startup_icon_name", 
"callback", NULL };
+    PyGObject *screen;
+    char *working_directory, *startup_icon_name;
+    char** c_argv;
+    char** c_envp;
+    PyObject* argv;
+    PyObject* envp;
+    int flags, startup_notify, ret;
+    unsigned long startup_timestamp;
+    GError *error = NULL;
+    PyObject* py_callback;
+    GClosure *closure;
+
+    if (!PyArg_ParseTupleAndKeywords(args, 
kwargs,"O!sOOiiksO:spawn_on_screen", kwlist, &PyGdkScreen_Type, &screen, 
&working_directory, &argv, &envp, &flags, &startup_notify, &startup_timestamp, 
&startup_icon_name, &py_callback))
+        return NULL;
+
+    if (!PyCallable_Check(py_callback)) {
+        PyErr_SetString(PyExc_TypeError, "callback argument not callable");
+        return NULL;
+    }
+    if(!PySequence_Check(argv)) {
+        PyErr_SetObject(PyExc_TypeError, argv);
+        return NULL;
+    }
+    if(!PySequence_Check(envp)) {
+        PyErr_SetObject(PyExc_TypeError, envp);
+        return NULL;
+    }
+    c_envp = PyStringList_AsStrv(envp);
+    c_argv = PyStringList_AsStrv(argv);
+    closure = pyg_closure_new(py_callback, NULL, NULL);
+    ret = xfce_spawn_on_screen_with_child_watch(GDK_SCREEN(screen->obj), 
working_directory, c_argv, c_envp, flags, startup_notify, startup_timestamp, 
startup_icon_name, closure, &error);
+    /* FIXME does this leak? pygobject_watch_closure((PyObject *)self, 
closure); */
+    /*g_closure_set_marshal (spawn_data->closure, 
g_cclosure_marshal_VOID__INT);*/
+    g_strfreev(c_envp);
+    g_strfreev(c_argv);
+    
+    if (pyg_error_check(&error))
+        return NULL;
+    return PyBool_FromLong(ret);
+}
diff --git a/ui/ui.py b/ui/ui.py
index 1f89115..177d267 100644
--- a/ui/ui.py
+++ b/ui/ui.py
@@ -14,21 +14,27 @@ SPAWN_STDERR_TO_DEV_NULL     = 1 << 4
 SPAWN_CHILD_INHERITS_STDIN   = 1 << 5
 SPAWN_FILE_AND_ARGV_ZERO     = 1 << 6
 
+def to_c_envp(source):
+       if hasattr(source, "items"):
+               return ["%s=%s" % (key, value) for key, value in source.items()]
+       else:
+               return source
+
+def to_c_flags(source):
+       if isinstance(source, int):
+               return(source)
+       else:
+               result = 0
+               bits = ["leave_descriptors_open", "do_not_reap_child", 
"search_path", "stdout_to_dev_null", "stderr_to_dev_null", 
"child_inherits_stdin", "file_and_argv_zero"]
+               for i, name in enumerate(bits):
+                       if name in source:
+                               result |= 1 << i
+               return result
+
 def spawn_on_screen(screen, working_directory, argv, envp, flags, 
startup_notify, startup_timestamp, startup_icon_name):
-       def to_c_envp(source):
-               if hasattr(source, "items"):
-                       return ["%s=%s" % (key, value) for key, value in 
source.items()]
-               else:
-                       return source
-       def to_c_flags(source):
-               if isinstance(source, int):
-                       return(source)
-               else:
-                       result = 0
-                       bits = ["leave_descriptors_open", "do_not_reap_child", 
"search_path", "stdout_to_dev_null", "stderr_to_dev_null", 
"child_inherits_stdin", "file_and_argv_zero"]
-                       for i, name in enumerate(bits):
-                               if name in source:
-                                       result |= 1 << i
-                       return result
        import _ui
        return(_ui.spawn_on_screen(screen, working_directory, argv, 
to_c_envp(envp), to_c_flags(flags), startup_notify, startup_timestamp, 
startup_icon_name))
+
+def spawn_on_screen_with_child_watch(screen, working_directory, argv, envp, 
flags, startup_notify, startup_timestamp, startup_icon_name, callback):
+       import _ui
+       return(_ui.spawn_on_screen_with_child_watch(screen, working_directory, 
argv, to_c_envp(envp), to_c_flags(flags), startup_notify, startup_timestamp, 
startup_icon_name, callback))
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to