| /* gdkapplaunchcontext.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 this library. If not, see <http://www.gnu.org/licenses/>. |
| |
| Author: Alexander Larsson <alexl@redhat.com> |
| */ |
| |
| #include "config.h" |
| |
| #include "gdkapplaunchcontextprivate.h" |
| #include "gdkdisplay.h" |
| #include <glib/gi18n-lib.h> |
| |
| |
| /** |
| * GdkAppLaunchContext: |
| * |
| * `GdkAppLaunchContext` handles launching an application in a graphical context. |
| * |
| * It is an implementation of `GAppLaunchContext` that provides startup |
| * notification and allows to launch applications on a specific workspace. |
| * |
| * ## Launching an application |
| * |
| * ```c |
| * GdkAppLaunchContext *context; |
| * |
| * context = gdk_display_get_app_launch_context (display); |
| * |
| * gdk_app_launch_context_set_timestamp (gdk_event_get_time (event)); |
| * |
| * if (!g_app_info_launch_default_for_uri ("http://www.gtk.org", context, &error)) |
| * g_warning ("Launching failed: %s\n", error->message); |
| * |
| * g_object_unref (context); |
| * ``` |
| */ |
| |
| static void gdk_app_launch_context_finalize (GObject *object); |
| static char * gdk_app_launch_context_get_display_name (GAppLaunchContext *context, |
| GAppInfo *info, |
| GList *files); |
| static char * gdk_app_launch_context_get_startup_notify_id (GAppLaunchContext *context, |
| GAppInfo *info, |
| GList *files); |
| static void gdk_app_launch_context_launch_failed (GAppLaunchContext *context, |
| const char *startup_notify_id); |
| |
| |
| enum |
| { |
| PROP_0, |
| PROP_DISPLAY |
| }; |
| |
| G_DEFINE_TYPE (GdkAppLaunchContext, gdk_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT) |
| |
| static void |
| gdk_app_launch_context_get_property (GObject *object, |
| guint prop_id, |
| GValue *value, |
| GParamSpec *pspec) |
| { |
| GdkAppLaunchContext *context = GDK_APP_LAUNCH_CONTEXT (object); |
| |
| switch (prop_id) |
| { |
| case PROP_DISPLAY: |
| g_value_set_object (value, context->display); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| } |
| } |
| |
| static void |
| gdk_app_launch_context_set_property (GObject *object, |
| guint prop_id, |
| const GValue *value, |
| GParamSpec *pspec) |
| { |
| GdkAppLaunchContext *context = GDK_APP_LAUNCH_CONTEXT (object); |
| |
| switch (prop_id) |
| { |
| case PROP_DISPLAY: |
| context->display = g_value_dup_object (value); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| } |
| } |
| |
| static void |
| gdk_app_launch_context_class_init (GdkAppLaunchContextClass *klass) |
| { |
| GObjectClass *gobject_class = G_OBJECT_CLASS (klass); |
| GAppLaunchContextClass *context_class = G_APP_LAUNCH_CONTEXT_CLASS (klass); |
| |
| gobject_class->set_property = gdk_app_launch_context_set_property, |
| gobject_class->get_property = gdk_app_launch_context_get_property; |
| |
| gobject_class->finalize = gdk_app_launch_context_finalize; |
| |
| context_class->get_display = gdk_app_launch_context_get_display_name; |
| context_class->get_startup_notify_id = gdk_app_launch_context_get_startup_notify_id; |
| context_class->launch_failed = gdk_app_launch_context_launch_failed; |
| |
| /** |
| * GdkAppLaunchContext:display: (attributes org.gtk.Property.get=gdk_app_launch_context_get_display) |
| * |
| * The display that the `GdkAppLaunchContext` is on. |
| */ |
| g_object_class_install_property (gobject_class, PROP_DISPLAY, |
| g_param_spec_object ("display", NULL, NULL, |
| GDK_TYPE_DISPLAY, |
| G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); |
| } |
| |
| static void |
| gdk_app_launch_context_init (GdkAppLaunchContext *context) |
| { |
| context->workspace = -1; |
| } |
| |
| static void |
| gdk_app_launch_context_finalize (GObject *object) |
| { |
| GdkAppLaunchContext *context = GDK_APP_LAUNCH_CONTEXT (object); |
| |
| if (context->display) |
| g_object_unref (context->display); |
| |
| if (context->icon) |
| g_object_unref (context->icon); |
| |
| g_free (context->icon_name); |
| |
| G_OBJECT_CLASS (gdk_app_launch_context_parent_class)->finalize (object); |
| } |
| |
| static char * |
| gdk_app_launch_context_get_display_name (GAppLaunchContext *context, |
| GAppInfo *info, |
| GList *files) |
| { |
| GdkAppLaunchContext *ctx = GDK_APP_LAUNCH_CONTEXT (context); |
| GdkDisplay *display; |
| |
| if (ctx->display) |
| display = ctx->display; |
| else |
| display = gdk_display_get_default (); |
| |
| return g_strdup (gdk_display_get_name (display)); |
| } |
| |
| /** |
| * gdk_app_launch_context_get_display: (attributes org.gtk.Method.get_property=display) |
| * @context: a `GdkAppLaunchContext` |
| * |
| * Gets the `GdkDisplay` that @context is for. |
| * |
| * Returns: (transfer none): the display of @context |
| */ |
| GdkDisplay * |
| gdk_app_launch_context_get_display (GdkAppLaunchContext *context) |
| { |
| g_return_val_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context), NULL); |
| |
| return context->display; |
| } |
| |
| /** |
| * gdk_app_launch_context_set_desktop: |
| * @context: a `GdkAppLaunchContext` |
| * @desktop: the number of a workspace, or -1 |
| * |
| * Sets the workspace on which applications will be launched. |
| * |
| * This only works when running under a window manager that |
| * supports multiple workspaces, as described in the |
| * [Extended Window Manager Hints](http://www.freedesktop.org/Standards/wm-spec). |
| * Specifically this sets the `_NET_WM_DESKTOP` property described |
| * in that spec. |
| * |
| * This only works when using the X11 backend. |
| * |
| * When the workspace is not specified or @desktop is set to -1, |
| * it is up to the window manager to pick one, typically it will |
| * be the current workspace. |
| */ |
| void |
| gdk_app_launch_context_set_desktop (GdkAppLaunchContext *context, |
| int desktop) |
| { |
| g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context)); |
| |
| context->workspace = desktop; |
| } |
| |
| /** |
| * gdk_app_launch_context_set_timestamp: |
| * @context: a `GdkAppLaunchContext` |
| * @timestamp: a timestamp |
| * |
| * Sets the timestamp of @context. |
| * |
| * The timestamp should ideally be taken from the event that |
| * triggered the launch. |
| * |
| * Window managers can use this information to avoid moving the |
| * focus to the newly launched application when the user is busy |
| * typing in another window. This is also known as 'focus stealing |
| * prevention'. |
| */ |
| void |
| gdk_app_launch_context_set_timestamp (GdkAppLaunchContext *context, |
| guint32 timestamp) |
| { |
| g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context)); |
| |
| context->timestamp = timestamp; |
| } |
| |
| /** |
| * gdk_app_launch_context_set_icon: |
| * @context: a `GdkAppLaunchContext` |
| * @icon: (nullable): a `GIcon` |
| * |
| * Sets the icon for applications that are launched with this |
| * context. |
| * |
| * Window Managers can use this information when displaying startup |
| * notification. |
| * |
| * See also [method@Gdk.AppLaunchContext.set_icon_name]. |
| */ |
| void |
| gdk_app_launch_context_set_icon (GdkAppLaunchContext *context, |
| GIcon *icon) |
| { |
| g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context)); |
| g_return_if_fail (icon == NULL || G_IS_ICON (icon)); |
| |
| if (context->icon) |
| { |
| g_object_unref (context->icon); |
| context->icon = NULL; |
| } |
| |
| if (icon) |
| context->icon = g_object_ref (icon); |
| } |
| |
| /** |
| * gdk_app_launch_context_set_icon_name: |
| * @context: a `GdkAppLaunchContext` |
| * @icon_name: (nullable): an icon name |
| * |
| * Sets the icon for applications that are launched with this context. |
| * |
| * The @icon_name will be interpreted in the same way as the Icon field |
| * in desktop files. See also [method@Gdk.AppLaunchContext.set_icon]. |
| * |
| * If both @icon and @icon_name are set, the @icon_name takes priority. |
| * If neither @icon or @icon_name is set, the icon is taken from either |
| * the file that is passed to launched application or from the `GAppInfo` |
| * for the launched application itself. |
| */ |
| void |
| gdk_app_launch_context_set_icon_name (GdkAppLaunchContext *context, |
| const char *icon_name) |
| { |
| g_return_if_fail (GDK_IS_APP_LAUNCH_CONTEXT (context)); |
| |
| g_free (context->icon_name); |
| context->icon_name = g_strdup (icon_name); |
| } |
| |
| static char * |
| gdk_app_launch_context_get_startup_notify_id (GAppLaunchContext *context, |
| GAppInfo *info, |
| GList *files) |
| { |
| return NULL; |
| } |
| |
| static void |
| gdk_app_launch_context_launch_failed (GAppLaunchContext *context, |
| const char *startup_notify_id) |
| { |
| } |