You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

441 lines
15 KiB

From 6bb533cf0a1bd0eb8b60f26ad022753608e519e8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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 <jmccann@redhat.com>
*
* 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 <config.h>
#endif
#include <string.h>
#include <sys/stat.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
+#include <gio/gdesktopappinfo.h>
#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 ("<b>%s</b>\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