⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkfilesel.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -