X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=cut-n-paste%2Fsmclient%2Feggdesktopfile.c;h=357e548f5b2aabce6ff173b0c87ca59d9d664d9d;hb=3d3c4a5a08f1b8b536542735110c1376fb3e30bf;hp=ccc908302ad0de009ba4a35afbdc6c634c240cc0;hpb=83a7a11ba109b8aee5cdc047dec8b93967ccfc0e;p=evince.git diff --git a/cut-n-paste/smclient/eggdesktopfile.c b/cut-n-paste/smclient/eggdesktopfile.c index ccc90830..357e548f 100644 --- a/cut-n-paste/smclient/eggdesktopfile.c +++ b/cut-n-paste/smclient/eggdesktopfile.c @@ -31,9 +31,8 @@ #include #include -#include -#include #include +#include struct EggDesktopFile { GKeyFile *key_file; @@ -56,7 +55,6 @@ struct EggDesktopFile { EggDesktopFile * egg_desktop_file_new (const char *desktop_file_path, GError **error) { - EggDesktopFile *desktop_file; GKeyFile *key_file; key_file = g_key_file_new (); @@ -66,13 +64,8 @@ egg_desktop_file_new (const char *desktop_file_path, GError **error) return NULL; } - desktop_file = egg_desktop_file_new_from_key_file (key_file, - desktop_file_path, - error); - if (!desktop_file) - g_key_file_free (key_file); - - return desktop_file; + return egg_desktop_file_new_from_key_file (key_file, desktop_file_path, + error); } /** @@ -106,9 +99,42 @@ egg_desktop_file_new_from_data_dirs (const char *desktop_file_path, full_path, error); g_free (full_path); - if (!desktop_file) - g_key_file_free (key_file); + return desktop_file; +} + +/** + * egg_desktop_file_new_from_dirs: + * @desktop_file_path: relative path to a Freedesktop-style Desktop file + * @search_dirs: NULL-terminated array of directories to search + * @error: error pointer + * + * Looks for @desktop_file_path in the paths returned from + * g_get_user_data_dir() and g_get_system_data_dirs(), and creates + * a new #EggDesktopFile from it. + * + * Return value: the new #EggDesktopFile, or %NULL on error. + **/ +EggDesktopFile * +egg_desktop_file_new_from_dirs (const char *desktop_file_path, + const char **search_dirs, + GError **error) +{ + EggDesktopFile *desktop_file; + GKeyFile *key_file; + char *full_path; + + key_file = g_key_file_new (); + if (!g_key_file_load_from_dirs (key_file, desktop_file_path, search_dirs, + &full_path, 0, error)) + { + g_key_file_free (key_file); + return NULL; + } + desktop_file = egg_desktop_file_new_from_key_file (key_file, + full_path, + error); + g_free (full_path); return desktop_file; } @@ -119,8 +145,8 @@ egg_desktop_file_new_from_data_dirs (const char *desktop_file_path, * @error: error pointer * * Creates a new #EggDesktopFile for @key_file. Assumes ownership of - * @key_file on success (meaning it will be freed when the desktop_file - * is freed). + * @key_file (on success or failure); you should consider @key_file to + * be freed after calling this function. * * Return value: the new #EggDesktopFile, or %NULL on error. **/ @@ -137,6 +163,7 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, g_set_error (error, EGG_DESKTOP_FILE_ERROR, EGG_DESKTOP_FILE_ERROR_INVALID, _("File is not a valid .desktop file")); + g_key_file_free (key_file); return NULL; } @@ -160,13 +187,14 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, EGG_DESKTOP_FILE_ERROR_INVALID, _("Unrecognized desktop file Version '%s'"), version); g_free (version); + g_key_file_free (key_file); return NULL; } - else g_free (version); } desktop_file = g_new0 (EggDesktopFile, 1); + desktop_file->key_file = key_file; if (g_path_is_absolute (source)) desktop_file->source = g_filename_to_uri (source, NULL, NULL); @@ -202,7 +230,7 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, if (!exec) { egg_desktop_file_free (desktop_file); - g_free(type); + g_free (type); return NULL; } @@ -235,7 +263,7 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, if (!url) { egg_desktop_file_free (desktop_file); - g_free(type); + g_free (type); return NULL; } g_free (url); @@ -245,7 +273,7 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, else desktop_file->type = EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED; - g_free(type); + g_free (type); /* Check the Icon key */ desktop_file->icon = g_key_file_get_string (key_file, @@ -270,7 +298,6 @@ egg_desktop_file_new_from_key_file (GKeyFile *key_file, } } - desktop_file->key_file = key_file; return desktop_file; } @@ -290,22 +317,6 @@ egg_desktop_file_free (EggDesktopFile *desktop_file) g_free (desktop_file); } -/** - * egg_desktop_file_get_key_file: - * @desktop_file: an #EggDesktopFile - * - * Gets the #GKeyFile associated with @desktop_file. You must not free - * this value, and changes made to it will not be reflected by - * @desktop_file. - * - * Return value: the #GKeyFile associated with @desktop_file. - **/ -GKeyFile * -egg_desktop_file_get_key_file (EggDesktopFile *desktop_file) -{ - return desktop_file->key_file; -} - /** * egg_desktop_file_get_source: * @desktop_file: an #EggDesktopFile @@ -369,6 +380,81 @@ egg_desktop_file_get_icon (EggDesktopFile *desktop_file) return desktop_file->icon; } +gboolean +egg_desktop_file_has_key (EggDesktopFile *desktop_file, + const char *key, + GError **error) +{ + return g_key_file_has_key (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + error); +} + +char * +egg_desktop_file_get_string (EggDesktopFile *desktop_file, + const char *key, + GError **error) +{ + return g_key_file_get_string (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + error); +} + +char * +egg_desktop_file_get_locale_string (EggDesktopFile *desktop_file, + const char *key, + const char *locale, + GError **error) +{ + return g_key_file_get_locale_string (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, locale, + error); +} + +gboolean +egg_desktop_file_get_boolean (EggDesktopFile *desktop_file, + const char *key, + GError **error) +{ + return g_key_file_get_boolean (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + error); +} + +double +egg_desktop_file_get_numeric (EggDesktopFile *desktop_file, + const char *key, + GError **error) +{ + return g_key_file_get_double (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + error); +} + +char ** +egg_desktop_file_get_string_list (EggDesktopFile *desktop_file, + const char *key, + gsize *length, + GError **error) +{ + return g_key_file_get_string_list (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, length, + error); +} + +char ** +egg_desktop_file_get_locale_string_list (EggDesktopFile *desktop_file, + const char *key, + const char *locale, + gsize *length, + GError **error) +{ + return g_key_file_get_locale_string_list (desktop_file->key_file, + EGG_DESKTOP_FILE_GROUP, key, + locale, length, + error); +} + /** * egg_desktop_file_can_launch: * @desktop_file: an #EggDesktopFile @@ -823,7 +909,7 @@ parse_link (EggDesktopFile *desktop_file, return TRUE; } -#ifdef HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE +#if GTK_CHECK_VERSION (2, 12, 0) static char * start_startup_notification (GdkDisplay *display, EggDesktopFile *desktop_file, @@ -901,7 +987,7 @@ end_startup_notification (GdkDisplay *display, NULL); } -#define EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH (30 /* seconds */ * 1000) +#define EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH (30 /* seconds */) typedef struct { GdkDisplay *display; @@ -931,24 +1017,32 @@ set_startup_notification_timeout (GdkDisplay *display, sn_data->display = g_object_ref (display); sn_data->startup_id = g_strdup (startup_id); - g_timeout_add (EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH, - startup_notification_timeout, sn_data); + g_timeout_add_seconds (EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH, + startup_notification_timeout, sn_data); } -#endif /* HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE */ - -extern char **environ; +#endif /* GTK 2.12 */ static GPtrArray * array_putenv (GPtrArray *env, char *variable) { - int i, keylen; + guint i, keylen; if (!env) { + char **envp; + env = g_ptr_array_new (); - for (i = 0; environ[i]; i++) - g_ptr_array_add (env, g_strdup (environ[i])); + envp = g_listenv (); + for (i = 0; envp[i]; i++) + { + const char *value; + + value = g_getenv (envp[i]); + g_ptr_array_add (env, g_strdup_printf ("%s=%s", envp[i], + value ? value : "")); + } + g_strfreev (envp); } keylen = strcspn (variable, "="); @@ -978,7 +1072,7 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, GError **error) { EggDesktopFileLaunchOption option; - GSList *translated_documents, *docs; + GSList *translated_documents = NULL, *docs = NULL; char *command, **argv; int argc, i, screen_num; gboolean success, current_success; @@ -1113,7 +1207,7 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, } g_free (command); -#ifdef HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE +#if GTK_CHECK_VERSION (2, 12, 0) startup_id = start_startup_notification (display, desktop_file, argv[0], screen_num, workspace, launch_time); @@ -1126,7 +1220,10 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, } #else startup_id = NULL; -#endif /* HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE */ +#endif /* GTK 2.12 */ + + if (env != NULL) + g_ptr_array_add (env, NULL); current_success = g_spawn_async_with_pipes (directory, @@ -1141,7 +1238,7 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, if (startup_id) { -#ifdef HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE +#if GTK_CHECK_VERSION (2, 12, 0) if (current_success) { set_startup_notification_timeout (display, startup_id); @@ -1152,7 +1249,7 @@ egg_desktop_file_launchv (EggDesktopFile *desktop_file, g_free (startup_id); } else -#endif /* HAVE_GDK_X11_DISPLAY_BROADCAST_STARTUP_MESSAGE */ +#endif /* GTK 2.12 */ g_free (startup_id); } else if (ret_startup_id) @@ -1343,16 +1440,18 @@ egg_set_desktop_file (const char *desktop_file_path) g_error_free (error); } - /* Set localized application name and default window icon */ - if (egg_desktop_file->name) - g_set_application_name (egg_desktop_file->name); - if (egg_desktop_file->icon) - { - if (g_path_is_absolute (egg_desktop_file->icon)) - gtk_window_set_default_icon_from_file (egg_desktop_file->icon, NULL); - else - gtk_window_set_default_icon_name (egg_desktop_file->icon); - } + if (egg_desktop_file) { + /* Set localized application name and default window icon */ + if (egg_desktop_file->name) + g_set_application_name (egg_desktop_file->name); + if (egg_desktop_file->icon) + { + if (g_path_is_absolute (egg_desktop_file->icon)) + gtk_window_set_default_icon_from_file (egg_desktop_file->icon, NULL); + else + gtk_window_set_default_icon_name (egg_desktop_file->icon); + } + } G_UNLOCK (egg_desktop_file); }