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), + _("")); + 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), + _("")); + 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), + _("")); + /* 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 #include #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 #include #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;