/* 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 :
*
* 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,
N_PROPS
};
static GParamSpec *props[N_PROPS] = { NULL, };
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 :
*
* The display that the ` GdkAppLaunchContext ` is on .
*/
props[PROP_DISPLAY] = g_param_spec_object ("display" , NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME);
g_object_class_install_properties (gobject_class, N_PROPS, props);
}
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 :
* @ 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 ] ( https : //specifications.freedesktop.org/wm/latest/).
* 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));
g_clear_object (&context->icon);
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)
{
}
Messung V0.5 in Prozent C=99 H=96 G=97
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-07-02)
¤
*© Formatika GbR, Deutschland