📄 gtkfilesel.c
字号:
static voidgtk_file_selection_rename_file_confirmed (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; gchar *buf; gchar *file; gchar *path; gchar *new_filename; gchar *old_filename; CompletionState *cmpl_state; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); file = gtk_entry_get_text (GTK_ENTRY (fs->fileop_entry)); cmpl_state = (CompletionState*) fs->cmpl_state; path = cmpl_reference_position (cmpl_state); new_filename = g_strconcat (path, "/", file, NULL); old_filename = g_strconcat (path, "/", fs->fileop_file, NULL); if ( (rename (old_filename, new_filename)) < 0) { buf = g_strconcat ("Error renaming file \"", file, "\": ", g_strerror(errno), NULL); gtk_file_selection_fileop_error (fs, buf); } g_free (new_filename); g_free (old_filename); gtk_widget_destroy (fs->fileop_dialog); gtk_file_selection_populate (fs, "", FALSE);} static voidgtk_file_selection_rename_file (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; GtkWidget *label; GtkWidget *dialog; GtkWidget *vbox; GtkWidget *button; gchar *buf; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); if (fs->fileop_dialog) return; fs->fileop_file = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); if (strlen(fs->fileop_file) < 1) return; /* main dialog */ fs->fileop_dialog = dialog = gtk_dialog_new (); gtk_signal_connect (GTK_OBJECT (dialog), "destroy", (GtkSignalFunc) gtk_file_selection_fileop_destroy, (gpointer) fs); gtk_window_set_title (GTK_WINDOW (dialog), _("Rename File")); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); /* If file dialog is grabbed, grab option dialog */ /* When option dialog closed, file dialog will be grabbed again */ if (GTK_WINDOW(fs)->modal) gtk_window_set_modal (GTK_WINDOW(dialog), TRUE); vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER(vbox), 8); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, FALSE, FALSE, 0); gtk_widget_show(vbox); buf = g_strconcat ("Rename file \"", fs->fileop_file, "\" to:", NULL); label = gtk_label_new(buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); gtk_widget_show(label); g_free(buf); /* New filename entry */ fs->fileop_entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (vbox), fs->fileop_entry, TRUE, TRUE, 5); GTK_WIDGET_SET_FLAGS(fs->fileop_entry, GTK_CAN_DEFAULT); gtk_widget_show (fs->fileop_entry); gtk_entry_set_text (GTK_ENTRY (fs->fileop_entry), fs->fileop_file); gtk_editable_select_region (GTK_EDITABLE (fs->fileop_entry), 0, strlen (fs->fileop_file)); /* buttons */ button = gtk_button_new_with_label (_("Rename")); gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) gtk_file_selection_rename_file_confirmed, (gpointer) fs); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_show(button); button = gtk_button_new_with_label (_("Cancel")); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", (GtkSignalFunc) gtk_widget_destroy, (gpointer) dialog); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_grab_default(button); gtk_widget_show (button); gtk_widget_show (dialog);}static gintgtk_file_selection_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data){ GtkFileSelection *fs; char *text; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->keyval == GDK_Tab) { fs = GTK_FILE_SELECTION (user_data); text = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); text = g_strdup (text); gtk_file_selection_populate (fs, text, TRUE); g_free (text); gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); return TRUE; } return FALSE;}static voidgtk_file_selection_history_callback (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; HistoryCallbackArg *callback_arg; GList *list; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); list = fs->history_list; while (list) { callback_arg = list->data; if (callback_arg->menu_item == widget) { gtk_file_selection_populate (fs, callback_arg->directory, FALSE); break; } list = list->next; }}static void gtk_file_selection_update_history_menu (GtkFileSelection *fs, gchar *current_directory){ HistoryCallbackArg *callback_arg; GtkWidget *menu_item; GList *list; gchar *current_dir; gint dir_len; gint i; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); g_return_if_fail (current_directory != NULL); list = fs->history_list; if (fs->history_menu) { while (list) { callback_arg = list->data; g_free (callback_arg->directory); g_free (callback_arg); list = list->next; } g_list_free (fs->history_list); fs->history_list = NULL; gtk_widget_destroy (fs->history_menu); } fs->history_menu = gtk_menu_new(); current_dir = g_strdup (current_directory); dir_len = strlen (current_dir); for (i = dir_len; i >= 0; i--) { /* the i == dir_len is to catch the full path for the first * entry. */ if ( (current_dir[i] == '/') || (i == dir_len)) { /* another small hack to catch the full path */ if (i != dir_len) current_dir[i + 1] = '\0'; menu_item = gtk_menu_item_new_with_label (current_dir); callback_arg = g_new (HistoryCallbackArg, 1); callback_arg->menu_item = menu_item; /* since the autocompletion gets confused if you don't * supply a trailing '/' on a dir entry, set the full * (current) path to "" which just refreshes the filesel */ if (dir_len == i) { callback_arg->directory = g_strdup (""); } else { callback_arg->directory = g_strdup (current_dir); } fs->history_list = g_list_append (fs->history_list, callback_arg); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", (GtkSignalFunc) gtk_file_selection_history_callback, (gpointer) fs); gtk_menu_append (GTK_MENU (fs->history_menu), menu_item); gtk_widget_show (menu_item); } } gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->history_pulldown), fs->history_menu); g_free (current_dir);}static voidgtk_file_selection_file_button (GtkWidget *widget, gint row, gint column, GdkEventButton *bevent, gpointer user_data){ GtkFileSelection *fs = NULL; gchar *filename, *temp = NULL; g_return_if_fail (GTK_IS_CLIST (widget)); fs = user_data; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); gtk_clist_get_text (GTK_CLIST (fs->file_list), row, 0, &temp); filename = g_strdup (temp); if (filename) { if (bevent) switch (bevent->type) { case GDK_2BUTTON_PRESS: gtk_button_clicked (GTK_BUTTON (fs->ok_button)); break; default: gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); break; } else gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); g_free (filename); }}static voidgtk_file_selection_dir_button (GtkWidget *widget, gint row, gint column, GdkEventButton *bevent, gpointer user_data){ GtkFileSelection *fs = NULL; gchar *filename, *temp = NULL; g_return_if_fail (GTK_IS_CLIST (widget)); fs = GTK_FILE_SELECTION (user_data); g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); gtk_clist_get_text (GTK_CLIST (fs->dir_list), row, 0, &temp); filename = g_strdup (temp); if (filename) { if (bevent) switch (bevent->type) { case GDK_2BUTTON_PRESS: gtk_file_selection_populate (fs, filename, FALSE); break; default: gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); break; } else gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); g_free (filename); }}static voidgtk_file_selection_populate (GtkFileSelection *fs, gchar *rel_path, gint try_complete){ CompletionState *cmpl_state; PossibleCompletion* poss; gchar* filename; gint row; gchar* rem_path = rel_path; gchar* sel_text; gchar* text[2]; gint did_recurse = FALSE; gint possible_count = 0; gint selection_index = -1; gint file_list_width; gint dir_list_width; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); cmpl_state = (CompletionState*) fs->cmpl_state; poss = cmpl_completion_matches (rel_path, &rem_path, cmpl_state); if (!cmpl_state_okay (cmpl_state)) { /* Something went wrong. */ gtk_file_selection_abort (fs); return; } g_assert (cmpl_state->reference_dir); gtk_clist_freeze (GTK_CLIST (fs->dir_list)); gtk_clist_clear (GTK_CLIST (fs->dir_list)); gtk_clist_freeze (GTK_CLIST (fs->file_list)); gtk_clist_clear (GTK_CLIST (fs->file_list)); /* Set the dir_list to include ./ and ../ */ text[1] = NULL; text[0] = "./"; row = gtk_clist_append (GTK_CLIST (fs->dir_list), text); text[0] = "../"; row = gtk_clist_append (GTK_CLIST (fs->dir_list), text); /*reset the max widths of the lists*/ dir_list_width = gdk_string_width(fs->dir_list->style->font,"../"); gtk_clist_set_column_width(GTK_CLIST(fs->dir_list),0,dir_list_width); file_list_width = 1; gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0,file_list_width); while (poss) { if (cmpl_is_a_completion (poss)) { possible_count += 1; filename = cmpl_this_completion (poss); text[0] = filename; if (cmpl_is_directory (poss)) { if (strcmp (filename, "./") != 0 && strcmp (filename, "../") != 0) { int width = gdk_string_width(fs->dir_list->style->font, filename); row = gtk_clist_append (GTK_CLIST (fs->dir_list), text); if(width > dir_list_width) { dir_list_width = width; gtk_clist_set_column_width(GTK_CLIST(fs->dir_list),0, width); } } } else { int width = gdk_string_width(fs->file_list->style->font, filename); row = gtk_clist_append (GTK_CLIST (fs->file_list), text); if(width > file_list_width) { file_list_width = width; gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0, width); } } } poss = cmpl_next_completion (cmpl_state); } gtk_clist_thaw (GTK_CLIST (fs->dir_list)); gtk_clist_thaw (GTK_CLIST (fs->file_list)); /* File lists are set. */ g_assert (cmpl_state->reference_dir); if (try_complete) { /* User is trying to complete filenames, so advance the user's input * string to the updated_text, which is the common leading substring * of all possible completions, and if its a directory attempt * attempt completions in it. */ if (cmpl_updated_text (cmpl_state)[0]) { if (cmpl_updated_dir (cmpl_state)) { gchar* dir_name = g_strdup (cmpl_updated_text (cmpl_state)); did_recurse = TRUE; gtk_file_selection_populate (fs, dir_name, TRUE); g_free (dir_name); } else { if (fs->selection_entry) gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), cmpl_updated_text (cmpl_state)); } } else { selection_index = cmpl_last_valid_char (cmpl_state) - (strlen (rel_path) - strlen (rem_path)); if (fs->selection_entry) gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), rem_path); } } else { if (fs->selection_entry) gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), ""); } if (!did_recurse) { if (fs->selection_entry) gtk_entry_set_position (GTK_ENTRY (fs->selection_entry), selection_index); if (fs->selection_entry) { sel_text = g_strconcat (_("Selection: "), cmpl_reference_position (cmpl_state), NULL); gtk_label_set_text (GTK_LABEL (fs->selection_text), sel_text); g_free (sel_text); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -