diff options
author | Perberos <[email protected]> | 2011-12-01 22:56:10 -0300 |
---|---|---|
committer | Perberos <[email protected]> | 2011-12-01 22:56:10 -0300 |
commit | c51ef797a707f4e2c6f9688d4378f2b0e9898a66 (patch) | |
tree | 019ae92bb53c19b30077545cb14743cbd1b57aef /mate-panel/mate-desktop-item-edit.c | |
download | mate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.bz2 mate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.xz |
moving from https://github.com/perberos/mate-desktop-environment
Diffstat (limited to 'mate-panel/mate-desktop-item-edit.c')
-rw-r--r-- | mate-panel/mate-desktop-item-edit.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/mate-panel/mate-desktop-item-edit.c b/mate-panel/mate-desktop-item-edit.c new file mode 100644 index 00000000..f94b9254 --- /dev/null +++ b/mate-panel/mate-desktop-item-edit.c @@ -0,0 +1,225 @@ +#include "config.h" + +#include <glib/gi18n.h> +#include <gio/gio.h> +#include <gtk/gtk.h> + +#include <libpanel-util/panel-error.h> +#include <libpanel-util/panel-keyfile.h> + +#include "panel-ditem-editor.h" +#include "panel-icon-names.h" +#include "panel-util.h" + +/* FIXME Symbols needed by panel-util.c - sucky */ +#include "applet.h" +GSList *mate_panel_applet_list_applets (void) { return NULL; } +#include "panel-mateconf.h" +MateConfClient *panel_mateconf_get_client (void) { return NULL; } +#include "panel-config-global.h" +gboolean panel_global_config_get_tooltips_enabled (void) { return FALSE; } +#include "panel-lockdown.h" +gboolean panel_lockdown_get_disable_lock_screen (void) { return FALSE; } + +static int dialogs = 0; +static gboolean create_new = FALSE; +static char **desktops = NULL; + +static GOptionEntry options[] = { + { "create-new", 0, 0, G_OPTION_ARG_NONE, &create_new, N_("Create new file in the given directory"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &desktops, NULL, N_("[FILE...]") }, + { NULL } +}; + +static void +dialog_destroyed (GtkWidget *dialog, gpointer data) +{ + dialogs --; + + if (dialogs <= 0) + gtk_main_quit (); +} + +static void +validate_for_filename (char *file) +{ + char *ptr; + + g_return_if_fail (file != NULL); + + ptr = file; + while (*ptr != '\0') { + if (*ptr == '/') + *ptr = '_'; + ptr++; + } +} + +static char * +find_uri_on_save (PanelDItemEditor *dialog, + gpointer data) +{ + GKeyFile *keyfile; + char *name; + char *filename; + char *uri; + char *dir; + + keyfile = panel_ditem_editor_get_key_file (dialog); + name = panel_key_file_get_string (keyfile, "Name"); + + validate_for_filename (name); + filename = g_filename_from_utf8 (name, -1, NULL, NULL, NULL); + g_free (name); + + if (filename == NULL) + filename = g_strdup ("foo"); + + dir = g_object_get_data (G_OBJECT (dialog), "dir"); + uri = panel_make_unique_desktop_path_from_name (dir, filename); + + g_free (filename); + + return uri; +} + +static void +error_reported (GtkWidget *dialog, + const char *primary, + const char *secondary, + gpointer data) +{ + panel_error_dialog (GTK_WINDOW (dialog), NULL, + "error_editing_launcher", TRUE, + primary, secondary); +} + +int +main (int argc, char * argv[]) +{ + GError *error = NULL; + int i; + + bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + if (!gtk_init_with_args (&argc, &argv, + _("- Edit .desktop files"), + options, + GETTEXT_PACKAGE, + &error)) { + g_printerr ("%s\n", error->message); + g_error_free (error); + return 1; + } + + gtk_window_set_default_icon_name (PANEL_ICON_LAUNCHER); + + if (desktops == NULL || + desktops[0] == NULL) { + g_printerr ("mate-desktop-item-edit: no file to edit\n"); + return 0; + } + + for (i = 0; desktops[i] != NULL; i++) { + GFile *file; + GFileInfo *info; + GFileType type; + char *uri; + char *path; + GtkWidget *dlg = NULL; + + file = g_file_new_for_commandline_arg (desktops[i]); + uri = g_file_get_uri (file); + path = g_file_get_path (file); + info = g_file_query_info (file, "standard::type", + G_FILE_QUERY_INFO_NONE, NULL, NULL); + g_object_unref (file); + + if (info) { + type = g_file_info_get_file_type (info); + + if (type == G_FILE_TYPE_DIRECTORY && create_new) { + + dlg = panel_ditem_editor_new (NULL, NULL, NULL, + _("Create Launcher")); + g_object_set_data_full (G_OBJECT (dlg), "dir", + g_strdup (path), + (GDestroyNotify)g_free); + + panel_ditem_register_save_uri_func (PANEL_DITEM_EDITOR (dlg), + find_uri_on_save, + NULL); + + } else if (type == G_FILE_TYPE_DIRECTORY) { + /* Rerun this iteration with the .directory + * file + * Note: No need to free, for one we can't free + * an individual member of desktops and + * secondly we will soon exit */ + desktops[i] = g_build_path ("/", uri, + ".directory", NULL); + i--; + } else if (type == G_FILE_TYPE_REGULAR + && g_str_has_suffix (desktops [i], + ".directory") + && !create_new) { + dlg = panel_ditem_editor_new_directory (NULL, + NULL, + uri, + _("Directory Properties")); + } else if (type == G_FILE_TYPE_REGULAR + && g_str_has_suffix (desktops [i], + ".desktop") + && !create_new) { + dlg = panel_ditem_editor_new (NULL, NULL, uri, + _("Launcher Properties")); + } else if (type == G_FILE_TYPE_REGULAR + && create_new) { + g_printerr ("mate-desktop-item-edit: %s " + "already exists\n", uri); + } else { + g_printerr ("mate-desktop-item-edit: %s " + "does not look like a desktop " + "item\n", uri); + } + + g_object_unref (info); + + } else if (g_str_has_suffix (desktops [i], ".directory")) { + /* a non-existant file. Well we can still edit that + * sort of. We will just create it new */ + dlg = panel_ditem_editor_new_directory (NULL, NULL, uri, + _("Directory Properties")); + + } else if (g_str_has_suffix (desktops [i], ".desktop")) { + /* a non-existant file. Well we can still edit that + * sort of. We will just create it new */ + dlg = panel_ditem_editor_new (NULL, NULL, uri, + _("Create Launcher")); + + } else { + g_printerr ("mate-desktop-item-edit: %s does not " + "have a .desktop or .directory " + "suffix\n", uri); + } + + if (dlg != NULL) { + dialogs ++; + g_signal_connect (G_OBJECT (dlg), "destroy", + G_CALLBACK (dialog_destroyed), NULL); + g_signal_connect (G_OBJECT (dlg), "error_reported", + G_CALLBACK (error_reported), NULL); + gtk_widget_show (dlg); + } + + g_free (uri); + g_free (path); + } + + if (dialogs > 0) + gtk_main (); + + return 0; +} |