summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2010-11-27 23:12:09 -0500
committerMatthias Clasen <mclasen@redhat.com>2010-11-27 23:12:09 -0500
commitb0bf2b5202782526edcba678c6239baecf897b16 (patch)
tree7e771c76a8c9a7e53d1c56b10aac14136731d014
parent289ad41bd105758110cc1861d623138aa77ec974 (diff)
downloadgtk+-b0bf2b5202782526edcba678c6239baecf897b16.tar.gz
Avoid delays in starting applications
Only query file info once, and don't do it for non-native files, since that may cause sync network IO. Bug http://bugzilla.gnome.org/show_bug.cgi?id=635588
-rw-r--r--gdk/x11/gdkapplaunchcontext-x11.c187
1 files changed, 95 insertions, 92 deletions
diff --git a/gdk/x11/gdkapplaunchcontext-x11.c b/gdk/x11/gdkapplaunchcontext-x11.c
index df3781edbb..5aea31d12a 100644
--- a/gdk/x11/gdkapplaunchcontext-x11.c
+++ b/gdk/x11/gdkapplaunchcontext-x11.c
@@ -36,54 +36,43 @@
#include <unistd.h>
static char *
-get_display_name (GFile *file)
+get_display_name (GFile *file,
+ GFileInfo *info)
{
- GFileInfo *info;
char *name, *tmp;
- /* This does sync I/O, which isn't ideal.
- * It should probably use the NautilusFile machinery
- */
-
name = NULL;
- info = g_file_query_info (file,
- G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, 0, NULL, NULL);
if (info)
- {
- name = g_strdup (g_file_info_get_display_name (info));
- g_object_unref (info);
- }
+ name = g_strdup (g_file_info_get_display_name (info));
if (name == NULL)
{
name = g_file_get_basename (file);
if (!g_utf8_validate (name, -1, NULL))
- {
- tmp = name;
- name =
- g_uri_escape_string (name, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH,
- TRUE);
- g_free (tmp);
- }
+ {
+ tmp = name;
+ name =
+ g_uri_escape_string (name, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE);
+ g_free (tmp);
+ }
}
return name;
}
static GIcon *
-get_icon (GFile *file)
+get_icon (GFile *file,
+ GFileInfo *info)
{
- GFileInfo *info;
GIcon *icon;
icon = NULL;
- info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_ICON, 0, NULL, NULL);
+
if (info)
{
icon = g_file_info_get_icon (info);
if (icon)
- g_object_ref (icon);
- g_object_unref (info);
+ g_object_ref (icon);
}
return icon;
@@ -99,13 +88,13 @@ gicon_to_string (GIcon *icon)
{
file = g_file_icon_get_file (G_FILE_ICON (icon));
if (file)
- return g_file_get_path (file);
+ return g_file_get_path (file);
}
else if (G_IS_THEMED_ICON (icon))
{
names = g_themed_icon_get_names (G_THEMED_ICON (icon));
if (names)
- return g_strdup (names[0]);
+ return g_strdup (names[0]);
}
else if (G_IS_EMBLEMED_ICON (icon))
{
@@ -121,11 +110,11 @@ gicon_to_string (GIcon *icon)
static void
end_startup_notification (GdkDisplay *display,
- const char *startup_id)
+ const char *startup_id)
{
gdk_x11_display_broadcast_startup_message (display, "remove",
- "ID", startup_id,
- NULL);
+ "ID", startup_id,
+ NULL);
}
@@ -210,19 +199,19 @@ startup_timeout (void *data)
next = tmp->next;
elapsed =
- ((((double) now.tv_sec - sn_data->time.tv_sec) * G_USEC_PER_SEC +
- (now.tv_usec - sn_data->time.tv_usec))) / 1000.0;
+ ((((double) now.tv_sec - sn_data->time.tv_sec) * G_USEC_PER_SEC +
+ (now.tv_usec - sn_data->time.tv_usec))) / 1000.0;
if (elapsed >= STARTUP_TIMEOUT_LENGTH)
- {
- std->contexts = g_slist_remove (std->contexts, sn_data);
- end_startup_notification (sn_data->display, sn_data->startup_id);
- free_startup_notification_data (sn_data);
- }
+ {
+ std->contexts = g_slist_remove (std->contexts, sn_data);
+ end_startup_notification (sn_data->display, sn_data->startup_id);
+ free_startup_notification_data (sn_data);
+ }
else
- {
- min_timeout = MIN (min_timeout, (STARTUP_TIMEOUT_LENGTH - elapsed));
- }
+ {
+ min_timeout = MIN (min_timeout, (STARTUP_TIMEOUT_LENGTH - elapsed));
+ }
tmp = next;
}
@@ -239,7 +228,7 @@ startup_timeout (void *data)
static void
add_startup_timeout (GdkScreen *screen,
- const char *startup_id)
+ const char *startup_id)
{
StartupTimeoutData *data;
StartupNotificationData *sn_data;
@@ -253,7 +242,7 @@ add_startup_timeout (GdkScreen *screen,
data->timeout_id = 0;
g_object_set_data_full (G_OBJECT (screen), "appinfo-startup-data",
- data, free_startup_timeout);
+ data, free_startup_timeout);
}
sn_data = g_new (StartupNotificationData, 1);
@@ -265,14 +254,14 @@ add_startup_timeout (GdkScreen *screen,
if (data->timeout_id == 0)
data->timeout_id = g_timeout_add_seconds (STARTUP_TIMEOUT_LENGTH_SECONDS,
- startup_timeout, data);
+ startup_timeout, data);
}
char *
_gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
- GAppInfo *info,
- GList *files)
+ GAppInfo *info,
+ GList *files)
{
static int sequence = 0;
GdkAppLaunchContextPrivate *priv;
@@ -288,6 +277,7 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
GIcon *icon;
guint32 timestamp;
char *startup_id;
+ GFileInfo *fileinfo;
priv = GDK_APP_LAUNCH_CONTEXT (context)->priv;
@@ -307,20 +297,32 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
screen = gdk_display_get_default_screen (display);
}
+ fileinfo = NULL;
+
files_count = g_list_length (files);
if (files_count == 0)
- description = g_strdup_printf (_("Starting %s"), g_app_info_get_name (info));
+ {
+ description = g_strdup_printf (_("Starting %s"), g_app_info_get_name (info));
+ }
else if (files_count == 1)
{
- gchar *display_name = get_display_name (files->data);
+ gchar *display_name;
+
+ if (g_file_is_native (files->data))
+ fileinfo = g_file_query_info (files->data,
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
+ G_FILE_ATTRIBUTE_STANDARD_ICON,
+ 0, NULL, NULL);
+
+ display_name = get_display_name (files->data, fileinfo);
description = g_strdup_printf (_("Opening %s"), display_name);
g_free (display_name);
}
else
description = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
- "Opening %d Item",
- "Opening %d Items",
- files_count), files_count);
+ "Opening %d Item",
+ "Opening %d Items",
+ files_count), files_count);
icon_name = NULL;
if (priv->icon_name)
@@ -330,18 +332,18 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
icon = NULL;
if (priv->icon != NULL)
- icon = g_object_ref (priv->icon);
+ icon = g_object_ref (priv->icon);
else if (files_count == 1)
- icon = get_icon (files->data);
+ icon = get_icon (files->data, fileinfo);
if (icon == NULL)
- {
- icon = g_app_info_get_icon (info);
- g_object_ref (icon);
- }
+ {
+ icon = g_app_info_get_icon (info);
+ g_object_ref (icon);
+ }
if (icon)
- icon_name = gicon_to_string (icon);
+ icon_name = gicon_to_string (icon);
g_object_unref (icon);
}
@@ -353,7 +355,7 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
timestamp = gdk_x11_display_get_user_time (display);
screen_str = g_strdup_printf ("%d", gdk_screen_get_number (screen));
- if (priv->workspace > -1)
+ if (priv->workspace > -1)
workspace_str = g_strdup_printf ("%d", priv->workspace);
else
workspace_str = NULL;
@@ -364,30 +366,31 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
application_id = NULL;
startup_id = g_strdup_printf ("%s-%lu-%s-%s-%d_TIME%lu",
- g_get_prgname (),
- (unsigned long)getpid (),
- g_get_host_name (),
- binary_name,
- sequence++,
- (unsigned long)timestamp);
-
-
+ g_get_prgname (),
+ (unsigned long)getpid (),
+ g_get_host_name (),
+ binary_name,
+ sequence++,
+ (unsigned long)timestamp);
+
gdk_x11_display_broadcast_startup_message (display, "new",
- "ID", startup_id,
- "NAME", g_app_info_get_name (info),
- "SCREEN", screen_str,
- "BIN", binary_name,
- "ICON", icon_name,
- "DESKTOP", workspace_str,
- "DESCRIPTION", description,
- "WMCLASS", NULL, /* FIXME */
- "APPLICATION_ID", application_id,
- NULL);
+ "ID", startup_id,
+ "NAME", g_app_info_get_name (info),
+ "SCREEN", screen_str,
+ "BIN", binary_name,
+ "ICON", icon_name,
+ "DESKTOP", workspace_str,
+ "DESCRIPTION", description,
+ "WMCLASS", NULL, /* FIXME */
+ "APPLICATION_ID", application_id,
+ NULL);
g_free (description);
g_free (screen_str);
g_free (workspace_str);
g_free (icon_name);
+ if (fileinfo)
+ g_object_unref (fileinfo);
add_startup_timeout (screen, startup_id);
@@ -396,8 +399,8 @@ _gdk_windowing_get_startup_notify_id (GAppLaunchContext *context,
void
-_gdk_windowing_launch_failed (GAppLaunchContext *context,
- const char *startup_notify_id)
+_gdk_windowing_launch_failed (GAppLaunchContext *context,
+ const char *startup_notify_id)
{
GdkAppLaunchContextPrivate *priv;
GdkScreen *screen;
@@ -419,22 +422,22 @@ _gdk_windowing_launch_failed (GAppLaunchContext *context,
if (data)
{
for (l = data->contexts; l != NULL; l = l->next)
- {
- sn_data = l->data;
- if (strcmp (startup_notify_id, sn_data->startup_id) == 0)
- {
- data->contexts = g_slist_remove (data->contexts, sn_data);
- end_startup_notification (sn_data->display, sn_data->startup_id);
- free_startup_notification_data (sn_data);
-
- break;
- }
- }
+ {
+ sn_data = l->data;
+ if (strcmp (startup_notify_id, sn_data->startup_id) == 0)
+ {
+ data->contexts = g_slist_remove (data->contexts, sn_data);
+ end_startup_notification (sn_data->display, sn_data->startup_id);
+ free_startup_notification_data (sn_data);
+
+ break;
+ }
+ }
if (data->contexts == NULL)
- {
- g_source_remove (data->timeout_id);
- data->timeout_id = 0;
- }
+ {
+ g_source_remove (data->timeout_id);
+ data->timeout_id = 0;
+ }
}
}