|
|
|
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
|
|
|
|
|