summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@src.gnome.org>1999-03-13 00:53:31 +0000
committerJonathan Blandford <jrb@src.gnome.org>1999-03-13 00:53:31 +0000
commitc52b6760345f26a882f181dbfdd75e55e48baced (patch)
treed044d0daa7cac66e82948cbcc7027788df4ee17f
parentaf81c4017fc4ee1c323f099864a2d694190a80f2 (diff)
downloadgnome-control-center-c52b6760345f26a882f181dbfdd75e55e48baced.tar.gz
more work. also minor fix in gnome-edit-properties. off to go see cruel
more work. also minor fix in gnome-edit-properties. off to go see cruel intentions.
-rw-r--r--capplets/mime-type/Makefile.am2
-rw-r--r--capplets/mime-type/edit-window.c262
-rw-r--r--capplets/mime-type/mime-data.c70
-rw-r--r--capplets/mime-type/mime-data.h2
-rw-r--r--capplets/mime-type/mime-type-capplet.c6
5 files changed, 319 insertions, 23 deletions
diff --git a/capplets/mime-type/Makefile.am b/capplets/mime-type/Makefile.am
index 8594251b3..51a4c5aec 100644
--- a/capplets/mime-type/Makefile.am
+++ b/capplets/mime-type/Makefile.am
@@ -6,7 +6,7 @@ INCLUDES = -I. -I$(srcdir) \
bin_PROGRAMS = mime-type-capplet
-mime_type_capplet_SOURCES = mime-type-capplet.c mime-data.c edit-window.c
+mime_type_capplet_SOURCES = mime-type-capplet.c mime-data.c edit-window.c mime-info.c
mime_type_capplet_LDADD = ../../control-center/libcapplet.la \
$(GNOME_LIBDIR) $(ORB_LIBS) \
diff --git a/capplets/mime-type/edit-window.c b/capplets/mime-type/edit-window.c
index 1a26bba6b..85e48dc35 100644
--- a/capplets/mime-type/edit-window.c
+++ b/capplets/mime-type/edit-window.c
@@ -1,23 +1,279 @@
#include "edit-window.h"
+#include "capplet-widget.h"
+
+
+extern GtkWidget *capplet;
+
typedef struct {
GtkWidget *window;
+ GtkWidget *icon_entry;
+ GtkWidget *mime_type;
+ GtkWidget *ext_label;
+ GtkWidget *regexp1_label;
+ GtkWidget *regexp2_label;
+ GtkWidget *open_entry;
+ GtkWidget *edit_entry;
+ GtkWidget *view_entry;
+ GtkWidget *open_cbox;
+ GtkWidget *edit_cbox;
+ GtkWidget *view_cbox;
} edit_window;
static edit_window *main_win = NULL;
+static gboolean changing = TRUE;
+static void
+destruction_handler (GtkWidget *widget, gpointer data)
+{
+ g_free (main_win);
+ main_win = NULL;
+}
+static void
+entry_changed (GtkWidget *widget, gpointer data)
+{
+ if (changing == FALSE)
+ capplet_widget_state_changed (CAPPLET_WIDGET (capplet),
+ TRUE);
+}
+static void
+apply_entry_change (GtkWidget *entry, gchar *key, MimeInfo *mi)
+{
+ gchar *buf;
+ gchar *text;
+
+ /* buf is the value that existed before when we
+ * started the capplet */
+ buf = local_mime_get_value (mi->mime_type, key);
+ if (buf == NULL)
+ buf = gnome_mime_get_value (mi->mime_type, key);
+ text = gtk_entry_get_text (GTK_ENTRY (entry));
+ if (text && !*text)
+ text = NULL;
+ /* First we see if they've added something. */
+ if (buf == NULL && text)
+ set_mime_key_value (mi->mime_type, key, text);
+ else {
+ /* Has the value changed? */
+ if (text && strcmp (text, buf))
+ set_mime_key_value (mi->mime_type, key, text);
+ else
+ /* We _REALLY_ need a way to specify in
+ * user.keys not to use the system defaults.
+ * (ie. override the system default and
+ * query it).
+ * If we could then we'd set it here. */
+ ;
+ }
+}
+static void
+apply_changes (MimeInfo *mi)
+{
+ apply_entry_change (main_win->open_entry, "open", mi);
+ apply_entry_change (main_win->view_entry, "view", mi);
+ apply_entry_change (main_win->edit_entry, "edit", mi);
+}
static void
initialize_main_win ()
{
+ GtkWidget *align, *vbox, *hbox, *vbox2;
+ GtkWidget *frame, *table, *label;
+ GtkWidget *button;
+ GString *extension;
+
main_win = g_new (edit_window, 1);
- main_win->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ main_win->window = gnome_dialog_new ("",
+ GNOME_STOCK_BUTTON_OK,
+ GNOME_STOCK_BUTTON_CANCEL,
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (main_win->window),
+ "destroy",
+ destruction_handler,
+ NULL);
+ vbox = GNOME_DIALOG (main_win->window)->vbox;
-}
+ /* icon box */
+ main_win->icon_entry = gnome_icon_entry_new ("mime_icon_entry", _("Select an icon..."));
+ align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
+ gtk_container_add (GTK_CONTAINER (align), main_win->icon_entry);
+ gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
+ hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Mime Type: ")), FALSE, FALSE, 0);
+ main_win->mime_type = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (hbox), main_win->mime_type, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
+ /* extension/regexp */
+ vbox2 = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
+ hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ main_win->ext_label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Extension: ")),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), main_win->ext_label, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ main_win->regexp1_label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("First Regular Expresion: ")),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), main_win->regexp1_label, FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ main_win->regexp2_label = gtk_label_new ("");
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Second Regular Expresion: ")),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), main_win->regexp2_label, FALSE, FALSE, 0);
+
+ /* Actions box */
+ frame = gtk_frame_new (_("Mime-Type Actions"));
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+ table = gtk_table_new (8, 3, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), GNOME_PAD_SMALL);
+ gtk_container_set_border_width (GTK_CONTAINER (table), GNOME_PAD_SMALL/2);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ label = gtk_label_new (_("Open"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label), 2, 0);
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ label,
+ 0, 1, 0, 1);
+ main_win->open_entry = gtk_entry_new ();
+ gtk_signal_connect (GTK_OBJECT (main_win->open_entry),
+ "changed",
+ entry_changed,
+ NULL);
+
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->open_entry,
+ 1, 2, 0, 1);
+ button = gtk_button_new_with_label ("Browse...");
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ button,
+ 2, 3, 0, 1);
+
+ main_win->open_cbox = gtk_check_button_new_with_label (_("Use default Open action"));
+/* gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->open_cbox,
+ 0, 2, 1, 2);*/
+
+ label = gtk_label_new (_("View"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label), 2, 0);
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ label,
+ 0, 1, 3, 4);
+ main_win->view_entry = gtk_entry_new ();
+ gtk_signal_connect (GTK_OBJECT (main_win->view_entry),
+ "changed",
+ entry_changed,
+ NULL);
+
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->view_entry,
+ 1, 2, 3, 4);
+ button = gtk_button_new_with_label ("Browse...");
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ button,
+ 2, 3, 3, 4);
+
+ main_win->open_cbox = gtk_check_button_new_with_label (_("Use default View action"));
+/* gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->open_cbox,
+ 0, 2, 4, 5);*/
+ label = gtk_label_new (_("Edit"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label), 2, 0);
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ label,
+ 0, 1, 6, 7);
+ main_win->edit_entry = gtk_entry_new ();
+ gtk_signal_connect (GTK_OBJECT (main_win->edit_entry),
+ "changed",
+ entry_changed,
+ NULL);
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->edit_entry,
+ 1, 2, 6, 7);
+ button = gtk_button_new_with_label ("Browse...");
+ gtk_table_attach_defaults (GTK_TABLE (table),
+ button,
+ 2, 3, 6, 7);
+
+ main_win->edit_cbox = gtk_check_button_new_with_label (_("Use default Edit action"));
+/* gtk_table_attach_defaults (GTK_TABLE (table),
+ main_win->edit_cbox,
+ 0, 2, 7, 8);*/
+}
+
+static void
+setup_entry (gchar *key, GtkWidget *entry, MimeInfo *mi)
+{
+ gchar *buf;
+ buf = local_mime_get_value (mi->mime_type, key);
+ if (buf == NULL)
+ buf = gnome_mime_get_value (mi->mime_type, key);
+ if (buf)
+ gtk_entry_set_text (GTK_ENTRY (entry), buf);
+ else
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+}
void
launch_edit_window (MimeInfo *mi)
{
+ gint size;
+
+ changing = TRUE;
if (main_win == NULL)
initialize_main_win ();
- gtk_widget_show_all (main_win->window);
+ /* now we fill in the fields with the mi stuff. */
+ gtk_label_set_text (GTK_LABEL (main_win->mime_type), mi->mime_type);
+ gnome_icon_entry_set_icon (GNOME_ICON_ENTRY (main_win->icon_entry),
+ gnome_mime_get_value (mi->mime_type,
+ "icon-filename"));
+
+ /* we initialize everything */
+ if (mi->ext[0]) {
+ GString *extension;
+ extension = g_string_new (mi->ext_readable[0]);
+ if (mi->ext[1]) {
+ g_string_append (extension, ", ");
+ g_string_append (extension, (mi->ext_readable[1]));
+ }
+ gtk_label_set_text (GTK_LABEL (main_win->ext_label),
+ extension->str);
+ g_string_free (extension, TRUE);
+ } else if (mi->ext[1])
+ gtk_label_set_text (GTK_LABEL (main_win->ext_label),
+ mi->ext_readable[1]);
+ else
+ gtk_label_set_text (GTK_LABEL (main_win->ext_label),
+ _("<No extention>"));
+ if (mi->regex_readable[0])
+ gtk_label_set_text (GTK_LABEL (main_win->regexp1_label),
+ mi->regex_readable[0]);
+ else
+ gtk_label_set_text (GTK_LABEL (main_win->regexp1_label),
+ _("<No Regular Expression>"));
+ if (mi->regex_readable[1])
+ gtk_label_set_text (GTK_LABEL (main_win->regexp2_label),
+ mi->regex_readable[1]);
+ else
+ gtk_label_set_text (GTK_LABEL (main_win->regexp2_label),
+ _("<No Regular Expression>"));
+ /* initialize the entries */
+ setup_entry ("open", main_win->open_entry, mi);
+ setup_entry ("view", main_win->view_entry, mi);
+ setup_entry ("edit", main_win->edit_entry, mi);
+
+ changing = FALSE;
+
+ gtk_widget_show_all (GNOME_DIALOG (main_win->window)->vbox);
+ if ((gnome_dialog_run (GNOME_DIALOG (main_win->window))) == 0) {
+ apply_changes (mi);
+ }
+ gtk_widget_hide (main_win->window);
}
diff --git a/capplets/mime-type/mime-data.c b/capplets/mime-type/mime-data.c
index bbac7fdb7..774433c94 100644
--- a/capplets/mime-type/mime-data.c
+++ b/capplets/mime-type/mime-data.c
@@ -11,20 +11,17 @@
#include <regex.h>
#include <ctype.h>
#include "mime-data.h"
+#include "mime-info.h"
/* Prototypes */
static void mime_fill_from_file (const char *filename);
-static void mime_load_from_dir (const char *mime_info_dir);
+static void mime_load_from_dir (const char *mime_info_dir, gboolean system_dir);
static void add_to_key (char *mime_type, char *def);
static char *get_priority (char *def, int *priority);
/* Global variables */
static char *current_lang;
- /* Our original purpose for having
- * the hash table seems to have dissappeared.
- * Oh well... must-fix-later */
static GHashTable *mime_types = NULL;
-
/* Initialization functions */
static char *
get_priority (char *def, int *priority)
@@ -63,6 +60,10 @@ add_to_key (char *mime_type, char *def)
info->regex[1] = NULL;
info->ext[0] = NULL;
info->ext[1] = NULL;
+ info->regex_readable[0] = NULL;
+ info->regex_readable[1] = NULL;
+ info->ext_readable[0] = NULL;
+ info->ext_readable[1] = NULL;
info->keys = gnome_mime_get_keys (mime_type);
g_hash_table_insert (mime_types, mime_type, info);
}
@@ -76,8 +77,8 @@ add_to_key (char *mime_type, char *def)
used = 0;
while ((ext = strtok_r (s, " \t\n\r,", &tokp)) != NULL){
+ /* FIXME: We really need to check for duplicates before entering this. */
info->ext[priority] = g_list_prepend (info->ext[priority], ext);
- g_print ("inserting:%s:\n", ext);
used = 1;
s = NULL;
}
@@ -99,8 +100,11 @@ add_to_key (char *mime_type, char *def)
return;
if (regcomp (regex, def, REG_EXTENDED | REG_NOSUB))
g_free (regex);
- else
+ else {
info->regex[priority] = regex;
+ g_free (info->regex_readable[priority]);
+ info->regex_readable[priority] = g_strdup (def);
+ }
}
}
static void
@@ -163,18 +167,22 @@ mime_fill_from_file (const char *filename)
}
static void
-mime_load_from_dir (const char *mime_info_dir)
+mime_load_from_dir (const char *mime_info_dir, gboolean system_dir)
{
DIR *dir;
struct dirent *dent;
const int extlen = sizeof (".mime") - 1;
+ char *filename;
dir = opendir (mime_info_dir);
if (!dir)
return;
-
+ if (system_dir) {
+ filename = g_concat_dir_and_file (mime_info_dir, "gnome.mime");
+ mime_fill_from_file (filename);
+ g_free (filename);
+ }
while ((dent = readdir (dir)) != NULL){
- char *filename;
int len = strlen (dent->d_name);
@@ -183,41 +191,69 @@ mime_load_from_dir (const char *mime_info_dir)
if (strcmp (dent->d_name + len - extlen, ".mime"))
continue;
-
+ if (system_dir && !strcmp (dent->d_name, "gnome.mime"))
+ continue;
+ if (!system_dir && !strcmp (dent->d_name, "user.mime"))
+ continue;
+
filename = g_concat_dir_and_file (mime_info_dir, dent->d_name);
mime_fill_from_file (filename);
g_free (filename);
}
+ if (!system_dir) {
+ filename = g_concat_dir_and_file (mime_info_dir, "user.mime");
+ mime_fill_from_file (filename);
+ g_free (filename);
+ }
closedir (dir);
}
static void
add_mime_vals_to_clist (gchar *mime_type, gpointer mi, gpointer clist)
{
+ /* we also finalize the MimeInfo structure here, now that we're done
+ * loading it */
static gchar *text[2];
GList *list;
GString *extension;
gint row;
extension = g_string_new ("");
-
for (list = ((MimeInfo *) mi)->ext[0];list; list=list->next) {
g_string_append (extension, (gchar *) list->data);
if (list->next != NULL)
g_string_append (extension, ", ");
- else if (((MimeInfo *) mi)->ext[1] != NULL)
- g_string_append (extension, ", ");
}
+ ((MimeInfo *) mi)->ext_readable[0] = extension->str;
+ g_string_free (extension, FALSE);
+
+ extension = g_string_new ("");
for (list = ((MimeInfo *) mi)->ext[1];list; list=list->next) {
g_string_append (extension, (gchar *) list->data);
if (list->next)
g_string_append (extension, ", ");
}
+ ((MimeInfo *) mi)->ext_readable[1] = extension->str;
+ g_string_free (extension, FALSE);
+
+ if (((MimeInfo *) mi)->ext[0]) {
+ extension = g_string_new ((((MimeInfo *) mi)->ext_readable[0]));
+ if (((MimeInfo *) mi)->ext[1]) {
+ g_string_append (extension, ", ");
+ g_string_append (extension, (((MimeInfo *) mi)->ext_readable[1]));
+ }
+ } else if (((MimeInfo *) mi)->ext[1])
+ extension = g_string_new ((((MimeInfo *) mi)->ext_readable[1]));
+ else
+ extension = g_string_new ("");
+
text[0] = ((MimeInfo *) mi)->mime_type;
text[1] = extension->str;
+
row = gtk_clist_insert (GTK_CLIST (clist), 1, text);
gtk_clist_set_row_data (GTK_CLIST (clist), row, mi);
g_string_free (extension, TRUE);
}
+
static void
selected_row_callback (GtkWidget *widget, gint row, gint column, GdkEvent *event, gpointer data)
{
@@ -273,11 +309,11 @@ init_mime_type ()
mime_types = g_hash_table_new (g_str_hash, g_str_equal);
mime_info_dir = gnome_unconditional_datadir_file ("mime-info");
- mime_load_from_dir (mime_info_dir);
+ mime_load_from_dir (mime_info_dir, TRUE);
g_free (mime_info_dir);
mime_info_dir = g_concat_dir_and_file (gnome_util_user_home (), ".gnome/mime-info");
- mime_load_from_dir (mime_info_dir);
+ mime_load_from_dir (mime_info_dir, FALSE);
g_free (mime_info_dir);
-
+ init_mime_info ();
}
diff --git a/capplets/mime-type/mime-data.h b/capplets/mime-type/mime-data.h
index 2f61eacbb..8f5fd9fe9 100644
--- a/capplets/mime-type/mime-data.h
+++ b/capplets/mime-type/mime-data.h
@@ -11,6 +11,8 @@ typedef struct {
char *mime_type;
regex_t *regex[2];
GList *ext[2];
+ char *ext_readable[2];
+ char *regex_readable[2];
char *file_name;
GList *keys;
} MimeInfo;
diff --git a/capplets/mime-type/mime-type-capplet.c b/capplets/mime-type/mime-type-capplet.c
index 4ad1dd875..f4183bdb2 100644
--- a/capplets/mime-type/mime-type-capplet.c
+++ b/capplets/mime-type/mime-type-capplet.c
@@ -11,6 +11,7 @@
#include <regex.h>
#include <ctype.h>
#include "mime-data.h"
+#include "mime-info.h"
/* Prototypes */
static void try_callback ();
@@ -18,11 +19,13 @@ static void revert_callback ();
static void ok_callback ();
static void cancel_callback ();
static void help_callback ();
+GtkWidget *capplet;
static void
try_callback ()
{
-
+ g_print ("testing...\n");
+ write_user_keys ();
}
static void
revert_callback ()
@@ -47,7 +50,6 @@ help_callback ()
static void
init_mime_capplet ()
{
- GtkWidget *capplet;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *button;