From 6bb533cf0a1bd0eb8b60f26ad022753608e519e8 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 13 May 2015 10:56:09 -0400 Subject: [PATCH 04/19] stop using gsm_util_get_current_desktop It no longer exists. --- capplet/gsp-app.c | 111 +++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/capplet/gsp-app.c b/capplet/gsp-app.c index c92b8dad..123ab217 100644 --- a/capplet/gsp-app.c +++ b/capplet/gsp-app.c @@ -3,60 +3,61 @@ * Copyright (C) 1999 Free Software Foundation, Inc. * Copyright (C) 2007, 2009 Vincent Untz. * Copyright (C) 2008 Lucas Rocha. * Copyright (C) 2008 William Jon McCann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include +#include #include "gsm-app-dialog.h" #include "gsm-properties-dialog.h" #include "gsm-util.h" #include "gsp-app-manager.h" #include "gsp-keyfile.h" #include "gsp-app.h" #define GSP_APP_SAVE_DELAY 2 #define GSP_ASP_SAVE_MASK_HIDDEN 0x0001 #define GSP_ASP_SAVE_MASK_ENABLED 0x0002 #define GSP_ASP_SAVE_MASK_NAME 0x0004 #define GSP_ASP_SAVE_MASK_EXEC 0x0008 #define GSP_ASP_SAVE_MASK_COMMENT 0x0010 #define GSP_ASP_SAVE_MASK_NO_DISPLAY 0x0020 #define GSP_ASP_SAVE_MASK_ALL 0xffff struct _GspAppPrivate { char *basename; char *path; gboolean hidden; gboolean no_display; gboolean enabled; gboolean shown; char *name; char *exec; @@ -281,148 +282,145 @@ _gsp_app_update_description (GspApp *app) } else { secondary = _("No description"); } g_free (app->priv->description); app->priv->description = g_markup_printf_escaped ("%s\n%s", primary, secondary); } /* * Saving */ static void _gsp_ensure_user_autostart_dir (void) { char *dir; dir = g_build_filename (g_get_user_config_dir (), "autostart", NULL); g_mkdir_with_parents (dir, S_IRWXU); g_free (dir); } static gboolean _gsp_app_user_equal_system (GspApp *app, char **system_path) { GspAppManager *manager; - const char *system_dir; - char *path; - char *str; - GKeyFile *keyfile; + gboolean return_value = FALSE; + const char *system_dir = NULL; + char *path = NULL; + char *str = NULL; + GKeyFile *keyfile = NULL; + GDesktopAppInfo *app_info = NULL; manager = gsp_app_manager_get (); system_dir = gsp_app_manager_get_dir (manager, app->priv->xdg_system_position); g_object_unref (manager); if (!system_dir) { - return FALSE; + goto out; } path = g_build_filename (system_dir, app->priv->basename, NULL); keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) { - g_free (path); - g_key_file_free (keyfile); - return FALSE; + goto out; } - if (gsp_key_file_get_boolean (keyfile, - G_KEY_FILE_DESKTOP_KEY_HIDDEN, - FALSE) != app->priv->hidden || - gsp_key_file_get_boolean (keyfile, - GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED, - TRUE) != app->priv->enabled || - gsp_key_file_get_shown (keyfile, - gsm_util_get_current_desktop ()) != app->priv->shown) { - g_free (path); - g_key_file_free (keyfile); - return FALSE; + app_info = g_desktop_app_info_new_from_keyfile (keyfile); + + if (!app_info) { + goto out; } - if (gsp_key_file_get_boolean (keyfile, - G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, - FALSE) != app->priv->no_display) { - g_free (path); - g_key_file_free (keyfile); - return FALSE; + if (g_desktop_app_info_get_is_hidden (app_info)) { + goto out; + } + + if (g_desktop_app_info_has_key (app_info, + GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED) && + !g_desktop_app_info_get_boolean (app_info, + GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED)) { + goto out; + } + + if (!g_desktop_app_info_get_show_in (app_info, NULL)) { + goto out; + } + + if (g_desktop_app_info_get_nodisplay (app_info)) { + goto out; } str = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_NAME); if (!_gsp_str_equal (str, app->priv->name)) { - g_free (str); - g_free (path); - g_key_file_free (keyfile); - return FALSE; + goto out; } - g_free (str); + g_clear_pointer (&str, g_free); str = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_COMMENT); if (!_gsp_str_equal (str, app->priv->comment)) { - g_free (str); - g_free (path); - g_key_file_free (keyfile); - return FALSE; + goto out; } - g_free (str); + g_clear_pointer (&str, g_free); str = gsp_key_file_get_string (keyfile, G_KEY_FILE_DESKTOP_KEY_EXEC); if (!_gsp_str_equal (str, app->priv->exec)) { - g_free (str); - g_free (path); - g_key_file_free (keyfile); - return FALSE; + goto out; } - g_free (str); + g_clear_pointer (&str, g_free); str = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_ICON); if (!_gsp_str_equal (str, app->priv->icon)) { - g_free (str); - g_free (path); - g_key_file_free (keyfile); - return FALSE; + goto out; } - g_free (str); - - g_key_file_free (keyfile); + g_clear_pointer (&str, g_free); *system_path = path; - - return TRUE; + path = NULL; + return_value = TRUE; +out: + g_clear_pointer (&path, g_free); + g_clear_pointer (&str, g_free); + g_clear_object (&app_info); + g_clear_pointer (&keyfile, g_key_file_free); + + return return_value; } static inline void _gsp_app_save_done_success (GspApp *app) { app->priv->save_mask = 0; if (app->priv->old_system_path) { g_free (app->priv->old_system_path); app->priv->old_system_path = NULL; } } static gboolean _gsp_app_save (gpointer data) { GspApp *app; char *use_path; GKeyFile *keyfile; GError *error; app = GSP_APP (data); /* first check if removing the data from the user dir and using the * data from the system dir is enough -- this helps us keep clean the * user config dir by removing unneeded files */ if (_gsp_app_user_equal_system (app, &use_path)) { if (g_file_test (app->priv->path, G_FILE_TEST_EXISTS)) { g_remove (app->priv->path); } @@ -748,153 +746,164 @@ gsp_app_delete (GspApp *app) app->priv->hidden = TRUE; app->priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN; _gsp_app_queue_save (app); _gsp_app_emit_changed (app); } } /* * New autostart app */ void gsp_app_reload_at (GspApp *app, const char *path, unsigned int xdg_position) { g_return_if_fail (GSP_IS_APP (app)); app->priv->xdg_position = G_MAXUINT; gsp_app_new (path, xdg_position); } GspApp * gsp_app_new (const char *path, unsigned int xdg_position) { GspAppManager *manager; GspApp *app; GKeyFile *keyfile; + GDesktopAppInfo *app_info; char *basename; gboolean new; basename = g_path_get_basename (path); manager = gsp_app_manager_get (); app = gsp_app_manager_find_app_with_basename (manager, basename); g_object_unref (manager); new = (app == NULL); if (!new) { if (app->priv->xdg_position == xdg_position) { if (app->priv->skip_next_monitor_event) { app->priv->skip_next_monitor_event = FALSE; return NULL; } /* else: the file got changed but not by us, we'll * update our data from disk */ } if (app->priv->xdg_position < xdg_position || app->priv->save_timeout != 0) { /* we don't really care about this file, since we * already have something with a higher priority, or * we're going to write something in the user config * anyway. * Note: xdg_position >= 1 so it's a system dir */ app->priv->xdg_system_position = MIN (xdg_position, app->priv->xdg_system_position); return NULL; } } keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) { g_key_file_free (keyfile); g_free (basename); return NULL; } + app_info = g_desktop_app_info_new_from_keyfile (keyfile); + + if (!app_info) { + g_object_unref (app_info); + g_key_file_free (keyfile); + g_free (basename); + return NULL; + } + if (new) { app = g_object_new (GSP_TYPE_APP, NULL); app->priv->basename = basename; } else { g_free (basename); _gsp_app_free_reusable_data (app); } + app->priv->path = g_strdup (path); app->priv->hidden = gsp_key_file_get_boolean (keyfile, G_KEY_FILE_DESKTOP_KEY_HIDDEN, FALSE); app->priv->no_display = gsp_key_file_get_boolean (keyfile, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, FALSE); app->priv->enabled = gsp_key_file_get_boolean (keyfile, GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED, TRUE); - app->priv->shown = gsp_key_file_get_shown (keyfile, - gsm_util_get_current_desktop ()); + app->priv->shown = g_desktop_app_info_get_show_in (app_info, NULL); app->priv->name = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_NAME); app->priv->exec = gsp_key_file_get_string (keyfile, G_KEY_FILE_DESKTOP_KEY_EXEC); app->priv->comment = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_COMMENT); if (gsm_util_text_is_blank (app->priv->name)) { g_free (app->priv->name); app->priv->name = g_strdup (app->priv->exec); } app->priv->icon = gsp_key_file_get_locale_string (keyfile, G_KEY_FILE_DESKTOP_KEY_ICON); if (app->priv->icon) { /* look at icon and see if it's a themed icon or not */ if (g_path_is_absolute (app->priv->icon)) { GFile *iconfile; iconfile = g_file_new_for_path (app->priv->icon); app->priv->gicon = g_file_icon_new (iconfile); g_object_unref (iconfile); } else { app->priv->gicon = g_themed_icon_new (app->priv->icon); } } else { app->priv->gicon = NULL; } + g_object_unref (app_info); g_key_file_free (keyfile); _gsp_app_update_description (app); if (xdg_position > 0) { g_assert (xdg_position <= app->priv->xdg_system_position); app->priv->xdg_system_position = xdg_position; } /* else we keep the old value (which is G_MAXUINT if it wasn't set) */ app->priv->xdg_position = xdg_position; g_assert (!new || app->priv->save_timeout == 0); app->priv->save_timeout = 0; app->priv->old_system_path = NULL; app->priv->skip_next_monitor_event = FALSE; if (!new) { _gsp_app_emit_changed (app); } return app; } static char * _gsp_find_free_basename (const char *suggested_basename) { GspAppManager *manager; char *base_path; char *filename; char *basename; -- 2.17.0