diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dlg-open-with.c | 488 | 
1 files changed, 47 insertions, 441 deletions
| diff --git a/src/dlg-open-with.c b/src/dlg-open-with.c index 3e90eb4..2bd5df9 100644 --- a/src/dlg-open-with.c +++ b/src/dlg-open-with.c @@ -32,466 +32,72 @@  #include "dlg-open-with.h" -#define TEMP_DOCS  "temp_docs" - -enum { ICON_COLUMN, TEXT_COLUMN, DATA_COLUMN, N_COLUMNS }; -  typedef struct { -	FrWindow     *window; -	GSettings    *settings; -	GtkBuilder   *builder; - -	GtkWidget    *dialog; -	GtkWidget    *o_app_tree_view; -	GtkWidget    *o_recent_tree_view; -	GtkWidget    *o_app_entry; -	GtkWidget    *o_del_button; -	GtkWidget    *ok_button; - -	GList        *app_list; -	GList        *file_list; - -	GtkTreeModel *app_model; -	GtkTreeModel *recent_model; -	 -	GtkWidget    *last_clicked_list; -} DialogData; - - -/* called when the main dialog is closed. */ -static void -open_with__destroy_cb (GtkWidget  *widget, -		       DialogData *data) -{ -	if (data->app_list != NULL)  -		g_list_free (data->app_list); - -	if (data->file_list != NULL) -		path_list_free (data->file_list); -	g_object_unref (data->builder); -	g_object_unref (data->settings); -	g_free (data); -} - - -static void -open_cb (GtkWidget *widget, -	 gpointer   callback_data) -{ -	DialogData  *data = callback_data; -	const char  *application; -	gboolean     present = FALSE; -	char        *command = NULL; -	GList       *scan; -	char **editors; -	int i; - -	application = gtk_entry_get_text (GTK_ENTRY (data->o_app_entry)); - -	for (scan = data->app_list; scan; scan = scan->next) { -		GAppInfo *app = scan->data; -		if (strcmp (g_app_info_get_executable (app), application) == 0) { -			fr_window_open_files_with_application (data->window, data->file_list, app); -			gtk_widget_destroy (data->dialog); -			return; -		} -	} - -	/* add the command to the editors list if not already present. */ - -	editors = g_settings_get_strv (data->settings, PREF_GENERAL_EDITORS); -	for (i = 0; ! present && editors[i] != NULL; i++) { -		if (strcmp (editors[i], application) == 0) { -			command = g_strdup (editors[i]); -			present = TRUE; -		} -	} - -	if (! present) { -		char **new_editors; - -		new_editors = _g_strv_prepend (editors, g_strdup (application)); -		command = g_strdup (application); -		g_settings_set_strv (data->settings, PREF_GENERAL_EDITORS, (const gchar * const *) new_editors); - -		g_strfreev (new_editors); -	} - -	g_strfreev (editors); - -	/* exec the application */ - -	if (command != NULL) { -		fr_window_open_files_with_command (data->window, data->file_list, command); -		g_free (command); -	} - -	gtk_widget_destroy (data->dialog); -} - - -static void -app_list_selection_changed_cb (GtkTreeSelection *selection, -			       gpointer          p) -{ -	DialogData  *data = p; -	GtkTreeIter  iter; -	GAppInfo    *app; - -	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_app_tree_view)); -	if (selection == NULL) -		return; - -	if (! gtk_tree_selection_get_selected (selection, NULL, &iter)) -		return; - -	gtk_tree_model_get (data->app_model, &iter, -			    DATA_COLUMN, &app, -			    -1); -	_gtk_entry_set_locale_text (GTK_ENTRY (data->o_app_entry), g_app_info_get_executable (app)); -	data->last_clicked_list = data->o_app_tree_view; -} - - -static void -app_activated_cb (GtkTreeView       *tree_view, -		  GtkTreePath       *path, -		  GtkTreeViewColumn *column, -		  gpointer           callback_data) -{ -	DialogData   *data = callback_data; -	GtkTreeIter   iter; -	GAppInfo     *app; - -	if (! gtk_tree_model_get_iter (data->app_model, &iter, path)) -		return; - -	gtk_tree_model_get (data->app_model, &iter, -			    DATA_COLUMN, &app, -			    -1); - -	_gtk_entry_set_locale_text (GTK_ENTRY (data->o_app_entry), g_app_info_get_executable (app)); - -	open_cb (NULL, data); -} - - -static void -recent_list_selection_changed_cb (GtkTreeSelection *selection, -				  gpointer          p) -{ -	DialogData   *data = p; -	GtkTreeIter   iter; -	char         *editor; - -	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_recent_tree_view)); -	if (selection == NULL) -		return; - -	if (! gtk_tree_selection_get_selected (selection, NULL, &iter)) -		return; - -	gtk_tree_model_get (data->recent_model, &iter, -			    0, &editor, -			    -1); -	_gtk_entry_set_locale_text (GTK_ENTRY (data->o_app_entry), editor); -	g_free (editor); -	data->last_clicked_list = data->o_recent_tree_view; -} - - -static void -recent_activated_cb (GtkTreeView       *tree_view, -		     GtkTreePath       *path, -		     GtkTreeViewColumn *column, -		     gpointer           callback_data) -{ -	DialogData   *data = callback_data; -	GtkTreeIter   iter; -	char         *editor; - -	if (! gtk_tree_model_get_iter (data->recent_model, &iter, path)) -		return; - -	gtk_tree_model_get (data->recent_model, &iter, -			    0, &editor, -			    -1); -	_gtk_entry_set_locale_text (GTK_ENTRY (data->o_app_entry), editor); -	g_free (editor); - -	open_cb (NULL, data); -} +	FrWindow *window; +	GList    *file_list; +} OpenData;  static void -app_entry__changed_cb (GtkEditable *editable, -		       gpointer     user_data) +open_data_free (OpenData *o_data)  { -	DialogData *data = user_data; -	const char *text; - -	text = eat_void_chars (gtk_entry_get_text (GTK_ENTRY (data->o_app_entry))); -	gtk_widget_set_sensitive (data->ok_button, strlen (text) > 0); +	path_list_free (o_data->file_list); +	g_free (o_data);  }  static void -delete_recent_cb (GtkWidget *widget, -		  gpointer   callback_data) +app_chooser_response_cb (GtkDialog *dialog, +			 int        response_id, +			 gpointer   user_data)  { -	DialogData       *data = callback_data; -	GtkTreeSelection *selection; -	GtkTreeIter       iter; -	 - -	if (data->last_clicked_list == data->o_recent_tree_view) { -		char *editor; -		char **editors; -	 -		selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_recent_tree_view)); -		if (! gtk_tree_selection_get_selected (selection, NULL, &iter)) -			return; - -		gtk_tree_model_get (data->recent_model, &iter, -				    0, &editor, -				    -1); -		gtk_list_store_remove (GTK_LIST_STORE (data->recent_model), &iter); - -		/**/ - -		editors = g_settings_get_strv (data->settings, PREF_GENERAL_EDITORS); -		if (_g_strv_remove (editors, editor)) -			g_settings_set_strv (data->settings, PREF_GENERAL_EDITORS, (const gchar * const *) editors); -		g_strfreev (editors); -		g_free (editor); -	} -	else if (data->last_clicked_list == data->o_app_tree_view) { -		GAppInfo *app; -		 -		selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_app_tree_view)); -		if (! gtk_tree_selection_get_selected (selection, NULL, &iter)) -			return; - -		gtk_tree_model_get (data->app_model, &iter, -			    	    DATA_COLUMN, &app, -			    	    -1); -		gtk_list_store_remove (GTK_LIST_STORE (data->app_model), &iter); -		 -		if (g_app_info_can_remove_supports_type (app)) { -			const char *mime_type; -			 -			mime_type = get_file_mime_type_for_path ((char*) data->file_list->data, FALSE); -			g_app_info_remove_supports_type (app, mime_type, NULL); +	OpenData *o_data = user_data; +	GAppInfo *app_info; + +	switch (response_id) { +	case GTK_RESPONSE_OK: +		app_info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (dialog)); +		if (app_info != NULL) { +			fr_window_open_files_with_application (o_data->window, o_data->file_list, app_info); +			g_object_unref (app_info);  		} +		open_data_free (o_data); +		gtk_widget_destroy (GTK_WIDGET (dialog)); +		break; + +	case GTK_RESPONSE_CANCEL: +	case GTK_RESPONSE_DELETE_EVENT: +		open_data_free (o_data); +		gtk_widget_destroy (GTK_WIDGET (dialog)); +		break; + +	default: +		break;  	}  } -/* create the "open with" dialog. */  void  dlg_open_with (FrWindow *window,  	       GList    *file_list)  { -	DialogData *data; -	GAppInfo *app; -	GList *scan, *app_names = NULL; -	char **editors; -	int i; -	GtkWidget *cancel_button; -	GtkTreeIter iter; -	GtkCellRenderer *renderer; -	GtkTreeViewColumn *column; -	GtkIconTheme *theme; -	int icon_size; - -	if (file_list == NULL) -		return; - -	data = g_new0 (DialogData, 1); -	data->settings = g_settings_new (ENGRAMPA_SCHEMA_GENERAL); -	data->builder = _gtk_builder_new_from_file ("open-with.ui"); -	if (data->builder == NULL) { -		g_free (data); -		return; -	} - -	data->file_list = path_list_dup (file_list); -	data->window = window; - -	/* Get the widgets. */ - -	data->dialog = _gtk_builder_get_widget (data->builder, "open_with_dialog"); -	data->o_app_tree_view = _gtk_builder_get_widget (data->builder, "o_app_list_tree_view"); -	data->o_recent_tree_view = _gtk_builder_get_widget (data->builder, "o_recent_tree_view"); -	data->o_app_entry = _gtk_builder_get_widget (data->builder, "o_app_entry"); -	data->o_del_button = _gtk_builder_get_widget (data->builder, "o_del_button"); -	data->ok_button = _gtk_builder_get_widget (data->builder, "o_ok_button"); -	cancel_button = _gtk_builder_get_widget (data->builder, "o_cancel_button"); - -	gtk_widget_set_sensitive (data->ok_button, FALSE); - -	/* Set the signals handlers. */ - -	g_signal_connect (G_OBJECT (data->dialog), -			  "destroy", -			  G_CALLBACK (open_with__destroy_cb), -			  data); - -	g_signal_connect (G_OBJECT (data->o_app_entry), -			  "changed", -			  G_CALLBACK (app_entry__changed_cb), -			  data); - -	g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_app_tree_view))), -			  "changed", -			  G_CALLBACK (app_list_selection_changed_cb), -			  data); -	g_signal_connect (G_OBJECT (data->o_app_tree_view), -			  "row_activated", -			  G_CALLBACK (app_activated_cb), -			  data); - -	g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (data->o_recent_tree_view))), -			  "changed", -			  G_CALLBACK (recent_list_selection_changed_cb), -			  data); -	g_signal_connect (G_OBJECT (data->o_recent_tree_view), -			  "row_activated", -			  G_CALLBACK (recent_activated_cb), -			  data); - -	g_signal_connect (G_OBJECT (data->ok_button), -			  "clicked", -			  G_CALLBACK (open_cb), -			  data); -	g_signal_connect_swapped (G_OBJECT (cancel_button), -				  "clicked", -				  G_CALLBACK (gtk_widget_destroy), -				  G_OBJECT (data->dialog)); -	g_signal_connect (G_OBJECT (data->o_del_button), -			  "clicked", -			  G_CALLBACK (delete_recent_cb), -			  data); - -	/* Set data. */ - -	/* * registered applications list. */ - -	data->app_list = NULL; -	for (scan = data->file_list; scan; scan = scan->next) { -		const char *mime_type; -		const char *name = scan->data; - -		mime_type = get_file_mime_type_for_path (name, FALSE); -		if ((mime_type != NULL) && ! g_content_type_is_unknown (mime_type)) -			data->app_list = g_list_concat (data->app_list, g_app_info_get_all_for_type (mime_type)); -	} - -	data->app_model = GTK_TREE_MODEL (gtk_list_store_new (N_COLUMNS, -							      GDK_TYPE_PIXBUF, -							      G_TYPE_STRING, -							      G_TYPE_POINTER)); - -	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->app_model), -					      TEXT_COLUMN, -					      GTK_SORT_ASCENDING); - -	gtk_tree_view_set_model (GTK_TREE_VIEW (data->o_app_tree_view), -				 data->app_model); -	g_object_unref (G_OBJECT (data->app_model)); - -	theme = gtk_icon_theme_get_default (); -	icon_size = get_folder_pixbuf_size_for_list (GTK_WIDGET (data->dialog)); - -	for (scan = data->app_list; scan; scan = scan->next) { -		gboolean   found; -		char      *utf8_name; -		GdkPixbuf *icon_image = NULL; - -		app = scan->data; - -		found = FALSE; -		if (app_names != NULL) { -			GList *p; -			for (p = app_names; p && !found; p = p->next) -				if (g_strcmp0 ((char*)p->data, g_app_info_get_executable (app)) == 0) -					found = TRUE; -		} - -		if (found) -			continue; - -		app_names = g_list_prepend (app_names, (char*) g_app_info_get_executable (app)); - -		utf8_name = g_locale_to_utf8 (g_app_info_get_name (app), -1, NULL, NULL, NULL);	 -		icon_image = get_icon_pixbuf (g_app_info_get_icon (app), icon_size, theme); -		 -		gtk_list_store_append (GTK_LIST_STORE (data->app_model), -				       &iter); -		gtk_list_store_set (GTK_LIST_STORE (data->app_model), -				    &iter, -				    ICON_COLUMN, icon_image, -				    TEXT_COLUMN, utf8_name, -				    DATA_COLUMN, app, -				    -1); - -		g_free (utf8_name); -	} - -	column = gtk_tree_view_column_new (); - -	renderer = gtk_cell_renderer_pixbuf_new (); -	gtk_tree_view_column_pack_start (column, renderer, FALSE); -	gtk_tree_view_column_set_attributes (column, renderer, -					     "pixbuf", ICON_COLUMN, -					     NULL); - -	renderer = gtk_cell_renderer_text_new (); -	gtk_tree_view_column_pack_start (column, -					 renderer, -					 TRUE); -	gtk_tree_view_column_set_attributes (column, renderer, -					     "text", TEXT_COLUMN, -					     NULL); - -	gtk_tree_view_append_column (GTK_TREE_VIEW (data->o_app_tree_view), -				     column); - -	if (app_names) -		g_list_free (app_names); - -	/* * recent editors list. */ - -	data->recent_model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING)); -	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->recent_model), 0, GTK_SORT_ASCENDING); - -	gtk_tree_view_set_model (GTK_TREE_VIEW (data->o_recent_tree_view), -				 data->recent_model); -	g_object_unref (G_OBJECT (data->recent_model)); - -	editors = g_settings_get_strv (data->settings, PREF_GENERAL_EDITORS); -	for (i = 0; editors[i] != NULL; i++) { -		gtk_list_store_append (GTK_LIST_STORE (data->recent_model), &iter); -		gtk_list_store_set (GTK_LIST_STORE (data->recent_model), &iter, -				    0, editors[i], -				    -1); -	} -	g_strfreev (editors); - -	renderer = gtk_cell_renderer_text_new (); -	column = gtk_tree_view_column_new_with_attributes (NULL, -							   renderer, -							   "text", 0, -							   NULL); -	gtk_tree_view_column_set_sort_column_id (column, 0); -	gtk_tree_view_append_column (GTK_TREE_VIEW (data->o_recent_tree_view), -				     column); - -	/* Run dialog. */ -	gtk_window_set_transient_for (GTK_WINDOW (data->dialog), -				      GTK_WINDOW (window)); -	gtk_window_set_modal (GTK_WINDOW (data->dialog), TRUE); -	gtk_widget_show_all (data->dialog); +	OpenData  *o_data; +	GtkWidget *app_chooser; +	GFile     *first_file; + +	o_data = g_new0 (OpenData, 1); +	o_data->window = window; +	o_data->file_list = file_list; + +	first_file = g_file_new_for_path (file_list->data); +	app_chooser = gtk_app_chooser_dialog_new (GTK_WINDOW (window), +						  GTK_DIALOG_MODAL, +						  first_file); +	g_signal_connect (app_chooser, +			  "response", +			  G_CALLBACK (app_chooser_response_cb), +			  o_data); +	gtk_widget_show (app_chooser);  } | 
