summaryrefslogtreecommitdiff
path: root/capplet
diff options
context:
space:
mode:
Diffstat (limited to 'capplet')
-rw-r--r--capplet/Makefile.am2
-rw-r--r--capplet/gsm-app-dialog.c3
-rw-r--r--capplet/gsm-app-dialog.h1
-rw-r--r--capplet/gsm-properties-dialog.c160
-rw-r--r--capplet/gsm-properties-dialog.h1
-rw-r--r--capplet/gsp-app-manager.c6
-rw-r--r--capplet/gsp-app-manager.h1
-rw-r--r--capplet/gsp-app.c59
-rw-r--r--capplet/gsp-app.h6
-rw-r--r--capplet/gsp-keyfile.c34
-rw-r--r--capplet/gsp-keyfile.h6
-rw-r--r--capplet/main.c5
-rw-r--r--capplet/msm-desktop-app-dialog.c315
-rw-r--r--capplet/msm-desktop-app-dialog.h20
14 files changed, 470 insertions, 149 deletions
diff --git a/capplet/Makefile.am b/capplet/Makefile.am
index d2ccfdd..a680ea4 100644
--- a/capplet/Makefile.am
+++ b/capplet/Makefile.am
@@ -15,6 +15,8 @@ mate_session_properties_SOURCES = \
gsm-properties-dialog.c \
gsm-app-dialog.h \
gsm-app-dialog.c \
+ msm-desktop-app-dialog.h \
+ msm-desktop-app-dialog.c \
gsp-app.h \
gsp-app.c \
gsp-app-manager.h \
diff --git a/capplet/gsm-app-dialog.c b/capplet/gsm-app-dialog.c
index 9759bac..cdd39cc 100644
--- a/capplet/gsm-app-dialog.c
+++ b/capplet/gsm-app-dialog.c
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
@@ -185,7 +186,9 @@ setup_dialog (GsmAppDialog *dialog)
GError *error;
xml = gtk_builder_new ();
+#ifdef ENABLE_NLS
gtk_builder_set_translation_domain (xml, GETTEXT_PACKAGE);
+#endif /* ENABLE_NLS */
error = NULL;
if (!gtk_builder_add_from_file (xml,
diff --git a/capplet/gsm-app-dialog.h b/capplet/gsm-app-dialog.h
index bef0535..23d8301 100644
--- a/capplet/gsm-app-dialog.h
+++ b/capplet/gsm-app-dialog.h
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
diff --git a/capplet/gsm-properties-dialog.c b/capplet/gsm-properties-dialog.c
index 592b130..96a0dc3 100644
--- a/capplet/gsm-properties-dialog.c
+++ b/capplet/gsm-properties-dialog.c
@@ -4,6 +4,7 @@
* Copyright (C) 2007 Vincent Untz.
* Copyright (C) 2008 Lucas Rocha.
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
@@ -31,6 +32,7 @@
#include "gsm-properties-dialog.h"
#include "gsm-app-dialog.h"
+#include "msm-desktop-app-dialog.h"
#include "gsm-util.h"
#include "gsp-app.h"
#include "gsp-app-manager.h"
@@ -39,6 +41,7 @@
#define CAPPLET_TREEVIEW_WIDGET_NAME "session_properties_treeview"
#define CAPPLET_ADD_WIDGET_NAME "session_properties_add_button"
+#define CAPPLET_DESKTOP_ADD_WIDGET_NAME "session_properties_desktop_add_button"
#define CAPPLET_DELETE_WIDGET_NAME "session_properties_delete_button"
#define CAPPLET_EDIT_WIDGET_NAME "session_properties_edit_button"
#define CAPPLET_SAVE_WIDGET_NAME "session_properties_save_button"
@@ -60,6 +63,7 @@ struct _GsmPropertiesDialog
GtkTreeView *treeview;
GtkWidget *add_button;
+ GtkWidget *desktop_add_button;
GtkWidget *delete_button;
GtkWidget *edit_button;
@@ -69,8 +73,7 @@ struct _GsmPropertiesDialog
};
enum {
- STORE_COL_VISIBLE = 0,
- STORE_COL_ENABLED,
+ STORE_COL_ENABLED = 0,
STORE_COL_GICON,
STORE_COL_DESCRIPTION,
STORE_COL_APP,
@@ -102,6 +105,8 @@ find_by_app (GtkTreeModel *model,
g_object_unref (iter_app);
return TRUE;
}
+
+ g_object_unref (iter_app);
} while (gtk_tree_model_iter_next (model, iter));
return FALSE;
@@ -112,14 +117,12 @@ _fill_iter_from_app (GtkListStore *list_store,
GtkTreeIter *iter,
GspApp *app)
{
- gboolean hidden;
gboolean enabled;
GIcon *icon;
const char *description;
const char *app_name;
- hidden = gsp_app_get_hidden (app);
- enabled = gsp_app_get_enabled (app);
+ enabled = !gsp_app_get_hidden (app);
icon = gsp_app_get_icon (app);
description = gsp_app_get_description (app);
app_name = gsp_app_get_name (app);
@@ -150,7 +153,6 @@ _fill_iter_from_app (GtkListStore *list_store,
}
gtk_list_store_set (list_store, iter,
- STORE_COL_VISIBLE, !hidden,
STORE_COL_ENABLED, enabled,
STORE_COL_GICON, icon,
STORE_COL_DESCRIPTION, description,
@@ -196,13 +198,13 @@ _app_added (GsmPropertiesDialog *dialog,
GspApp *app,
GspAppManager *manager)
{
+ (void) manager;
append_app (dialog, app);
}
static void
-_app_removed (GsmPropertiesDialog *dialog,
- GspApp *app,
- GspAppManager *manager)
+remove_app (GsmPropertiesDialog *dialog,
+ GspApp *app)
{
GtkTreeIter iter;
@@ -218,6 +220,15 @@ _app_removed (GsmPropertiesDialog *dialog,
}
static void
+_app_removed (GsmPropertiesDialog *dialog,
+ GspApp *app,
+ GspAppManager *manager)
+{
+ (void) manager;
+ remove_app (dialog, app);
+}
+
+static void
populate_model (GsmPropertiesDialog *dialog)
{
GSList *apps;
@@ -263,10 +274,9 @@ on_startup_enabled_toggled (GtkCellRendererToggle *cell_renderer,
-1);
active = gtk_cell_renderer_toggle_get_active (cell_renderer);
- active = !active;
if (app) {
- gsp_app_set_enabled (app, active);
+ gsp_app_set_hidden (app, active);
g_object_unref (app);
}
}
@@ -381,6 +391,33 @@ on_add_app_clicked (GtkWidget *widget,
}
static void
+on_desktop_add_app_clicked (GtkWidget *widget,
+ GsmPropertiesDialog *dialog)
+{
+ GtkWidget *desktop_add_dialog;
+ gint response;
+ const char *filename;
+
+ desktop_add_dialog = msm_desktop_app_dialog_new (dialog->manager);
+ gtk_window_set_transient_for (GTK_WINDOW (desktop_add_dialog),
+ GTK_WINDOW (dialog));
+
+ gtk_widget_show_all (desktop_add_dialog);
+ response = gtk_dialog_run (GTK_DIALOG (desktop_add_dialog));
+
+ if (response == GTK_RESPONSE_OK)
+ {
+ filename = msm_dektop_app_dialog_get_selected (MSM_DESKTOP_APP_DIALOG (desktop_add_dialog));
+ if (filename != NULL)
+ {
+ gsp_app_copy_desktop_file (g_filename_to_uri (filename, NULL, NULL));
+ }
+ }
+
+ gtk_widget_destroy (desktop_add_dialog);
+}
+
+static void
on_delete_app_clicked (GtkWidget *widget,
GsmPropertiesDialog *dialog)
{
@@ -462,34 +499,11 @@ on_row_activated (GtkTreeView *tree_view,
}
static void
-update_tree_view (GsmPropertiesDialog *dialog)
-{
- GSList *apps;
- GSList *l;
- gboolean show_hidden;
- GspApp *app;
-
- show_hidden = g_settings_get_boolean (dialog->settings, SPC_SHOW_HIDDEN_KEY);
-
- apps = gsp_app_manager_get_apps (dialog->manager);
- for (l = apps; l != NULL; l = l->next) {
- app = GSP_APP (l->data);
- if (gsp_app_get_nodisplay(app)) {
- if (show_hidden) {
- _app_added (dialog, app, dialog->manager);
- }else{
- _app_removed (dialog, app, dialog->manager);
- }
- }
- }
- g_slist_free (apps);
-}
-
-static void
-on_show_hidden_clicked (GtkWidget *widget,
+on_show_hidden_toggled (GtkToggleButton *togglebutton,
GsmPropertiesDialog *dialog)
{
- update_tree_view (dialog);
+ (void) togglebutton;
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (dialog->tree_filter));
}
static void
@@ -557,11 +571,41 @@ on_main_notebook_scroll_event (GtkWidget *widget,
return TRUE;
}
+static gboolean
+visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ gboolean visible = FALSE;
+ GtkToggleButton *toggle_button = data;;
+ GspApp *app;
+ gboolean show_hidden;
+
+ show_hidden = gtk_toggle_button_get_active (toggle_button);
+
+ gtk_tree_model_get (model, iter,
+ STORE_COL_APP, &app,
+ -1);
+
+ if (app) {
+ gboolean nodisplay;
+
+ nodisplay = gsp_app_get_nodisplay (app);
+ visible = show_hidden || !nodisplay;
+ g_object_unref (app);
+ } else {
+ visible = show_hidden;
+ }
+
+ return visible;
+}
+
static void
setup_dialog (GsmPropertiesDialog *dialog)
{
GtkTreeView *treeview;
GtkWidget *button;
+ GtkToggleButton *toggle_button;
GtkTreeModel *tree_filter;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
@@ -576,9 +620,20 @@ setup_dialog (GsmPropertiesDialog *dialog)
_("_Close"), "window-close",
GTK_RESPONSE_CLOSE);
+ dialog->settings = g_settings_new (SPC_CONFIG_SCHEMA);
+
+ toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (dialog->xml,
+ CAPPLET_SHOW_HIDDEN_WIDGET_NAME));
+
+ g_settings_bind (dialog->settings, SPC_SHOW_HIDDEN_KEY,
+ toggle_button, "active", G_SETTINGS_BIND_DEFAULT);
+
+ g_signal_connect (toggle_button, "toggled",
+ G_CALLBACK (on_show_hidden_toggled),
+ dialog);
+
dialog->list_store = gtk_list_store_new (NUMBER_OF_COLUMNS,
G_TYPE_BOOLEAN,
- G_TYPE_BOOLEAN,
G_TYPE_ICON,
G_TYPE_STRING,
G_TYPE_OBJECT,
@@ -588,8 +643,7 @@ setup_dialog (GsmPropertiesDialog *dialog)
g_object_unref (dialog->list_store);
dialog->tree_filter = tree_filter;
- gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (tree_filter),
- STORE_COL_VISIBLE);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (tree_filter), visible_func, toggle_button, NULL);
treeview = GTK_TREE_VIEW (gtk_builder_get_object (dialog->xml,
CAPPLET_TREEVIEW_WIDGET_NAME));
@@ -647,7 +701,6 @@ setup_dialog (GsmPropertiesDialog *dialog)
NULL);
gtk_tree_view_append_column (treeview, column);
-
gtk_tree_view_column_set_sort_column_id (column, STORE_COL_DESCRIPTION);
gtk_tree_view_set_search_column (treeview, STORE_COL_SEARCH);
@@ -692,7 +745,6 @@ setup_dialog (GsmPropertiesDialog *dialog)
STORE_COL_DESCRIPTION,
GTK_SORT_ASCENDING);
-
button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
CAPPLET_ADD_WIDGET_NAME));
dialog->add_button = button;
@@ -702,6 +754,14 @@ setup_dialog (GsmPropertiesDialog *dialog)
dialog);
button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
+ CAPPLET_DESKTOP_ADD_WIDGET_NAME));
+ dialog->desktop_add_button = button;
+ g_signal_connect (button,
+ "clicked",
+ G_CALLBACK (on_desktop_add_app_clicked),
+ dialog);
+
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
CAPPLET_DELETE_WIDGET_NAME));
dialog->delete_button = button;
g_signal_connect (button,
@@ -717,9 +777,6 @@ setup_dialog (GsmPropertiesDialog *dialog)
G_CALLBACK (on_edit_app_clicked),
dialog);
-
- dialog->settings = g_settings_new (SPC_CONFIG_SCHEMA);
-
button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
CAPPLET_REMEMBER_WIDGET_NAME));
@@ -727,17 +784,6 @@ setup_dialog (GsmPropertiesDialog *dialog)
button, "active", G_SETTINGS_BIND_DEFAULT);
button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
- CAPPLET_SHOW_HIDDEN_WIDGET_NAME));
-
- g_settings_bind (dialog->settings, SPC_SHOW_HIDDEN_KEY,
- button, "active", G_SETTINGS_BIND_DEFAULT);
-
- g_signal_connect (button,
- "clicked",
- G_CALLBACK (on_show_hidden_clicked),
- dialog);
-
- button = GTK_WIDGET (gtk_builder_get_object (dialog->xml,
CAPPLET_SAVE_WIDGET_NAME));
g_signal_connect (button,
"clicked",
@@ -752,7 +798,7 @@ setup_dialog (GsmPropertiesDialog *dialog)
G_CALLBACK (_app_removed), dialog);
populate_model (dialog);
- update_tree_view (dialog);
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (dialog->tree_filter));
}
static GObject *
diff --git a/capplet/gsm-properties-dialog.h b/capplet/gsm-properties-dialog.h
index 93ef91b..9e93a5d 100644
--- a/capplet/gsm-properties-dialog.h
+++ b/capplet/gsm-properties-dialog.h
@@ -1,6 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
diff --git a/capplet/gsp-app-manager.c b/capplet/gsp-app-manager.c
index 7e245db..6d3b0f5 100644
--- a/capplet/gsp-app-manager.c
+++ b/capplet/gsp-app-manager.c
@@ -4,6 +4,7 @@
* Copyright (C) 2007, 2009 Vincent Untz.
* Copyright (C) 2008 Lucas Rocha.
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
@@ -28,8 +29,6 @@
#include "gsp-app-manager.h"
-static GspAppManager *manager = NULL;
-
typedef struct {
char *dir;
int index;
@@ -49,7 +48,6 @@ enum {
static guint gsp_app_manager_signals[LAST_SIGNAL] = { 0 };
-
G_DEFINE_TYPE_WITH_PRIVATE (GspAppManager, gsp_app_manager, G_TYPE_OBJECT)
static void gsp_app_manager_dispose (GObject *object);
@@ -599,6 +597,8 @@ gsp_app_manager_find_app_with_basename (GspAppManager *manager,
GspAppManager *
gsp_app_manager_get (void)
{
+ static GspAppManager *manager = NULL;
+
if (manager == NULL) {
manager = g_object_new (GSP_TYPE_APP_MANAGER, NULL);
return manager;
diff --git a/capplet/gsp-app-manager.h b/capplet/gsp-app-manager.h
index 515c67c..13a1c19 100644
--- a/capplet/gsp-app-manager.h
+++ b/capplet/gsp-app-manager.h
@@ -4,6 +4,7 @@
* Copyright (C) 2007, 2009 Vincent Untz.
* Copyright (C) 2008 Lucas Rocha.
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
diff --git a/capplet/gsp-app.c b/capplet/gsp-app.c
index 169701f..6c2250a 100644
--- a/capplet/gsp-app.c
+++ b/capplet/gsp-app.c
@@ -4,6 +4,7 @@
* Copyright (C) 2007, 2009 Vincent Untz.
* Copyright (C) 2008 Lucas Rocha.
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
@@ -42,11 +43,10 @@
#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_DELAY 0x0020
+#define GSP_ASP_SAVE_MASK_NAME 0x0002
+#define GSP_ASP_SAVE_MASK_EXEC 0x0004
+#define GSP_ASP_SAVE_MASK_COMMENT 0x0008
+#define GSP_ASP_SAVE_MASK_DELAY 0x0010
#define GSP_ASP_SAVE_MASK_ALL 0xffff
typedef struct {
@@ -55,7 +55,6 @@ typedef struct {
gboolean hidden;
gboolean nodisplay;
- gboolean enabled;
char *name;
char *exec;
@@ -90,14 +89,12 @@ enum {
static guint gsp_app_signals[LAST_SIGNAL] = { 0 };
-
G_DEFINE_TYPE_WITH_PRIVATE (GspApp, gsp_app, G_TYPE_OBJECT)
static void gsp_app_dispose (GObject *object);
static void gsp_app_finalize (GObject *object);
static gboolean _gsp_app_save (gpointer data);
-
static gboolean
_gsp_str_equal (const char *a,
const char *b)
@@ -117,7 +114,6 @@ _gsp_str_equal (const char *a,
return FALSE;
}
-
static void
gsp_app_class_init (GspAppClass *class)
{
@@ -343,10 +339,7 @@ _gsp_app_user_equal_system (GspApp *app,
if (gsp_key_file_get_boolean (keyfile,
G_KEY_FILE_DESKTOP_KEY_HIDDEN,
- FALSE) != priv->hidden ||
- gsp_key_file_get_boolean (keyfile,
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
- TRUE) != priv->enabled) {
+ FALSE) != priv->hidden) {
g_free (path);
g_key_file_free (keyfile);
return FALSE;
@@ -472,12 +465,6 @@ _gsp_app_save (gpointer data)
priv->hidden);
}
- if (priv->save_mask & GSP_ASP_SAVE_MASK_ENABLED) {
- gsp_key_file_set_boolean (keyfile,
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
- priv->enabled);
- }
-
if (priv->save_mask & GSP_ASP_SAVE_MASK_NAME) {
gsp_key_file_set_locale_string (keyfile,
G_KEY_FILE_DESKTOP_KEY_NAME,
@@ -503,7 +490,7 @@ _gsp_app_save (gpointer data)
}
_gsp_ensure_user_autostart_dir ();
- if (gsp_key_file_to_file (keyfile, priv->path, NULL)) {
+ if (g_key_file_save_to_file (keyfile, priv->path, NULL)) {
priv->skip_next_monitor_event = TRUE;
_gsp_app_save_done_success (app);
} else {
@@ -589,21 +576,9 @@ gsp_app_get_hidden (GspApp *app)
return priv->hidden;
}
-gboolean
-gsp_app_get_enabled (GspApp *app)
-{
- GspAppPrivate *priv;
-
- g_return_val_if_fail (GSP_IS_APP (app), FALSE);
-
- priv = gsp_app_get_instance_private (app);
-
- return priv->enabled;
-}
-
void
-gsp_app_set_enabled (GspApp *app,
- gboolean enabled)
+gsp_app_set_hidden (GspApp *app,
+ gboolean hidden)
{
GspAppPrivate *priv;
@@ -611,12 +586,12 @@ gsp_app_set_enabled (GspApp *app,
priv = gsp_app_get_instance_private (app);
- if (enabled == priv->enabled) {
+ if (hidden == priv->hidden) {
return;
}
- priv->enabled = enabled;
- priv->save_mask |= GSP_ASP_SAVE_MASK_ENABLED;
+ priv->hidden = hidden;
+ priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN;
_gsp_app_queue_save (app);
_gsp_app_emit_changed (app);
@@ -963,9 +938,6 @@ gsp_app_new (const char *path,
priv->hidden = gsp_key_file_get_boolean (keyfile,
G_KEY_FILE_DESKTOP_KEY_HIDDEN,
FALSE);
- priv->enabled = gsp_key_file_get_boolean (keyfile,
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
- TRUE);
priv->nodisplay = gsp_key_file_get_boolean (keyfile,
G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY,
FALSE);
@@ -1114,7 +1086,6 @@ gsp_app_create (const char *name,
priv->basename, NULL);
priv->hidden = FALSE;
- priv->enabled = TRUE;
priv->nodisplay = FALSE;
if (!gsm_util_text_is_blank (name)) {
@@ -1214,12 +1185,6 @@ gsp_app_copy_desktop_file (const char *uri)
priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN;
}
- if (!priv->enabled) {
- changed = TRUE;
- priv->enabled = TRUE;
- priv->save_mask |= GSP_ASP_SAVE_MASK_ENABLED;
- }
-
if (changed) {
_gsp_app_queue_save (app);
}
diff --git a/capplet/gsp-app.h b/capplet/gsp-app.h
index 8bc2700..eaaccff 100644
--- a/capplet/gsp-app.h
+++ b/capplet/gsp-app.h
@@ -4,6 +4,7 @@
* Copyright (C) 2007, 2009 Vincent Untz.
* Copyright (C) 2008 Lucas Rocha.
* Copyright (C) 2008 William Jon McCann <[email protected]>
+ * Copyright (C) 2012-2021 MATE Developers
*
* 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
@@ -58,10 +59,9 @@ const char *gsp_app_get_basename (GspApp *app);
const char *gsp_app_get_path (GspApp *app);
gboolean gsp_app_get_hidden (GspApp *app);
+void gsp_app_set_hidden (GspApp *app,
+ gboolean hidden);
-gboolean gsp_app_get_enabled (GspApp *app);
-void gsp_app_set_enabled (GspApp *app,
- gboolean enabled);
gboolean gsp_app_get_nodisplay (GspApp *app);
const char *gsp_app_get_name (GspApp *app);
diff --git a/capplet/gsp-keyfile.c b/capplet/gsp-keyfile.c
index 2fbf2b5..260c1de 100644
--- a/capplet/gsp-keyfile.c
+++ b/capplet/gsp-keyfile.c
@@ -2,6 +2,7 @@
* gsp-keyfile.c: GKeyFile extensions
*
* Copyright (C) 2008, 2009 Novell, Inc.
+ * Copyright (C) 2012-2021 MATE Developers
*
* Based on code from panel-keyfile.c (from mate-panel)
*
@@ -42,39 +43,6 @@ gsp_key_file_populate (GKeyFile *keyfile)
"/bin/false");
}
-//FIXME: kill this when bug #309224 is fixed
-gboolean
-gsp_key_file_to_file (GKeyFile *keyfile,
- const gchar *path,
- GError **error)
-{
- GError *write_error;
- gchar *data;
- gsize length;
- gboolean res;
-
- g_return_val_if_fail (keyfile != NULL, FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
-
- write_error = NULL;
- data = g_key_file_to_data (keyfile, &length, &write_error);
-
- if (write_error) {
- g_propagate_error (error, write_error);
- return FALSE;
- }
-
- res = g_file_set_contents (path, data, length, &write_error);
- g_free (data);
-
- if (write_error) {
- g_propagate_error (error, write_error);
- return FALSE;
- }
-
- return res;
-}
-
gboolean
gsp_key_file_get_boolean (GKeyFile *keyfile,
const gchar *key,
diff --git a/capplet/gsp-keyfile.h b/capplet/gsp-keyfile.h
index 97f135f..ed7a0c9 100644
--- a/capplet/gsp-keyfile.h
+++ b/capplet/gsp-keyfile.h
@@ -2,6 +2,7 @@
* gsp-keyfile.h: GKeyFile extensions
*
* Copyright (C) 2008, 2009 Novell, Inc.
+ * Copyright (C) 2012-2021 MATE Developers
*
* Based on code from panel-keyfile.h (from mate-panel)
*
@@ -33,15 +34,10 @@
extern "C" {
#endif
-#define GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED "X-MATE-Autostart-enabled"
#define GSP_KEY_FILE_DESKTOP_KEY_DELAY "X-MATE-Autostart-Delay"
void gsp_key_file_populate (GKeyFile *keyfile);
-gboolean gsp_key_file_to_file (GKeyFile *keyfile,
- const gchar *path,
- GError **error);
-
gboolean gsp_key_file_get_boolean (GKeyFile *keyfile,
const gchar *key,
gboolean default_value);
diff --git a/capplet/main.c b/capplet/main.c
index 30c2ac6..add1acc 100644
--- a/capplet/main.c
+++ b/capplet/main.c
@@ -2,6 +2,7 @@
* main.c
* Copyright (C) 1999 Free Software Foundation, Inc.
* Copyright (C) 2008 Lucas Rocha.
+ * Copyright (C) 2012-2021 MATE Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -68,13 +69,15 @@ int main(int argc, char* argv[])
GError* error;
GtkWidget* dialog;
+#ifdef ENABLE_NLS
bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
+#endif /* ENABLE_NLS */
error = NULL;
- if (!gtk_init_with_args(&argc, &argv, " - MATE Session Properties", options, GETTEXT_PACKAGE, &error))
+ if (!gtk_init_with_args(&argc, &argv, _("- MATE Session Properties"), options, GETTEXT_PACKAGE, &error))
{
g_warning("Unable to start: %s", error->message);
g_error_free(error);
diff --git a/capplet/msm-desktop-app-dialog.c b/capplet/msm-desktop-app-dialog.c
new file mode 100644
index 0000000..cb0c3dd
--- /dev/null
+++ b/capplet/msm-desktop-app-dialog.c
@@ -0,0 +1,315 @@
+#include "config.h"
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "msm-desktop-app-dialog.h"
+
+struct _MsmDesktopAppDialog
+{
+ GtkDialog parent;
+
+ GtkWidget *entry;
+ GtkWidget *listbox;
+};
+
+G_DEFINE_TYPE (MsmDesktopAppDialog, msm_desktop_app_dialog, GTK_TYPE_DIALOG)
+
+static void
+on_search_entry_changed (GtkSearchEntry *entry,
+ MsmDesktopAppDialog *dialog)
+{
+ GtkListBoxRow *selected;
+
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (dialog->listbox));
+ selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (dialog->listbox));
+
+ if (selected != NULL && gtk_widget_get_mapped (GTK_WIDGET (selected)))
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
+ }
+ else
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
+ }
+}
+
+static gint
+list_sort_app_func (GtkListBoxRow *row1, GtkListBoxRow *row2, gpointer user_data)
+{
+ GAppInfo *app1, *app2;
+
+ app1 = g_object_get_data (G_OBJECT (row1), "appinfo");
+ app2 = g_object_get_data (G_OBJECT (row2), "appinfo");
+
+ return g_utf8_collate (g_app_info_get_name (app1), g_app_info_get_name (app2));
+}
+
+static void
+list_header_app_func (GtkListBoxRow *row, GtkListBoxRow *before, gpointer user_data)
+{
+
+ if (before != NULL && (gtk_list_box_row_get_header (row) == NULL))
+ {
+ gtk_list_box_row_set_header (row,
+ gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
+ }
+}
+
+static gboolean
+list_filter_app_func (GtkListBoxRow *row,
+ gpointer user_data)
+{
+ MsmDesktopAppDialog *dialog = MSM_DESKTOP_APP_DIALOG (user_data);
+ GAppInfo *app;
+ GString *s1, *s2;
+
+ app = g_object_get_data (G_OBJECT (row), "appinfo");
+
+ s1 = g_string_new (gtk_entry_get_text (GTK_ENTRY (dialog->entry)));
+ s2 = g_string_new (g_app_info_get_name (app));
+
+ g_string_ascii_up (s1);
+ g_string_ascii_up (s2);
+
+ if (strstr (s2->str, s1->str) != NULL)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void
+on_row_selected (GtkListBox *box,
+ GtkListBoxRow *row,
+ MsmDesktopAppDialog *dialog)
+{
+ if (row != NULL && gtk_widget_get_mapped (GTK_WIDGET (row)))
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
+ }
+ else
+ {
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
+ }
+}
+
+static void
+setup_dialog (MsmDesktopAppDialog *dialog)
+{
+ GtkStyleContext *context;
+ GtkWidget *content_area;
+ GtkWidget *searchbar;
+ GtkWidget *searchbutton;
+ GtkWidget *searchimage;
+ GtkWidget *headerbar;
+ GtkWidget *sw;
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_container_set_border_width (GTK_CONTAINER (content_area), 6);
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+ gtk_widget_set_size_request (GTK_WIDGET (dialog), 600, 400);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+ dialog->entry = gtk_search_entry_new ();
+ g_signal_connect (dialog->entry,
+ "search-changed",
+ G_CALLBACK (on_search_entry_changed),
+ dialog);
+
+ gtk_entry_set_placeholder_text (GTK_ENTRY (dialog->entry), _("Search Applications…"));
+ gtk_entry_set_width_chars (GTK_ENTRY (dialog->entry), 30);
+ gtk_entry_set_activates_default (GTK_ENTRY (dialog->entry), TRUE);
+ gtk_entry_set_input_hints (GTK_ENTRY (dialog->entry), GTK_INPUT_HINT_NO_EMOJI);
+
+ searchbar = gtk_search_bar_new ();
+ gtk_container_add (GTK_CONTAINER (searchbar), dialog->entry);
+ gtk_widget_set_hexpand (searchbar, TRUE);
+ gtk_box_pack_start (GTK_BOX (content_area), searchbar, FALSE, FALSE, 0);
+
+ dialog->listbox = gtk_list_box_new ();
+ gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (dialog->listbox), FALSE);
+ gtk_list_box_set_sort_func (GTK_LIST_BOX (dialog->listbox), list_sort_app_func, dialog, NULL);
+ gtk_list_box_set_header_func (GTK_LIST_BOX (dialog->listbox), list_header_app_func, dialog, NULL);
+ gtk_list_box_set_filter_func (GTK_LIST_BOX (dialog->listbox), list_filter_app_func, dialog, NULL);
+ g_signal_connect (dialog->listbox,
+ "row-selected",
+ G_CALLBACK (on_row_selected),
+ dialog);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Close"), GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Add"), GTK_RESPONSE_OK);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_NEVER,
+ GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (sw), dialog->listbox);
+ gtk_box_pack_start (GTK_BOX (content_area), sw, TRUE, TRUE, 0);
+
+ searchbutton = gtk_toggle_button_new ();
+ gtk_widget_set_valign (searchbutton, GTK_ALIGN_CENTER);
+ searchimage = gtk_image_new_from_icon_name ("edit-find", GTK_ICON_SIZE_MENU);
+ gtk_container_add (GTK_CONTAINER (searchbutton), searchimage);
+
+ context = gtk_widget_get_style_context (searchbutton);
+ gtk_style_context_add_class (context, "image-button");
+ gtk_style_context_remove_class (context, "text-button");
+
+ headerbar = gtk_dialog_get_header_bar (GTK_DIALOG (dialog));
+ gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), searchbutton);
+ g_object_bind_property (searchbutton, "active", searchbar, "search-mode-enabled", G_BINDING_BIDIRECTIONAL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (searchbutton), TRUE);
+}
+
+static GObject *
+msm_desktop_app_dialog_constructor (GType type,
+ guint n_construct_app,
+ GObjectConstructParam *construct_app)
+{
+ MsmDesktopAppDialog *dialog;
+
+ dialog = MSM_DESKTOP_APP_DIALOG (G_OBJECT_CLASS (msm_desktop_app_dialog_parent_class)->constructor (type,
+ n_construct_app,
+ construct_app));
+
+ setup_dialog (dialog);
+
+ return G_OBJECT (dialog);
+}
+
+static void
+msm_desktop_app_dialog_dispose (GObject *object)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (MSM_IS_DESKTOP_APP_DIALOG (object));
+
+ G_OBJECT_CLASS (msm_desktop_app_dialog_parent_class)->dispose (object);
+}
+
+static void
+msm_desktop_app_dialog_class_init (MsmDesktopAppDialogClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->constructor = msm_desktop_app_dialog_constructor;
+ object_class->dispose = msm_desktop_app_dialog_dispose;
+}
+
+static void
+msm_desktop_app_dialog_init (MsmDesktopAppDialog *dialog)
+{
+
+}
+
+static GtkWidget *
+create_app_info_row (GAppInfo *app)
+{
+ GtkWidget *row;
+ GtkWidget *grid;
+ GtkWidget *image = NULL;
+ GtkWidget *label, *label2;
+ gint height;
+ const char *app_name;
+ const char *app_summary;
+ GIcon *app_icon;
+
+ row = gtk_list_box_row_new ();
+ grid = gtk_grid_new ();
+ gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
+ gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
+
+ app_name = g_app_info_get_name (app);
+ app_icon = g_app_info_get_icon (app);
+ app_summary = g_app_info_get_description (app);
+
+ if (app_name == NULL)
+ return NULL;
+
+ if (app_icon != NULL)
+ {
+ image = gtk_image_new_from_gicon (app_icon, GTK_ICON_SIZE_DIALOG);
+ gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, NULL, &height);
+ gtk_image_set_pixel_size (GTK_IMAGE (image), height);
+ gtk_grid_attach (GTK_GRID (grid), image, 0, 0, 2, 2);
+ gtk_widget_set_hexpand (image, FALSE);
+ }
+
+ label = gtk_label_new (app_name);
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ gtk_label_set_max_width_chars (GTK_LABEL (label), 50);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_widget_set_vexpand (label, FALSE);
+ gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
+ gtk_grid_attach_next_to (GTK_GRID (grid), label, image, GTK_POS_RIGHT, 1, 1);
+
+ label2 = gtk_label_new (app_summary);
+ gtk_label_set_ellipsize (GTK_LABEL (label2), PANGO_ELLIPSIZE_END);
+ gtk_label_set_max_width_chars (GTK_LABEL (label2), 50);
+ gtk_widget_set_hexpand (label2, TRUE);
+ gtk_widget_set_halign (label2, GTK_ALIGN_START);
+ gtk_widget_set_vexpand (label2, FALSE);
+ gtk_widget_set_valign (label2, GTK_ALIGN_CENTER);
+ gtk_grid_attach_next_to (GTK_GRID (grid), label2, label, GTK_POS_BOTTOM, 1, 1);
+
+ gtk_container_add (GTK_CONTAINER (row), grid);
+ g_object_set_data (G_OBJECT (row), "appinfo", app);
+
+ return row;
+}
+
+GtkWidget *
+msm_desktop_app_dialog_new (GspAppManager *manager)
+{
+ MsmDesktopAppDialog *dialog;
+ gboolean use_header;
+ GList *apps, *l;
+
+ g_object_get (gtk_settings_get_default (),
+ "gtk-dialogs-use-header", &use_header,
+ NULL);
+
+ dialog = g_object_new (MSM_TYPE_DESKTOP_APP_DIALOG,
+ "use-header-bar", use_header,
+ NULL);
+
+ apps = g_app_info_get_all ();
+ for (l = apps; l != NULL; l = l->next)
+ {
+ GAppInfo *info = l->data;
+ GtkWidget *row;
+ const char *id;
+
+ id = g_app_info_get_id (info);
+ if (id != NULL && gsp_app_manager_find_app_with_basename (manager, id) == NULL)
+ {
+ if (g_app_info_should_show (info))
+ {
+ row = create_app_info_row (info);
+ if (row != NULL)
+ {
+ gtk_list_box_prepend (GTK_LIST_BOX (dialog->listbox), row);
+ }
+ }
+ }
+ }
+
+ return GTK_WIDGET (dialog);
+}
+
+const char *
+msm_dektop_app_dialog_get_selected (MsmDesktopAppDialog *dialog)
+{
+ GtkListBoxRow *selected = NULL;
+ GAppInfo *app;
+
+ selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (dialog->listbox));
+ if (selected != NULL)
+ {
+ app = g_object_get_data (G_OBJECT (selected), "appinfo");
+ return g_desktop_app_info_get_filename (G_DESKTOP_APP_INFO (app));
+ }
+
+ return NULL;
+}
diff --git a/capplet/msm-desktop-app-dialog.h b/capplet/msm-desktop-app-dialog.h
new file mode 100644
index 0000000..ac7cf25
--- /dev/null
+++ b/capplet/msm-desktop-app-dialog.h
@@ -0,0 +1,20 @@
+#ifndef __MSM_DESKTOP_APP_DIALOG_H
+#define __MSM_DESKTOP_APP_DIALOG_H
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <gio/gdesktopappinfo.h>
+#include "gsp-app-manager.h"
+
+G_BEGIN_DECLS
+
+#define MSM_TYPE_DESKTOP_APP_DIALOG (msm_desktop_app_dialog_get_type ())
+G_DECLARE_FINAL_TYPE (MsmDesktopAppDialog, msm_desktop_app_dialog, MSM, DESKTOP_APP_DIALOG, GtkDialog)
+
+GtkWidget *msm_desktop_app_dialog_new (GspAppManager *manager);
+
+const char *msm_dektop_app_dialog_get_selected (MsmDesktopAppDialog *dialog);
+
+G_END_DECLS
+
+#endif /* __GSM_APP_DIALOG_H */