From 93fd3a3317a107cc56815bd81f29984fc0330878 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Thu, 23 Dec 2010 17:57:33 +0100 Subject: [PATCH] smclient: Update smclient from libegg --- cut-n-paste/smclient/eggdesktopfile.c | 83 ++++++++++++++++------ cut-n-paste/smclient/eggdesktopfile.h | 8 ++- cut-n-paste/smclient/eggsmclient-osx.c | 2 +- cut-n-paste/smclient/eggsmclient-private.h | 6 ++ cut-n-paste/smclient/eggsmclient-xsmp.c | 17 +++-- cut-n-paste/smclient/eggsmclient.c | 29 ++++++-- 6 files changed, 109 insertions(+), 36 deletions(-) diff --git a/cut-n-paste/smclient/eggdesktopfile.c b/cut-n-paste/smclient/eggdesktopfile.c index a05b88df..b50f225c 100644 --- a/cut-n-paste/smclient/eggdesktopfile.c +++ b/cut-n-paste/smclient/eggdesktopfile.c @@ -431,6 +431,16 @@ egg_desktop_file_get_numeric (EggDesktopFile *desktop_file, error); } +int +egg_desktop_file_get_integer (EggDesktopFile *desktop_file, + const char *key, + GError **error) +{ + return g_key_file_get_integer (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + error); +} + char ** egg_desktop_file_get_string_list (EggDesktopFile *desktop_file, const char *key, @@ -1274,8 +1284,8 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, out: if (env) { - g_strfreev ((char **)env->pdata); - g_ptr_array_free (env, FALSE); + g_ptr_array_foreach (env, (GFunc)g_free, NULL); + g_ptr_array_free (env, TRUE); } free_document_list (translated_documents); @@ -1386,6 +1396,8 @@ egg_desktop_file_launch (EggDesktopFile *desktop_file, free_document_list (documents); break; + case EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED: + case EGG_DESKTOP_FILE_TYPE_DIRECTORY: default: g_set_error (error, EGG_DESKTOP_FILE_ERROR, EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE, @@ -1408,23 +1420,9 @@ egg_desktop_file_error_quark (void) G_LOCK_DEFINE_STATIC (egg_desktop_file); static EggDesktopFile *egg_desktop_file; -/** - * egg_set_desktop_file: - * @desktop_file_path: path to the application's desktop file - * - * Creates an #EggDesktopFile for the application from the data at - * @desktop_file_path. This will also call g_set_application_name() - * with the localized application name from the desktop file, and - * gtk_window_set_default_icon_name() or - * gtk_window_set_default_icon_from_file() with the application's - * icon. Other code may use additional information from the desktop - * file. - * - * Note that for thread safety reasons, this function can only - * be called once. - **/ -void -egg_set_desktop_file (const char *desktop_file_path) +static void +egg_set_desktop_file_internal (const char *desktop_file_path, + gboolean set_defaults) { GError *error = NULL; @@ -1440,7 +1438,7 @@ egg_set_desktop_file (const char *desktop_file_path) g_error_free (error); } - if (egg_desktop_file) { + if (set_defaults && egg_desktop_file != NULL) { /* Set localized application name and default window icon */ if (egg_desktop_file->name) g_set_application_name (egg_desktop_file->name); @@ -1456,6 +1454,51 @@ egg_set_desktop_file (const char *desktop_file_path) G_UNLOCK (egg_desktop_file); } +/** + * egg_set_desktop_file: + * @desktop_file_path: path to the application's desktop file + * + * Creates an #EggDesktopFile for the application from the data at + * @desktop_file_path. This will also call g_set_application_name() + * with the localized application name from the desktop file, and + * gtk_window_set_default_icon_name() or + * gtk_window_set_default_icon_from_file() with the application's + * icon. Other code may use additional information from the desktop + * file. + * See egg_set_desktop_file_without_defaults() for a variant of this + * function that does not set the application name and default window + * icon. + * + * Note that for thread safety reasons, this function can only + * be called once, and is mutually exclusive with calling + * egg_set_desktop_file_without_defaults(). + **/ +void +egg_set_desktop_file (const char *desktop_file_path) +{ + egg_set_desktop_file_internal (desktop_file_path, TRUE); +} + +/** + * egg_set_desktop_file_without_defaults: + * @desktop_file_path: path to the application's desktop file + * + * Creates an #EggDesktopFile for the application from the data at + * @desktop_file_path. + * See egg_set_desktop_file() for a variant of this function that + * sets the application name and default window icon from the information + * in the desktop file. + * + * Note that for thread safety reasons, this function can only + * be called once, and is mutually exclusive with calling + * egg_set_desktop_file(). + **/ +void +egg_set_desktop_file_without_defaults (const char *desktop_file_path) +{ + egg_set_desktop_file_internal (desktop_file_path, FALSE); +} + /** * egg_get_desktop_file: * diff --git a/cut-n-paste/smclient/eggdesktopfile.h b/cut-n-paste/smclient/eggdesktopfile.h index 2be36210..0e9f4018 100644 --- a/cut-n-paste/smclient/eggdesktopfile.h +++ b/cut-n-paste/smclient/eggdesktopfile.h @@ -127,6 +127,9 @@ gboolean egg_desktop_file_get_boolean (EggDesktopFile *desktop_file double egg_desktop_file_get_numeric (EggDesktopFile *desktop_file, const char *key, GError **error); +int egg_desktop_file_get_integer (EggDesktopFile *desktop_file, + const char *key, + GError **error); char **egg_desktop_file_get_string_list (EggDesktopFile *desktop_file, const char *key, gsize *length, @@ -150,8 +153,9 @@ typedef enum { } EggDesktopFileError; /* Global application desktop file */ -void egg_set_desktop_file (const char *desktop_file_path); -EggDesktopFile *egg_get_desktop_file (void); +void egg_set_desktop_file (const char *desktop_file_path); +void egg_set_desktop_file_without_defaults (const char *desktop_file_path); +EggDesktopFile *egg_get_desktop_file (void); G_END_DECLS diff --git a/cut-n-paste/smclient/eggsmclient-osx.c b/cut-n-paste/smclient/eggsmclient-osx.c index 5428c09f..06528eb2 100644 --- a/cut-n-paste/smclient/eggsmclient-osx.c +++ b/cut-n-paste/smclient/eggsmclient-osx.c @@ -37,7 +37,7 @@ #include "config.h" #include "eggsmclient-private.h" -#include +#include #include #include diff --git a/cut-n-paste/smclient/eggsmclient-private.h b/cut-n-paste/smclient/eggsmclient-private.h index fc3a0a2d..703c0034 100644 --- a/cut-n-paste/smclient/eggsmclient-private.h +++ b/cut-n-paste/smclient/eggsmclient-private.h @@ -20,7 +20,13 @@ #ifndef __EGG_SM_CLIENT_PRIVATE_H__ #define __EGG_SM_CLIENT_PRIVATE_H__ +#include + +#if !GTK_CHECK_VERSION(2,91,7) && !GTK_CHECK_VERSION(3,0,0) +/* GTK+ 3 includes this automatically */ #include +#endif + #include "eggsmclient.h" G_BEGIN_DECLS diff --git a/cut-n-paste/smclient/eggsmclient-xsmp.c b/cut-n-paste/smclient/eggsmclient-xsmp.c index d4cc9dcf..20cd23b1 100644 --- a/cut-n-paste/smclient/eggsmclient-xsmp.c +++ b/cut-n-paste/smclient/eggsmclient-xsmp.c @@ -36,6 +36,7 @@ #include #include +#include #define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ()) #define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP)) @@ -367,7 +368,11 @@ sm_client_xsmp_startup (EggSMClient *client, free (ret_client_id); gdk_threads_enter (); +#if !GTK_CHECK_VERSION(2,91,7) && !GTK_CHECK_VERSION(3,0,0) gdk_set_sm_client_id (xsmp->client_id); +#else + gdk_x11_set_sm_client_id (xsmp->client_id); +#endif gdk_threads_leave (); g_debug ("Got client ID \"%s\"", xsmp->client_id); @@ -1052,13 +1057,13 @@ generate_command (char **restart_command, const char *client_id, if (client_id) { - g_ptr_array_add (cmd, "--sm-client-id"); + g_ptr_array_add (cmd, (char *)"--sm-client-id"); g_ptr_array_add (cmd, (char *)client_id); } if (state_file) { - g_ptr_array_add (cmd, "--sm-client-state-file"); + g_ptr_array_add (cmd, (char *)"--sm-client-state-file"); g_ptr_array_add (cmd, (char *)state_file); } @@ -1141,7 +1146,7 @@ array_prop (const char *name, ...) prop = g_new (SmProp, 1); prop->name = (char *)name; - prop->type = SmLISTofARRAY8; + prop->type = (char *)SmLISTofARRAY8; vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue)); @@ -1175,7 +1180,7 @@ ptrarray_prop (const char *name, GPtrArray *values) prop = g_new (SmProp, 1); prop->name = (char *)name; - prop->type = SmLISTofARRAY8; + prop->type = (char *)SmLISTofARRAY8; vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue)); @@ -1205,7 +1210,7 @@ string_prop (const char *name, const char *value) prop = g_new (SmProp, 1); prop->name = (char *)name; - prop->type = SmARRAY8; + prop->type = (char *)SmARRAY8; prop->num_vals = 1; prop->vals = g_new (SmPropValue, 1); @@ -1230,7 +1235,7 @@ card8_prop (const char *name, unsigned char value) prop = g_new (SmProp, 1); prop->name = (char *)name; - prop->type = SmCARD8; + prop->type = (char *)SmCARD8; prop->num_vals = 1; prop->vals = g_new (SmPropValue, 2); diff --git a/cut-n-paste/smclient/eggsmclient.c b/cut-n-paste/smclient/eggsmclient.c index f2d2a503..513d938a 100644 --- a/cut-n-paste/smclient/eggsmclient.c +++ b/cut-n-paste/smclient/eggsmclient.c @@ -202,7 +202,8 @@ sm_client_post_parse_func (GOptionContext *context, * use the same client id. */ g_unsetenv ("DESKTOP_AUTOSTART_ID"); - if (EGG_SM_CLIENT_GET_CLASS (client)->startup) + if (global_client_mode != EGG_SM_CLIENT_MODE_DISABLED && + EGG_SM_CLIENT_GET_CLASS (client)->startup) EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id); return TRUE; } @@ -265,9 +266,9 @@ egg_sm_client_get_option_group (void) * Sets the "mode" of #EggSMClient as follows: * * %EGG_SM_CLIENT_MODE_DISABLED: Session management is completely - * disabled. The application will not even connect to the session - * manager. (egg_sm_client_get() will still return an #EggSMClient, - * but it will just be a dummy object.) + * disabled, until the mode is changed again. The application will + * not even connect to the session manager. (egg_sm_client_get() + * will still return an #EggSMClient object.) * * %EGG_SM_CLIENT_MODE_NO_RESTART: The application will connect to * the session manager (and thus will receive notification when the @@ -277,12 +278,27 @@ egg_sm_client_get_option_group (void) * %EGG_SM_CLIENT_MODE_NORMAL: The default. #EggSMCLient will * function normally. * - * This must be called before the application's main loop begins. + * This must be called before the application's main loop begins and + * before any call to egg_sm_client_get(), unless the mode was set + * earlier to %EGG_SM_CLIENT_MODE_DISABLED and this call enables + * session management. Note that option parsing will call + * egg_sm_client_get(). **/ void egg_sm_client_set_mode (EggSMClientMode mode) { + EggSMClientMode old_mode = global_client_mode; + + g_return_if_fail (global_client == NULL || global_client_mode == EGG_SM_CLIENT_MODE_DISABLED); + g_return_if_fail (!(global_client != NULL && mode == EGG_SM_CLIENT_MODE_DISABLED)); + global_client_mode = mode; + + if (global_client != NULL && old_mode == EGG_SM_CLIENT_MODE_DISABLED) + { + if (EGG_SM_CLIENT_GET_CLASS (global_client)->startup) + EGG_SM_CLIENT_GET_CLASS (global_client)->startup (global_client, sm_client_id); + } } /** @@ -317,8 +333,7 @@ egg_sm_client_get (void) { if (!global_client) { - if (global_client_mode != EGG_SM_CLIENT_MODE_DISABLED && - !sm_client_disable) + if (!sm_client_disable) { #if defined (GDK_WINDOWING_WIN32) global_client = egg_sm_client_win32_new (); -- 2.43.0