📄 gtkfilesel.c
字号:
filesel->selection_text = label = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (entry_vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); filesel->selection_entry = gtk_entry_new (); gtk_signal_connect (GTK_OBJECT (filesel->selection_entry), "key_press_event", (GtkSignalFunc) gtk_file_selection_key_press, filesel); gtk_signal_connect_object (GTK_OBJECT (filesel->selection_entry), "focus_in_event", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (filesel->ok_button)); gtk_signal_connect_object (GTK_OBJECT (filesel->selection_entry), "activate", (GtkSignalFunc) gtk_button_clicked, GTK_OBJECT (filesel->ok_button)); gtk_box_pack_start (GTK_BOX (entry_vbox), filesel->selection_entry, TRUE, TRUE, 0); gtk_widget_show (filesel->selection_entry); if (!cmpl_state_okay (filesel->cmpl_state)) { gchar err_buf[256]; sprintf (err_buf, _("Directory unreadable: %s"), cmpl_strerror (cmpl_errno)); gtk_label_set_text (GTK_LABEL (filesel->selection_text), err_buf); } else { gtk_file_selection_populate (filesel, "", FALSE); } gtk_widget_grab_focus (filesel->selection_entry);}GtkWidget*gtk_file_selection_new (const gchar *title){ GtkFileSelection *filesel; filesel = gtk_type_new (GTK_TYPE_FILE_SELECTION); gtk_window_set_title (GTK_WINDOW (filesel), title); return GTK_WIDGET (filesel);}voidgtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel){ g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); /* delete, create directory, and rename */ if (!filesel->fileop_c_dir) { filesel->fileop_c_dir = gtk_button_new_with_label (_("Create Dir")); gtk_signal_connect (GTK_OBJECT (filesel->fileop_c_dir), "clicked", (GtkSignalFunc) gtk_file_selection_create_dir, (gpointer) filesel); gtk_box_pack_start (GTK_BOX (filesel->button_area), filesel->fileop_c_dir, TRUE, TRUE, 0); gtk_widget_show (filesel->fileop_c_dir); } if (!filesel->fileop_del_file) { filesel->fileop_del_file = gtk_button_new_with_label (_("Delete File")); gtk_signal_connect (GTK_OBJECT (filesel->fileop_del_file), "clicked", (GtkSignalFunc) gtk_file_selection_delete_file, (gpointer) filesel); gtk_box_pack_start (GTK_BOX (filesel->button_area), filesel->fileop_del_file, TRUE, TRUE, 0); gtk_widget_show (filesel->fileop_del_file); } if (!filesel->fileop_ren_file) { filesel->fileop_ren_file = gtk_button_new_with_label (_("Rename File")); gtk_signal_connect (GTK_OBJECT (filesel->fileop_ren_file), "clicked", (GtkSignalFunc) gtk_file_selection_rename_file, (gpointer) filesel); gtk_box_pack_start (GTK_BOX (filesel->button_area), filesel->fileop_ren_file, TRUE, TRUE, 0); gtk_widget_show (filesel->fileop_ren_file); } gtk_widget_queue_resize(GTK_WIDGET(filesel));}void gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel){ g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); if (filesel->fileop_ren_file) { gtk_widget_destroy (filesel->fileop_ren_file); filesel->fileop_ren_file = NULL; } if (filesel->fileop_del_file) { gtk_widget_destroy (filesel->fileop_del_file); filesel->fileop_del_file = NULL; } if (filesel->fileop_c_dir) { gtk_widget_destroy (filesel->fileop_c_dir); filesel->fileop_c_dir = NULL; }}voidgtk_file_selection_set_filename (GtkFileSelection *filesel, const gchar *filename){ char buf[MAXPATHLEN]; const char *name, *last_slash; g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); g_return_if_fail (filename != NULL); last_slash = strrchr (filename, '/'); if (!last_slash) { buf[0] = 0; name = filename; } else { gint len = MIN (MAXPATHLEN - 1, last_slash - filename + 1); strncpy (buf, filename, len); buf[len] = 0; name = last_slash + 1; } gtk_file_selection_populate (filesel, buf, FALSE); if (filesel->selection_entry) gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), name);}gchar*gtk_file_selection_get_filename (GtkFileSelection *filesel){ static char nothing[2] = ""; char *text; char *filename; g_return_val_if_fail (filesel != NULL, nothing); g_return_val_if_fail (GTK_IS_FILE_SELECTION (filesel), nothing); text = gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)); if (text) { filename = cmpl_completion_fullname (text, filesel->cmpl_state); return filename; } return nothing;}voidgtk_file_selection_complete (GtkFileSelection *filesel, const gchar *pattern){ g_return_if_fail (filesel != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); g_return_if_fail (pattern != NULL); if (filesel->selection_entry) gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), pattern); gtk_file_selection_populate (filesel, (gchar*) pattern, TRUE);}static voidgtk_file_selection_destroy (GtkObject *object){ GtkFileSelection *filesel; GList *list; HistoryCallbackArg *callback_arg; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (object)); filesel = GTK_FILE_SELECTION (object); if (filesel->fileop_dialog) gtk_widget_destroy (filesel->fileop_dialog); if (filesel->history_list) { list = filesel->history_list; while (list) { callback_arg = list->data; g_free (callback_arg->directory); g_free (callback_arg); list = list->next; } g_list_free (filesel->history_list); filesel->history_list = NULL; } cmpl_free_state (filesel->cmpl_state); filesel->cmpl_state = NULL; if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);}/* Begin file operations callbacks */static voidgtk_file_selection_fileop_error (GtkFileSelection *fs, gchar *error_message){ GtkWidget *label; GtkWidget *vbox; GtkWidget *button; GtkWidget *dialog; g_return_if_fail (error_message != NULL); /* main 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), _("Error")); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); /* If file dialog is grabbed, make this dialog modal too */ /* When error dialog is 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); label = gtk_label_new(error_message); 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); /* yes, we free it */ g_free (error_message); /* close button */ button = gtk_button_new_with_label (_("Close")); 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 voidgtk_file_selection_fileop_destroy (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); fs->fileop_dialog = NULL;}static voidgtk_file_selection_create_dir_confirmed (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; gchar *dirname; gchar *path; gchar *full_path; gchar *buf; CompletionState *cmpl_state; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); dirname = gtk_entry_get_text (GTK_ENTRY (fs->fileop_entry)); cmpl_state = (CompletionState*) fs->cmpl_state; path = cmpl_reference_position (cmpl_state); full_path = g_strconcat (path, "/", dirname, NULL); if ( (mkdir (full_path, 0755) < 0) ) { buf = g_strconcat ("Error creating directory \"", dirname, "\": ", g_strerror(errno), NULL); gtk_file_selection_fileop_error (fs, buf); } g_free (full_path); gtk_widget_destroy (fs->fileop_dialog); gtk_file_selection_populate (fs, "", FALSE);} static voidgtk_file_selection_create_dir (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; GtkWidget *label; GtkWidget *dialog; GtkWidget *vbox; GtkWidget *button; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); if (fs->fileop_dialog) 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), _("Create Directory")); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); /* If file dialog is grabbed, grab option dialog */ /* When option dialog is 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); label = gtk_label_new(_("Directory name:")); 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); /* The directory entry widget */ 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); /* buttons */ button = gtk_button_new_with_label (_("Create")); gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) gtk_file_selection_create_dir_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 voidgtk_file_selection_delete_file_confirmed (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; CompletionState *cmpl_state; gchar *path; gchar *full_path; gchar *buf; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); cmpl_state = (CompletionState*) fs->cmpl_state; path = cmpl_reference_position (cmpl_state); full_path = g_strconcat (path, "/", fs->fileop_file, NULL); if ( (unlink (full_path) < 0) ) { buf = g_strconcat ("Error deleting file \"", fs->fileop_file, "\": ", g_strerror(errno), NULL); gtk_file_selection_fileop_error (fs, buf); } g_free (full_path); gtk_widget_destroy (fs->fileop_dialog); gtk_file_selection_populate (fs, "", FALSE);}static voidgtk_file_selection_delete_file (GtkWidget *widget, gpointer data){ GtkFileSelection *fs = data; GtkWidget *label; GtkWidget *vbox; GtkWidget *button; GtkWidget *dialog; gchar *filename; gchar *buf; g_return_if_fail (fs != NULL); g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); if (fs->fileop_dialog) return; filename = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); if (strlen(filename) < 1) return; fs->fileop_file = filename; /* 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), _("Delete File")); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); /* If file dialog is grabbed, grab option dialog */ /* When option dialog is 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 ("Really delete file \"", filename, "\" ?", 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); /* buttons */ button = gtk_button_new_with_label (_("Delete")); gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) gtk_file_selection_delete_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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -