diff options
Diffstat (limited to 'capplet')
-rw-r--r-- | capplet/Makefile.am | 2 | ||||
-rw-r--r-- | capplet/gsm-app-dialog.c | 3 | ||||
-rw-r--r-- | capplet/gsm-app-dialog.h | 1 | ||||
-rw-r--r-- | capplet/gsm-properties-dialog.c | 160 | ||||
-rw-r--r-- | capplet/gsm-properties-dialog.h | 1 | ||||
-rw-r--r-- | capplet/gsp-app-manager.c | 6 | ||||
-rw-r--r-- | capplet/gsp-app-manager.h | 1 | ||||
-rw-r--r-- | capplet/gsp-app.c | 59 | ||||
-rw-r--r-- | capplet/gsp-app.h | 6 | ||||
-rw-r--r-- | capplet/gsp-keyfile.c | 34 | ||||
-rw-r--r-- | capplet/gsp-keyfile.h | 6 | ||||
-rw-r--r-- | capplet/main.c | 5 | ||||
-rw-r--r-- | capplet/msm-desktop-app-dialog.c | 315 | ||||
-rw-r--r-- | capplet/msm-desktop-app-dialog.h | 20 |
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 */ |