From 8fa00d0a56f073e0ac44a7de33203d893af4a841 Mon Sep 17 00:00:00 2001 From: Ignacio Casal Quinteiro Date: Thu, 19 Mar 2015 15:46:48 +0100 Subject: [PATCH 05/26] Fix desktop actions https://bugzilla.gnome.org/show_bug.cgi?id=744184 --- data/org.gnome.gedit.desktop.in.in | 6 +- gedit/gedit-app.c | 394 +++++++++++++++++++------------------ 2 files changed, 210 insertions(+), 190 deletions(-) --- a/data/org.gnome.gedit.desktop.in.in +++ b/data/org.gnome.gedit.desktop.in.in @@ -16,14 +16,14 @@ X-GNOME-Bugzilla-Product=gedit X-GNOME-Bugzilla-Component=general X-GNOME-Bugzilla-Version=@VERSION@ X-GNOME-Bugzilla-ExtraInfoScript=@FULL_LIBEXECDIR@/gedit/gedit-bugreport.sh -Actions=Window;Document; +Actions=new-window;new-document; _Keywords=Text;Editor; DBusActivatable=true -[Desktop Action Window] +[Desktop Action new-window] _Name=Open a New Window Exec=gedit --new-window -[Desktop Action Document] +[Desktop Action new-document] _Name=Open a New Document Exec=gedit --new-document --- a/gedit/gedit-app.c +++ b/gedit/gedit-app.c @@ -290,6 +290,193 @@ gedit_app_set_window_title_impl (GeditAp gtk_window_set_title (GTK_WINDOW (window), title); } +static gboolean +is_in_viewport (GtkWindow *window, + GdkScreen *screen, + gint workspace, + gint viewport_x, + gint viewport_y) +{ + GdkScreen *s; + GdkDisplay *display; + GdkWindow *gdkwindow; + const gchar *cur_name; + const gchar *name; + gint cur_n; + gint n; + gint ws; + gint sc_width, sc_height; + gint x, y, width, height; + gint vp_x, vp_y; + + /* Check for screen and display match */ + display = gdk_screen_get_display (screen); + cur_name = gdk_display_get_name (display); + cur_n = gdk_screen_get_number (screen); + + s = gtk_window_get_screen (window); + display = gdk_screen_get_display (s); + name = gdk_display_get_name (display); + n = gdk_screen_get_number (s); + + if (strcmp (cur_name, name) != 0 || cur_n != n) + { + return FALSE; + } + + /* Check for workspace match */ + ws = gedit_utils_get_window_workspace (window); + if (ws != workspace && ws != GEDIT_ALL_WORKSPACES) + { + return FALSE; + } + + /* Check for viewport match */ + gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); + gdk_window_get_position (gdkwindow, &x, &y); + width = gdk_window_get_width (gdkwindow); + height = gdk_window_get_height (gdkwindow); + gedit_utils_get_current_viewport (screen, &vp_x, &vp_y); + x += vp_x; + y += vp_y; + + sc_width = gdk_screen_get_width (screen); + sc_height = gdk_screen_get_height (screen); + + return x + width * .25 >= viewport_x && + x + width * .75 <= viewport_x + sc_width && + y >= viewport_y && + y + height <= viewport_y + sc_height; +} + +static GeditWindow * +get_active_window (GtkApplication *app) +{ + GdkScreen *screen; + guint workspace; + gint viewport_x, viewport_y; + GList *windows, *l; + + screen = gdk_screen_get_default (); + + workspace = gedit_utils_get_current_workspace (screen); + gedit_utils_get_current_viewport (screen, &viewport_x, &viewport_y); + + /* Gtk documentation says the window list is always in MRU order */ + windows = gtk_application_get_windows (app); + for (l = windows; l != NULL; l = l->next) + { + GtkWindow *window = l->data; + + if (GEDIT_IS_WINDOW (window) && is_in_viewport (window, screen, workspace, viewport_x, viewport_y)) + { + return GEDIT_WINDOW (window); + } + } + + return NULL; +} + +static void +set_command_line_wait (GeditApp *app, + GeditTab *tab) +{ + g_object_set_data_full (G_OBJECT (tab), + "GeditTabCommandLineWait", + g_object_ref (app->priv->command_line), + (GDestroyNotify)g_object_unref); +} + +static void +open_files (GApplication *application, + gboolean new_window, + gboolean new_document, + gchar *geometry, + gint line_position, + gint column_position, + const GtkSourceEncoding *encoding, + GInputStream *stdin_stream, + GSList *file_list, + GApplicationCommandLine *command_line) +{ + GeditWindow *window = NULL; + GeditTab *tab; + gboolean doc_created = FALSE; + + if (!new_window) + { + window = get_active_window (GTK_APPLICATION (application)); + } + + if (window == NULL) + { + gedit_debug_message (DEBUG_APP, "Create main window"); + window = gedit_app_create_window (GEDIT_APP (application), NULL); + + gedit_debug_message (DEBUG_APP, "Show window"); + gtk_widget_show (GTK_WIDGET (window)); + } + + if (geometry) + { + gtk_window_parse_geometry (GTK_WINDOW (window), geometry); + } + + if (stdin_stream) + { + gedit_debug_message (DEBUG_APP, "Load stdin"); + + tab = gedit_window_create_tab_from_stream (window, + stdin_stream, + encoding, + line_position, + column_position, + TRUE); + doc_created = tab != NULL; + + if (doc_created && command_line) + { + set_command_line_wait (GEDIT_APP (application), + tab); + } + g_input_stream_close (stdin_stream, NULL, NULL); + } + + if (file_list != NULL) + { + GSList *loaded; + + gedit_debug_message (DEBUG_APP, "Load files"); + loaded = _gedit_cmd_load_files_from_prompt (window, + file_list, + encoding, + line_position, + column_position); + + doc_created = doc_created || loaded != NULL; + + if (command_line) + { + g_slist_foreach (loaded, (GFunc)set_command_line_wait, NULL); + } + g_slist_free (loaded); + } + + if (!doc_created || new_document) + { + gedit_debug_message (DEBUG_APP, "Create tab"); + tab = gedit_window_create_tab (window, TRUE); + + if (command_line) + { + set_command_line_wait (GEDIT_APP (application), + tab); + } + } + + gtk_window_present (GTK_WINDOW (window)); +} + static void new_window_activated (GSimpleAction *action, GVariant *parameter, @@ -311,6 +498,25 @@ new_window_activated (GSimpleAction *act } static void +new_document_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GApplication *application = G_APPLICATION (user_data); + + open_files (application, + FALSE, + TRUE, + NULL, + 0, + 0, + NULL, + NULL, + NULL, + NULL); +} + +static void preferences_activated (GSimpleAction *action, GVariant *parameter, gpointer user_data) @@ -362,6 +568,7 @@ quit_activated (GSimpleAction *action, static GActionEntry app_entries[] = { { "new-window", new_window_activated, NULL, NULL, NULL }, + { "new-document", new_document_activated, NULL, NULL, NULL }, { "preferences", preferences_activated, NULL, NULL, NULL }, { "help", help_activated, NULL, NULL, NULL }, { "about", about_activated, NULL, NULL, NULL }, @@ -639,193 +846,6 @@ gedit_app_startup (GApplication *applica app); } -static gboolean -is_in_viewport (GtkWindow *window, - GdkScreen *screen, - gint workspace, - gint viewport_x, - gint viewport_y) -{ - GdkScreen *s; - GdkDisplay *display; - GdkWindow *gdkwindow; - const gchar *cur_name; - const gchar *name; - gint cur_n; - gint n; - gint ws; - gint sc_width, sc_height; - gint x, y, width, height; - gint vp_x, vp_y; - - /* Check for screen and display match */ - display = gdk_screen_get_display (screen); - cur_name = gdk_display_get_name (display); - cur_n = gdk_screen_get_number (screen); - - s = gtk_window_get_screen (window); - display = gdk_screen_get_display (s); - name = gdk_display_get_name (display); - n = gdk_screen_get_number (s); - - if (strcmp (cur_name, name) != 0 || cur_n != n) - { - return FALSE; - } - - /* Check for workspace match */ - ws = gedit_utils_get_window_workspace (window); - if (ws != workspace && ws != GEDIT_ALL_WORKSPACES) - { - return FALSE; - } - - /* Check for viewport match */ - gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); - gdk_window_get_position (gdkwindow, &x, &y); - width = gdk_window_get_width (gdkwindow); - height = gdk_window_get_height (gdkwindow); - gedit_utils_get_current_viewport (screen, &vp_x, &vp_y); - x += vp_x; - y += vp_y; - - sc_width = gdk_screen_get_width (screen); - sc_height = gdk_screen_get_height (screen); - - return x + width * .25 >= viewport_x && - x + width * .75 <= viewport_x + sc_width && - y >= viewport_y && - y + height <= viewport_y + sc_height; -} - -static GeditWindow * -get_active_window (GtkApplication *app) -{ - GdkScreen *screen; - guint workspace; - gint viewport_x, viewport_y; - GList *windows, *l; - - screen = gdk_screen_get_default (); - - workspace = gedit_utils_get_current_workspace (screen); - gedit_utils_get_current_viewport (screen, &viewport_x, &viewport_y); - - /* Gtk documentation says the window list is always in MRU order */ - windows = gtk_application_get_windows (app); - for (l = windows; l != NULL; l = l->next) - { - GtkWindow *window = l->data; - - if (GEDIT_IS_WINDOW (window) && is_in_viewport (window, screen, workspace, viewport_x, viewport_y)) - { - return GEDIT_WINDOW (window); - } - } - - return NULL; -} - -static void -set_command_line_wait (GeditApp *app, - GeditTab *tab) -{ - g_object_set_data_full (G_OBJECT (tab), - "GeditTabCommandLineWait", - g_object_ref (app->priv->command_line), - (GDestroyNotify)g_object_unref); -} - -static void -open_files (GApplication *application, - gboolean new_window, - gboolean new_document, - gchar *geometry, - gint line_position, - gint column_position, - const GtkSourceEncoding *encoding, - GInputStream *stdin_stream, - GSList *file_list, - GApplicationCommandLine *command_line) -{ - GeditWindow *window = NULL; - GeditTab *tab; - gboolean doc_created = FALSE; - - if (!new_window) - { - window = get_active_window (GTK_APPLICATION (application)); - } - - if (window == NULL) - { - gedit_debug_message (DEBUG_APP, "Create main window"); - window = gedit_app_create_window (GEDIT_APP (application), NULL); - - gedit_debug_message (DEBUG_APP, "Show window"); - gtk_widget_show (GTK_WIDGET (window)); - } - - if (geometry) - { - gtk_window_parse_geometry (GTK_WINDOW (window), geometry); - } - - if (stdin_stream) - { - gedit_debug_message (DEBUG_APP, "Load stdin"); - - tab = gedit_window_create_tab_from_stream (window, - stdin_stream, - encoding, - line_position, - column_position, - TRUE); - doc_created = tab != NULL; - - if (doc_created && command_line) - { - set_command_line_wait (GEDIT_APP (application), - tab); - } - g_input_stream_close (stdin_stream, NULL, NULL); - } - - if (file_list != NULL) - { - GSList *loaded; - - gedit_debug_message (DEBUG_APP, "Load files"); - loaded = _gedit_cmd_load_files_from_prompt (window, - file_list, - encoding, - line_position, - column_position); - - doc_created = doc_created || loaded != NULL; - - if (command_line) - { - g_slist_foreach (loaded, (GFunc)set_command_line_wait, NULL); - } - g_slist_free (loaded); - } - - if (!doc_created || new_document) - { - gedit_debug_message (DEBUG_APP, "Create tab"); - tab = gedit_window_create_tab (window, TRUE); - - if (command_line) - { - set_command_line_wait (GEDIT_APP (application), - tab); - } - } - - gtk_window_present (GTK_WINDOW (window)); -} - static void gedit_app_activate (GApplication *application) {