X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=fc8cc8dc2ba3838002b529af113903e9fbc0517a;hb=0be3be0d4166be324d628802772e99cacd336f11;hp=65f5d468893a7f082a447ca9ddb3f32c09bf0990;hpb=c86fea736694b17beb9fb621fceac7e2970afe08;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 65f5d468..fc8cc8dc 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -285,6 +285,9 @@ static void find_bar_search_changed_cb (EggFindBar *find_ static void ev_window_do_preview_print (EvWindow *window); static void ev_window_load_file_remote (EvWindow *ev_window, GFile *source_file); +static void ev_window_media_player_key_pressed (EvWindow *window, + const gchar *key, + gpointer user_data); G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -2621,13 +2624,13 @@ ev_window_cmd_focus_page_selector (GtkAction *act, EvWindow *window) static void ev_window_cmd_scroll_forward (GtkAction *action, EvWindow *window) { - ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_FORWARD, FALSE); + ev_view_scroll (EV_VIEW (window->priv->view), GTK_SCROLL_PAGE_FORWARD, FALSE); } static void ev_window_cmd_scroll_backward (GtkAction *action, EvWindow *window) { - ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_BACKWARD, FALSE); + ev_view_scroll (EV_VIEW (window->priv->view), GTK_SCROLL_PAGE_BACKWARD, FALSE); } static void @@ -3256,12 +3259,6 @@ ev_window_cmd_go_previous_page (GtkAction *action, EvWindow *ev_window) ev_view_previous_page (EV_VIEW (ev_window->priv->view)); } -void -ev_window_go_previous_page (EvWindow *ev_window) -{ - ev_window_cmd_go_previous_page (NULL, ev_window); -} - static void ev_window_cmd_go_next_page (GtkAction *action, EvWindow *ev_window) { @@ -3270,12 +3267,6 @@ ev_window_cmd_go_next_page (GtkAction *action, EvWindow *ev_window) ev_view_next_page (EV_VIEW (ev_window->priv->view)); } -void -ev_window_go_next_page (EvWindow *ev_window) -{ - ev_window_cmd_go_next_page (NULL, ev_window); -} - static void ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window) { @@ -3284,12 +3275,6 @@ ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window) ev_page_cache_set_current_page (ev_window->priv->page_cache, 0); } -void -ev_window_go_first_page (EvWindow *ev_window) -{ - ev_window_cmd_go_first_page (NULL, ev_window); -} - static void ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) { @@ -3301,12 +3286,6 @@ ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) ev_page_cache_set_current_page (ev_window->priv->page_cache, n_pages - 1); } -void -ev_window_go_last_page (EvWindow *ev_window) -{ - ev_window_cmd_go_last_page (NULL, ev_window); -} - static void ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window) { @@ -3407,12 +3386,6 @@ ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window) ev_window_run_presentation (window); } -void -ev_window_start_presentation (EvWindow *ev_window) -{ - ev_window_run_presentation (ev_window); -} - static gboolean ev_window_enumerate_printer_cb (GtkPrinter *printer, EvWindow *window) @@ -4170,7 +4143,9 @@ find_bar_visibility_changed_cb (EggFindBar *find_bar, } static void -find_bar_scroll(EggFindBar *find_bar, GtkScrollType scroll, EvWindow* ev_window) +find_bar_scroll (EggFindBar *find_bar, + GtkScrollType scroll, + EvWindow *ev_window) { ev_view_scroll (EV_VIEW (ev_window->priv->view), scroll, FALSE); } @@ -4220,16 +4195,14 @@ ev_window_dispose (GObject *object) { EvWindow *window = EV_WINDOW (object); EvWindowPrivate *priv = window->priv; -#ifdef ENABLE_DBUS - GObject *keys; + GObject *mpkeys = ev_application_get_media_keys (EV_APP); - keys = ev_application_get_media_keys (EV_APP); - if (keys) { - ev_media_player_keys_focused (EV_MEDIA_PLAYER_KEYS (keys), NULL); - g_object_unref (keys); + if (mpkeys) { + g_signal_handlers_disconnect_by_func (mpkeys, + ev_window_media_player_key_pressed, + window); } -#endif /* ENABLE_DBUS */ - + if (priv->setup_document_idle > 0) { g_source_remove (priv->setup_document_idle); priv->setup_document_idle = 0; @@ -4766,10 +4739,7 @@ view_actions_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *win GObject *keys; keys = ev_application_get_media_keys (EV_APP); - if (keys) { - ev_media_player_keys_focused (EV_MEDIA_PLAYER_KEYS (keys), window); - g_object_unref (keys); - } + ev_media_player_keys_focused (EV_MEDIA_PLAYER_KEYS (keys)); #endif /* ENABLE_DBUS */ update_chrome_flag (window, EV_CHROME_RAISE_TOOLBAR, FALSE); @@ -4914,25 +4884,34 @@ static void launch_external_uri (EvWindow *window, EvLinkAction *action) { const gchar *uri = ev_link_action_get_uri (action); + GAppLaunchContext *context = NULL; GError *error = NULL; gboolean ret; + +#if GTK_CHECK_VERSION (2, 14, 0) + context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ()); + gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context), + gtk_window_get_screen (GTK_WINDOW (window))); + gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), + GDK_CURRENT_TIME); +#endif + + if (!g_strstr_len (uri, strlen (uri), "://")) { + gchar *http; + + /* Not a valid uri, assuming it's http */ + http = g_strdup_printf ("http://%s", uri); + ret = g_app_info_launch_default_for_uri (http, NULL, &error); + g_free (http); + } else { + ret = g_app_info_launch_default_for_uri (uri, NULL, &error); + } - ret = g_app_info_launch_default_for_uri (uri, NULL, &error); if (ret == FALSE) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("Unable to open external link")); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - error->message, uri); - g_signal_connect (dialog, "response", - G_CALLBACK (gtk_widget_destroy), - NULL); - gtk_widget_show (dialog); - g_error_free(error); + ev_window_error_message (GTK_WINDOW (window), + _("Unable to open external link"), + error); + g_error_free (error); } } @@ -5095,7 +5074,7 @@ image_save_dialog_response_cb (GtkWidget *fc, } extensions = gdk_pixbuf_format_get_extensions (format); - if (g_str_has_suffix(uri, extensions[0])) { + if (!g_str_has_suffix (uri, extensions[0])) { gchar *uri_extension; uri_extension = g_strconcat (uri, ".", extensions[0], NULL); @@ -5104,7 +5083,7 @@ image_save_dialog_response_cb (GtkWidget *fc, } else { target_file = g_file_new_for_uri (uri); } - g_strfreev(extensions); + g_strfreev (extensions); g_free (uri); is_native = g_file_is_native (target_file); @@ -5202,18 +5181,21 @@ ev_view_popup_cmd_copy_image (GtkAction *action, EvWindow *window) static void ev_attachment_popup_cmd_open_attachment (GtkAction *action, EvWindow *window) { - GList *l; + GList *l; + GdkScreen *screen; if (!window->priv->attach_list) return; + screen = gtk_window_get_screen (GTK_WINDOW (window)); + for (l = window->priv->attach_list; l && l->data; l = g_list_next (l)) { EvAttachment *attachment; GError *error = NULL; attachment = (EvAttachment *) l->data; - ev_attachment_open (attachment, &error); + ev_attachment_open (attachment, screen, GDK_CURRENT_TIME, &error); if (error) { ev_window_error_message (GTK_WINDOW (window), @@ -5337,6 +5319,35 @@ ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, EvWindow *window) gtk_widget_show (fc); } +static void +ev_window_media_player_key_pressed (EvWindow *window, + const gchar *key, + gpointer user_data) +{ + if (!gtk_window_is_active (GTK_WINDOW (window))) + return; + + /* Note how Previous/Next only go to the + * next/previous page despite their icon telling you + * they should go to the beginning/end. + * + * There's very few keyboards with FFW/RWD though, + * so we stick the most useful keybinding on the most + * often seen keys + */ + if (strcmp (key, "Play") == 0) { + ev_window_run_presentation (window); + } else if (strcmp (key, "Previous") == 0) { + ev_window_cmd_go_previous_page (NULL, window); + } else if (strcmp (key, "Next") == 0) { + ev_window_cmd_go_next_page (NULL, window); + } else if (strcmp (key, "FastForward") == 0) { + ev_window_cmd_go_last_page (NULL, window); + } else if (strcmp (key, "Rewind") == 0) { + ev_window_cmd_go_first_page (NULL, window); + } +} + static void ev_window_init (EvWindow *ev_window) { @@ -5344,6 +5355,7 @@ ev_window_init (EvWindow *ev_window) GtkAccelGroup *accel_group; GError *error = NULL; GtkWidget *sidebar_widget; + GObject *mpkeys; g_signal_connect (ev_window, "configure_event", G_CALLBACK (window_configure_event_cb), NULL); @@ -5624,6 +5636,14 @@ ev_window_init (EvWindow *ev_window) "/AttachmentPopup"); ev_window->priv->attach_list = NULL; + /* Media player keys */ + mpkeys = ev_application_get_media_keys (EV_APP); + if (mpkeys) { + g_signal_connect_swapped (mpkeys, "key_pressed", + G_CALLBACK (ev_window_media_player_key_pressed), + ev_window); + } + /* Give focus to the document view */ gtk_widget_grab_focus (ev_window->priv->view);