Author: benny
Date: 2007-01-14 18:27:38 +0000 (Sun, 14 Jan 2007)
New Revision: 24451
Modified:
thunar/trunk/ChangeLog
thunar/trunk/thunar-vfs/thunar-vfs-exec.c
thunar/trunk/thunar-vfs/thunar-vfs-exec.h
thunar/trunk/thunar-vfs/thunar-vfs-info.c
thunar/trunk/thunar-vfs/thunar-vfs-mime-handler.c
Log:
2007-01-14 Benedikt Meurer <[EMAIL PROTECTED]>
* thunar-vfs/thunar-vfs-exec.c: Improve startup notification handling,
based on a patch from Gregoire Gentil <[EMAIL PROTECTED]>.
* thunar-vfs/thunar-vfs-exec.{c,h}, thunar-vfs/thunar-vfs-info.c,
thunar-vfs/thunar-vfs-mime-handler.c: Allow to pass in icon_name
of the application to start, which can be used by window managers
that detailed support startup notification feedback.
Modified: thunar/trunk/ChangeLog
===================================================================
--- thunar/trunk/ChangeLog 2007-01-14 18:23:09 UTC (rev 24450)
+++ thunar/trunk/ChangeLog 2007-01-14 18:27:38 UTC (rev 24451)
@@ -1,5 +1,14 @@
2007-01-14 Benedikt Meurer <[EMAIL PROTECTED]>
+ * thunar-vfs/thunar-vfs-exec.c: Improve startup notification handling,
+ based on a patch from Gregoire Gentil <[EMAIL PROTECTED]>.
+ * thunar-vfs/thunar-vfs-exec.{c,h}, thunar-vfs/thunar-vfs-info.c,
+ thunar-vfs/thunar-vfs-mime-handler.c: Allow to pass in icon_name
+ of the application to start, which can be used by window managers
+ that detailed support startup notification feedback.
+
+2007-01-14 Benedikt Meurer <[EMAIL PROTECTED]>
+
* thunar-vfs/thunar-vfs-io-local.c(_thunar_vfs_io_local_listdir):
Use g_list_free_1() instead of g_list_free1().
Modified: thunar/trunk/thunar-vfs/thunar-vfs-exec.c
===================================================================
--- thunar/trunk/thunar-vfs/thunar-vfs-exec.c 2007-01-14 18:23:09 UTC (rev
24450)
+++ thunar/trunk/thunar-vfs/thunar-vfs-exec.c 2007-01-14 18:27:38 UTC (rev
24451)
@@ -41,6 +41,7 @@
#include <thunar-vfs/thunar-vfs-exec.h>
#include <thunar-vfs/thunar-vfs-path-private.h>
+#include <thunar-vfs/thunar-vfs-private.h>
#include <thunar-vfs/thunar-vfs-alias.h>
#ifdef GDK_WINDOWING_X11
@@ -273,28 +274,37 @@
/* the max. timeout for an application to startup */
#define TVSN_STARTUP_TIMEOUT (30 * 1000)
+typedef struct
+{
+ SnLauncherContext *sn_launcher;
+ guint timeout_id;
+ guint watch_id;
+ GPid pid;
+} TvsnStartupData;
+
static gboolean
tvsn_startup_timeout (gpointer data)
{
- SnLauncherContext *sn_launcher = data;
- GTimeVal now;
- gdouble elapsed;
- glong tv_sec;
- glong tv_usec;
+ TvsnStartupData *startup_data = data;
+ GTimeVal now;
+ gdouble elapsed;
+ glong tv_sec;
+ glong tv_usec;
GDK_THREADS_ENTER ();
/* determine the amount of elapsed time */
g_get_current_time (&now);
- sn_launcher_context_get_last_active_time (sn_launcher, &tv_sec, &tv_usec);
+ sn_launcher_context_get_last_active_time (startup_data->sn_launcher,
&tv_sec, &tv_usec);
elapsed = (((gdouble) now.tv_sec - tv_sec) * G_USEC_PER_SEC + (now.tv_usec -
tv_usec)) / 1000.0;
/* check if the timeout was reached */
if (elapsed >= TVSN_STARTUP_TIMEOUT)
{
/* abort the startup notification */
- sn_launcher_context_complete (sn_launcher);
- sn_launcher_context_unref (sn_launcher);
+ sn_launcher_context_complete (startup_data->sn_launcher);
+ sn_launcher_context_unref (startup_data->sn_launcher);
+ startup_data->sn_launcher = NULL;
}
GDK_THREADS_LEAVE ();
@@ -303,6 +313,44 @@
return (elapsed < TVSN_STARTUP_TIMEOUT);
}
+static void
+tvsn_startup_timeout_destroy (gpointer data)
+{
+ TvsnStartupData *startup_data = data;
+
+ _thunar_vfs_return_if_fail (startup_data->sn_launcher == NULL);
+
+ /* cancel the watch (if any) */
+ if (startup_data->watch_id != 0)
+ g_source_remove (startup_data->watch_id);
+
+ /* close the PID */
+ g_spawn_close_pid (startup_data->pid);
+
+ /* release the startup data */
+ _thunar_vfs_slice_free (TvsnStartupData, startup_data);
+}
+
+static void
+tvsn_startup_watch (GPid pid,
+ gint status,
+ gpointer data)
+{
+ TvsnStartupData *startup_data = data;
+
+ _thunar_vfs_return_if_fail (startup_data->sn_launcher != NULL);
+ _thunar_vfs_return_if_fail (startup_data->watch_id != 0);
+ _thunar_vfs_return_if_fail (startup_data->pid == pid);
+
+ /* abort the startup notification (application exited) */
+ sn_launcher_context_complete (startup_data->sn_launcher);
+ sn_launcher_context_unref (startup_data->sn_launcher);
+ startup_data->sn_launcher = NULL;
+
+ /* cancel the startup notification timeout */
+ g_source_remove (startup_data->timeout_id);
+}
+
static gint
tvsn_get_active_workspace_number (GdkScreen *screen)
{
@@ -365,6 +413,7 @@
* @envp : child's environment vector or %NULL to inherit
parent's.
* @flags : flags from #GSpawnFlags.
* @startup_notify : whether to use startup notification.
+ * @icon_name : application icon or %NULL.
* @error : return location for errors or %NULL.
*
* Like gdk_spawn_on_screen(), but also supports startup notification
@@ -379,17 +428,20 @@
gchar **envp,
GSpawnFlags flags,
gboolean startup_notify,
+ const gchar *icon_name,
GError **error)
{
#ifdef HAVE_LIBSTARTUP_NOTIFICATION
SnLauncherContext *sn_launcher = NULL;
- extern char **environ;
+ TvsnStartupData *startup_data;
+ extern gchar **environ;
SnDisplay *sn_display = NULL;
gint sn_workspace;
gint n, m;
#endif
gboolean succeed;
gchar **sn_envp = envp;
+ GPid pid;
#ifdef HAVE_LIBSTARTUP_NOTIFICATION
/* initialize the sn launcher context */
@@ -409,6 +461,7 @@
sn_workspace = tvsn_get_active_workspace_number (screen);
sn_launcher_context_set_binary_name (sn_launcher, argv[0]);
sn_launcher_context_set_workspace (sn_launcher, sn_workspace);
+ sn_launcher_context_set_icon_name (sn_launcher, (icon_name !=
NULL) ? icon_name : "applications-other");
sn_launcher_context_initiate (sn_launcher, g_get_prgname (),
argv[0], CurrentTime);
/* setup the child environment */
@@ -422,13 +475,16 @@
sn_envp[m++] = g_strdup (envp[n]);
sn_envp[m++] = g_strconcat ("DESKTOP_STARTUP_ID=",
sn_launcher_context_get_startup_id (sn_launcher), NULL);
sn_envp[m] = NULL;
+
+ /* we want to watch the child process */
+ flags |= G_SPAWN_DO_NOT_REAP_CHILD;
}
}
}
#endif
/* try to spawn the new process */
- succeed = gdk_spawn_on_screen (screen, working_directory, argv, sn_envp,
flags, NULL, NULL, NULL, error);
+ succeed = gdk_spawn_on_screen (screen, working_directory, argv, sn_envp,
flags, NULL, NULL, &pid, error);
#ifdef HAVE_LIBSTARTUP_NOTIFICATION
/* handle the sn launcher context */
@@ -443,7 +499,12 @@
else
{
/* schedule a startup notification timeout */
- g_timeout_add (TVSN_STARTUP_TIMEOUT, tvsn_startup_timeout,
sn_launcher);
+ startup_data = _thunar_vfs_slice_new (TvsnStartupData);
+ startup_data->sn_launcher = sn_launcher;
+ startup_data->timeout_id = g_timeout_add_full (G_PRIORITY_LOW,
TVSN_STARTUP_TIMEOUT, tvsn_startup_timeout,
+ startup_data,
tvsn_startup_timeout_destroy);
+ startup_data->watch_id = g_child_watch_add_full (G_PRIORITY_LOW,
pid, tvsn_startup_watch, startup_data, NULL);
+ startup_data->pid = pid;
}
}
Modified: thunar/trunk/thunar-vfs/thunar-vfs-exec.h
===================================================================
--- thunar/trunk/thunar-vfs/thunar-vfs-exec.h 2007-01-14 18:23:09 UTC (rev
24450)
+++ thunar/trunk/thunar-vfs/thunar-vfs-exec.h 2007-01-14 18:27:38 UTC (rev
24451)
@@ -1,6 +1,6 @@
/* $Id$ */
/*-
- * Copyright (c) 2005 Benedikt Meurer <[EMAIL PROTECTED]>
+ * Copyright (c) 2005-2007 Benedikt Meurer <[EMAIL PROTECTED]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -41,6 +41,7 @@
gchar **envp,
GSpawnFlags flags,
gboolean startup_notify,
+ const gchar *icon_name,
GError **error) G_GNUC_INTERNAL;
gboolean thunar_vfs_exec_sync (const gchar *command_line,
Modified: thunar/trunk/thunar-vfs/thunar-vfs-info.c
===================================================================
--- thunar/trunk/thunar-vfs/thunar-vfs-info.c 2007-01-14 18:23:09 UTC (rev
24450)
+++ thunar/trunk/thunar-vfs/thunar-vfs-info.c 2007-01-14 18:27:38 UTC (rev
24451)
@@ -1,6 +1,6 @@
/* $Id$ */
/*-
- * Copyright (c) 2005-2006 Benedikt Meurer <[EMAIL PROTECTED]>
+ * Copyright (c) 2005-2007 Benedikt Meurer <[EMAIL PROTECTED]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -332,7 +332,7 @@
GError **error)
{
ThunarVfsPath *parent;
- const gchar *icon;
+ const gchar *icon = NULL;
const gchar *name;
const gchar *type;
const gchar *url;
@@ -453,7 +453,7 @@
}
/* execute the command */
- result = thunar_vfs_exec_on_screen (screen, directory, argv, NULL,
G_SPAWN_SEARCH_PATH, startup_notify, error);
+ result = thunar_vfs_exec_on_screen (screen, directory, argv, NULL,
G_SPAWN_SEARCH_PATH, startup_notify, icon, error);
/* release the working directory */
g_free (directory);
Modified: thunar/trunk/thunar-vfs/thunar-vfs-mime-handler.c
===================================================================
--- thunar/trunk/thunar-vfs/thunar-vfs-mime-handler.c 2007-01-14 18:23:09 UTC
(rev 24450)
+++ thunar/trunk/thunar-vfs/thunar-vfs-mime-handler.c 2007-01-14 18:27:38 UTC
(rev 24451)
@@ -1,6 +1,6 @@
/* $Id$ */
/*-
- * Copyright (c) 2005-2006 Benedikt Meurer <[EMAIL PROTECTED]>
+ * Copyright (c) 2005-2007 Benedikt Meurer <[EMAIL PROTECTED]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -286,7 +286,8 @@
/* try to spawn the application */
result = thunar_vfs_exec_on_screen (screen, working_directory, argv, envp,
G_SPAWN_SEARCH_PATH,
- mime_handler->flags &
THUNAR_VFS_MIME_HANDLER_SUPPORTS_STARTUP_NOTIFY, error);
+ mime_handler->flags &
THUNAR_VFS_MIME_HANDLER_SUPPORTS_STARTUP_NOTIFY,
+ mime_handler->icon, error);
/* cleanup */
g_free (working_directory);
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits