diff options
author | Cosimo Cecchi <cosimoc@src.gnome.org> | 2008-09-05 07:23:03 +0800 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@src.gnome.org> | 2008-09-05 07:23:03 +0800 |
commit | c445dfd01935d073d73cb6f1d758a7e08d7d25fe (patch) | |
tree | 016a17344c5b6dfea7e45941a00e47e972dd0da0 /lib | |
parent | 27896c9da1c67ad4da2112fcfd4fa9e5ecd028a0 (diff) | |
download | gsoc2013-epiphany-c445dfd01935d073d73cb6f1d758a7e08d7d25fe.tar.gz gsoc2013-epiphany-c445dfd01935d073d73cb6f1d758a7e08d7d25fe.tar.zst gsoc2013-epiphany-c445dfd01935d073d73cb6f1d758a7e08d7d25fe.zip |
Drop usage of EelAppLaunchContext; replace it with GdkAppLaunchContext.
Bug #550883.
svn path=/trunk/; revision=8457
Diffstat (limited to 'lib')
-rw-r--r-- | lib/egg/Makefile.am | 6 | ||||
-rw-r--r-- | lib/egg/eel-app-launch-context.c | 613 | ||||
-rw-r--r-- | lib/egg/eel-app-launch-context.h | 77 | ||||
-rw-r--r-- | lib/ephy-file-helpers.c | 24 |
4 files changed, 15 insertions, 705 deletions
diff --git a/lib/egg/Makefile.am b/lib/egg/Makefile.am index 9a7275373..da1d3abe6 100644 --- a/lib/egg/Makefile.am +++ b/lib/egg/Makefile.am @@ -2,15 +2,13 @@ EGGSOURCES = \ eggtreemultidnd.c \ egg-editable-toolbar.c \ egg-toolbars-model.c \ - egg-toolbar-editor.c \ - eel-app-launch-context.c + egg-toolbar-editor.c EGGHEADERS = \ eggtreemultidnd.h \ egg-editable-toolbar.h \ egg-toolbars-model.h \ - egg-toolbar-editor.h \ - eel-app-launch-context.h + egg-toolbar-editor.h noinst_HEADERS = \ $(EGGHEADERS) \ diff --git a/lib/egg/eel-app-launch-context.c b/lib/egg/eel-app-launch-context.c deleted file mode 100644 index e4cac819a..000000000 --- a/lib/egg/eel-app-launch-context.c +++ /dev/null @@ -1,613 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* eel-mount-operation.c - Gtk+ implementation for GAppLaunchContext - - Copyright (C) 2007 Red Hat, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - Author: Alexander Larsson <alexl@redhat.com> -*/ - -#include <config.h> -#include "eel-app-launch-context.h" - -#include <gio/gio.h> -#include <glib.h> -#include <string.h> - -#ifdef HAVE_STARTUP_NOTIFICATION -#define SN_API_NOT_YET_FROZEN -#include <libsn/sn.h> -#include <gdk/gdk.h> -#include <gtk/gtk.h> -#endif - -G_DEFINE_TYPE (EelAppLaunchContext, eel_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT); - -struct EelAppLaunchContextPrivate { - GdkDisplay *display; - GdkScreen *screen; - guint32 timestamp; - GIcon *icon; - char *icon_name; -}; - -static void -eel_app_launch_context_finalize (GObject *object) -{ - EelAppLaunchContext *context; - EelAppLaunchContextPrivate *priv; - - context = EEL_APP_LAUNCH_CONTEXT (object); - - priv = context->priv; - - if (priv->display) { - g_object_unref (priv->display); - } - if (priv->screen) { - g_object_unref (priv->screen); - } - if (priv->icon) { - g_object_unref (priv->screen); - } - g_free (priv->icon_name); - - (*G_OBJECT_CLASS (eel_app_launch_context_parent_class)->finalize) (object); -} - -static char * -get_display (GAppLaunchContext *context, - GAppInfo *info, - GList *files) -{ - GdkDisplay *display; - EelAppLaunchContextPrivate *priv; - - priv = EEL_APP_LAUNCH_CONTEXT (context)->priv; - - if (priv->screen) { - return gdk_screen_make_display_name (priv->screen); - } - - if (priv->display) { - display = priv->display; - } else { - display = gdk_display_get_default (); - } - - return g_strdup (gdk_display_get_name (display)); -} - -#ifdef HAVE_STARTUP_NOTIFICATION -static void -sn_error_trap_push (SnDisplay *display, - Display *xdisplay) -{ - gdk_error_trap_push (); -} - -static void -sn_error_trap_pop (SnDisplay *display, - Display *xdisplay) -{ - gdk_error_trap_pop (); -} - -static char * -get_display_name (GFile *file) -{ - 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); - } - - 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); - } - } - return name; -} - -static GIcon * -get_icon (GFile *file) -{ - 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); - } - - return icon; - -} - -static char * -gicon_to_string (GIcon *icon) -{ - GFile *file; - const char * const *names; - - if (G_IS_FILE_ICON (icon)) { - file = g_file_icon_get_file (G_FILE_ICON (icon)); - if (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 NULL; -} - -/* FIXME: This is the wrong way to do this; there should be some event - * (e.g. button press) available with a good time. A function like - * this should not be needed. - */ -static Time -slowly_and_stupidly_obtain_timestamp (Display *xdisplay) -{ - Window xwindow; - XEvent event; - - { - XSetWindowAttributes attrs; - Atom atom_name; - Atom atom_type; - char* name; - - attrs.override_redirect = True; - attrs.event_mask = PropertyChangeMask | StructureNotifyMask; - - xwindow = - XCreateWindow (xdisplay, - RootWindow (xdisplay, 0), - -100, -100, 1, 1, - 0, - CopyFromParent, - CopyFromParent, - (Visual *)CopyFromParent, - CWOverrideRedirect | CWEventMask, - &attrs); - - atom_name = XInternAtom (xdisplay, "WM_NAME", TRUE); - g_assert (atom_name != None); - atom_type = XInternAtom (xdisplay, "STRING", TRUE); - g_assert (atom_type != None); - - name = "Fake Window"; - XChangeProperty (xdisplay, - xwindow, atom_name, - atom_type, - 8, PropModeReplace, name, strlen (name)); - } - - XWindowEvent (xdisplay, - xwindow, - PropertyChangeMask, - &event); - - XDestroyWindow(xdisplay, xwindow); - - return event.xproperty.time; -} - -/* This should be fairly long, as it's confusing to users if a startup - * ends when it shouldn't (it appears that the startup failed, and - * they have to relaunch the app). Also the timeout only matters when - * there are bugs and apps don't end their own startup sequence. - * - * This timeout is a "last resort" timeout that ignores whether the - * startup sequence has shown activity or not. Metacity and the - * tasklist have smarter, and correspondingly able-to-be-shorter - * timeouts. The reason our timeout is dumb is that we don't monitor - * the sequence (don't use an SnMonitorContext) - */ -#define STARTUP_TIMEOUT_LENGTH (30 /* seconds */ * 1000) - -typedef struct -{ - GSList *contexts; - guint timeout_id; -} StartupTimeoutData; - -static void -free_startup_timeout (void *data) -{ - StartupTimeoutData *std; - - std = data; - - g_slist_foreach (std->contexts, - (GFunc) sn_launcher_context_unref, - NULL); - g_slist_free (std->contexts); - - if (std->timeout_id != 0) { - g_source_remove (std->timeout_id); - std->timeout_id = 0; - } - - g_free (std); -} - -static gboolean -startup_timeout (void *data) -{ - StartupTimeoutData *std; - GSList *tmp; - GTimeVal now; - int min_timeout; - - std = data; - - min_timeout = STARTUP_TIMEOUT_LENGTH; - - g_get_current_time (&now); - - tmp = std->contexts; - while (tmp != NULL) { - SnLauncherContext *sn_context; - GSList *next; - long tv_sec, tv_usec; - double elapsed; - - sn_context = tmp->data; - next = tmp->next; - - sn_launcher_context_get_last_active_time (sn_context, - &tv_sec, &tv_usec); - - elapsed = - ((((double)now.tv_sec - tv_sec) * G_USEC_PER_SEC + - (now.tv_usec - tv_usec))) / 1000.0; - - if (elapsed >= STARTUP_TIMEOUT_LENGTH) { - std->contexts = g_slist_remove (std->contexts, - sn_context); - sn_launcher_context_complete (sn_context); - sn_launcher_context_unref (sn_context); - } else { - min_timeout = MIN (min_timeout, (STARTUP_TIMEOUT_LENGTH - elapsed)); - } - - tmp = next; - } - - if (std->contexts == NULL) { - std->timeout_id = 0; - } else { - std->timeout_id = g_timeout_add (min_timeout, - startup_timeout, - std); - } - - /* always remove this one, but we may have reinstalled another one. */ - return FALSE; -} - -static void -add_startup_timeout (GdkScreen *screen, - SnLauncherContext *sn_context) -{ - StartupTimeoutData *data; - - data = g_object_get_data (G_OBJECT (screen), "appinfo-startup-data"); - if (data == NULL) { - data = g_new (StartupTimeoutData, 1); - data->contexts = NULL; - data->timeout_id = 0; - - g_object_set_data_full (G_OBJECT (screen), "appinfo-startup-data", - data, free_startup_timeout); - } - - sn_launcher_context_ref (sn_context); - data->contexts = g_slist_prepend (data->contexts, sn_context); - - if (data->timeout_id == 0) { - data->timeout_id = g_timeout_add (STARTUP_TIMEOUT_LENGTH, - startup_timeout, - data); - } -} - -#endif - - -static char * -get_startup_notify_id (GAppLaunchContext *context, - GAppInfo *info, - GList *files) -{ -#ifdef HAVE_STARTUP_NOTIFICATION - EelAppLaunchContextPrivate *priv; - SnLauncherContext *sn_context; - SnDisplay *sn_display; - GdkDisplay *display; - GdkScreen *screen; - int files_count; - char *name, *description, *icon_name; - const char *binary_name; - GIcon *icon; - guint32 timestamp; - char *id; - - priv = EEL_APP_LAUNCH_CONTEXT (context)->priv; - - if (priv->screen) { - screen = priv->screen; - display = gdk_screen_get_display (priv->screen); - } else if (priv->display) { - display = priv->display; - screen = gdk_display_get_default_screen (display); - } else { - display = gdk_display_get_default (); - screen = gdk_display_get_default_screen (display); - } - - sn_display = sn_display_new (gdk_display, - sn_error_trap_push, - sn_error_trap_pop); - - - sn_context = sn_launcher_context_new (sn_display, - gdk_screen_get_number (screen)); - - - files_count = g_list_length (files); - if (files_count == 1) { - name = get_display_name (files->data); - description = g_strdup_printf (_("Opening %s"), name); - } else { - name = NULL; - description = g_strdup_printf (ngettext ("Opening %d Item", - "Opening %d Items", - files_count), - files_count); - } - - if (name != NULL) { - sn_launcher_context_set_name (sn_context, name); - g_free (name); - } - - if (description != NULL) { - sn_launcher_context_set_description (sn_context, description); - g_free (description); - } - - icon_name = NULL; - if (priv->icon_name) { - icon_name = g_strdup (priv->icon_name); - } else { - icon = NULL; - - if (priv->icon != NULL) { - icon = g_object_ref (priv->icon); - } else if (files_count == 1) { - icon = get_icon (files->data); - } - - if (icon == NULL) { - icon = g_app_info_get_icon (info); - g_object_ref (icon); - } - - if (icon) { - icon_name = gicon_to_string (icon); - } - g_object_unref (icon); - } - - if (icon_name) { - sn_launcher_context_set_icon_name (sn_context, icon_name); - g_free (icon_name); - } - - - binary_name = g_app_info_get_executable (info); - sn_launcher_context_set_binary_name (sn_context, binary_name); - - timestamp = priv->timestamp; - if (timestamp == GDK_CURRENT_TIME) { - timestamp = gtk_get_current_event_time (); - } - if (timestamp == GDK_CURRENT_TIME) { - timestamp = slowly_and_stupidly_obtain_timestamp (GDK_SCREEN_XDISPLAY (screen)); - } - - sn_launcher_context_initiate (sn_context, - g_get_application_name () ? g_get_application_name () : "unknown", - binary_name, - timestamp); - - id = g_strdup (sn_launcher_context_get_startup_id (sn_context)); - - add_startup_timeout (screen, sn_context); - - sn_launcher_context_unref (sn_context); - - sn_display_unref (sn_display); - - return id; -#else - return NULL; -#endif -} - -static void -launch_failed (GAppLaunchContext *context, - const char *startup_notify_id) -{ -#ifdef HAVE_STARTUP_NOTIFICATION - EelAppLaunchContextPrivate *priv; - GdkScreen *screen; - StartupTimeoutData *data; - SnLauncherContext *sn_context; - GSList *l; - - priv = EEL_APP_LAUNCH_CONTEXT (context)->priv; - - if (priv->screen) { - screen = priv->screen; - } else if (priv->display) { - screen = gdk_display_get_default_screen (priv->display); - } else { - screen = gdk_display_get_default_screen (gdk_display_get_default ()); - } - - data = g_object_get_data (G_OBJECT (screen), "appinfo-startup-data"); - - if (data) { - for (l = data->contexts; l != NULL; l = l->next) { - sn_context = l->data; - if (strcmp (startup_notify_id, sn_launcher_context_get_startup_id (sn_context)) == 0) { - data->contexts = g_slist_remove (data->contexts, - sn_context); - sn_launcher_context_complete (sn_context); - sn_launcher_context_unref (sn_context); - break; - } - } - - if (data->contexts == NULL) { - g_source_remove (data->timeout_id); - data->timeout_id = 0; - } - } - -#endif - -} - - -static void -eel_app_launch_context_class_init (EelAppLaunchContextClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GAppLaunchContextClass *context_class = G_APP_LAUNCH_CONTEXT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (EelAppLaunchContextPrivate)); - - gobject_class->finalize = eel_app_launch_context_finalize; - - context_class->get_display = get_display; - context_class->get_startup_notify_id = get_startup_notify_id; - context_class->launch_failed = launch_failed; -} - -static void -eel_app_launch_context_init (EelAppLaunchContext *context) -{ - context->priv = G_TYPE_INSTANCE_GET_PRIVATE (context, - EEL_TYPE_APP_LAUNCH_CONTEXT, - EelAppLaunchContextPrivate); -} - -void -eel_app_launch_context_set_display (EelAppLaunchContext *context, - GdkDisplay *display) -{ - if (context->priv->display) { - g_object_unref (context->priv->display); - context->priv->display = NULL; - } - - if (display) { - context->priv->display = g_object_ref (display); - } -} - -void -eel_app_launch_context_set_screen (EelAppLaunchContext *context, - GdkScreen *screen) -{ - if (context->priv->screen) { - g_object_unref (context->priv->screen); - context->priv->screen = NULL; - } - - if (screen) { - context->priv->screen = g_object_ref (screen); - } -} - -void -eel_app_launch_context_set_timestamp (EelAppLaunchContext *context, - guint32 timestamp) -{ - context->priv->timestamp = timestamp; -} - -void -eel_app_launch_context_set_icon (EelAppLaunchContext *context, - GIcon *icon) -{ - if (context->priv->icon) { - g_object_unref (context->priv->icon); - context->priv->icon = NULL; - } - - if (icon) { - context->priv->icon = g_object_ref (icon); - } -} - -void -eel_app_launch_context_set_icon_name (EelAppLaunchContext *context, - const char *icon_name) -{ - g_free (context->priv->icon_name); - context->priv->icon_name = g_strdup (icon_name); -} - -EelAppLaunchContext * -eel_app_launch_context_new (void) -{ - EelAppLaunchContext *context; - - context = g_object_new (eel_app_launch_context_get_type (), NULL); - return context; -} diff --git a/lib/egg/eel-app-launch-context.h b/lib/egg/eel-app-launch-context.h deleted file mode 100644 index 25db482e3..000000000 --- a/lib/egg/eel-app-launch-context.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -/* eel-app-launch-context.h - Gtk+ implementation for GAppLaunchContext - - Copyright (C) 2007 Red Hat, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - Author: Alexander Larsson <alexl@redhat.com> -*/ - -#ifndef EEL_APP_LAUCH_CONTEXT_H -#define EEL_APP_LAUCH_CONTEXT_H - -#include <glib.h> -#include <gio/gio.h> -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define EEL_TYPE_APP_LAUNCH_CONTEXT (eel_app_launch_context_get_type ()) -#define EEL_APP_LAUNCH_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EEL_TYPE_APP_LAUNCH_CONTEXT, EelAppLaunchContext)) -#define EEL_APP_LAUNCH_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EEL_TYPE_APP_LAUNCH_CONTEXT, EelAppLaunchContextClass)) -#define EEL_IS_APP_LAUNCH_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EEL_TYPE_APP_LAUNCH_CONTEXT)) -#define EEL_IS_APP_LAUNCH_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EEL_TYPE_APP_LAUNCH_CONTEXT)) -#define EEL_APP_LAUNCH_CONTEXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EEL_TYPE_APP_LAUNCH_CONTEXT, EelAppLaunchContextClass)) - -typedef struct EelAppLaunchContext EelAppLaunchContext; -typedef struct EelAppLaunchContextClass EelAppLaunchContextClass; -typedef struct EelAppLaunchContextPrivate EelAppLaunchContextPrivate; - -struct EelAppLaunchContext -{ - GAppLaunchContext parent_instance; - - EelAppLaunchContextPrivate *priv; -}; - -struct EelAppLaunchContextClass -{ - GAppLaunchContextClass parent_class; - - -}; - -GType eel_app_launch_context_get_type (void); - -EelAppLaunchContext *eel_app_launch_context_new (void); -void eel_app_launch_context_set_display (EelAppLaunchContext *context, - GdkDisplay *display); -void eel_app_launch_context_set_screen (EelAppLaunchContext *context, - GdkScreen *screen); -void eel_app_launch_context_set_timestamp (EelAppLaunchContext *context, - guint32 timestamp); -void eel_app_launch_context_set_icon (EelAppLaunchContext *context, - GIcon *icon); -void eel_app_launch_context_set_icon_name (EelAppLaunchContext *context, - const char *icon_name); - -G_END_DECLS - -#endif /* EEL_APP_LAUNCH_CONTEXT_H */ - - diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c index ad7f65c39..b3ba240dd 100644 --- a/lib/ephy-file-helpers.c +++ b/lib/ephy-file-helpers.c @@ -27,7 +27,6 @@ #include "ephy-prefs.h" #include "eel-gconf-extensions.h" -#include "eel-app-launch-context.h" #include "ephy-debug.h" #include "ephy-string.h" @@ -35,6 +34,7 @@ #include <glib/gi18n.h> #include <gio/gio.h> #include <gio/gdesktopappinfo.h> +#include <gdk/gdk.h> #include <libgnome/gnome-init.h> #include <libxml/xmlreader.h> @@ -600,11 +600,12 @@ ephy_file_launch_application (GAppInfo *app, guint32 user_time, GtkWidget *widget) { - GAppLaunchContext *context; + GdkAppLaunchContext *context; GdkDisplay *display; GdkScreen *screen; + gboolean res; - context = G_APP_LAUNCH_CONTEXT (eel_app_launch_context_new ()); + context = gdk_app_launch_context_new (); if (widget) { display = gtk_widget_get_display (widget); @@ -616,14 +617,15 @@ ephy_file_launch_application (GAppInfo *app, screen = gdk_screen_get_default (); } - eel_app_launch_context_set_display (EEL_APP_LAUNCH_CONTEXT (context), - display); - eel_app_launch_context_set_screen (EEL_APP_LAUNCH_CONTEXT (context), - screen); - eel_app_launch_context_set_timestamp (EEL_APP_LAUNCH_CONTEXT (context), - user_time); - - return g_app_info_launch (app, files, context, NULL); + gdk_app_launch_context_set_display (context, display); + gdk_app_launch_context_set_screen (context, screen); + gdk_app_launch_context_set_timestamp (context, user_time); + + res = g_app_info_launch (app, files, + G_APP_LAUNCH_CONTEXT (context), NULL); + g_object_unref (context); + + return res; } gboolean |