diff options
Diffstat (limited to 'src/ephy-window.c')
-rw-r--r-- | src/ephy-window.c | 5449 |
1 files changed, 2644 insertions, 2805 deletions
diff --git a/src/ephy-window.c b/src/ephy-window.c index 9fc746c75..4c42a5d6d 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -77,2469 +77,2352 @@ * #EphyWindow is Epiphany's main widget. */ -static void ephy_window_view_popup_windows_cb (GtkAction *action, - EphyWindow *window); +static void ephy_window_view_popup_windows_cb (GtkAction *action, + EphyWindow *window); static const GtkActionEntry ephy_menu_entries [] = { - - /* Toplevel */ - - { "Bookmarks", NULL, N_("_Bookmarks") }, - { "PopupAction", NULL, "" }, - { "PagePopupAction", NULL, "" }, - { "NotebookPopupAction", NULL, "" }, - - /* File actions. */ - - { "FileNewWindow", NULL, N_("_New Window"), "<control>N", NULL, - G_CALLBACK (window_cmd_file_new_window) }, - { "FileNewWindowIncognito", NULL, N_("New _Incognito Window"), "<control><shift>N", NULL, - G_CALLBACK (window_cmd_file_new_incognito_window) }, - { "FileOpen", NULL, N_("_Open…"), "<control>O", NULL, - G_CALLBACK (window_cmd_file_open) }, - { "FileSaveAs", NULL, N_("Save _As…"), "<shift><control>S", NULL, - G_CALLBACK (window_cmd_file_save_as) }, - { "FileSaveAsApplication", NULL, N_("Save As _Web Application…"), "<shift><control>A", NULL, - G_CALLBACK (window_cmd_file_save_as_application) }, - { "FilePrint", NULL, N_("_Print…"), "<control>P", NULL, - G_CALLBACK (window_cmd_file_print) }, - { "FileSendTo", NULL, N_("S_end Link by Email…"), NULL, NULL, - G_CALLBACK (window_cmd_file_send_to) }, - { "FileCloseTab", NULL, N_("_Close"), "<control>W", NULL, - G_CALLBACK (window_cmd_file_close_window) }, - { "FileQuit", NULL, N_("_Quit"), "<control>Q", NULL, - G_CALLBACK (window_cmd_file_quit) }, - - /* Edit actions. */ - - { "EditUndo", NULL, N_("_Undo"), "<control>Z", NULL, - G_CALLBACK (window_cmd_edit_undo) }, - { "EditRedo", NULL, N_("Re_do"), "<shift><control>Z", NULL, - G_CALLBACK (window_cmd_edit_redo) }, - { "EditCut", NULL, N_("Cu_t"), "<control>X", NULL, - G_CALLBACK (window_cmd_edit_cut) }, - { "EditCopy", NULL, N_("_Copy"), "<control>C", NULL, - G_CALLBACK (window_cmd_edit_copy) }, - { "EditPaste", NULL, N_("_Paste"), "<control>V", NULL, - G_CALLBACK (window_cmd_edit_paste) }, - { "EditDelete", NULL, NULL, NULL, NULL, - G_CALLBACK (window_cmd_edit_delete) }, - { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL, - G_CALLBACK (window_cmd_edit_select_all) }, - { "EditFind", NULL, N_("_Find…"), "<control>F", NULL, - G_CALLBACK (window_cmd_edit_find) }, - { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G", NULL, - G_CALLBACK (window_cmd_edit_find_next) }, - { "EditFindPrev", NULL, N_("Find Pre_vious"), "<shift><control>G", NULL, - G_CALLBACK (window_cmd_edit_find_prev) }, - { "EditBookmarks", NULL, N_("Edit _Bookmarks"), "<control>B", NULL, - G_CALLBACK (window_cmd_edit_bookmarks) }, - { "EditHistory", NULL, N_("_History"), "<control>H", NULL, - G_CALLBACK (window_cmd_edit_history) }, - { "EditPreferences", NULL, N_("Pr_eferences"), "<control>e", NULL, - G_CALLBACK (window_cmd_edit_preferences) }, - - /* View actions. */ - - { "ViewStop", NULL, N_("_Stop"), "Escape", NULL, - G_CALLBACK (window_cmd_view_stop) }, - { "ViewAlwaysStop", NULL, N_("_Stop"), "Escape", - NULL, G_CALLBACK (window_cmd_view_stop) }, - { "ViewReload", NULL, N_("_Reload"), "<control>R", NULL, - G_CALLBACK (window_cmd_view_reload) }, - { "ViewZoomIn", NULL, N_("Zoom _In"), "<control>plus", NULL, - G_CALLBACK (window_cmd_view_zoom_in) }, - { "ViewZoomOut", NULL, N_("Zoom O_ut"), "<control>minus", NULL, - G_CALLBACK (window_cmd_view_zoom_out) }, - { "ViewZoomNormal", NULL, N_("_Normal Size"), "<control>0", NULL, - G_CALLBACK (window_cmd_view_zoom_normal) }, - { "ViewEncoding", NULL, N_("Text _Encoding"), NULL, NULL, - G_CALLBACK (window_cmd_view_encoding) }, - { "ViewPageSource", NULL, N_("_Page Source"), "<control>U", NULL, - G_CALLBACK (window_cmd_view_page_source) }, - - /* Bookmarks actions. */ - - { "FileBookmarkPage", NULL, N_("_Add Bookmark…"), "<control>D", NULL, - G_CALLBACK (window_cmd_file_bookmark_page) }, - - /* Go actions. */ - - { "GoLocation", NULL, N_("_Location…"), "<control>L", NULL, - G_CALLBACK (window_cmd_go_location) }, - - /* Tabs actions. */ - - { "TabsPrevious", NULL, N_("_Previous Tab"), "<control>Page_Up", NULL, - G_CALLBACK (window_cmd_tabs_previous) }, - { "TabsNext", NULL, N_("_Next Tab"), "<control>Page_Down", NULL, - G_CALLBACK (window_cmd_tabs_next) }, - { "TabsMoveLeft", NULL, N_("Move Tab _Left"), "<shift><control>Page_Up", NULL, - G_CALLBACK (window_cmd_tabs_move_left) }, - { "TabsMoveRight", NULL, N_("Move Tab _Right"), "<shift><control>Page_Down", NULL, - G_CALLBACK (window_cmd_tabs_move_right) }, - { "TabsDetach", NULL, N_("_Detach Tab"), NULL, NULL, - G_CALLBACK (window_cmd_tabs_detach) }, - - /* Help. */ - - { "HelpContents", NULL, N_("_Help"), "F1", NULL, - G_CALLBACK (window_cmd_help_contents) }, - { "HelpAbout", NULL, N_("_About"), NULL, NULL, - G_CALLBACK (window_cmd_help_about) } + /* Toplevel */ + + { "Bookmarks", NULL, N_("_Bookmarks") }, + { "PopupAction", NULL, "" }, + { "PagePopupAction", NULL, "" }, + { "NotebookPopupAction", NULL, "" }, + + /* File actions. */ + + { "FileNewWindow", NULL, N_("_New Window"), "<control>N", NULL, + G_CALLBACK (window_cmd_file_new_window) }, + { "FileNewWindowIncognito", NULL, N_("New _Incognito Window"), "<control><shift>N", NULL, + G_CALLBACK (window_cmd_file_new_incognito_window) }, + { "FileOpen", NULL, N_("_Open…"), "<control>O", NULL, + G_CALLBACK (window_cmd_file_open) }, + { "FileSaveAs", NULL, N_("Save _As…"), "<shift><control>S", NULL, + G_CALLBACK (window_cmd_file_save_as) }, + { "FileSaveAsApplication", NULL, N_("Save As _Web Application…"), "<shift><control>A", NULL, + G_CALLBACK (window_cmd_file_save_as_application) }, + { "FilePrint", NULL, N_("_Print…"), "<control>P", NULL, + G_CALLBACK (window_cmd_file_print) }, + { "FileSendTo", NULL, N_("S_end Link by Email…"), NULL, NULL, + G_CALLBACK (window_cmd_file_send_to) }, + { "FileCloseTab", NULL, N_("_Close"), "<control>W", NULL, + G_CALLBACK (window_cmd_file_close_window) }, + { "FileQuit", NULL, N_("_Quit"), "<control>Q", NULL, + G_CALLBACK (window_cmd_file_quit) }, + + /* Edit actions. */ + + { "EditUndo", NULL, N_("_Undo"), "<control>Z", NULL, + G_CALLBACK (window_cmd_edit_undo) }, + { "EditRedo", NULL, N_("Re_do"), "<shift><control>Z", NULL, + G_CALLBACK (window_cmd_edit_redo) }, + { "EditCut", NULL, N_("Cu_t"), "<control>X", NULL, + G_CALLBACK (window_cmd_edit_cut) }, + { "EditCopy", NULL, N_("_Copy"), "<control>C", NULL, + G_CALLBACK (window_cmd_edit_copy) }, + { "EditPaste", NULL, N_("_Paste"), "<control>V", NULL, + G_CALLBACK (window_cmd_edit_paste) }, + { "EditDelete", NULL, NULL, NULL, NULL, + G_CALLBACK (window_cmd_edit_delete) }, + { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL, + G_CALLBACK (window_cmd_edit_select_all) }, + { "EditFind", NULL, N_("_Find…"), "<control>F", NULL, + G_CALLBACK (window_cmd_edit_find) }, + { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G", NULL, + G_CALLBACK (window_cmd_edit_find_next) }, + { "EditFindPrev", NULL, N_("Find Pre_vious"), "<shift><control>G", NULL, + G_CALLBACK (window_cmd_edit_find_prev) }, + { "EditBookmarks", NULL, N_("Edit _Bookmarks"), "<control>B", NULL, + G_CALLBACK (window_cmd_edit_bookmarks) }, + { "EditHistory", NULL, N_("_History"), "<control>H", NULL, + G_CALLBACK (window_cmd_edit_history) }, + { "EditPreferences", NULL, N_("Pr_eferences"), "<control>e", NULL, + G_CALLBACK (window_cmd_edit_preferences) }, + + /* View actions. */ + + { "ViewStop", NULL, N_("_Stop"), "Escape", NULL, + G_CALLBACK (window_cmd_view_stop) }, + { "ViewAlwaysStop", NULL, N_("_Stop"), "Escape", + NULL, G_CALLBACK (window_cmd_view_stop) }, + { "ViewReload", NULL, N_("_Reload"), "<control>R", NULL, + G_CALLBACK (window_cmd_view_reload) }, + { "ViewZoomIn", NULL, N_("Zoom _In"), "<control>plus", NULL, + G_CALLBACK (window_cmd_view_zoom_in) }, + { "ViewZoomOut", NULL, N_("Zoom O_ut"), "<control>minus", NULL, + G_CALLBACK (window_cmd_view_zoom_out) }, + { "ViewZoomNormal", NULL, N_("_Normal Size"), "<control>0", NULL, + G_CALLBACK (window_cmd_view_zoom_normal) }, + { "ViewEncoding", NULL, N_("Text _Encoding"), NULL, NULL, + G_CALLBACK (window_cmd_view_encoding) }, + { "ViewPageSource", NULL, N_("_Page Source"), "<control>U", NULL, + G_CALLBACK (window_cmd_view_page_source) }, + + /* Bookmarks actions. */ + + { "FileBookmarkPage", NULL, N_("_Add Bookmark…"), "<control>D", NULL, + G_CALLBACK (window_cmd_file_bookmark_page) }, + + /* Go actions. */ + + { "GoLocation", NULL, N_("_Location…"), "<control>L", NULL, + G_CALLBACK (window_cmd_go_location) }, + + /* Tabs actions. */ + + { "TabsPrevious", NULL, N_("_Previous Tab"), "<control>Page_Up", NULL, + G_CALLBACK (window_cmd_tabs_previous) }, + { "TabsNext", NULL, N_("_Next Tab"), "<control>Page_Down", NULL, + G_CALLBACK (window_cmd_tabs_next) }, + { "TabsMoveLeft", NULL, N_("Move Tab _Left"), "<shift><control>Page_Up", NULL, + G_CALLBACK (window_cmd_tabs_move_left) }, + { "TabsMoveRight", NULL, N_("Move Tab _Right"), "<shift><control>Page_Down", NULL, + G_CALLBACK (window_cmd_tabs_move_right) }, + { "TabsDetach", NULL, N_("_Detach Tab"), NULL, NULL, + G_CALLBACK (window_cmd_tabs_detach) }, + + /* Help. */ + + { "HelpContents", NULL, N_("_Help"), "F1", NULL, + G_CALLBACK (window_cmd_help_contents) }, + { "HelpAbout", NULL, N_("_About"), NULL, NULL, + G_CALLBACK (window_cmd_help_about) } }; static const GtkToggleActionEntry ephy_menu_toggle_entries [] = { - /* View actions. */ + /* View actions. */ - { "ViewFullscreen", NULL, N_("_Fullscreen"), "F11", NULL, - G_CALLBACK (window_cmd_view_fullscreen), FALSE }, - { "ViewPopupWindows", NULL, N_("Popup _Windows"), NULL, NULL, - G_CALLBACK (ephy_window_view_popup_windows_cb), FALSE }, - { "BrowseWithCaret", NULL, N_("Selection Caret"), "F7", NULL, - G_CALLBACK (window_cmd_browse_with_caret), FALSE } + { "ViewFullscreen", NULL, N_("_Fullscreen"), "F11", NULL, + G_CALLBACK (window_cmd_view_fullscreen), FALSE }, + { "ViewPopupWindows", NULL, N_("Popup _Windows"), NULL, NULL, + G_CALLBACK (ephy_window_view_popup_windows_cb), FALSE }, + { "BrowseWithCaret", NULL, N_("Selection Caret"), "F7", NULL, + G_CALLBACK (window_cmd_browse_with_caret), FALSE } }; static const GtkActionEntry ephy_popups_entries [] = { - /* Document. */ - - { "ContextBookmarkPage", NULL, N_("Add Boo_kmark…"), "<control>D", NULL, - G_CALLBACK (window_cmd_file_bookmark_page) }, - - /* Links. */ - - { "OpenLinkInNewWindow", NULL, N_("Open Link in New _Window"), NULL, NULL, - G_CALLBACK (popup_cmd_link_in_new_window) }, - { "OpenLinkInNewTab", NULL, N_("Open Link in New _Tab"), NULL, NULL, - G_CALLBACK (popup_cmd_link_in_new_tab) }, - { "OpenLinkInIncognitoWindow", NULL, N_("Open Link in I_ncognito Window"), NULL, NULL, - G_CALLBACK (popup_cmd_link_in_incognito_window) }, - { "DownloadLinkAs", NULL, N_("_Save Link As…"), NULL, NULL, - G_CALLBACK (popup_cmd_download_link_as) }, - { "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL, - NULL, G_CALLBACK (popup_cmd_copy_link_address) }, - { "CopyEmailAddress", NULL, N_("_Copy E-mail Address"), NULL, - NULL, G_CALLBACK (popup_cmd_copy_link_address) }, - - /* Images. */ - - { "ViewImage", NULL, N_("View _Image in New Tab"), NULL, - NULL, G_CALLBACK (popup_cmd_view_image_in_new_tab) }, - { "CopyImageLocation", NULL, N_("Copy I_mage Address"), NULL, - NULL, G_CALLBACK (popup_cmd_copy_image_location) }, - { "SaveImageAs", NULL, N_("_Save Image As…"), NULL, - NULL, G_CALLBACK (popup_cmd_save_image_as) }, - { "SetImageAsBackground", NULL, N_("Set as _Wallpaper"), NULL, - NULL, G_CALLBACK (popup_cmd_set_image_as_background) }, - - /* Video. */ - - { "OpenVideoInNewWindow", NULL, N_("Open Video in New _Window"), NULL, NULL, - G_CALLBACK (popup_cmd_media_in_new_window) }, - { "OpenVideoInNewTab", NULL, N_("Open Video in New _Tab"), NULL, NULL, - G_CALLBACK (popup_cmd_media_in_new_tab) }, - { "SaveVideoAs", NULL, N_("_Save Video As…"), NULL, - NULL, G_CALLBACK (popup_cmd_save_media_as) }, - { "CopyVideoLocation", NULL, N_("_Copy Video Address"), NULL, - NULL, G_CALLBACK (popup_cmd_copy_media_location) }, - - /* Audio. */ - - { "OpenAudioInNewWindow", NULL, N_("Open Audio in New _Window"), NULL, NULL, - G_CALLBACK (popup_cmd_media_in_new_window) }, - { "OpenAudioInNewTab", NULL, N_("Open Audio in New _Tab"), NULL, NULL, - G_CALLBACK (popup_cmd_media_in_new_tab) }, - { "SaveAudioAs", NULL, N_("_Save Audio As…"), NULL, - NULL, G_CALLBACK (popup_cmd_save_media_as) }, - { "CopyAudioLocation", NULL, N_("_Copy Audio Address"), NULL, - NULL, G_CALLBACK (popup_cmd_copy_media_location) }, - - /* Selection */ - { "SearchSelection", NULL, "_Search Selection", NULL, NULL, - G_CALLBACK (popup_cmd_search_selection) }, + /* Document. */ + + { "ContextBookmarkPage", NULL, N_("Add Boo_kmark…"), "<control>D", NULL, + G_CALLBACK (window_cmd_file_bookmark_page) }, + + /* Links. */ + + { "OpenLinkInNewWindow", NULL, N_("Open Link in New _Window"), NULL, NULL, + G_CALLBACK (popup_cmd_link_in_new_window) }, + { "OpenLinkInNewTab", NULL, N_("Open Link in New _Tab"), NULL, NULL, + G_CALLBACK (popup_cmd_link_in_new_tab) }, + { "OpenLinkInIncognitoWindow", NULL, N_("Open Link in I_ncognito Window"), NULL, NULL, + G_CALLBACK (popup_cmd_link_in_incognito_window) }, + { "DownloadLinkAs", NULL, N_("_Save Link As…"), NULL, NULL, + G_CALLBACK (popup_cmd_download_link_as) }, + { "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL, + NULL, G_CALLBACK (popup_cmd_copy_link_address) }, + { "CopyEmailAddress", NULL, N_("_Copy E-mail Address"), NULL, + NULL, G_CALLBACK (popup_cmd_copy_link_address) }, + + /* Images. */ + + { "ViewImage", NULL, N_("View _Image in New Tab"), NULL, + NULL, G_CALLBACK (popup_cmd_view_image_in_new_tab) }, + { "CopyImageLocation", NULL, N_("Copy I_mage Address"), NULL, + NULL, G_CALLBACK (popup_cmd_copy_image_location) }, + { "SaveImageAs", NULL, N_("_Save Image As…"), NULL, + NULL, G_CALLBACK (popup_cmd_save_image_as) }, + { "SetImageAsBackground", NULL, N_("Set as _Wallpaper"), NULL, + NULL, G_CALLBACK (popup_cmd_set_image_as_background) }, + + /* Video. */ + + { "OpenVideoInNewWindow", NULL, N_("Open Video in New _Window"), NULL, NULL, + G_CALLBACK (popup_cmd_media_in_new_window) }, + { "OpenVideoInNewTab", NULL, N_("Open Video in New _Tab"), NULL, NULL, + G_CALLBACK (popup_cmd_media_in_new_tab) }, + { "SaveVideoAs", NULL, N_("_Save Video As…"), NULL, + NULL, G_CALLBACK (popup_cmd_save_media_as) }, + { "CopyVideoLocation", NULL, N_("_Copy Video Address"), NULL, + NULL, G_CALLBACK (popup_cmd_copy_media_location) }, + + /* Audio. */ + + { "OpenAudioInNewWindow", NULL, N_("Open Audio in New _Window"), NULL, NULL, + G_CALLBACK (popup_cmd_media_in_new_window) }, + { "OpenAudioInNewTab", NULL, N_("Open Audio in New _Tab"), NULL, NULL, + G_CALLBACK (popup_cmd_media_in_new_tab) }, + { "SaveAudioAs", NULL, N_("_Save Audio As…"), NULL, + NULL, G_CALLBACK (popup_cmd_save_media_as) }, + { "CopyAudioLocation", NULL, N_("_Copy Audio Address"), NULL, + NULL, G_CALLBACK (popup_cmd_copy_media_location) }, + + /* Selection */ + { "SearchSelection", NULL, "_Search Selection", NULL, NULL, + G_CALLBACK (popup_cmd_search_selection) }, }; -static const struct -{ - guint keyval; - GdkModifierType modifier; - const gchar *action; - gboolean fromToolbar; +static const struct { + guint keyval; + GdkModifierType modifier; + const gchar *action; + gboolean fromToolbar; } extra_keybindings [] = { - /* FIXME: PageMenu should have its accel without being in the - * extra keybindings, but does not seem to work for some - * reason. */ - { GDK_KEY_F10, 0, "PageMenu", TRUE }, - { GDK_KEY_Home, GDK_MOD1_MASK, "FileHome", TRUE }, - /* FIXME: these are not in any menu for now, so add them here. */ - { GDK_KEY_F11, 0, "ViewFullscreen", FALSE }, - { GDK_KEY_plus, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, - { GDK_KEY_minus, GDK_CONTROL_MASK, "ViewZoomOut", FALSE }, - { GDK_KEY_0, GDK_CONTROL_MASK, "ViewZoomNormal", FALSE }, - { GDK_KEY_g, GDK_CONTROL_MASK, "EditFindNext", FALSE }, - { GDK_KEY_G, GDK_CONTROL_MASK | - GDK_SHIFT_MASK, "EditFindPrev", FALSE }, - - { GDK_KEY_s, GDK_CONTROL_MASK, "FileSaveAs", FALSE }, - { GDK_KEY_r, GDK_CONTROL_MASK, "ViewReload", FALSE }, - { GDK_KEY_R, GDK_CONTROL_MASK, "ViewReload", FALSE }, - { GDK_KEY_R, GDK_CONTROL_MASK | - GDK_SHIFT_MASK, "ViewReload", FALSE }, - /* Tab navigation */ - { GDK_KEY_Page_Up, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, - { GDK_KEY_Page_Down, GDK_CONTROL_MASK, "TabsNext", FALSE }, - { GDK_KEY_Page_Up, GDK_CONTROL_MASK | - GDK_SHIFT_MASK, "TabsMoveLeft", FALSE }, - { GDK_KEY_Page_Down, GDK_CONTROL_MASK | - GDK_SHIFT_MASK, "TabsMoveRight", FALSE }, - /* Go */ - { GDK_KEY_l, GDK_CONTROL_MASK, "GoLocation", FALSE }, - { GDK_KEY_F6, 0, "GoLocation", FALSE }, - /* Support all the MSIE tricks as well ;) */ - { GDK_KEY_F5, 0, "ViewReload", FALSE }, - { GDK_KEY_F5, GDK_CONTROL_MASK, "ViewReload", FALSE }, - { GDK_KEY_F5, GDK_SHIFT_MASK, "ViewReload", FALSE }, - { GDK_KEY_F5, GDK_CONTROL_MASK | - GDK_SHIFT_MASK, "ViewReload", FALSE }, - { GDK_KEY_KP_Add, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, - { GDK_KEY_KP_Subtract, GDK_CONTROL_MASK, "ViewZoomOut", FALSE }, - { GDK_KEY_equal, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, - { GDK_KEY_KP_0, GDK_CONTROL_MASK, "ViewZoomNormal", FALSE }, - /* These keys are a bit strange: when pressed with no modifiers, they emit - * KP_PageUp/Down Control; when pressed with Control+Shift they are KP_9/3, - * when NumLock is on they are KP_9/3 and with NumLock and Control+Shift - * They're KP_PageUp/Down again! - */ - { GDK_KEY_KP_4, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, - { GDK_KEY_KP_6, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, - { GDK_KEY_KP_Page_Up, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, - { GDK_KEY_KP_9, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, - { GDK_KEY_KP_Page_Down, GDK_CONTROL_MASK, "TabsNext", FALSE }, - { GDK_KEY_KP_3, GDK_CONTROL_MASK, "TabsNext", FALSE }, - { GDK_KEY_KP_Page_Up, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE }, - { GDK_KEY_KP_9, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE }, - { GDK_KEY_KP_Page_Down, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE }, - { GDK_KEY_KP_3, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE }, + /* FIXME: PageMenu should have its accel without being in the + * extra keybindings, but does not seem to work for some + * reason. */ + { GDK_KEY_F10, 0, "PageMenu", TRUE }, + { GDK_KEY_Home, GDK_MOD1_MASK, "FileHome", TRUE }, + /* FIXME: these are not in any menu for now, so add them here. */ + { GDK_KEY_F11, 0, "ViewFullscreen", FALSE }, + { GDK_KEY_plus, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, + { GDK_KEY_minus, GDK_CONTROL_MASK, "ViewZoomOut", FALSE }, + { GDK_KEY_0, GDK_CONTROL_MASK, "ViewZoomNormal", FALSE }, + { GDK_KEY_g, GDK_CONTROL_MASK, "EditFindNext", FALSE }, + { GDK_KEY_G, GDK_CONTROL_MASK | + GDK_SHIFT_MASK, "EditFindPrev", FALSE }, + + { GDK_KEY_s, GDK_CONTROL_MASK, "FileSaveAs", FALSE }, + { GDK_KEY_r, GDK_CONTROL_MASK, "ViewReload", FALSE }, + { GDK_KEY_R, GDK_CONTROL_MASK, "ViewReload", FALSE }, + { GDK_KEY_R, GDK_CONTROL_MASK | + GDK_SHIFT_MASK, "ViewReload", FALSE }, + /* Tab navigation */ + { GDK_KEY_Page_Up, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, + { GDK_KEY_Page_Down, GDK_CONTROL_MASK, "TabsNext", FALSE }, + { GDK_KEY_Page_Up, GDK_CONTROL_MASK | + GDK_SHIFT_MASK, "TabsMoveLeft", FALSE }, + { GDK_KEY_Page_Down, GDK_CONTROL_MASK | + GDK_SHIFT_MASK, "TabsMoveRight", FALSE }, + /* Go */ + { GDK_KEY_l, GDK_CONTROL_MASK, "GoLocation", FALSE }, + { GDK_KEY_F6, 0, "GoLocation", FALSE }, + /* Support all the MSIE tricks as well ;) */ + { GDK_KEY_F5, 0, "ViewReload", FALSE }, + { GDK_KEY_F5, GDK_CONTROL_MASK, "ViewReload", FALSE }, + { GDK_KEY_F5, GDK_SHIFT_MASK, "ViewReload", FALSE }, + { GDK_KEY_F5, GDK_CONTROL_MASK | + GDK_SHIFT_MASK, "ViewReload", FALSE }, + { GDK_KEY_KP_Add, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, + { GDK_KEY_KP_Subtract, GDK_CONTROL_MASK, "ViewZoomOut", FALSE }, + { GDK_KEY_equal, GDK_CONTROL_MASK, "ViewZoomIn", FALSE }, + { GDK_KEY_KP_0, GDK_CONTROL_MASK, "ViewZoomNormal", FALSE }, + /* These keys are a bit strange: when pressed with no modifiers, they emit + * KP_PageUp/Down Control; when pressed with Control+Shift they are KP_9/3, + * when NumLock is on they are KP_9/3 and with NumLock and Control+Shift + * They're KP_PageUp/Down again! + */ + { GDK_KEY_KP_4, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, + { GDK_KEY_KP_6, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, + { GDK_KEY_KP_Page_Up, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, + { GDK_KEY_KP_9, GDK_CONTROL_MASK, "TabsPrevious", FALSE }, + { GDK_KEY_KP_Page_Down, GDK_CONTROL_MASK, "TabsNext", FALSE }, + { GDK_KEY_KP_3, GDK_CONTROL_MASK, "TabsNext", FALSE }, + { GDK_KEY_KP_Page_Up, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE }, + { GDK_KEY_KP_9, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE }, + { GDK_KEY_KP_Page_Down, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE }, + { GDK_KEY_KP_3, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE }, #ifdef HAVE_X11_XF86KEYSYM_H - { XF86XK_Back, 0, "NavigationBack", TRUE }, - { XF86XK_Forward, 0, "NavigationForward", TRUE }, - { XF86XK_Go, 0, "GoLocation", FALSE }, - { XF86XK_OpenURL, 0, "GoLocation", FALSE }, - { XF86XK_AddFavorite, 0, "FileBookmarkPage", FALSE }, - { XF86XK_Refresh, 0, "ViewReload", FALSE }, - { XF86XK_Reload, 0, "ViewReload", FALSE }, - { XF86XK_Search, 0, "EditFind", FALSE }, - { XF86XK_Send, 0, "FileSendTo", FALSE }, - { XF86XK_Stop, 0, "ViewStop", FALSE }, - { XF86XK_ZoomIn, 0, "ViewZoomIn", FALSE }, - { XF86XK_ZoomOut, 0, "ViewZoomOut", FALSE } - /* FIXME: what about ScrollUp, ScrollDown, Menu*, Option, LogOff, Save,.. any others? */ + { XF86XK_Back, 0, "NavigationBack", TRUE }, + { XF86XK_Forward, 0, "NavigationForward", TRUE }, + { XF86XK_Go, 0, "GoLocation", FALSE }, + { XF86XK_OpenURL, 0, "GoLocation", FALSE }, + { XF86XK_AddFavorite, 0, "FileBookmarkPage", FALSE }, + { XF86XK_Refresh, 0, "ViewReload", FALSE }, + { XF86XK_Reload, 0, "ViewReload", FALSE }, + { XF86XK_Search, 0, "EditFind", FALSE }, + { XF86XK_Send, 0, "FileSendTo", FALSE }, + { XF86XK_Stop, 0, "ViewStop", FALSE }, + { XF86XK_ZoomIn, 0, "ViewZoomIn", FALSE }, + { XF86XK_ZoomOut, 0, "ViewZoomOut", FALSE } + /* FIXME: what about ScrollUp, ScrollDown, Menu*, Option, LogOff, Save,.. any others? */ #endif /* HAVE_X11_XF86KEYSYM_H */ }, navigation_keybindings_ltr [] = { - { GDK_KEY_Left, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, - { GDK_KEY_KP_Left, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, - { GDK_KEY_Right, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, - { GDK_KEY_KP_Right, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE } + { GDK_KEY_Left, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, + { GDK_KEY_KP_Left, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, + { GDK_KEY_Right, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, + { GDK_KEY_KP_Right, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE } }, navigation_keybindings_rtl [] = { - { GDK_KEY_Left, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, - { GDK_KEY_KP_Left, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, - { GDK_KEY_Right, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, - { GDK_KEY_KP_Right, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE } + { GDK_KEY_Left, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, + { GDK_KEY_KP_Left, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE }, + { GDK_KEY_Right, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE }, + { GDK_KEY_KP_Right, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE } }, *navigation_keybindings_rtl_ltr; -#define SETTINGS_CONNECTION_DATA_KEY "EphyWindowSettings" - -struct _EphyWindow -{ - GtkApplicationWindow parent_instance; - - GtkWidget *toolbar; - GtkUIManager *manager; - GtkActionGroup *action_group; - GtkActionGroup *popups_action_group; - GtkActionGroup *toolbar_action_group; - GtkActionGroup *tab_accels_action_group; - GtkNotebook *notebook; - EphyEmbed *active_embed; - EphyWindowChrome chrome; - EphyEmbedEvent *context_event; - WebKitHitTestResult *hit_test_result; - guint idle_worker; - - EphyLocationController *location_controller; - - gulong app_menu_visibility_handler; - - guint closing : 1; - guint has_size : 1; - guint fullscreen_mode : 1; - guint is_popup : 1; - guint present_on_insert : 1; - guint key_theme_is_emacs : 1; - guint updating_address : 1; - guint force_close : 1; - guint checking_modified_forms : 1; +#define SETTINGS_CONNECTION_DATA_KEY "EphyWindowSettings" + +struct _EphyWindow { + GtkApplicationWindow parent_instance; + + GtkWidget *toolbar; + GtkUIManager *manager; + GtkActionGroup *action_group; + GtkActionGroup *popups_action_group; + GtkActionGroup *toolbar_action_group; + GtkActionGroup *tab_accels_action_group; + GtkNotebook *notebook; + EphyEmbed *active_embed; + EphyWindowChrome chrome; + EphyEmbedEvent *context_event; + WebKitHitTestResult *hit_test_result; + guint idle_worker; + + EphyLocationController *location_controller; + + gulong app_menu_visibility_handler; + + guint closing : 1; + guint has_size : 1; + guint fullscreen_mode : 1; + guint is_popup : 1; + guint present_on_insert : 1; + guint key_theme_is_emacs : 1; + guint updating_address : 1; + guint force_close : 1; + guint checking_modified_forms : 1; }; -enum -{ - PROP_0, - PROP_ACTIVE_CHILD, - PROP_CHROME, - PROP_SINGLE_TAB_MODE +enum { + PROP_0, + PROP_ACTIVE_CHILD, + PROP_CHROME, + PROP_SINGLE_TAB_MODE }; /* Make sure not to overlap with those in ephy-lockdown.c */ -enum -{ - SENS_FLAG_CHROME = 1 << 0, - SENS_FLAG_CONTEXT = 1 << 1, - SENS_FLAG_DOCUMENT = 1 << 2, - SENS_FLAG_LOADING = 1 << 3, - SENS_FLAG_NAVIGATION = 1 << 4, - SENS_FLAG_IS_BLANK = 1 << 5 +enum { + SENS_FLAG_CHROME = 1 << 0, + SENS_FLAG_CONTEXT = 1 << 1, + SENS_FLAG_DOCUMENT = 1 << 2, + SENS_FLAG_LOADING = 1 << 3, + SENS_FLAG_NAVIGATION = 1 << 4, + SENS_FLAG_IS_BLANK = 1 << 5 }; static gint impl_add_child (EphyEmbedContainer *container, - EphyEmbed *child, - gint position, - gboolean jump_to) + EphyEmbed *child, + gint position, + gboolean jump_to) { - EphyWindow *window = EPHY_WINDOW (container); + EphyWindow *window = EPHY_WINDOW (container); - g_return_val_if_fail (!window->is_popup || - gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)) < 1, -1); + g_return_val_if_fail (!window->is_popup || + gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)) < 1, -1); - return ephy_notebook_add_tab (EPHY_NOTEBOOK (window->notebook), - child, position, jump_to); + return ephy_notebook_add_tab (EPHY_NOTEBOOK (window->notebook), + child, position, jump_to); } static void impl_set_active_child (EphyEmbedContainer *container, - EphyEmbed *child) + EphyEmbed *child) { - int page; - EphyWindow *window; + int page; + EphyWindow *window; - window = EPHY_WINDOW (container); + window = EPHY_WINDOW (container); - page = gtk_notebook_page_num - (window->notebook, GTK_WIDGET (child)); - gtk_notebook_set_current_page - (window->notebook, page); + page = gtk_notebook_page_num + (window->notebook, GTK_WIDGET (child)); + gtk_notebook_set_current_page + (window->notebook, page); } static GtkWidget * construct_confirm_close_dialog (EphyWindow *window, - const char *title, - const char *info, - const char *action) + const char *title, + const char *info, + const char *action) { - GtkWidget *dialog; + GtkWidget *dialog; - dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_CANCEL, - "%s", title); + dialog = gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CANCEL, + "%s", title); - gtk_message_dialog_format_secondary_text - (GTK_MESSAGE_DIALOG (dialog), "%s", info); + gtk_message_dialog_format_secondary_text + (GTK_MESSAGE_DIALOG (dialog), "%s", info); - gtk_dialog_add_button (GTK_DIALOG (dialog), - action, GTK_RESPONSE_ACCEPT); + gtk_dialog_add_button (GTK_DIALOG (dialog), + action, GTK_RESPONSE_ACCEPT); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); - /* FIXME gtk_window_set_title (GTK_WINDOW (dialog), _("Close Document?")); */ - gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (window)), - GTK_WINDOW (dialog)); + /* FIXME gtk_window_set_title (GTK_WINDOW (dialog), _("Close Document?")); */ + gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (window)), + GTK_WINDOW (dialog)); - return dialog; + return dialog; } static gboolean confirm_close_with_modified_forms (EphyWindow *window) { - GtkWidget *dialog; - int response; + GtkWidget *dialog; + int response; - dialog = construct_confirm_close_dialog (window, - _("There are unsubmitted changes to form elements"), - _("If you close the document anyway, " - "you will lose that information."), - _("Close _Document")); - response = gtk_dialog_run (GTK_DIALOG (dialog)); + dialog = construct_confirm_close_dialog (window, + _("There are unsubmitted changes to form elements"), + _("If you close the document anyway, " + "you will lose that information."), + _("Close _Document")); + response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); + gtk_widget_destroy (dialog); - return response == GTK_RESPONSE_ACCEPT; + return response == GTK_RESPONSE_ACCEPT; } static gboolean confirm_close_with_downloads (EphyWindow *window) { - GtkWidget *dialog; - int response; + GtkWidget *dialog; + int response; - dialog = construct_confirm_close_dialog (window, - _("There are ongoing downloads"), - _("If you quit, the downloads will be cancelled"), - _("Quit and cancel downloads")); - response = gtk_dialog_run (GTK_DIALOG (dialog)); + dialog = construct_confirm_close_dialog (window, + _("There are ongoing downloads"), + _("If you quit, the downloads will be cancelled"), + _("Quit and cancel downloads")); + response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); + gtk_widget_destroy (dialog); - return response == GTK_RESPONSE_ACCEPT; + return response == GTK_RESPONSE_ACCEPT; } static void impl_remove_child (EphyEmbedContainer *container, - EphyEmbed *child) + EphyEmbed *child) { - EphyWindow *window; + EphyWindow *window; - window = EPHY_WINDOW (container); - g_signal_emit_by_name (window->notebook, - "tab-close-request", - child, window); + window = EPHY_WINDOW (container); + g_signal_emit_by_name (window->notebook, + "tab-close-request", + child, window); } static EphyEmbed * impl_get_active_child (EphyEmbedContainer *container) { - return EPHY_WINDOW (container)->active_embed; + return EPHY_WINDOW (container)->active_embed; } static GList * impl_get_children (EphyEmbedContainer *container) { - EphyWindow *window = EPHY_WINDOW (container); + EphyWindow *window = EPHY_WINDOW (container); - return gtk_container_get_children (GTK_CONTAINER (window->notebook)); + return gtk_container_get_children (GTK_CONTAINER (window->notebook)); } static gboolean impl_get_is_popup (EphyEmbedContainer *container) { - return EPHY_WINDOW (container)->is_popup; + return EPHY_WINDOW (container)->is_popup; } static void ephy_window_embed_container_iface_init (EphyEmbedContainerInterface *iface) { - iface->add_child = impl_add_child; - iface->set_active_child = impl_set_active_child; - iface->remove_child = impl_remove_child; - iface->get_active_child = impl_get_active_child; - iface->get_children = impl_get_children; - iface->get_is_popup = impl_get_is_popup; + iface->add_child = impl_add_child; + iface->set_active_child = impl_set_active_child; + iface->remove_child = impl_remove_child; + iface->get_active_child = impl_get_active_child; + iface->get_children = impl_get_children; + iface->get_is_popup = impl_get_is_popup; } static EphyEmbed * -ephy_window_open_link (EphyLink *link, - const char *address, - EphyEmbed *embed, - EphyLinkFlags flags) -{ - EphyWindow *window = EPHY_WINDOW (link); - EphyEmbed *new_embed; - - g_return_val_if_fail (address != NULL, NULL); - - if (embed == NULL) - { - embed = window->active_embed; - } - - if (flags & EPHY_LINK_BOOKMARK) - ephy_web_view_set_visit_type (ephy_embed_get_web_view (embed), - EPHY_PAGE_VISIT_BOOKMARK); - else if (flags & EPHY_LINK_TYPED) - ephy_web_view_set_visit_type (ephy_embed_get_web_view (embed), - EPHY_PAGE_VISIT_TYPED); - - if (flags & (EPHY_LINK_JUMP_TO | - EPHY_LINK_NEW_TAB | - EPHY_LINK_NEW_WINDOW)) - { - EphyNewTabFlags ntflags = 0; - EphyWindow *target_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))); - - if (flags & EPHY_LINK_JUMP_TO) - { - ntflags |= EPHY_NEW_TAB_JUMP; - } - - if (flags & EPHY_LINK_NEW_WINDOW || - (flags & EPHY_LINK_NEW_TAB && window->is_popup)) - { - target_window = ephy_window_new (); - } - - if (flags & EPHY_LINK_NEW_TAB_APPEND_AFTER) - ntflags |= EPHY_NEW_TAB_APPEND_AFTER; - - new_embed = ephy_shell_new_tab - (ephy_shell_get_default (), - target_window, - embed, ntflags); - if (flags & EPHY_LINK_HOME_PAGE) - { - ephy_web_view_load_homepage (ephy_embed_get_web_view (new_embed)); - ephy_window_activate_location (window); - } - else - { - ephy_web_view_load_url (ephy_embed_get_web_view (new_embed), address); - if (flags & EPHY_LINK_JUMP_TO) - { - gtk_widget_grab_focus (GTK_WIDGET (new_embed)); - } - } - } - else - { - ephy_web_view_load_url (ephy_embed_get_web_view (embed), address); - - if (address == NULL || address[0] == '\0' || g_str_equal (address, "about:blank")) - { - ephy_window_activate_location (window); - } - else - { - gtk_widget_grab_focus (GTK_WIDGET (embed)); - } - - new_embed = embed; - } - - return new_embed; +ephy_window_open_link (EphyLink *link, + const char *address, + EphyEmbed *embed, + EphyLinkFlags flags) +{ + EphyWindow *window = EPHY_WINDOW (link); + EphyEmbed *new_embed; + + g_return_val_if_fail (address != NULL, NULL); + + if (embed == NULL) { + embed = window->active_embed; + } + + if (flags & EPHY_LINK_BOOKMARK) + ephy_web_view_set_visit_type (ephy_embed_get_web_view (embed), + EPHY_PAGE_VISIT_BOOKMARK); + else if (flags & EPHY_LINK_TYPED) + ephy_web_view_set_visit_type (ephy_embed_get_web_view (embed), + EPHY_PAGE_VISIT_TYPED); + + if (flags & (EPHY_LINK_JUMP_TO | + EPHY_LINK_NEW_TAB | + EPHY_LINK_NEW_WINDOW)) { + EphyNewTabFlags ntflags = 0; + EphyWindow *target_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))); + + if (flags & EPHY_LINK_JUMP_TO) { + ntflags |= EPHY_NEW_TAB_JUMP; + } + + if (flags & EPHY_LINK_NEW_WINDOW || + (flags & EPHY_LINK_NEW_TAB && window->is_popup)) { + target_window = ephy_window_new (); + } + + if (flags & EPHY_LINK_NEW_TAB_APPEND_AFTER) + ntflags |= EPHY_NEW_TAB_APPEND_AFTER; + + new_embed = ephy_shell_new_tab + (ephy_shell_get_default (), + target_window, + embed, ntflags); + if (flags & EPHY_LINK_HOME_PAGE) { + ephy_web_view_load_homepage (ephy_embed_get_web_view (new_embed)); + ephy_window_activate_location (window); + } else { + ephy_web_view_load_url (ephy_embed_get_web_view (new_embed), address); + if (flags & EPHY_LINK_JUMP_TO) { + gtk_widget_grab_focus (GTK_WIDGET (new_embed)); + } + } + } else { + ephy_web_view_load_url (ephy_embed_get_web_view (embed), address); + + if (address == NULL || address[0] == '\0' || g_str_equal (address, "about:blank")) { + ephy_window_activate_location (window); + } else { + gtk_widget_grab_focus (GTK_WIDGET (embed)); + } + + new_embed = embed; + } + + return new_embed; } static void ephy_window_link_iface_init (EphyLinkInterface *iface) { - iface->open_link = ephy_window_open_link; + iface->open_link = ephy_window_open_link; } G_DEFINE_TYPE_WITH_CODE (EphyWindow, ephy_window, GTK_TYPE_APPLICATION_WINDOW, - G_IMPLEMENT_INTERFACE (EPHY_TYPE_LINK, - ephy_window_link_iface_init) - G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_CONTAINER, - ephy_window_embed_container_iface_init)) + G_IMPLEMENT_INTERFACE (EPHY_TYPE_LINK, + ephy_window_link_iface_init) + G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_CONTAINER, + ephy_window_embed_container_iface_init)) static void settings_change_notify (GtkSettings *settings, - EphyWindow *window) + EphyWindow *window) { - char *key_theme_name; + char *key_theme_name; - g_object_get (settings, - "gtk-key-theme-name", &key_theme_name, - NULL); + g_object_get (settings, + "gtk-key-theme-name", &key_theme_name, + NULL); - window->key_theme_is_emacs = - key_theme_name && - g_ascii_strcasecmp (key_theme_name, "Emacs") == 0; + window->key_theme_is_emacs = + key_theme_name && + g_ascii_strcasecmp (key_theme_name, "Emacs") == 0; - g_free (key_theme_name); + g_free (key_theme_name); } static void settings_changed_cb (GtkSettings *settings) { - GList *list, *l; + GList *list, *l; - /* FIXME: multi-head */ - list = gtk_window_list_toplevels (); + /* FIXME: multi-head */ + list = gtk_window_list_toplevels (); - for (l = list; l != NULL; l = l->next) - { - if (EPHY_IS_WINDOW (l->data)) - { - settings_change_notify (settings, l->data); - } - } + for (l = list; l != NULL; l = l->next) { + if (EPHY_IS_WINDOW (l->data)) { + settings_change_notify (settings, l->data); + } + } - g_list_free (list); + g_list_free (list); } static void sync_chromes_visibility (EphyWindow *window) { - gboolean show_tabsbar; + gboolean show_tabsbar; - if (window->closing) - return; + if (window->closing) + return; - show_tabsbar = (window->chrome & EPHY_WINDOW_CHROME_TABSBAR); + show_tabsbar = (window->chrome & EPHY_WINDOW_CHROME_TABSBAR); - ephy_notebook_set_tabs_allowed (EPHY_NOTEBOOK (window->notebook), - show_tabsbar && !(window->is_popup || window->fullscreen_mode)); + ephy_notebook_set_tabs_allowed (EPHY_NOTEBOOK (window->notebook), + show_tabsbar && !(window->is_popup || window->fullscreen_mode)); } static void -ephy_window_set_chrome (EphyWindow *window, - EphyWindowChrome chrome) +ephy_window_set_chrome (EphyWindow *window, + EphyWindowChrome chrome) { - if (window->chrome == chrome) - return; + if (window->chrome == chrome) + return; - window->chrome = chrome; - if (window->closing) - return; + window->chrome = chrome; + if (window->closing) + return; - g_object_notify (G_OBJECT (window), "chrome"); - sync_chromes_visibility (window); + g_object_notify (G_OBJECT (window), "chrome"); + sync_chromes_visibility (window); } static void -sync_tab_load_status (EphyWebView *view, - WebKitLoadEvent load_event, - EphyWindow *window) +sync_tab_load_status (EphyWebView *view, + WebKitLoadEvent load_event, + EphyWindow *window) { - GtkActionGroup *action_group = window->action_group; - GtkAction *action; - gboolean loading; + GtkActionGroup *action_group = window->action_group; + GtkAction *action; + gboolean loading; - if (window->closing) return; + if (window->closing) return; - loading = ephy_web_view_is_loading (view); + loading = ephy_web_view_is_loading (view); - action = gtk_action_group_get_action (action_group, "ViewStop"); - gtk_action_set_sensitive (action, loading); + action = gtk_action_group_get_action (action_group, "ViewStop"); + gtk_action_set_sensitive (action, loading); - /* disable print while loading, see bug #116344 */ - action = gtk_action_group_get_action (action_group, "FilePrint"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_LOADING, loading); + /* disable print while loading, see bug #116344 */ + action = gtk_action_group_get_action (action_group, "FilePrint"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_LOADING, loading); - action = gtk_action_group_get_action (window->toolbar_action_group, - "ViewCombinedStopReload"); - ephy_combined_stop_reload_action_set_loading (EPHY_COMBINED_STOP_RELOAD_ACTION (action), - loading); + action = gtk_action_group_get_action (window->toolbar_action_group, + "ViewCombinedStopReload"); + ephy_combined_stop_reload_action_set_loading (EPHY_COMBINED_STOP_RELOAD_ACTION (action), + loading); } static void sync_tab_security (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - EphyTitleBox *title_box; - EphySecurityLevel security_level; + EphyTitleBox *title_box; + EphySecurityLevel security_level; - if (window->closing) return; + if (window->closing) return; - ephy_web_view_get_security_level (view, &security_level, NULL, NULL); - title_box = ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)); - ephy_title_box_set_security_level (title_box, security_level); + ephy_web_view_get_security_level (view, &security_level, NULL, NULL); + title_box = ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)); + ephy_title_box_set_security_level (title_box, security_level); } static void ephy_window_fullscreen (EphyWindow *window) { - EphyEmbed *embed; + EphyEmbed *embed; - window->fullscreen_mode = TRUE; + window->fullscreen_mode = TRUE; - /* sync status */ - embed = window->active_embed; - sync_tab_load_status (ephy_embed_get_web_view (embed), WEBKIT_LOAD_STARTED, window); - sync_tab_security (ephy_embed_get_web_view (embed), NULL, window); + /* sync status */ + embed = window->active_embed; + sync_tab_load_status (ephy_embed_get_web_view (embed), WEBKIT_LOAD_STARTED, window); + sync_tab_security (ephy_embed_get_web_view (embed), NULL, window); - sync_chromes_visibility (window); - gtk_widget_hide (window->toolbar); - ephy_embed_entering_fullscreen (embed); + sync_chromes_visibility (window); + gtk_widget_hide (window->toolbar); + ephy_embed_entering_fullscreen (embed); } static void ephy_window_unfullscreen (EphyWindow *window) { - window->fullscreen_mode = FALSE; + window->fullscreen_mode = FALSE; - gtk_widget_show (window->toolbar); - sync_chromes_visibility (window); - ephy_embed_leaving_fullscreen (window->active_embed); + gtk_widget_show (window->toolbar); + sync_chromes_visibility (window); + ephy_embed_leaving_fullscreen (window->active_embed); } static gboolean -ephy_window_bound_accels (GtkWidget *widget, - GdkEventKey *event) -{ - EphyWindow *window = EPHY_WINDOW (widget); - guint modifier = event->state & gtk_accelerator_get_default_mod_mask (); - guint i; - - navigation_keybindings_rtl_ltr = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ? - navigation_keybindings_rtl : navigation_keybindings_ltr; - - for (i = 0; i < G_N_ELEMENTS (extra_keybindings); i++) - { - if (event->keyval == extra_keybindings[i].keyval && - modifier == extra_keybindings[i].modifier) - { - GtkAction * action = gtk_action_group_get_action - (extra_keybindings[i].fromToolbar ? - window->toolbar_action_group : - window->action_group, - extra_keybindings[i].action); - if (gtk_action_is_sensitive (action)) - { - gtk_action_activate (action); - return TRUE; - } - break; - } - } - - for (i = 0; i < G_N_ELEMENTS (navigation_keybindings_rtl); i++) - { - if (event->keyval == navigation_keybindings_rtl_ltr[i].keyval && - modifier == navigation_keybindings_rtl_ltr[i].modifier) - { - GtkAction * action = gtk_action_group_get_action - (navigation_keybindings_rtl_ltr[i].fromToolbar ? - window->toolbar_action_group : - window->action_group, - navigation_keybindings_rtl_ltr[i].action); - if (gtk_action_is_sensitive (action)) - { - gtk_action_activate (action); - return TRUE; - } - break; - } - } - - return FALSE; +ephy_window_bound_accels (GtkWidget *widget, + GdkEventKey *event) +{ + EphyWindow *window = EPHY_WINDOW (widget); + guint modifier = event->state & gtk_accelerator_get_default_mod_mask (); + guint i; + + navigation_keybindings_rtl_ltr = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ? + navigation_keybindings_rtl : navigation_keybindings_ltr; + + for (i = 0; i < G_N_ELEMENTS (extra_keybindings); i++) { + if (event->keyval == extra_keybindings[i].keyval && + modifier == extra_keybindings[i].modifier) { + GtkAction *action = gtk_action_group_get_action + (extra_keybindings[i].fromToolbar ? + window->toolbar_action_group : + window->action_group, + extra_keybindings[i].action); + if (gtk_action_is_sensitive (action)) { + gtk_action_activate (action); + return TRUE; + } + break; + } + } + + for (i = 0; i < G_N_ELEMENTS (navigation_keybindings_rtl); i++) { + if (event->keyval == navigation_keybindings_rtl_ltr[i].keyval && + modifier == navigation_keybindings_rtl_ltr[i].modifier) { + GtkAction *action = gtk_action_group_get_action + (navigation_keybindings_rtl_ltr[i].fromToolbar ? + window->toolbar_action_group : + window->action_group, + navigation_keybindings_rtl_ltr[i].action); + if (gtk_action_is_sensitive (action)) { + gtk_action_activate (action); + return TRUE; + } + break; + } + } + + return FALSE; } static gboolean -ephy_window_key_press_event (GtkWidget *widget, - GdkEventKey *event) -{ - EphyWindow *window = EPHY_WINDOW (widget); - GtkWidget *focus_widget; - gboolean shortcircuit = FALSE, force_chain = FALSE, handled = FALSE; - guint modifier = event->state & gtk_accelerator_get_default_mod_mask (); - - /* In an attempt to get the mozembed playing nice with things like emacs keybindings - * we are passing important events to the focused child widget before letting the window's - * base handler see them. This is *completely against* stated gtk2 policy but the - * 'correct' behaviour is exceptionally useless. We need to keep an eye out for - * unexpected consequences of this decision. IME's should be a high concern, but - * considering that the IME folks complained about the upside-down event propagation - * rules, we might be doing them a favour. - * - * We achieve this by first evaluating the event to see if it's important, and if - * so, we get the focus widget and attempt to get the widget to handle that event. - * If the widget does handle it, we're done (unless force_chain is true, in which - * case the event is handled as normal in addition to being sent to the focus - * widget), otherwise the event follows the normal handling path. - */ - - if ((event->state & GDK_CONTROL_MASK || - event->state & GDK_MOD1_MASK || - event->state & GDK_SHIFT_MASK) && - event->length > 0) - { - /* Pass (CTRL|ALT|SHIFT)+letter characters to the widget */ - shortcircuit = TRUE; - } - else if (event->keyval == GDK_KEY_Escape && modifier == 0) - { - /* Always pass Escape to both the widget, and the parent */ - shortcircuit = TRUE; - force_chain = TRUE; - } - else if (window->key_theme_is_emacs && - (modifier == GDK_CONTROL_MASK) && - event->length > 0 && - /* But don't pass Ctrl+Enter twice */ - event->keyval != GDK_KEY_Return && - event->keyval != GDK_KEY_KP_Enter && - event->keyval != GDK_KEY_ISO_Enter) - { - /* Pass CTRL+letter characters to the widget */ - shortcircuit = TRUE; - } - - if (shortcircuit) - { - focus_widget = gtk_window_get_focus (GTK_WINDOW (window)); - - if (GTK_IS_WIDGET (focus_widget)) - { - handled = gtk_widget_event (focus_widget, - (GdkEvent*) event); - } - - if (handled && !force_chain) - { - return handled; - } - } - - /* Handle accelerators that we want bound, but aren't associated with - * an action */ - if (ephy_window_bound_accels (widget, event)) - { - return TRUE; - } - - return GTK_WIDGET_CLASS (ephy_window_parent_class)->key_press_event (widget, event); +ephy_window_key_press_event (GtkWidget *widget, + GdkEventKey *event) +{ + EphyWindow *window = EPHY_WINDOW (widget); + GtkWidget *focus_widget; + gboolean shortcircuit = FALSE, force_chain = FALSE, handled = FALSE; + guint modifier = event->state & gtk_accelerator_get_default_mod_mask (); + + /* In an attempt to get the mozembed playing nice with things like emacs keybindings + * we are passing important events to the focused child widget before letting the window's + * base handler see them. This is *completely against* stated gtk2 policy but the + * 'correct' behaviour is exceptionally useless. We need to keep an eye out for + * unexpected consequences of this decision. IME's should be a high concern, but + * considering that the IME folks complained about the upside-down event propagation + * rules, we might be doing them a favour. + * + * We achieve this by first evaluating the event to see if it's important, and if + * so, we get the focus widget and attempt to get the widget to handle that event. + * If the widget does handle it, we're done (unless force_chain is true, in which + * case the event is handled as normal in addition to being sent to the focus + * widget), otherwise the event follows the normal handling path. + */ + + if ((event->state & GDK_CONTROL_MASK || + event->state & GDK_MOD1_MASK || + event->state & GDK_SHIFT_MASK) && + event->length > 0) { + /* Pass (CTRL|ALT|SHIFT)+letter characters to the widget */ + shortcircuit = TRUE; + } else if (event->keyval == GDK_KEY_Escape && modifier == 0) { + /* Always pass Escape to both the widget, and the parent */ + shortcircuit = TRUE; + force_chain = TRUE; + } else if (window->key_theme_is_emacs && + (modifier == GDK_CONTROL_MASK) && + event->length > 0 && + /* But don't pass Ctrl+Enter twice */ + event->keyval != GDK_KEY_Return && + event->keyval != GDK_KEY_KP_Enter && + event->keyval != GDK_KEY_ISO_Enter) { + /* Pass CTRL+letter characters to the widget */ + shortcircuit = TRUE; + } + + if (shortcircuit) { + focus_widget = gtk_window_get_focus (GTK_WINDOW (window)); + + if (GTK_IS_WIDGET (focus_widget)) { + handled = gtk_widget_event (focus_widget, + (GdkEvent *)event); + } + + if (handled && !force_chain) { + return handled; + } + } + + /* Handle accelerators that we want bound, but aren't associated with + * an action */ + if (ephy_window_bound_accels (widget, event)) { + return TRUE; + } + + return GTK_WIDGET_CLASS (ephy_window_parent_class)->key_press_event (widget, event); } static gboolean -ephy_window_delete_event (GtkWidget *widget, - GdkEventAny *event) +ephy_window_delete_event (GtkWidget *widget, + GdkEventAny *event) { - if (!ephy_window_close (EPHY_WINDOW (widget))) - return TRUE; + if (!ephy_window_close (EPHY_WINDOW (widget))) + return TRUE; - /* proceed with window close */ - if (GTK_WIDGET_CLASS (ephy_window_parent_class)->delete_event) - { - return GTK_WIDGET_CLASS (ephy_window_parent_class)->delete_event (widget, event); - } + /* proceed with window close */ + if (GTK_WIDGET_CLASS (ephy_window_parent_class)->delete_event) { + return GTK_WIDGET_CLASS (ephy_window_parent_class)->delete_event (widget, event); + } - return FALSE; + return FALSE; } #define MAX_SPELL_CHECK_GUESSES 4 static void update_link_actions_sensitivity (EphyWindow *window, - gboolean link_has_web_scheme) + gboolean link_has_web_scheme) { - GtkAction *action; - GtkActionGroup *action_group; + GtkAction *action; + GtkActionGroup *action_group; - action_group = window->popups_action_group; + action_group = window->popups_action_group; - action = gtk_action_group_get_action (action_group, "OpenLinkInNewWindow"); - gtk_action_set_sensitive (action, link_has_web_scheme); + action = gtk_action_group_get_action (action_group, "OpenLinkInNewWindow"); + gtk_action_set_sensitive (action, link_has_web_scheme); - action = gtk_action_group_get_action (action_group, "OpenLinkInNewTab"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CONTEXT, !link_has_web_scheme); + action = gtk_action_group_get_action (action_group, "OpenLinkInNewTab"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CONTEXT, !link_has_web_scheme); - action = gtk_action_group_get_action (action_group, "OpenLinkInIncognitoWindow"); - gtk_action_set_sensitive (action, link_has_web_scheme); + action = gtk_action_group_get_action (action_group, "OpenLinkInIncognitoWindow"); + gtk_action_set_sensitive (action, link_has_web_scheme); } static void update_edit_action_sensitivity (EphyWindow *window, const gchar *action_name, gboolean sensitive, gboolean hide) { - GtkAction *action; + GtkAction *action; - action = gtk_action_group_get_action (window->action_group, action_name); - gtk_action_set_sensitive (action, sensitive); - gtk_action_set_visible (action, !hide || sensitive); + action = gtk_action_group_get_action (window->action_group, action_name); + gtk_action_set_sensitive (action, sensitive); + gtk_action_set_visible (action, !hide || sensitive); } -typedef struct -{ - EphyWindow *window; - const gchar *action_name; - gboolean hide; +typedef struct { + EphyWindow *window; + const gchar *action_name; + gboolean hide; } CanEditCommandAsyncData; static CanEditCommandAsyncData * can_edit_command_async_data_new (EphyWindow *window, const gchar *action_name, gboolean hide) { - CanEditCommandAsyncData *data; + CanEditCommandAsyncData *data; - data = g_slice_new (CanEditCommandAsyncData); - data->window = g_object_ref (window); - data->action_name = action_name; - data->hide = hide; + data = g_slice_new (CanEditCommandAsyncData); + data->window = g_object_ref (window); + data->action_name = action_name; + data->hide = hide; - return data; + return data; } static void can_edit_command_async_data_free (CanEditCommandAsyncData *data) { - if (G_UNLIKELY (!data)) - return; + if (G_UNLIKELY (!data)) + return; - g_object_unref (data->window); - g_slice_free (CanEditCommandAsyncData, data); + g_object_unref (data->window); + g_slice_free (CanEditCommandAsyncData, data); } static void can_edit_command_callback (GObject *object, GAsyncResult *result, CanEditCommandAsyncData *data) { - gboolean sensitive; - GError *error = NULL; - - sensitive = webkit_web_view_can_execute_editing_command_finish (WEBKIT_WEB_VIEW (object), result, &error); - if (!error) - { - update_edit_action_sensitivity (data->window, data->action_name, sensitive, data->hide); + gboolean sensitive; + GError *error = NULL; - } - else - { - g_error_free (error); - } + sensitive = webkit_web_view_can_execute_editing_command_finish (WEBKIT_WEB_VIEW (object), result, &error); + if (!error) { + update_edit_action_sensitivity (data->window, data->action_name, sensitive, data->hide); + } else { + g_error_free (error); + } - can_edit_command_async_data_free (data); + can_edit_command_async_data_free (data); } static void update_edit_actions_sensitivity (EphyWindow *window, gboolean hide) { - GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window)); - gboolean can_copy, can_cut, can_undo, can_redo, can_paste; - - if (GTK_IS_EDITABLE (widget)) - { - GtkWidget *entry; - gboolean has_selection; - - entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); - - has_selection = gtk_editable_get_selection_bounds - (GTK_EDITABLE (widget), NULL, NULL); - - can_copy = has_selection; - can_cut = has_selection; - can_paste = TRUE; - can_undo = ephy_location_entry_get_can_undo (EPHY_LOCATION_ENTRY (entry)); - can_redo = ephy_location_entry_get_can_redo (EPHY_LOCATION_ENTRY (entry)); - } - else - { - EphyEmbed *embed; - WebKitWebView *view; - CanEditCommandAsyncData *data; - - embed = window->active_embed; - g_return_if_fail (embed != NULL); - - view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); - - data = can_edit_command_async_data_new (window, "EditCopy", hide); - webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_COPY, NULL, - (GAsyncReadyCallback)can_edit_command_callback, - data); - data = can_edit_command_async_data_new (window, "EditCut", hide); - webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_CUT, NULL, - (GAsyncReadyCallback)can_edit_command_callback, - data); - data = can_edit_command_async_data_new (window, "EditPaste", hide); - webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_PASTE, NULL, - (GAsyncReadyCallback)can_edit_command_callback, - data); - data = can_edit_command_async_data_new (window, "EditUndo", hide); - webkit_web_view_can_execute_editing_command (view, "Undo", NULL, - (GAsyncReadyCallback)can_edit_command_callback, - data); - data = can_edit_command_async_data_new (window, "EditRedo", hide); - webkit_web_view_can_execute_editing_command (view, "Redo", NULL, - (GAsyncReadyCallback)can_edit_command_callback, - data); - return; - } - - update_edit_action_sensitivity (window, "EditCopy", can_copy, hide); - update_edit_action_sensitivity (window, "EditCut", can_cut, hide); - update_edit_action_sensitivity (window, "EditPaste", can_paste, hide); - update_edit_action_sensitivity (window, "EditUndo", can_undo, hide); - update_edit_action_sensitivity (window, "EditRedo", can_redo, hide); + GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window)); + gboolean can_copy, can_cut, can_undo, can_redo, can_paste; + + if (GTK_IS_EDITABLE (widget)) { + GtkWidget *entry; + gboolean has_selection; + + entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); + + has_selection = gtk_editable_get_selection_bounds + (GTK_EDITABLE (widget), NULL, NULL); + + can_copy = has_selection; + can_cut = has_selection; + can_paste = TRUE; + can_undo = ephy_location_entry_get_can_undo (EPHY_LOCATION_ENTRY (entry)); + can_redo = ephy_location_entry_get_can_redo (EPHY_LOCATION_ENTRY (entry)); + } else { + EphyEmbed *embed; + WebKitWebView *view; + CanEditCommandAsyncData *data; + + embed = window->active_embed; + g_return_if_fail (embed != NULL); + + view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); + + data = can_edit_command_async_data_new (window, "EditCopy", hide); + webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_COPY, NULL, + (GAsyncReadyCallback)can_edit_command_callback, + data); + data = can_edit_command_async_data_new (window, "EditCut", hide); + webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_CUT, NULL, + (GAsyncReadyCallback)can_edit_command_callback, + data); + data = can_edit_command_async_data_new (window, "EditPaste", hide); + webkit_web_view_can_execute_editing_command (view, WEBKIT_EDITING_COMMAND_PASTE, NULL, + (GAsyncReadyCallback)can_edit_command_callback, + data); + data = can_edit_command_async_data_new (window, "EditUndo", hide); + webkit_web_view_can_execute_editing_command (view, "Undo", NULL, + (GAsyncReadyCallback)can_edit_command_callback, + data); + data = can_edit_command_async_data_new (window, "EditRedo", hide); + webkit_web_view_can_execute_editing_command (view, "Redo", NULL, + (GAsyncReadyCallback)can_edit_command_callback, + data); + return; + } + + update_edit_action_sensitivity (window, "EditCopy", can_copy, hide); + update_edit_action_sensitivity (window, "EditCut", can_cut, hide); + update_edit_action_sensitivity (window, "EditPaste", can_paste, hide); + update_edit_action_sensitivity (window, "EditUndo", can_undo, hide); + update_edit_action_sensitivity (window, "EditRedo", can_redo, hide); } static void enable_edit_actions_sensitivity (EphyWindow *window) { - GtkActionGroup *action_group; - GtkAction *action; + GtkActionGroup *action_group; + GtkAction *action; - action_group = window->action_group; + action_group = window->action_group; - action = gtk_action_group_get_action (action_group, "EditCopy"); - gtk_action_set_sensitive (action, TRUE); - gtk_action_set_visible (action, TRUE); - action = gtk_action_group_get_action (action_group, "EditCut"); - gtk_action_set_sensitive (action, TRUE); - gtk_action_set_visible (action, TRUE); - action = gtk_action_group_get_action (action_group, "EditPaste"); - gtk_action_set_sensitive (action, TRUE); - gtk_action_set_visible (action, TRUE); - action = gtk_action_group_get_action (action_group, "EditUndo"); - gtk_action_set_sensitive (action, TRUE); - gtk_action_set_visible (action, TRUE); - action = gtk_action_group_get_action (action_group, "EditRedo"); - gtk_action_set_sensitive (action, TRUE); - gtk_action_set_visible (action, TRUE); + action = gtk_action_group_get_action (action_group, "EditCopy"); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, TRUE); + action = gtk_action_group_get_action (action_group, "EditCut"); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, TRUE); + action = gtk_action_group_get_action (action_group, "EditPaste"); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, TRUE); + action = gtk_action_group_get_action (action_group, "EditUndo"); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, TRUE); + action = gtk_action_group_get_action (action_group, "EditRedo"); + gtk_action_set_sensitive (action, TRUE); + gtk_action_set_visible (action, TRUE); } static void -edit_menu_show_cb (GtkWidget *menu, - EphyWindow *window) +edit_menu_show_cb (GtkWidget *menu, + EphyWindow *window) { - update_edit_actions_sensitivity (window, FALSE); + update_edit_actions_sensitivity (window, FALSE); } static void -edit_menu_hide_cb (GtkWidget *menu, - EphyWindow *window) +edit_menu_hide_cb (GtkWidget *menu, + EphyWindow *window) { - enable_edit_actions_sensitivity (window); + enable_edit_actions_sensitivity (window); } static void init_menu_updaters (EphyWindow *window) { - GtkWidget *edit_menu; + GtkWidget *edit_menu; - edit_menu = gtk_ui_manager_get_widget - (window->manager, "/ui/PagePopup"); + edit_menu = gtk_ui_manager_get_widget + (window->manager, "/ui/PagePopup"); - g_signal_connect (edit_menu, "show", - G_CALLBACK (edit_menu_show_cb), window); - g_signal_connect (edit_menu, "hide", - G_CALLBACK (edit_menu_hide_cb), window); + g_signal_connect (edit_menu, "show", + G_CALLBACK (edit_menu_show_cb), window); + g_signal_connect (edit_menu, "hide", + G_CALLBACK (edit_menu_hide_cb), window); } static void setup_ui_manager (EphyWindow *window) { - GtkActionGroup *action_group; - GtkAccelGroup *accel_group; - GtkAction *action; - GtkUIManager *manager; - - manager = gtk_ui_manager_new (); - accel_group = gtk_ui_manager_get_accel_group (manager); - - action_group = gtk_action_group_new ("WindowActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, ephy_menu_entries, - G_N_ELEMENTS (ephy_menu_entries), window); - gtk_action_group_add_toggle_actions (action_group, - ephy_menu_toggle_entries, - G_N_ELEMENTS (ephy_menu_toggle_entries), - window); - gtk_action_group_set_accel_group (action_group, accel_group); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - window->action_group = action_group; - g_object_unref (action_group); - - action = gtk_action_group_get_action (action_group, "FileOpen"); - g_object_set (action, "short_label", _("Open"), NULL); - action = gtk_action_group_get_action (action_group, "FileSaveAs"); - g_object_set (action, "short_label", _("Save As"), NULL); - action = gtk_action_group_get_action (action_group, "FileSaveAsApplication"); - g_object_set (action, "short_label", _("Save As Application"), NULL); - action = gtk_action_group_get_action (action_group, "FilePrint"); - g_object_set (action, "short_label", _("Print"), NULL); - action = gtk_action_group_get_action (action_group, "FileBookmarkPage"); - g_object_set (action, "short_label", _("Bookmark"), NULL); - action = gtk_action_group_get_action (action_group, "EditFind"); - g_object_set (action, "short_label", _("Find"), NULL); - - action = gtk_action_group_get_action (action_group, "EditFind"); - g_object_set (action, "is_important", TRUE, NULL); - - action = gtk_action_group_get_action (action_group, "ViewEncoding"); - g_object_set (action, "short_label", _("Encodings…"), NULL); - action = gtk_action_group_get_action (action_group, "ViewZoomIn"); - /* Translators: This refers to text size */ - g_object_set (action, "short-label", _("Larger"), NULL); - action = gtk_action_group_get_action (action_group, "ViewZoomOut"); - /* Translators: This refers to text size */ - g_object_set (action, "short-label", _("Smaller"), NULL); - - action_group = gtk_action_group_new ("PopupsActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, ephy_popups_entries, - G_N_ELEMENTS (ephy_popups_entries), window); - gtk_action_group_set_accel_group (action_group, accel_group); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - window->popups_action_group = action_group; - g_object_unref (action_group); - - /* Tab accels */ - action_group = gtk_action_group_new ("TabAccelsActions"); - gtk_action_group_set_accel_group (action_group, accel_group); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - window->tab_accels_action_group = action_group; - g_object_unref (action_group); - - action_group = gtk_action_group_new ("SpecialToolbarActions"); - action = - g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION, - "name", "NavigationBack", - "label", _("Back"), - "icon-name", "go-previous-symbolic", - "window", window, - "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_BACK, - NULL); - gtk_action_group_add_action_with_accel (action_group, action, - "<alt>Left"); - g_object_unref (action); - - action = - g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION, - "name", "NavigationForward", - "label", _("Forward"), - "icon-name", "go-next-symbolic", - "window", window, - "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD, - NULL); - gtk_action_group_add_action_with_accel (action_group, action, - "<alt>Right"); - g_object_unref (action); - - action = - g_object_new (EPHY_TYPE_ZOOM_ACTION, - "name", "Zoom", - "label", _("Zoom"), - "zoom", 1.0, - NULL); - gtk_action_group_add_action (action_group, action); - g_object_unref (action); - - action = g_object_new (EPHY_TYPE_HOME_ACTION, - "name", "FileNewTab", - "icon-name", "tab-new-symbolic", - "label", _("New _Tab"), - NULL); - gtk_action_group_add_action_with_accel (action_group, action, "<control>T"); - g_object_unref (action); - - action = - g_object_new (EPHY_TYPE_HOME_ACTION, - "name", "FileHome", - "label", _("Go to most visited"), - NULL); - gtk_action_group_add_action_with_accel (action_group, action, "<alt>Home"); - g_signal_connect_swapped (action, "open-link", - G_CALLBACK (ephy_link_open), window); - g_object_unref (action); - - action = g_object_new (EPHY_TYPE_COMBINED_STOP_RELOAD_ACTION, - "name", "ViewCombinedStopReload", - "loading", FALSE, - "window", window, - NULL); - gtk_action_group_add_action (action_group, action); - g_object_unref (action); - - gtk_action_group_set_accel_group (action_group, accel_group); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - window->toolbar_action_group = action_group; - g_object_unref (action_group); - - window->manager = manager; - gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); + GtkActionGroup *action_group; + GtkAccelGroup *accel_group; + GtkAction *action; + GtkUIManager *manager; + + manager = gtk_ui_manager_new (); + accel_group = gtk_ui_manager_get_accel_group (manager); + + action_group = gtk_action_group_new ("WindowActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, ephy_menu_entries, + G_N_ELEMENTS (ephy_menu_entries), window); + gtk_action_group_add_toggle_actions (action_group, + ephy_menu_toggle_entries, + G_N_ELEMENTS (ephy_menu_toggle_entries), + window); + gtk_action_group_set_accel_group (action_group, accel_group); + gtk_ui_manager_insert_action_group (manager, action_group, 0); + window->action_group = action_group; + g_object_unref (action_group); + + action = gtk_action_group_get_action (action_group, "FileOpen"); + g_object_set (action, "short_label", _("Open"), NULL); + action = gtk_action_group_get_action (action_group, "FileSaveAs"); + g_object_set (action, "short_label", _("Save As"), NULL); + action = gtk_action_group_get_action (action_group, "FileSaveAsApplication"); + g_object_set (action, "short_label", _("Save As Application"), NULL); + action = gtk_action_group_get_action (action_group, "FilePrint"); + g_object_set (action, "short_label", _("Print"), NULL); + action = gtk_action_group_get_action (action_group, "FileBookmarkPage"); + g_object_set (action, "short_label", _("Bookmark"), NULL); + action = gtk_action_group_get_action (action_group, "EditFind"); + g_object_set (action, "short_label", _("Find"), NULL); + + action = gtk_action_group_get_action (action_group, "EditFind"); + g_object_set (action, "is_important", TRUE, NULL); + + action = gtk_action_group_get_action (action_group, "ViewEncoding"); + g_object_set (action, "short_label", _("Encodings…"), NULL); + action = gtk_action_group_get_action (action_group, "ViewZoomIn"); + /* Translators: This refers to text size */ + g_object_set (action, "short-label", _("Larger"), NULL); + action = gtk_action_group_get_action (action_group, "ViewZoomOut"); + /* Translators: This refers to text size */ + g_object_set (action, "short-label", _("Smaller"), NULL); + + action_group = gtk_action_group_new ("PopupsActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, ephy_popups_entries, + G_N_ELEMENTS (ephy_popups_entries), window); + gtk_action_group_set_accel_group (action_group, accel_group); + gtk_ui_manager_insert_action_group (manager, action_group, 0); + window->popups_action_group = action_group; + g_object_unref (action_group); + + /* Tab accels */ + action_group = gtk_action_group_new ("TabAccelsActions"); + gtk_action_group_set_accel_group (action_group, accel_group); + gtk_ui_manager_insert_action_group (manager, action_group, 0); + window->tab_accels_action_group = action_group; + g_object_unref (action_group); + + action_group = gtk_action_group_new ("SpecialToolbarActions"); + action = + g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION, + "name", "NavigationBack", + "label", _("Back"), + "icon-name", "go-previous-symbolic", + "window", window, + "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_BACK, + NULL); + gtk_action_group_add_action_with_accel (action_group, action, + "<alt>Left"); + g_object_unref (action); + + action = + g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION, + "name", "NavigationForward", + "label", _("Forward"), + "icon-name", "go-next-symbolic", + "window", window, + "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD, + NULL); + gtk_action_group_add_action_with_accel (action_group, action, + "<alt>Right"); + g_object_unref (action); + + action = + g_object_new (EPHY_TYPE_ZOOM_ACTION, + "name", "Zoom", + "label", _("Zoom"), + "zoom", 1.0, + NULL); + gtk_action_group_add_action (action_group, action); + g_object_unref (action); + + action = g_object_new (EPHY_TYPE_HOME_ACTION, + "name", "FileNewTab", + "icon-name", "tab-new-symbolic", + "label", _("New _Tab"), + NULL); + gtk_action_group_add_action_with_accel (action_group, action, "<control>T"); + g_object_unref (action); + + action = + g_object_new (EPHY_TYPE_HOME_ACTION, + "name", "FileHome", + "label", _("Go to most visited"), + NULL); + gtk_action_group_add_action_with_accel (action_group, action, "<alt>Home"); + g_signal_connect_swapped (action, "open-link", + G_CALLBACK (ephy_link_open), window); + g_object_unref (action); + + action = g_object_new (EPHY_TYPE_COMBINED_STOP_RELOAD_ACTION, + "name", "ViewCombinedStopReload", + "loading", FALSE, + "window", window, + NULL); + gtk_action_group_add_action (action_group, action); + g_object_unref (action); + + gtk_action_group_set_accel_group (action_group, accel_group); + gtk_ui_manager_insert_action_group (manager, action_group, 0); + window->toolbar_action_group = action_group; + g_object_unref (action_group); + + window->manager = manager; + gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); } static char * calculate_location (const char *typed_address, const char *address) { - const char *location; + const char *location; - /* If there's a typed address, use that over address. Never - * show URIs in the 'do_not_show_address' array. */ - location = typed_address ? typed_address : address; - location = ephy_embed_utils_is_no_show_address (location) ? NULL : location; + /* If there's a typed address, use that over address. Never + * show URIs in the 'do_not_show_address' array. */ + location = typed_address ? typed_address : address; + location = ephy_embed_utils_is_no_show_address (location) ? NULL : location; - return g_strdup (location); + return g_strdup (location); } static void _ephy_window_set_default_actions_sensitive (EphyWindow *window, - guint flags, - gboolean set) -{ - GtkActionGroup *action_group; - GtkAction *action; - int i; - const char *action_group_actions[] = { "FileSaveAs", "FileSaveAsApplication", "FilePrint", - "FileSendTo", "FileBookmarkPage", "EditFind", - "EditFindPrev", "EditFindNext", "ViewEncoding", - "ViewZoomIn", "ViewZoomOut", "ViewPageSource", - NULL }; - - action_group = window->action_group; - - /* Page menu */ - for (i = 0; action_group_actions[i] != NULL; i++) - { - action = gtk_action_group_get_action (action_group, - action_group_actions[i]); - ephy_action_change_sensitivity_flags (action, - flags, set); - } - - /* Page context popup */ - action = gtk_action_group_get_action (window->popups_action_group, - "ContextBookmarkPage"); - ephy_action_change_sensitivity_flags (action, - flags, set); - - /* Toolbar */ - action = gtk_action_group_get_action (window->toolbar_action_group, - "ViewCombinedStopReload"); - ephy_action_change_sensitivity_flags (action, - flags, set); + guint flags, + gboolean set) +{ + GtkActionGroup *action_group; + GtkAction *action; + int i; + const char *action_group_actions[] = { "FileSaveAs", "FileSaveAsApplication", "FilePrint", + "FileSendTo", "FileBookmarkPage", "EditFind", + "EditFindPrev", "EditFindNext", "ViewEncoding", + "ViewZoomIn", "ViewZoomOut", "ViewPageSource", + NULL }; + + action_group = window->action_group; + + /* Page menu */ + for (i = 0; action_group_actions[i] != NULL; i++) { + action = gtk_action_group_get_action (action_group, + action_group_actions[i]); + ephy_action_change_sensitivity_flags (action, + flags, set); + } + + /* Page context popup */ + action = gtk_action_group_get_action (window->popups_action_group, + "ContextBookmarkPage"); + ephy_action_change_sensitivity_flags (action, + flags, set); + + /* Toolbar */ + action = gtk_action_group_get_action (window->toolbar_action_group, + "ViewCombinedStopReload"); + ephy_action_change_sensitivity_flags (action, + flags, set); } static void sync_tab_address (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - const char *address; - const char *typed_address; - char *location; + const char *address; + const char *typed_address; + char *location; - if (window->closing) return; + if (window->closing) return; - address = ephy_web_view_get_display_address (view); - typed_address = ephy_web_view_get_typed_address (view); + address = ephy_web_view_get_display_address (view); + typed_address = ephy_web_view_get_typed_address (view); - _ephy_window_set_default_actions_sensitive (window, - SENS_FLAG_IS_BLANK, - ephy_web_view_is_overview (view)); + _ephy_window_set_default_actions_sensitive (window, + SENS_FLAG_IS_BLANK, + ephy_web_view_is_overview (view)); - location = calculate_location (typed_address, address); - ephy_window_set_location (window, location); - g_free (location); + location = calculate_location (typed_address, address); + ephy_window_set_location (window, location); + g_free (location); } static void sync_tab_zoom (WebKitWebView *web_view, GParamSpec *pspec, EphyWindow *window) { - GtkActionGroup *action_group; - GtkAction *action; - gboolean can_zoom_in = TRUE, can_zoom_out = TRUE, can_zoom_normal = FALSE; - double zoom; + GtkActionGroup *action_group; + GtkAction *action; + gboolean can_zoom_in = TRUE, can_zoom_out = TRUE, can_zoom_normal = FALSE; + double zoom; - if (window->closing) return; + if (window->closing) return; - zoom = webkit_web_view_get_zoom_level (web_view); + zoom = webkit_web_view_get_zoom_level (web_view); - if (zoom >= ZOOM_MAXIMAL) - { - can_zoom_in = FALSE; - } + if (zoom >= ZOOM_MAXIMAL) { + can_zoom_in = FALSE; + } - if (zoom <= ZOOM_MINIMAL) - { - can_zoom_out = FALSE; - } + if (zoom <= ZOOM_MINIMAL) { + can_zoom_out = FALSE; + } - if (zoom != 1.0) - { - can_zoom_normal = TRUE; - } + if (zoom != 1.0) { + can_zoom_normal = TRUE; + } - action_group = window->action_group; - action = gtk_action_group_get_action (action_group, "ViewZoomIn"); - gtk_action_set_sensitive (action, can_zoom_in); - action = gtk_action_group_get_action (action_group, "ViewZoomOut"); - gtk_action_set_sensitive (action, can_zoom_out); - action = gtk_action_group_get_action (action_group, "ViewZoomNormal"); - gtk_action_set_sensitive (action, can_zoom_normal); + action_group = window->action_group; + action = gtk_action_group_get_action (action_group, "ViewZoomIn"); + gtk_action_set_sensitive (action, can_zoom_in); + action = gtk_action_group_get_action (action_group, "ViewZoomOut"); + gtk_action_set_sensitive (action, can_zoom_out); + action = gtk_action_group_get_action (action_group, "ViewZoomNormal"); + gtk_action_set_sensitive (action, can_zoom_normal); } static void sync_tab_document_type (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - GtkActionGroup *action_group = window->action_group; - GtkAction *action; - EphyWebViewDocumentType type; - gboolean can_find, disable, is_image; + GtkActionGroup *action_group = window->action_group; + GtkAction *action; + EphyWebViewDocumentType type; + gboolean can_find, disable, is_image; - if (window->closing) return; + if (window->closing) return; - /* update zoom actions */ - sync_tab_zoom (WEBKIT_WEB_VIEW (view), NULL, window); + /* update zoom actions */ + sync_tab_zoom (WEBKIT_WEB_VIEW (view), NULL, window); - type = ephy_web_view_get_document_type (view); - can_find = (type != EPHY_WEB_VIEW_DOCUMENT_IMAGE); - is_image = type == EPHY_WEB_VIEW_DOCUMENT_IMAGE; - disable = (type != EPHY_WEB_VIEW_DOCUMENT_HTML); + type = ephy_web_view_get_document_type (view); + can_find = (type != EPHY_WEB_VIEW_DOCUMENT_IMAGE); + is_image = type == EPHY_WEB_VIEW_DOCUMENT_IMAGE; + disable = (type != EPHY_WEB_VIEW_DOCUMENT_HTML); - action = gtk_action_group_get_action (action_group, "ViewEncoding"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, disable); - action = gtk_action_group_get_action (action_group, "ViewPageSource"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, is_image); - action = gtk_action_group_get_action (action_group, "EditFind"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); - action = gtk_action_group_get_action (action_group, "EditFindNext"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); - action = gtk_action_group_get_action (action_group, "EditFindPrev"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); + action = gtk_action_group_get_action (action_group, "ViewEncoding"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, disable); + action = gtk_action_group_get_action (action_group, "ViewPageSource"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, is_image); + action = gtk_action_group_get_action (action_group, "EditFind"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); + action = gtk_action_group_get_action (action_group, "EditFindNext"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); + action = gtk_action_group_get_action (action_group, "EditFindPrev"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_DOCUMENT, !can_find); - if (!can_find) - { - ephy_find_toolbar_request_close (ephy_embed_get_find_toolbar (window->active_embed)); - } + if (!can_find) { + ephy_find_toolbar_request_close (ephy_embed_get_find_toolbar (window->active_embed)); + } } static void _ephy_window_action_set_favicon (EphyWindow *window, - GdkPixbuf *icon) + GdkPixbuf *icon) { - g_object_set (window->location_controller, "icon", icon, NULL); + g_object_set (window->location_controller, "icon", icon, NULL); } static void sync_tab_icon (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - GdkPixbuf *icon; + GdkPixbuf *icon; - if (window->closing) return; + if (window->closing) return; - icon = ephy_web_view_get_icon (view); + icon = ephy_web_view_get_icon (view); - _ephy_window_action_set_favicon (window, icon); + _ephy_window_action_set_favicon (window, icon); } static void -_ephy_window_set_navigation_flags (EphyWindow *window, - EphyWebViewNavigationFlags flags) +_ephy_window_set_navigation_flags (EphyWindow *window, + EphyWebViewNavigationFlags flags) { - GtkAction *action; + GtkAction *action; - action = gtk_action_group_get_action (window->toolbar_action_group, "NavigationBack"); - gtk_action_set_sensitive (action, flags & EPHY_WEB_VIEW_NAV_BACK); - action = gtk_action_group_get_action (window->toolbar_action_group, "NavigationForward"); - gtk_action_set_sensitive (action, flags & EPHY_WEB_VIEW_NAV_FORWARD); + action = gtk_action_group_get_action (window->toolbar_action_group, "NavigationBack"); + gtk_action_set_sensitive (action, flags & EPHY_WEB_VIEW_NAV_BACK); + action = gtk_action_group_get_action (window->toolbar_action_group, "NavigationForward"); + gtk_action_set_sensitive (action, flags & EPHY_WEB_VIEW_NAV_FORWARD); } static void sync_tab_navigation (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - if (window->closing) return; + if (window->closing) return; - _ephy_window_set_navigation_flags (window, - ephy_web_view_get_navigation_flags (view)); + _ephy_window_set_navigation_flags (window, + ephy_web_view_get_navigation_flags (view)); } static void sync_tab_is_blank (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - if (window->closing) return; + if (window->closing) return; - _ephy_window_set_default_actions_sensitive (window, - SENS_FLAG_IS_BLANK, - ephy_web_view_get_is_blank (view)); + _ephy_window_set_default_actions_sensitive (window, + SENS_FLAG_IS_BLANK, + ephy_web_view_get_is_blank (view)); } static void sync_tab_popup_windows (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - /* FIXME: show popup count somehow */ + /* FIXME: show popup count somehow */ } static void sync_tab_popups_allowed (EphyWebView *view, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - GtkAction *action; - gboolean allow; + GtkAction *action; + gboolean allow; - g_return_if_fail (EPHY_IS_WEB_VIEW (view)); - g_return_if_fail (EPHY_IS_WINDOW (window)); + g_return_if_fail (EPHY_IS_WEB_VIEW (view)); + g_return_if_fail (EPHY_IS_WINDOW (window)); - action = gtk_action_group_get_action (window->action_group, - "ViewPopupWindows"); - g_return_if_fail (GTK_IS_ACTION (action)); + action = gtk_action_group_get_action (window->action_group, + "ViewPopupWindows"); + g_return_if_fail (GTK_IS_ACTION (action)); - g_object_get (view, "popups-allowed", &allow, NULL); + g_object_get (view, "popups-allowed", &allow, NULL); - g_signal_handlers_block_by_func - (G_OBJECT (action), - G_CALLBACK (ephy_window_view_popup_windows_cb), - window); + g_signal_handlers_block_by_func + (G_OBJECT (action), + G_CALLBACK (ephy_window_view_popup_windows_cb), + window); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), allow); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), allow); - g_signal_handlers_unblock_by_func - (G_OBJECT (action), - G_CALLBACK (ephy_window_view_popup_windows_cb), - window); + g_signal_handlers_unblock_by_func + (G_OBJECT (action), + G_CALLBACK (ephy_window_view_popup_windows_cb), + window); } static void -sync_tab_title (EphyEmbed *embed, - GParamSpec *pspec, - EphyWindow *window) +sync_tab_title (EphyEmbed *embed, + GParamSpec *pspec, + EphyWindow *window) { - if (window->closing) return; + if (window->closing) return; - gtk_window_set_title (GTK_WINDOW(window), - ephy_embed_get_title (embed)); + gtk_window_set_title (GTK_WINDOW (window), + ephy_embed_get_title (embed)); } static gboolean idle_unref_context_event (EphyWindow *window) { - LOG ("Idle unreffing context event %p", window->context_event); + LOG ("Idle unreffing context event %p", window->context_event); - if (window->context_event != NULL) - { - g_object_unref (window->context_event); - window->context_event = NULL; - } + if (window->context_event != NULL) { + g_object_unref (window->context_event); + window->context_event = NULL; + } - window->idle_worker = 0; - return FALSE; + window->idle_worker = 0; + return FALSE; } static void -_ephy_window_set_context_event (EphyWindow *window, - EphyEmbedEvent *event) +_ephy_window_set_context_event (EphyWindow *window, + EphyEmbedEvent *event) { - if (window->idle_worker != 0) - { - g_source_remove (window->idle_worker); - window->idle_worker = 0; - } + if (window->idle_worker != 0) { + g_source_remove (window->idle_worker); + window->idle_worker = 0; + } - if (window->context_event != NULL) - { - g_object_unref (window->context_event); - } + if (window->context_event != NULL) { + g_object_unref (window->context_event); + } - window->context_event = event != NULL ? g_object_ref (event) : NULL; + window->context_event = event != NULL ? g_object_ref (event) : NULL; } static void _ephy_window_unset_context_event (EphyWindow *window) { - /* Unref the event from idle since we still need it - * from the action callbacks which will run before idle. - */ - if (window->idle_worker == 0 && window->context_event != NULL) - { - window->idle_worker = - g_idle_add ((GSourceFunc) idle_unref_context_event, window); - } + /* Unref the event from idle since we still need it + * from the action callbacks which will run before idle. + */ + if (window->idle_worker == 0 && window->context_event != NULL) { + window->idle_worker = + g_idle_add ((GSourceFunc)idle_unref_context_event, window); + } } static void context_menu_dismissed_cb (WebKitWebView *webView, - EphyWindow *window) + EphyWindow *window) { - LOG ("Deactivating popup menu"); + LOG ("Deactivating popup menu"); - enable_edit_actions_sensitivity (window); + enable_edit_actions_sensitivity (window); - g_signal_handlers_disconnect_by_func - (webView, G_CALLBACK (context_menu_dismissed_cb), window); + g_signal_handlers_disconnect_by_func + (webView, G_CALLBACK (context_menu_dismissed_cb), window); - _ephy_window_unset_context_event (window); + _ephy_window_unset_context_event (window); } static void add_action_to_context_menu (WebKitContextMenu *context_menu, - GtkActionGroup *action_group, - const char *action_name) + GtkActionGroup *action_group, + const char *action_name) { - GtkAction *action; + GtkAction *action; - action = gtk_action_group_get_action (action_group, action_name); - webkit_context_menu_append (context_menu, webkit_context_menu_item_new (action)); + action = gtk_action_group_get_action (action_group, action_name); + webkit_context_menu_append (context_menu, webkit_context_menu_item_new (action)); } static void -add_item_to_context_menu (WebKitContextMenu *context_menu, - WebKitContextMenuItem *item) +add_item_to_context_menu (WebKitContextMenu *context_menu, + WebKitContextMenuItem *item) { - if (!item) - return; + if (!item) + return; - webkit_context_menu_append (context_menu, item); - g_object_unref (item); + webkit_context_menu_append (context_menu, item); + g_object_unref (item); } /* FIXME: Add webkit_context_menu_find() ? */ static WebKitContextMenuItem * -find_item_in_context_menu (WebKitContextMenu *context_menu, - WebKitContextMenuAction action) +find_item_in_context_menu (WebKitContextMenu *context_menu, + WebKitContextMenuAction action) { - GList *items, *iter; + GList *items, *iter; - items = webkit_context_menu_get_items (context_menu); - for (iter = items; iter; iter = g_list_next (iter)) - { - WebKitContextMenuItem *item = (WebKitContextMenuItem *)iter->data; + items = webkit_context_menu_get_items (context_menu); + for (iter = items; iter; iter = g_list_next (iter)) { + WebKitContextMenuItem *item = (WebKitContextMenuItem *)iter->data; - if (webkit_context_menu_item_get_stock_action (item) == action) - return g_object_ref (item); - } + if (webkit_context_menu_item_get_stock_action (item) == action) + return g_object_ref (item); + } - return NULL; + return NULL; } static GList * find_spelling_guess_context_menu_items (WebKitContextMenu *context_menu) { - GList *items, *iter; - guint i; - GList *retval = NULL; + GList *items, *iter; + guint i; + GList *retval = NULL; - items = webkit_context_menu_get_items (context_menu); - for (iter = items, i = 0; iter && i < MAX_SPELL_CHECK_GUESSES; iter = g_list_next (iter), i++) - { - WebKitContextMenuItem *item = (WebKitContextMenuItem *)iter->data; + items = webkit_context_menu_get_items (context_menu); + for (iter = items, i = 0; iter && i < MAX_SPELL_CHECK_GUESSES; iter = g_list_next (iter), i++) { + WebKitContextMenuItem *item = (WebKitContextMenuItem *)iter->data; - if (webkit_context_menu_item_get_stock_action (item) == WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS) - { - retval = g_list_prepend (retval, g_object_ref (item)); - } - else - { - /* Spelling guesses are always at the beginning of the context menu, so - * we can break the loop as soon as we find the first item that is not - * spelling guess. - */ - break; - } - } + if (webkit_context_menu_item_get_stock_action (item) == WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS) { + retval = g_list_prepend (retval, g_object_ref (item)); + } else { + /* Spelling guesses are always at the beginning of the context menu, so + * we can break the loop as soon as we find the first item that is not + * spelling guess. + */ + break; + } + } - return g_list_reverse (retval); + return g_list_reverse (retval); } static char * ellipsize_string (const char *string, - glong max_length) + glong max_length) { - char *ellipsized; - glong length = g_utf8_strlen (string, -1); + char *ellipsized; + glong length = g_utf8_strlen (string, -1); - if (length == 0) - return NULL; + if (length == 0) + return NULL; - if (length < max_length) - { - ellipsized = g_strdup (string); - } - else - { - char *str = g_utf8_substring (string, 0, max_length); - ellipsized = g_strconcat (str, "…", NULL); - g_free (str); - } - return ellipsized; + if (length < max_length) { + ellipsized = g_strdup (string); + } else { + char *str = g_utf8_substring (string, 0, max_length); + ellipsized = g_strconcat (str, "…", NULL); + g_free (str); + } + return ellipsized; } static void parse_context_menu_user_data (WebKitContextMenu *context_menu, - const char** selected_text) + const char **selected_text) { - GVariantDict dict; + GVariantDict dict; - g_variant_dict_init (&dict, webkit_context_menu_get_user_data (context_menu)); - g_variant_dict_lookup (&dict, "SelectedText", "&s", selected_text); + g_variant_dict_init (&dict, webkit_context_menu_get_user_data (context_menu)); + g_variant_dict_lookup (&dict, "SelectedText", "&s", selected_text); } static gboolean -populate_context_menu (WebKitWebView *web_view, - WebKitContextMenu *context_menu, - GdkEvent *event, - WebKitHitTestResult *hit_test_result, - EphyWindow *window) -{ - WebKitContextMenuItem *input_methods_item = NULL; - WebKitContextMenuItem *unicode_item = NULL; - WebKitContextMenuItem *play_pause_item = NULL; - WebKitContextMenuItem *mute_item = NULL; - WebKitContextMenuItem *toggle_controls_item = NULL; - WebKitContextMenuItem *toggle_loop_item = NULL; - WebKitContextMenuItem *fullscreen_item = NULL; - GList *spelling_guess_items = NULL; - EphyEmbedEvent *embed_event; - gboolean is_document = FALSE; - gboolean app_mode, incognito_mode; - gboolean is_image; - gboolean is_media = FALSE; - gboolean is_video = FALSE; - gboolean is_audio = FALSE; - gboolean can_search_selection = FALSE; - const char *selected_text = NULL; - - is_image = webkit_hit_test_result_context_is_image (hit_test_result); - - if (webkit_hit_test_result_context_is_editable (hit_test_result)) { - input_methods_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS); - unicode_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_UNICODE); - spelling_guess_items = find_spelling_guess_context_menu_items (context_menu); - } - - if (webkit_hit_test_result_context_is_media (hit_test_result)) - { - WebKitContextMenuItem *item; - - is_media = TRUE; - play_pause_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY); - if (!play_pause_item) - play_pause_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PAUSE); - mute_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE); - toggle_controls_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS); - toggle_loop_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_LOOP); - fullscreen_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN); - - item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_COPY_VIDEO_LINK_TO_CLIPBOARD); - if (item) - { - is_video = TRUE; - g_object_unref (item); - } - else - { - item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_COPY_AUDIO_LINK_TO_CLIPBOARD); - if (item) - { - is_audio = TRUE; - g_object_unref (item); - } - } - } - - parse_context_menu_user_data (context_menu, &selected_text); - if (selected_text) - { - char* ellipsized = ellipsize_string (selected_text, 32); - if (ellipsized) - { - char* label; - GtkAction *action; - - can_search_selection = TRUE; - action = gtk_action_group_get_action (window->popups_action_group, - "SearchSelection"); - label = g_strdup_printf (_("Search the Web for '%s'"), ellipsized); - gtk_action_set_label (action, label); - g_object_set_data_full (G_OBJECT (action), "selection", g_strdup (selected_text), - (GDestroyNotify)g_free); - g_free (ellipsized); - g_free (label); - can_search_selection = TRUE; - } - } - - webkit_context_menu_remove_all (context_menu); - - embed_event = ephy_embed_event_new ((GdkEventButton *)event, hit_test_result); - _ephy_window_set_context_event (window, embed_event); - g_object_unref (embed_event); - - app_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION; - incognito_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_INCOGNITO; - - update_edit_actions_sensitivity (window, FALSE); - - if (webkit_hit_test_result_context_is_link (hit_test_result)) - { - const char *uri; - gboolean link_has_web_scheme; - - uri = webkit_hit_test_result_get_link_uri (hit_test_result); - link_has_web_scheme = ephy_embed_utils_address_has_web_scheme (uri); - - update_edit_actions_sensitivity (window, TRUE); - update_link_actions_sensitivity (window, link_has_web_scheme); - - if (!app_mode) - { - add_action_to_context_menu (context_menu, - window->popups_action_group, "OpenLinkInNewTab"); - add_action_to_context_menu (context_menu, - window->popups_action_group, "OpenLinkInNewWindow"); - if (!incognito_mode) - add_action_to_context_menu (context_menu, - window->popups_action_group, "OpenLinkInIncognitoWindow"); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - } - add_action_to_context_menu (context_menu, - window->action_group, "EditCopy"); - if (can_search_selection) - add_action_to_context_menu (context_menu, - window->popups_action_group, "SearchSelection"); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->popups_action_group, "DownloadLinkAs"); - - if (g_str_has_prefix (uri, "mailto:")) - { - add_action_to_context_menu (context_menu, - window->popups_action_group, "CopyEmailAddress"); - } - else - { - add_action_to_context_menu (context_menu, - window->popups_action_group, "CopyLinkAddress"); - } - } - else if (webkit_hit_test_result_context_is_editable (hit_test_result)) - { - GList *l; - gboolean has_guesses = FALSE; - - for (l = spelling_guess_items; l; l = g_list_next (l)) - { - WebKitContextMenuItem *item = WEBKIT_CONTEXT_MENU_ITEM (l->data); - - webkit_context_menu_append (context_menu, item); - g_object_unref (item); - has_guesses = TRUE; - } - g_list_free (spelling_guess_items); - - if (has_guesses) - { - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - } - - update_edit_actions_sensitivity (window, FALSE); - - add_action_to_context_menu (context_menu, - window->action_group, "EditUndo"); - add_action_to_context_menu (context_menu, - window->action_group, "EditRedo"); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->action_group, "EditCut"); - add_action_to_context_menu (context_menu, - window->action_group, "EditCopy"); - add_action_to_context_menu (context_menu, - window->action_group, "EditPaste"); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->action_group, "EditSelectAll"); - if (input_methods_item || unicode_item) - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_item_to_context_menu (context_menu, input_methods_item); - add_item_to_context_menu (context_menu, unicode_item); - } - else - { - is_document = TRUE; - - update_edit_actions_sensitivity (window, TRUE); - - if (!is_image && !is_media) - { - add_action_to_context_menu (context_menu, - window->toolbar_action_group, "NavigationBack"); - add_action_to_context_menu (context_menu, - window->toolbar_action_group, "NavigationForward"); - add_action_to_context_menu (context_menu, - window->action_group, "ViewReload"); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - } - - add_action_to_context_menu (context_menu, - window->action_group, "EditCopy"); - if (can_search_selection) - add_action_to_context_menu (context_menu, - window->popups_action_group, "SearchSelection"); - - if (!app_mode && !is_image && !is_media) - { - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->popups_action_group, "ContextBookmarkPage"); - } - } - - if (is_image) - { - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->popups_action_group, "SaveImageAs"); - add_action_to_context_menu (context_menu, - window->popups_action_group, "CopyImageLocation"); - add_action_to_context_menu (context_menu, - window->popups_action_group, "ViewImage"); - add_action_to_context_menu (context_menu, - window->popups_action_group, "SetImageAsBackground"); - } - - if (is_media) - { - add_item_to_context_menu (context_menu, play_pause_item); - add_item_to_context_menu (context_menu, mute_item); - add_item_to_context_menu (context_menu, toggle_controls_item); - add_item_to_context_menu (context_menu, toggle_loop_item); - add_item_to_context_menu (context_menu, fullscreen_item); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - if (is_video) - { - add_action_to_context_menu (context_menu, window->popups_action_group, - "OpenVideoInNewWindow"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "OpenVideoInNewTab"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "SaveVideoAs"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "CopyVideoLocation"); - } - else if (is_audio) - { - add_action_to_context_menu (context_menu, window->popups_action_group, - "OpenAudioInNewWindow"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "OpenAudioInNewTab"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "SaveAudioAs"); - add_action_to_context_menu (context_menu, window->popups_action_group, - "CopyAudioLocation"); - } - } - - g_signal_connect (web_view, "context-menu-dismissed", - G_CALLBACK (context_menu_dismissed_cb), - window); - - if (app_mode) - return FALSE; - - if (is_document && !is_image && !is_media) - { - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - add_action_to_context_menu (context_menu, - window->action_group, "FileSendTo"); - } - - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_separator ()); - webkit_context_menu_append (context_menu, - webkit_context_menu_item_new_from_stock_action (WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT)); - - return FALSE; +populate_context_menu (WebKitWebView *web_view, + WebKitContextMenu *context_menu, + GdkEvent *event, + WebKitHitTestResult *hit_test_result, + EphyWindow *window) +{ + WebKitContextMenuItem *input_methods_item = NULL; + WebKitContextMenuItem *unicode_item = NULL; + WebKitContextMenuItem *play_pause_item = NULL; + WebKitContextMenuItem *mute_item = NULL; + WebKitContextMenuItem *toggle_controls_item = NULL; + WebKitContextMenuItem *toggle_loop_item = NULL; + WebKitContextMenuItem *fullscreen_item = NULL; + GList *spelling_guess_items = NULL; + EphyEmbedEvent *embed_event; + gboolean is_document = FALSE; + gboolean app_mode, incognito_mode; + gboolean is_image; + gboolean is_media = FALSE; + gboolean is_video = FALSE; + gboolean is_audio = FALSE; + gboolean can_search_selection = FALSE; + const char *selected_text = NULL; + + is_image = webkit_hit_test_result_context_is_image (hit_test_result); + + if (webkit_hit_test_result_context_is_editable (hit_test_result)) { + input_methods_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS); + unicode_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_UNICODE); + spelling_guess_items = find_spelling_guess_context_menu_items (context_menu); + } + + if (webkit_hit_test_result_context_is_media (hit_test_result)) { + WebKitContextMenuItem *item; + + is_media = TRUE; + play_pause_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY); + if (!play_pause_item) + play_pause_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PAUSE); + mute_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_MEDIA_MUTE); + toggle_controls_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_CONTROLS); + toggle_loop_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_TOGGLE_MEDIA_LOOP); + fullscreen_item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_ENTER_VIDEO_FULLSCREEN); + + item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_COPY_VIDEO_LINK_TO_CLIPBOARD); + if (item) { + is_video = TRUE; + g_object_unref (item); + } else { + item = find_item_in_context_menu (context_menu, WEBKIT_CONTEXT_MENU_ACTION_COPY_AUDIO_LINK_TO_CLIPBOARD); + if (item) { + is_audio = TRUE; + g_object_unref (item); + } + } + } + + parse_context_menu_user_data (context_menu, &selected_text); + if (selected_text) { + char *ellipsized = ellipsize_string (selected_text, 32); + if (ellipsized) { + char *label; + GtkAction *action; + + can_search_selection = TRUE; + action = gtk_action_group_get_action (window->popups_action_group, + "SearchSelection"); + label = g_strdup_printf (_("Search the Web for '%s'"), ellipsized); + gtk_action_set_label (action, label); + g_object_set_data_full (G_OBJECT (action), "selection", g_strdup (selected_text), + (GDestroyNotify)g_free); + g_free (ellipsized); + g_free (label); + can_search_selection = TRUE; + } + } + + webkit_context_menu_remove_all (context_menu); + + embed_event = ephy_embed_event_new ((GdkEventButton *)event, hit_test_result); + _ephy_window_set_context_event (window, embed_event); + g_object_unref (embed_event); + + app_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION; + incognito_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_INCOGNITO; + + update_edit_actions_sensitivity (window, FALSE); + + if (webkit_hit_test_result_context_is_link (hit_test_result)) { + const char *uri; + gboolean link_has_web_scheme; + + uri = webkit_hit_test_result_get_link_uri (hit_test_result); + link_has_web_scheme = ephy_embed_utils_address_has_web_scheme (uri); + + update_edit_actions_sensitivity (window, TRUE); + update_link_actions_sensitivity (window, link_has_web_scheme); + + if (!app_mode) { + add_action_to_context_menu (context_menu, + window->popups_action_group, "OpenLinkInNewTab"); + add_action_to_context_menu (context_menu, + window->popups_action_group, "OpenLinkInNewWindow"); + if (!incognito_mode) + add_action_to_context_menu (context_menu, + window->popups_action_group, "OpenLinkInIncognitoWindow"); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + } + add_action_to_context_menu (context_menu, + window->action_group, "EditCopy"); + if (can_search_selection) + add_action_to_context_menu (context_menu, + window->popups_action_group, "SearchSelection"); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->popups_action_group, "DownloadLinkAs"); + + if (g_str_has_prefix (uri, "mailto:")) { + add_action_to_context_menu (context_menu, + window->popups_action_group, "CopyEmailAddress"); + } else { + add_action_to_context_menu (context_menu, + window->popups_action_group, "CopyLinkAddress"); + } + } else if (webkit_hit_test_result_context_is_editable (hit_test_result)) { + GList *l; + gboolean has_guesses = FALSE; + + for (l = spelling_guess_items; l; l = g_list_next (l)) { + WebKitContextMenuItem *item = WEBKIT_CONTEXT_MENU_ITEM (l->data); + + webkit_context_menu_append (context_menu, item); + g_object_unref (item); + has_guesses = TRUE; + } + g_list_free (spelling_guess_items); + + if (has_guesses) { + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + } + + update_edit_actions_sensitivity (window, FALSE); + + add_action_to_context_menu (context_menu, + window->action_group, "EditUndo"); + add_action_to_context_menu (context_menu, + window->action_group, "EditRedo"); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->action_group, "EditCut"); + add_action_to_context_menu (context_menu, + window->action_group, "EditCopy"); + add_action_to_context_menu (context_menu, + window->action_group, "EditPaste"); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->action_group, "EditSelectAll"); + if (input_methods_item || unicode_item) + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_item_to_context_menu (context_menu, input_methods_item); + add_item_to_context_menu (context_menu, unicode_item); + } else { + is_document = TRUE; + + update_edit_actions_sensitivity (window, TRUE); + + if (!is_image && !is_media) { + add_action_to_context_menu (context_menu, + window->toolbar_action_group, "NavigationBack"); + add_action_to_context_menu (context_menu, + window->toolbar_action_group, "NavigationForward"); + add_action_to_context_menu (context_menu, + window->action_group, "ViewReload"); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + } + + add_action_to_context_menu (context_menu, + window->action_group, "EditCopy"); + if (can_search_selection) + add_action_to_context_menu (context_menu, + window->popups_action_group, "SearchSelection"); + + if (!app_mode && !is_image && !is_media) { + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->popups_action_group, "ContextBookmarkPage"); + } + } + + if (is_image) { + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->popups_action_group, "SaveImageAs"); + add_action_to_context_menu (context_menu, + window->popups_action_group, "CopyImageLocation"); + add_action_to_context_menu (context_menu, + window->popups_action_group, "ViewImage"); + add_action_to_context_menu (context_menu, + window->popups_action_group, "SetImageAsBackground"); + } + + if (is_media) { + add_item_to_context_menu (context_menu, play_pause_item); + add_item_to_context_menu (context_menu, mute_item); + add_item_to_context_menu (context_menu, toggle_controls_item); + add_item_to_context_menu (context_menu, toggle_loop_item); + add_item_to_context_menu (context_menu, fullscreen_item); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + if (is_video) { + add_action_to_context_menu (context_menu, window->popups_action_group, + "OpenVideoInNewWindow"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "OpenVideoInNewTab"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "SaveVideoAs"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "CopyVideoLocation"); + } else if (is_audio) { + add_action_to_context_menu (context_menu, window->popups_action_group, + "OpenAudioInNewWindow"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "OpenAudioInNewTab"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "SaveAudioAs"); + add_action_to_context_menu (context_menu, window->popups_action_group, + "CopyAudioLocation"); + } + } + + g_signal_connect (web_view, "context-menu-dismissed", + G_CALLBACK (context_menu_dismissed_cb), + window); + + if (app_mode) + return FALSE; + + if (is_document && !is_image && !is_media) { + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + add_action_to_context_menu (context_menu, + window->action_group, "FileSendTo"); + } + + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_separator ()); + webkit_context_menu_append (context_menu, + webkit_context_menu_item_new_from_stock_action (WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT)); + + return FALSE; } static gboolean -save_target_uri (EphyWindow *window, - WebKitWebView *view, - GdkEventButton *event, - WebKitHitTestResult *hit_test_result) -{ - guint context; - char *location = NULL; - gboolean retval = FALSE; - - g_object_get (hit_test_result, "context", &context, NULL); - - LOG ("ephy_window_dom_mouse_click_cb: button %d, context %d, modifier %d (%d:%d)", - event->button, context, event->state, (int)event->x, (int)event->y); - - /* shift+click saves the link target */ - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) - { - g_object_get (G_OBJECT (hit_test_result), "link-uri", &location, NULL); - } - /* Note: pressing enter to submit a form synthesizes a mouse - * click event - */ - /* shift+click saves the non-link image */ - else if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE && - !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) - { - g_object_get (G_OBJECT (hit_test_result), "image-uri", &location, NULL); - } - - if (location) - { - LOG ("Location: %s", location); - - retval = ephy_embed_utils_address_has_web_scheme (location); - if (retval) - { - EphyDownload *download; - - download = ephy_download_new_for_uri (location); - ephy_download_set_action (download, EPHY_DOWNLOAD_ACTION_OPEN); - ephy_downloads_manager_add_download (ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())), - download); - g_object_unref (download); - } - - g_free (location); - } - - return retval; +save_target_uri (EphyWindow *window, + WebKitWebView *view, + GdkEventButton *event, + WebKitHitTestResult *hit_test_result) +{ + guint context; + char *location = NULL; + gboolean retval = FALSE; + + g_object_get (hit_test_result, "context", &context, NULL); + + LOG ("ephy_window_dom_mouse_click_cb: button %d, context %d, modifier %d (%d:%d)", + event->button, context, event->state, (int)event->x, (int)event->y); + + /* shift+click saves the link target */ + if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { + g_object_get (G_OBJECT (hit_test_result), "link-uri", &location, NULL); + } + /* Note: pressing enter to submit a form synthesizes a mouse + * click event + */ + /* shift+click saves the non-link image */ + else if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE && + !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) { + g_object_get (G_OBJECT (hit_test_result), "image-uri", &location, NULL); + } + + if (location) { + LOG ("Location: %s", location); + + retval = ephy_embed_utils_address_has_web_scheme (location); + if (retval) { + EphyDownload *download; + + download = ephy_download_new_for_uri (location); + ephy_download_set_action (download, EPHY_DOWNLOAD_ACTION_OPEN); + ephy_downloads_manager_add_download (ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())), + download); + g_object_unref (download); + } + + g_free (location); + } + + return retval; } static gboolean -ephy_window_dom_mouse_click_cb (WebKitWebView *view, - GdkEventButton *event, - EphyWindow *window) +ephy_window_dom_mouse_click_cb (WebKitWebView *view, + GdkEventButton *event, + EphyWindow *window) { - WebKitHitTestResult *hit_test_result; - gboolean handled = FALSE; + WebKitHitTestResult *hit_test_result; + gboolean handled = FALSE; - /* Since we're only dealing with shift+click, we can do these - checks early. */ - if (!(event->state & GDK_SHIFT_MASK) || event->button != GDK_BUTTON_PRIMARY) - { - return FALSE; - } + /* Since we're only dealing with shift+click, we can do these + checks early. */ + if (!(event->state & GDK_SHIFT_MASK) || event->button != GDK_BUTTON_PRIMARY) { + return FALSE; + } - hit_test_result = g_object_ref (window->hit_test_result); - handled = save_target_uri (window, view, event, hit_test_result); - g_object_unref (hit_test_result); + hit_test_result = g_object_ref (window->hit_test_result); + handled = save_target_uri (window, view, event, hit_test_result); + g_object_unref (hit_test_result); - return handled; + return handled; } static void -ephy_window_mouse_target_changed_cb (WebKitWebView *web_view, - WebKitHitTestResult *hit_test_result, - guint modifiers, - EphyWindow *window) +ephy_window_mouse_target_changed_cb (WebKitWebView *web_view, + WebKitHitTestResult *hit_test_result, + guint modifiers, + EphyWindow *window) { - if (window->hit_test_result) - g_object_unref (window->hit_test_result); - window->hit_test_result = g_object_ref (hit_test_result); + if (window->hit_test_result) + g_object_unref (window->hit_test_result); + window->hit_test_result = g_object_ref (hit_test_result); } static void ephy_window_set_is_popup (EphyWindow *window, - gboolean is_popup) + gboolean is_popup) { - window->is_popup = is_popup; + window->is_popup = is_popup; - g_object_notify (G_OBJECT (window), "is-popup"); + g_object_notify (G_OBJECT (window), "is-popup"); } static void window_properties_geometry_changed (WebKitWindowProperties *properties, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - GdkRectangle geometry; + GdkRectangle geometry; - webkit_window_properties_get_geometry (properties, &geometry); - if (geometry.x >= 0 && geometry.y >= 0) - gtk_window_move (GTK_WINDOW (window), geometry.x, geometry.y); - if (geometry.width > 0 && geometry.height > 0) - gtk_window_resize (GTK_WINDOW (window), geometry.width, geometry.height); + webkit_window_properties_get_geometry (properties, &geometry); + if (geometry.x >= 0 && geometry.y >= 0) + gtk_window_move (GTK_WINDOW (window), geometry.x, geometry.y); + if (geometry.width > 0 && geometry.height > 0) + gtk_window_resize (GTK_WINDOW (window), geometry.width, geometry.height); } static void -ephy_window_configure_for_view (EphyWindow *window, - WebKitWebView *web_view) +ephy_window_configure_for_view (EphyWindow *window, + WebKitWebView *web_view) { - WebKitWindowProperties *properties; - GdkRectangle geometry; - EphyWindowChrome chrome = 0; + WebKitWindowProperties *properties; + GdkRectangle geometry; + EphyWindowChrome chrome = 0; - properties = webkit_web_view_get_window_properties (web_view); + properties = webkit_web_view_get_window_properties (web_view); - if (webkit_window_properties_get_toolbar_visible (properties)) - chrome |= EPHY_WINDOW_CHROME_TOOLBAR; + if (webkit_window_properties_get_toolbar_visible (properties)) + chrome |= EPHY_WINDOW_CHROME_TOOLBAR; - if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) != EPHY_EMBED_SHELL_MODE_APPLICATION) - { - GtkWidget *entry; + if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) != EPHY_EMBED_SHELL_MODE_APPLICATION) { + GtkWidget *entry; - entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); - gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE); + entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); + gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE); - if (webkit_window_properties_get_menubar_visible (properties)) - chrome |= EPHY_WINDOW_CHROME_MENU; - if (webkit_window_properties_get_locationbar_visible (properties)) - chrome |= EPHY_WINDOW_CHROME_LOCATION; - } + if (webkit_window_properties_get_menubar_visible (properties)) + chrome |= EPHY_WINDOW_CHROME_MENU; + if (webkit_window_properties_get_locationbar_visible (properties)) + chrome |= EPHY_WINDOW_CHROME_LOCATION; + } - webkit_window_properties_get_geometry (properties, &geometry); - if (geometry.width > 0 && geometry.height > 0) - gtk_window_set_default_size (GTK_WINDOW (window), geometry.width, geometry.height); + webkit_window_properties_get_geometry (properties, &geometry); + if (geometry.width > 0 && geometry.height > 0) + gtk_window_set_default_size (GTK_WINDOW (window), geometry.width, geometry.height); - if (!webkit_window_properties_get_resizable (properties)) - gtk_window_set_resizable (GTK_WINDOW (window), FALSE); + if (!webkit_window_properties_get_resizable (properties)) + gtk_window_set_resizable (GTK_WINDOW (window), FALSE); - window->is_popup = TRUE; - ephy_window_set_chrome (window, chrome); - g_signal_connect (properties, "notify::geometry", - G_CALLBACK (window_properties_geometry_changed), - window); + window->is_popup = TRUE; + ephy_window_set_chrome (window, chrome); + g_signal_connect (properties, "notify::geometry", + G_CALLBACK (window_properties_geometry_changed), + window); } static gboolean web_view_ready_cb (WebKitWebView *web_view, - WebKitWebView *parent_web_view) + WebKitWebView *parent_web_view) { - EphyWindow *window, *parent_view_window; - gboolean using_new_window; + EphyWindow *window, *parent_view_window; + gboolean using_new_window; - window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (web_view))); - parent_view_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent_web_view))); + window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (web_view))); + parent_view_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent_web_view))); - using_new_window = window != parent_view_window; + using_new_window = window != parent_view_window; - if (using_new_window) - { - ephy_window_configure_for_view (window, web_view); - g_signal_emit_by_name (parent_web_view, "new-window", web_view); - } + if (using_new_window) { + ephy_window_configure_for_view (window, web_view); + g_signal_emit_by_name (parent_web_view, "new-window", web_view); + } - if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION && - !webkit_web_view_get_uri(web_view)) - { - /* Wait until we have a valid URL to decide whether to show the window - * or load the URL in the default web browser - */ - g_object_set_data_full (G_OBJECT (window), "referrer", - g_strdup (webkit_web_view_get_uri (parent_web_view)), - g_free); - return TRUE; - } + if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION && + !webkit_web_view_get_uri (web_view)) { + /* Wait until we have a valid URL to decide whether to show the window + * or load the URL in the default web browser + */ + g_object_set_data_full (G_OBJECT (window), "referrer", + g_strdup (webkit_web_view_get_uri (parent_web_view)), + g_free); + return TRUE; + } - gtk_widget_show (GTK_WIDGET (window)); + gtk_widget_show (GTK_WIDGET (window)); - return TRUE; + return TRUE; } static WebKitWebView * -create_web_view_cb (WebKitWebView *web_view, - WebKitNavigationAction *navigation_action, - EphyWindow *window) -{ - EphyEmbed *embed; - WebKitWebView *new_web_view; - EphyNewTabFlags flags; - EphyWindow *target_window; - - if ((ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) != EPHY_EMBED_SHELL_MODE_APPLICATION) && - (g_settings_get_boolean (EPHY_SETTINGS_MAIN, - EPHY_PREFS_NEW_WINDOWS_IN_TABS) || - g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, - EPHY_PREFS_LOCKDOWN_FULLSCREEN))) - { - target_window = window; - flags = EPHY_NEW_TAB_JUMP | - EPHY_NEW_TAB_APPEND_AFTER; - } - else - { - target_window = ephy_window_new (); - flags = EPHY_NEW_TAB_DONT_SHOW_WINDOW; - } - - embed = ephy_shell_new_tab_full (ephy_shell_get_default (), - NULL, - web_view, - target_window, - EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view), - flags, - 0); - if (target_window == window) - gtk_widget_grab_focus (GTK_WIDGET (embed)); - - new_web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); - g_signal_connect (new_web_view, "ready-to-show", - G_CALLBACK (web_view_ready_cb), - web_view); - - return new_web_view; +create_web_view_cb (WebKitWebView *web_view, + WebKitNavigationAction *navigation_action, + EphyWindow *window) +{ + EphyEmbed *embed; + WebKitWebView *new_web_view; + EphyNewTabFlags flags; + EphyWindow *target_window; + + if ((ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) != EPHY_EMBED_SHELL_MODE_APPLICATION) && + (g_settings_get_boolean (EPHY_SETTINGS_MAIN, + EPHY_PREFS_NEW_WINDOWS_IN_TABS) || + g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, + EPHY_PREFS_LOCKDOWN_FULLSCREEN))) { + target_window = window; + flags = EPHY_NEW_TAB_JUMP | + EPHY_NEW_TAB_APPEND_AFTER; + } else { + target_window = ephy_window_new (); + flags = EPHY_NEW_TAB_DONT_SHOW_WINDOW; + } + + embed = ephy_shell_new_tab_full (ephy_shell_get_default (), + NULL, + web_view, + target_window, + EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view), + flags, + 0); + if (target_window == window) + gtk_widget_grab_focus (GTK_WIDGET (embed)); + + new_web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); + g_signal_connect (new_web_view, "ready-to-show", + G_CALLBACK (web_view_ready_cb), + web_view); + + return new_web_view; } static gboolean -decide_policy_cb (WebKitWebView *web_view, - WebKitPolicyDecision *decision, - WebKitPolicyDecisionType decision_type, - EphyWindow *window) -{ - WebKitNavigationPolicyDecision *navigation_decision; - WebKitNavigationAction *navigation_action; - WebKitNavigationType navigation_type; - WebKitURIRequest *request; - const char *uri; - EphyEmbed *embed; - - if (decision_type == WEBKIT_POLICY_DECISION_TYPE_RESPONSE) - return FALSE; - - navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); - navigation_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); - request = webkit_navigation_action_get_request (navigation_action); - uri = webkit_uri_request_get_uri (request); - - if (!ephy_embed_utils_address_has_web_scheme (uri)) - { - GError *error = NULL; - GdkScreen *screen; - - screen = gtk_widget_get_screen (GTK_WIDGET (web_view)); - gtk_show_uri (screen, uri, GDK_CURRENT_TIME, &error); - - if (error) - { - LOG ("failed to handle non web scheme: %s", error->message); - g_error_free (error); - - return FALSE; - } - - webkit_policy_decision_ignore (decision); - - return TRUE; - } - - if (decision_type == WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION) - { - const char *frame_name = webkit_navigation_policy_decision_get_frame_name (navigation_decision); - - if (g_strcmp0 (frame_name, "_evince_download") == 0) - { - /* The Evince Browser Plugin is requesting us to downlod the document */ - webkit_policy_decision_download (decision); - return TRUE; - } - - if (!g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_POPUPS) && - !webkit_navigation_action_is_user_gesture (navigation_action)) - { - webkit_policy_decision_ignore (decision); - return TRUE; - } - } - - navigation_type = webkit_navigation_action_get_navigation_type (navigation_action); - - if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION) - { - if (!gtk_widget_is_visible (GTK_WIDGET (window))) - { - char *referrer; - - referrer = (char *)g_object_get_data (G_OBJECT (window), "referrer"); - - if (ephy_embed_utils_urls_have_same_origin (uri, referrer)) - { - gtk_widget_show (GTK_WIDGET (window)); - } - else - { - ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME, - gtk_window_get_screen (GTK_WINDOW (window))); - webkit_policy_decision_ignore (decision); - - gtk_widget_destroy (GTK_WIDGET (window)); - - return TRUE; - } - } - - if (navigation_type == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) - { - if (ephy_embed_utils_urls_have_same_origin (uri, webkit_web_view_get_uri (web_view))) - { - return FALSE; - } - - ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME, - gtk_window_get_screen (GTK_WINDOW (window))); - webkit_policy_decision_ignore (decision); - - return TRUE; - } - } - - if (navigation_type == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) - { - gint button; - gint state; - EphyEmbed *new_embed; - EphyWebView *new_view; - EphyNewTabFlags flags = 0; - EphyWindow *target_window = window; - gboolean inherit_session = FALSE; - - button = webkit_navigation_action_get_mouse_button (navigation_action); - state = webkit_navigation_action_get_modifiers (navigation_action); - - ephy_web_view_set_visit_type (EPHY_WEB_VIEW (web_view), - EPHY_PAGE_VISIT_LINK); - - /* New tab in new window for control+shift+click */ - if (button == 1 && state == (GDK_SHIFT_MASK | GDK_CONTROL_MASK) && - !g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, - EPHY_PREFS_LOCKDOWN_FULLSCREEN)) - { - target_window = ephy_window_new (); - } - /* New tab in existing window for middle click and - * control+click */ - else if (button == 2 || (button == 1 && state == GDK_CONTROL_MASK)) - { - flags |= EPHY_NEW_TAB_APPEND_AFTER; - inherit_session = TRUE; - } - /* Because we connect to button-press-event *after* - * (G_CONNECT_AFTER) we need to prevent WebKit from browsing to - * a link when you shift+click it. Otherwise when you - * shift+click a link to download it you would also be taken to - * the link destination. */ - else if (button == 1 && state == GDK_SHIFT_MASK) - { - webkit_policy_decision_ignore (decision); - - return TRUE; - } - /* Those were our special cases, we won't handle this */ - else - { - return FALSE; - } - - embed = ephy_embed_container_get_active_child - (EPHY_EMBED_CONTAINER (window)); - - new_embed = ephy_shell_new_tab_full (ephy_shell_get_default (), - NULL, NULL, - target_window, - embed, - flags, - 0); - - new_view = ephy_embed_get_web_view (new_embed); - if (inherit_session) - { - WebKitWebViewSessionState *session_state; - - session_state = webkit_web_view_get_session_state (web_view); - webkit_web_view_restore_session_state (WEBKIT_WEB_VIEW (new_view), session_state); - webkit_web_view_session_state_unref (session_state); - } - ephy_web_view_load_request (new_view, request); - - webkit_policy_decision_ignore (decision); - - return TRUE; - } - - return FALSE; +decide_policy_cb (WebKitWebView *web_view, + WebKitPolicyDecision *decision, + WebKitPolicyDecisionType decision_type, + EphyWindow *window) +{ + WebKitNavigationPolicyDecision *navigation_decision; + WebKitNavigationAction *navigation_action; + WebKitNavigationType navigation_type; + WebKitURIRequest *request; + const char *uri; + EphyEmbed *embed; + + if (decision_type == WEBKIT_POLICY_DECISION_TYPE_RESPONSE) + return FALSE; + + navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); + navigation_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); + request = webkit_navigation_action_get_request (navigation_action); + uri = webkit_uri_request_get_uri (request); + + if (!ephy_embed_utils_address_has_web_scheme (uri)) { + GError *error = NULL; + GdkScreen *screen; + + screen = gtk_widget_get_screen (GTK_WIDGET (web_view)); + gtk_show_uri (screen, uri, GDK_CURRENT_TIME, &error); + + if (error) { + LOG ("failed to handle non web scheme: %s", error->message); + g_error_free (error); + + return FALSE; + } + + webkit_policy_decision_ignore (decision); + + return TRUE; + } + + if (decision_type == WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION) { + const char *frame_name = webkit_navigation_policy_decision_get_frame_name (navigation_decision); + + if (g_strcmp0 (frame_name, "_evince_download") == 0) { + /* The Evince Browser Plugin is requesting us to downlod the document */ + webkit_policy_decision_download (decision); + return TRUE; + } + + if (!g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_POPUPS) && + !webkit_navigation_action_is_user_gesture (navigation_action)) { + webkit_policy_decision_ignore (decision); + return TRUE; + } + } + + navigation_type = webkit_navigation_action_get_navigation_type (navigation_action); + + if (ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()) == EPHY_EMBED_SHELL_MODE_APPLICATION) { + if (!gtk_widget_is_visible (GTK_WIDGET (window))) { + char *referrer; + + referrer = (char *)g_object_get_data (G_OBJECT (window), "referrer"); + + if (ephy_embed_utils_urls_have_same_origin (uri, referrer)) { + gtk_widget_show (GTK_WIDGET (window)); + } else { + ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME, + gtk_window_get_screen (GTK_WINDOW (window))); + webkit_policy_decision_ignore (decision); + + gtk_widget_destroy (GTK_WIDGET (window)); + + return TRUE; + } + } + + if (navigation_type == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { + if (ephy_embed_utils_urls_have_same_origin (uri, webkit_web_view_get_uri (web_view))) { + return FALSE; + } + + ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME, + gtk_window_get_screen (GTK_WINDOW (window))); + webkit_policy_decision_ignore (decision); + + return TRUE; + } + } + + if (navigation_type == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { + gint button; + gint state; + EphyEmbed *new_embed; + EphyWebView *new_view; + EphyNewTabFlags flags = 0; + EphyWindow *target_window = window; + gboolean inherit_session = FALSE; + + button = webkit_navigation_action_get_mouse_button (navigation_action); + state = webkit_navigation_action_get_modifiers (navigation_action); + + ephy_web_view_set_visit_type (EPHY_WEB_VIEW (web_view), + EPHY_PAGE_VISIT_LINK); + + /* New tab in new window for control+shift+click */ + if (button == 1 && state == (GDK_SHIFT_MASK | GDK_CONTROL_MASK) && + !g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, + EPHY_PREFS_LOCKDOWN_FULLSCREEN)) { + target_window = ephy_window_new (); + } + /* New tab in existing window for middle click and + * control+click */ + else if (button == 2 || (button == 1 && state == GDK_CONTROL_MASK)) { + flags |= EPHY_NEW_TAB_APPEND_AFTER; + inherit_session = TRUE; + } + /* Because we connect to button-press-event *after* + * (G_CONNECT_AFTER) we need to prevent WebKit from browsing to + * a link when you shift+click it. Otherwise when you + * shift+click a link to download it you would also be taken to + * the link destination. */ + else if (button == 1 && state == GDK_SHIFT_MASK) { + webkit_policy_decision_ignore (decision); + + return TRUE; + } + /* Those were our special cases, we won't handle this */ + else { + return FALSE; + } + + embed = ephy_embed_container_get_active_child + (EPHY_EMBED_CONTAINER (window)); + + new_embed = ephy_shell_new_tab_full (ephy_shell_get_default (), + NULL, NULL, + target_window, + embed, + flags, + 0); + + new_view = ephy_embed_get_web_view (new_embed); + if (inherit_session) { + WebKitWebViewSessionState *session_state; + + session_state = webkit_web_view_get_session_state (web_view); + webkit_web_view_restore_session_state (WEBKIT_WEB_VIEW (new_view), session_state); + webkit_web_view_session_state_unref (session_state); + } + ephy_web_view_load_request (new_view, request); + + webkit_policy_decision_ignore (decision); + + return TRUE; + } + + return FALSE; } static void ephy_window_connect_active_embed (EphyWindow *window) { - EphyEmbed *embed; - WebKitWebView *web_view; - EphyWebView *view; - - g_return_if_fail (window->active_embed != NULL); - - embed = window->active_embed; - view = ephy_embed_get_web_view (embed); - web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); - - sync_tab_security (view, NULL, window); - sync_tab_document_type (view, NULL, window); - sync_tab_load_status (view, WEBKIT_LOAD_STARTED, window); - sync_tab_is_blank (view, NULL, window); - sync_tab_navigation (view, NULL, window); - sync_tab_title (embed, NULL, window); - sync_tab_address (view, NULL, window); - sync_tab_icon (view, NULL, window); - sync_tab_popup_windows (view, NULL, window); - sync_tab_popups_allowed (view, NULL, window); - - sync_tab_zoom (web_view, NULL, window); - - g_signal_connect_object (web_view, "notify::zoom-level", - G_CALLBACK (sync_tab_zoom), - window, 0); - - g_signal_connect_object (web_view, "create", - G_CALLBACK (create_web_view_cb), - window, 0); - g_signal_connect_object (web_view, "decide-policy", - G_CALLBACK (decide_policy_cb), - window, 0); - g_signal_connect_object (view, "notify::hidden-popup-count", - G_CALLBACK (sync_tab_popup_windows), - window, 0); - g_signal_connect_object (view, "notify::popups-allowed", - G_CALLBACK (sync_tab_popups_allowed), - window, 0); - g_signal_connect_object (embed, "notify::title", - G_CALLBACK (sync_tab_title), - window, 0); - g_signal_connect_object (view, "notify::address", - G_CALLBACK (sync_tab_address), - window, 0); - g_signal_connect_object (view, "notify::icon", - G_CALLBACK (sync_tab_icon), - window, 0); - g_signal_connect_object (view, "notify::security-level", - G_CALLBACK (sync_tab_security), - window, 0); - g_signal_connect_object (view, "notify::document-type", - G_CALLBACK (sync_tab_document_type), - window, 0); - g_signal_connect_object (view, "load-changed", - G_CALLBACK (sync_tab_load_status), - window, 0); - g_signal_connect_object (view, "notify::navigation", - G_CALLBACK (sync_tab_navigation), - window, 0); - g_signal_connect_object (view, "notify::is-blank", - G_CALLBACK (sync_tab_is_blank), - window, 0); - g_signal_connect_object (view, "button-press-event", - G_CALLBACK (ephy_window_dom_mouse_click_cb), - window, 0); - g_signal_connect_object (view, "context-menu", - G_CALLBACK (populate_context_menu), - window, 0); - g_signal_connect_object (view, "mouse-target-changed", - G_CALLBACK (ephy_window_mouse_target_changed_cb), - window, 0); - - g_object_notify (G_OBJECT (window), "active-child"); + EphyEmbed *embed; + WebKitWebView *web_view; + EphyWebView *view; + + g_return_if_fail (window->active_embed != NULL); + + embed = window->active_embed; + view = ephy_embed_get_web_view (embed); + web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); + + sync_tab_security (view, NULL, window); + sync_tab_document_type (view, NULL, window); + sync_tab_load_status (view, WEBKIT_LOAD_STARTED, window); + sync_tab_is_blank (view, NULL, window); + sync_tab_navigation (view, NULL, window); + sync_tab_title (embed, NULL, window); + sync_tab_address (view, NULL, window); + sync_tab_icon (view, NULL, window); + sync_tab_popup_windows (view, NULL, window); + sync_tab_popups_allowed (view, NULL, window); + + sync_tab_zoom (web_view, NULL, window); + + g_signal_connect_object (web_view, "notify::zoom-level", + G_CALLBACK (sync_tab_zoom), + window, 0); + + g_signal_connect_object (web_view, "create", + G_CALLBACK (create_web_view_cb), + window, 0); + g_signal_connect_object (web_view, "decide-policy", + G_CALLBACK (decide_policy_cb), + window, 0); + g_signal_connect_object (view, "notify::hidden-popup-count", + G_CALLBACK (sync_tab_popup_windows), + window, 0); + g_signal_connect_object (view, "notify::popups-allowed", + G_CALLBACK (sync_tab_popups_allowed), + window, 0); + g_signal_connect_object (embed, "notify::title", + G_CALLBACK (sync_tab_title), + window, 0); + g_signal_connect_object (view, "notify::address", + G_CALLBACK (sync_tab_address), + window, 0); + g_signal_connect_object (view, "notify::icon", + G_CALLBACK (sync_tab_icon), + window, 0); + g_signal_connect_object (view, "notify::security-level", + G_CALLBACK (sync_tab_security), + window, 0); + g_signal_connect_object (view, "notify::document-type", + G_CALLBACK (sync_tab_document_type), + window, 0); + g_signal_connect_object (view, "load-changed", + G_CALLBACK (sync_tab_load_status), + window, 0); + g_signal_connect_object (view, "notify::navigation", + G_CALLBACK (sync_tab_navigation), + window, 0); + g_signal_connect_object (view, "notify::is-blank", + G_CALLBACK (sync_tab_is_blank), + window, 0); + g_signal_connect_object (view, "button-press-event", + G_CALLBACK (ephy_window_dom_mouse_click_cb), + window, 0); + g_signal_connect_object (view, "context-menu", + G_CALLBACK (populate_context_menu), + window, 0); + g_signal_connect_object (view, "mouse-target-changed", + G_CALLBACK (ephy_window_mouse_target_changed_cb), + window, 0); + + g_object_notify (G_OBJECT (window), "active-child"); } static void ephy_window_disconnect_active_embed (EphyWindow *window) { - EphyEmbed *embed; - WebKitWebView *web_view; - EphyWebView *view; - - g_return_if_fail (window->active_embed != NULL); - - embed = window->active_embed; - web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); - view = EPHY_WEB_VIEW (web_view); - - g_signal_handlers_disconnect_by_func (web_view, - G_CALLBACK (sync_tab_zoom), - window); - g_signal_handlers_disconnect_by_func (web_view, - G_CALLBACK (create_web_view_cb), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (decide_policy_cb), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_popup_windows), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_popups_allowed), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_security), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_document_type), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_load_status), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_is_blank), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_navigation), - window); - g_signal_handlers_disconnect_by_func (embed, - G_CALLBACK (sync_tab_title), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_address), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (sync_tab_icon), - window); - - g_signal_handlers_disconnect_by_func - (view, G_CALLBACK (ephy_window_dom_mouse_click_cb), window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (populate_context_menu), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (ephy_window_mouse_target_changed_cb), - window); + EphyEmbed *embed; + WebKitWebView *web_view; + EphyWebView *view; + + g_return_if_fail (window->active_embed != NULL); + + embed = window->active_embed; + web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); + view = EPHY_WEB_VIEW (web_view); + + g_signal_handlers_disconnect_by_func (web_view, + G_CALLBACK (sync_tab_zoom), + window); + g_signal_handlers_disconnect_by_func (web_view, + G_CALLBACK (create_web_view_cb), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (decide_policy_cb), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_popup_windows), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_popups_allowed), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_security), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_document_type), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_load_status), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_is_blank), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_navigation), + window); + g_signal_handlers_disconnect_by_func (embed, + G_CALLBACK (sync_tab_title), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_address), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (sync_tab_icon), + window); + + g_signal_handlers_disconnect_by_func + (view, G_CALLBACK (ephy_window_dom_mouse_click_cb), window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (populate_context_menu), + window); + g_signal_handlers_disconnect_by_func (view, + G_CALLBACK (ephy_window_mouse_target_changed_cb), + window); } static void ephy_window_set_active_tab (EphyWindow *window, EphyEmbed *new_embed) { - EphyEmbed *old_embed; + EphyEmbed *old_embed; - g_return_if_fail (EPHY_IS_WINDOW (window)); - g_return_if_fail (gtk_widget_get_toplevel (GTK_WIDGET (new_embed)) == GTK_WIDGET (window)); + g_return_if_fail (EPHY_IS_WINDOW (window)); + g_return_if_fail (gtk_widget_get_toplevel (GTK_WIDGET (new_embed)) == GTK_WIDGET (window)); - old_embed = window->active_embed; + old_embed = window->active_embed; - if (old_embed == new_embed) return; + if (old_embed == new_embed) return; - if (old_embed != NULL) - ephy_window_disconnect_active_embed (window); + if (old_embed != NULL) + ephy_window_disconnect_active_embed (window); - window->active_embed = new_embed; + window->active_embed = new_embed; - if (new_embed != NULL) - ephy_window_connect_active_embed (window); + if (new_embed != NULL) + ephy_window_connect_active_embed (window); } static void -tab_accels_item_activate (GtkAction *action, - EphyWindow *window) +tab_accels_item_activate (GtkAction *action, + EphyWindow *window) { - const char *name; - int tab_number; + const char *name; + int tab_number; - name = gtk_action_get_name (action); - tab_number = atoi (name + strlen ("TabAccel")); + name = gtk_action_get_name (action); + tab_number = atoi (name + strlen ("TabAccel")); - gtk_notebook_set_current_page (window->notebook, tab_number); + gtk_notebook_set_current_page (window->notebook, tab_number); } static void tab_accels_update (EphyWindow *window) { - int pages, i = 0; - GList *actions, *l; + int pages, i = 0; + GList *actions, *l; - actions = gtk_action_group_list_actions (window->tab_accels_action_group); - pages = gtk_notebook_get_n_pages (window->notebook); - for (l = actions; l != NULL; l = l->next) - { - GtkAction *action = GTK_ACTION (l->data); + actions = gtk_action_group_list_actions (window->tab_accels_action_group); + pages = gtk_notebook_get_n_pages (window->notebook); + for (l = actions; l != NULL; l = l->next) { + GtkAction *action = GTK_ACTION (l->data); - gtk_action_set_sensitive (action, (i < pages)); + gtk_action_set_sensitive (action, (i < pages)); - i++; - } - g_list_free (actions); + i++; + } + g_list_free (actions); } #define TAB_ACCELS_N 10 @@ -2547,268 +2430,253 @@ tab_accels_update (EphyWindow *window) static void setup_tab_accels (EphyWindow *window) { - guint id; - int i; + guint id; + int i; - id = gtk_ui_manager_new_merge_id (window->manager); + id = gtk_ui_manager_new_merge_id (window->manager); - for (i = 0; i < TAB_ACCELS_N; i++) - { - GtkAction *action; - char *name; - char *accel; + for (i = 0; i < TAB_ACCELS_N; i++) { + GtkAction *action; + char *name; + char *accel; - name = g_strdup_printf ("TabAccel%d", i); - accel = g_strdup_printf ("<alt>%d", (i + 1) % TAB_ACCELS_N); - action = gtk_action_new (name, NULL, NULL, NULL); + name = g_strdup_printf ("TabAccel%d", i); + accel = g_strdup_printf ("<alt>%d", (i + 1) % TAB_ACCELS_N); + action = gtk_action_new (name, NULL, NULL, NULL); - gtk_action_group_add_action_with_accel (window->tab_accels_action_group, - action, accel); + gtk_action_group_add_action_with_accel (window->tab_accels_action_group, + action, accel); - g_signal_connect (action, "activate", - G_CALLBACK (tab_accels_item_activate), window); - gtk_ui_manager_add_ui (window->manager, id, "/", - name, name, - GTK_UI_MANAGER_ACCELERATOR, - FALSE); + g_signal_connect (action, "activate", + G_CALLBACK (tab_accels_item_activate), window); + gtk_ui_manager_add_ui (window->manager, id, "/", + name, name, + GTK_UI_MANAGER_ACCELERATOR, + FALSE); - g_object_unref (action); - g_free (accel); - g_free (name); - } + g_object_unref (action); + g_free (accel); + g_free (name); + } } static gboolean -show_notebook_popup_menu (GtkNotebook *notebook, - EphyWindow *window, - GdkEventButton *event) +show_notebook_popup_menu (GtkNotebook *notebook, + EphyWindow *window, + GdkEventButton *event) { - GtkWidget *menu, *tab, *tab_label; - GtkAction *action; + GtkWidget *menu, *tab, *tab_label; + GtkAction *action; - menu = gtk_ui_manager_get_widget (window->manager, "/EphyNotebookPopup"); - g_return_val_if_fail (menu != NULL, FALSE); + menu = gtk_ui_manager_get_widget (window->manager, "/EphyNotebookPopup"); + g_return_val_if_fail (menu != NULL, FALSE); - /* allow extensions to sync when showing the popup */ - action = gtk_action_group_get_action (window->action_group, - "NotebookPopupAction"); - g_return_val_if_fail (action != NULL, FALSE); - gtk_action_activate (action); + /* allow extensions to sync when showing the popup */ + action = gtk_action_group_get_action (window->action_group, + "NotebookPopupAction"); + g_return_val_if_fail (action != NULL, FALSE); + gtk_action_activate (action); - if (event != NULL) - { - gint n_pages, page_num; + if (event != NULL) { + gint n_pages, page_num; - tab = GTK_WIDGET (window->active_embed); - n_pages = gtk_notebook_get_n_pages (notebook); - page_num = gtk_notebook_page_num (notebook, tab); + tab = GTK_WIDGET (window->active_embed); + n_pages = gtk_notebook_get_n_pages (notebook); + page_num = gtk_notebook_page_num (notebook, tab); - /* enable/disable move left/right items*/ - action = gtk_action_group_get_action (window->action_group, - "TabsMoveLeft"); - gtk_action_set_sensitive (action, page_num > 0); + /* enable/disable move left/right items*/ + action = gtk_action_group_get_action (window->action_group, + "TabsMoveLeft"); + gtk_action_set_sensitive (action, page_num > 0); - action = gtk_action_group_get_action (window->action_group, - "TabsMoveRight"); - gtk_action_set_sensitive (action, page_num < n_pages - 1); + action = gtk_action_group_get_action (window->action_group, + "TabsMoveRight"); + gtk_action_set_sensitive (action, page_num < n_pages - 1); - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, - NULL, NULL, - event->button, event->time); - } - else - { - tab = GTK_WIDGET (window->active_embed); - tab_label = gtk_notebook_get_tab_label (notebook, tab); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + NULL, NULL, + event->button, event->time); + } else { + tab = GTK_WIDGET (window->active_embed); + tab_label = gtk_notebook_get_tab_label (notebook, tab); - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, - ephy_gui_menu_position_under_widget, tab_label, - 0, gtk_get_current_event_time ()); - gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); - } + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + ephy_gui_menu_position_under_widget, tab_label, + 0, gtk_get_current_event_time ()); + gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); + } - return TRUE; + return TRUE; } static gboolean -notebook_button_press_cb (GtkNotebook *notebook, - GdkEventButton *event, - EphyWindow *window) +notebook_button_press_cb (GtkNotebook *notebook, + GdkEventButton *event, + EphyWindow *window) { - if (GDK_BUTTON_PRESS == event->type && 3 == event->button) - { - return show_notebook_popup_menu (notebook, window, event); - } + if (GDK_BUTTON_PRESS == event->type && 3 == event->button) { + return show_notebook_popup_menu (notebook, window, event); + } - return FALSE; + return FALSE; } static gboolean notebook_popup_menu_cb (GtkNotebook *notebook, - EphyWindow *window) + EphyWindow *window) { - /* Only respond if the notebook is the actual focus */ - if (EPHY_IS_NOTEBOOK (gtk_window_get_focus (GTK_WINDOW (window)))) - { - return show_notebook_popup_menu (notebook, window, NULL); - } + /* Only respond if the notebook is the actual focus */ + if (EPHY_IS_NOTEBOOK (gtk_window_get_focus (GTK_WINDOW (window)))) { + return show_notebook_popup_menu (notebook, window, NULL); + } - return FALSE; + return FALSE; } static gboolean present_on_idle_cb (GtkWindow *window) { - gtk_window_present (window); - return FALSE; + gtk_window_present (window); + return FALSE; } static gboolean delayed_remove_child (gpointer data) { - GtkWidget *widget = GTK_WIDGET (data); - EphyEmbedContainer *container = EPHY_EMBED_CONTAINER (gtk_widget_get_toplevel (widget)); + GtkWidget *widget = GTK_WIDGET (data); + EphyEmbedContainer *container = EPHY_EMBED_CONTAINER (gtk_widget_get_toplevel (widget)); - ephy_embed_container_remove_child (container, EPHY_EMBED (widget)); + ephy_embed_container_remove_child (container, EPHY_EMBED (widget)); - return FALSE; + return FALSE; } static void download_only_load_cb (EphyWebView *view, - EphyWindow *window) + EphyWindow *window) { - if (gtk_notebook_get_n_pages (window->notebook) == 1) { - ephy_web_view_load_homepage (view); - return; - } + if (gtk_notebook_get_n_pages (window->notebook) == 1) { + ephy_web_view_load_homepage (view); + return; + } - g_idle_add (delayed_remove_child, EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view)); + g_idle_add (delayed_remove_child, EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view)); } static void notebook_page_added_cb (EphyNotebook *notebook, - EphyEmbed *embed, - guint position, - EphyWindow *window) + EphyEmbed *embed, + guint position, + EphyWindow *window) { - LOG ("page-added notebook %p embed %p position %u\n", notebook, embed, position); + LOG ("page-added notebook %p embed %p position %u\n", notebook, embed, position); - g_return_if_fail (EPHY_IS_EMBED (embed)); + g_return_if_fail (EPHY_IS_EMBED (embed)); #if 0 - g_signal_connect_object (embed, "open-link", - G_CALLBACK (ephy_link_open), window, - G_CONNECT_SWAPPED); + g_signal_connect_object (embed, "open-link", + G_CALLBACK (ephy_link_open), window, + G_CONNECT_SWAPPED); #endif - g_signal_connect_object (ephy_embed_get_web_view (embed), "download-only-load", - G_CALLBACK (download_only_load_cb), window, G_CONNECT_AFTER); + g_signal_connect_object (ephy_embed_get_web_view (embed), "download-only-load", + G_CALLBACK (download_only_load_cb), window, G_CONNECT_AFTER); - if (window->present_on_insert) - { - window->present_on_insert = FALSE; - g_idle_add ((GSourceFunc) present_on_idle_cb, g_object_ref (window)); - } + if (window->present_on_insert) { + window->present_on_insert = FALSE; + g_idle_add ((GSourceFunc)present_on_idle_cb, g_object_ref (window)); + } - tab_accels_update (window); + tab_accels_update (window); } static void notebook_page_removed_cb (EphyNotebook *notebook, - EphyEmbed *embed, - guint position, - EphyWindow *window) + EphyEmbed *embed, + guint position, + EphyWindow *window) { - LOG ("page-removed notebook %p embed %p position %u\n", notebook, embed, position); + LOG ("page-removed notebook %p embed %p position %u\n", notebook, embed, position); - if (window->closing) return; + if (window->closing) return; - g_return_if_fail (EPHY_IS_EMBED (embed)); + g_return_if_fail (EPHY_IS_EMBED (embed)); #if 0 - g_signal_handlers_disconnect_by_func (G_OBJECT (embed), - G_CALLBACK (ephy_link_open), - window); + g_signal_handlers_disconnect_by_func (G_OBJECT (embed), + G_CALLBACK (ephy_link_open), + window); #endif - g_signal_handlers_disconnect_by_func - (ephy_embed_get_web_view (embed), G_CALLBACK (download_only_load_cb), window); + g_signal_handlers_disconnect_by_func + (ephy_embed_get_web_view (embed), G_CALLBACK (download_only_load_cb), window); - tab_accels_update (window); + tab_accels_update (window); } static void ephy_window_close_tab (EphyWindow *window, - EphyEmbed *tab) + EphyEmbed *tab) { - gtk_widget_destroy (GTK_WIDGET (tab)); + gtk_widget_destroy (GTK_WIDGET (tab)); - /* If that was the last tab, destroy the window. */ - if (gtk_notebook_get_n_pages (window->notebook) == 0) - { - gtk_widget_destroy (GTK_WIDGET (window)); - } + /* If that was the last tab, destroy the window. */ + if (gtk_notebook_get_n_pages (window->notebook) == 0) { + gtk_widget_destroy (GTK_WIDGET (window)); + } } static void -tab_has_modified_forms_cb (EphyWebView *view, - GAsyncResult *result, - EphyWindow *window) +tab_has_modified_forms_cb (EphyWebView *view, + GAsyncResult *result, + EphyWindow *window) { - gboolean has_modified_forms; + gboolean has_modified_forms; - has_modified_forms = ephy_web_view_has_modified_forms_finish (view, result, NULL); - if (!has_modified_forms || confirm_close_with_modified_forms (window)) - { - ephy_window_close_tab (window, EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view)); - } + has_modified_forms = ephy_web_view_has_modified_forms_finish (view, result, NULL); + if (!has_modified_forms || confirm_close_with_modified_forms (window)) { + ephy_window_close_tab (window, EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view)); + } } static void notebook_page_close_request_cb (EphyNotebook *notebook, - EphyEmbed *embed, - EphyWindow *window) -{ - if (gtk_notebook_get_n_pages (window->notebook) == 1) - { - if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, - EPHY_PREFS_LOCKDOWN_QUIT)) - { - return; - } - - /* Last window, check ongoing downloads before closing the tab */ - if (ephy_shell_get_n_windows (ephy_shell_get_default ()) == 1) - { - EphyDownloadsManager *manager = ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())); - - if (ephy_downloads_manager_has_active_downloads (manager) && - !confirm_close_with_downloads (window)) - return; - } - } - - if (g_settings_get_boolean (EPHY_SETTINGS_MAIN, - EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA)) - { - ephy_web_view_has_modified_forms (ephy_embed_get_web_view (embed), - NULL, - (GAsyncReadyCallback)tab_has_modified_forms_cb, - window); - } - else - { - ephy_window_close_tab (window, embed); - } + EphyEmbed *embed, + EphyWindow *window) +{ + if (gtk_notebook_get_n_pages (window->notebook) == 1) { + if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, + EPHY_PREFS_LOCKDOWN_QUIT)) { + return; + } + + /* Last window, check ongoing downloads before closing the tab */ + if (ephy_shell_get_n_windows (ephy_shell_get_default ()) == 1) { + EphyDownloadsManager *manager = ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())); + + if (ephy_downloads_manager_has_active_downloads (manager) && + !confirm_close_with_downloads (window)) + return; + } + } + + if (g_settings_get_boolean (EPHY_SETTINGS_MAIN, + EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA)) { + ephy_web_view_has_modified_forms (ephy_embed_get_web_view (embed), + NULL, + (GAsyncReadyCallback)tab_has_modified_forms_cb, + window); + } else { + ephy_window_close_tab (window, embed); + } } static GtkWidget * notebook_create_window_cb (GtkNotebook *notebook, - GtkWidget *page, - int x, - int y, - EphyWindow *window) + GtkWidget *page, + int x, + int y, + EphyWindow *window) { EphyWindow *new_window; @@ -2822,655 +2690,639 @@ notebook_create_window_cb (GtkNotebook *notebook, static EphyEmbed * real_get_active_tab (EphyWindow *window, int page_num) { - GtkWidget *embed; + GtkWidget *embed; - if (page_num == -1) - { - page_num = gtk_notebook_get_current_page (window->notebook); - } + if (page_num == -1) { + page_num = gtk_notebook_get_current_page (window->notebook); + } - embed = gtk_notebook_get_nth_page (window->notebook, page_num); + embed = gtk_notebook_get_nth_page (window->notebook, page_num); - g_return_val_if_fail (EPHY_IS_EMBED (embed), NULL); + g_return_val_if_fail (EPHY_IS_EMBED (embed), NULL); - return EPHY_EMBED (embed); + return EPHY_EMBED (embed); } static void notebook_switch_page_cb (GtkNotebook *notebook, - GtkWidget *page, - guint page_num, - EphyWindow *window) + GtkWidget *page, + guint page_num, + EphyWindow *window) { - EphyEmbed *embed; + EphyEmbed *embed; - LOG ("switch-page notebook %p position %u\n", notebook, page_num); + LOG ("switch-page notebook %p position %u\n", notebook, page_num); - if (window->closing) return; + if (window->closing) return; - /* get the new tab */ - embed = real_get_active_tab (window, page_num); + /* get the new tab */ + embed = real_get_active_tab (window, page_num); - /* update new tab */ - ephy_window_set_active_tab (window, embed); + /* update new tab */ + ephy_window_set_active_tab (window, embed); - ephy_title_box_set_web_view (ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)), - EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed)); + ephy_title_box_set_web_view (ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)), + EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed)); } static GtkNotebook * setup_notebook (EphyWindow *window) { - GtkNotebook *notebook; + GtkNotebook *notebook; - notebook = GTK_NOTEBOOK (g_object_new (EPHY_TYPE_NOTEBOOK, NULL)); + notebook = GTK_NOTEBOOK (g_object_new (EPHY_TYPE_NOTEBOOK, NULL)); - g_signal_connect_after (notebook, "switch-page", - G_CALLBACK (notebook_switch_page_cb), - window); - g_signal_connect (notebook, "create-window", - G_CALLBACK (notebook_create_window_cb), + g_signal_connect_after (notebook, "switch-page", + G_CALLBACK (notebook_switch_page_cb), window); + g_signal_connect (notebook, "create-window", + G_CALLBACK (notebook_create_window_cb), + window); - g_signal_connect (notebook, "popup-menu", - G_CALLBACK (notebook_popup_menu_cb), window); - g_signal_connect (notebook, "button-press-event", - G_CALLBACK (notebook_button_press_cb), window); + g_signal_connect (notebook, "popup-menu", + G_CALLBACK (notebook_popup_menu_cb), window); + g_signal_connect (notebook, "button-press-event", + G_CALLBACK (notebook_button_press_cb), window); - g_signal_connect (notebook, "page-added", - G_CALLBACK (notebook_page_added_cb), window); - g_signal_connect (notebook, "page-removed", - G_CALLBACK (notebook_page_removed_cb), window); - g_signal_connect (notebook, "tab-close-request", - G_CALLBACK (notebook_page_close_request_cb), window); + g_signal_connect (notebook, "page-added", + G_CALLBACK (notebook_page_added_cb), window); + g_signal_connect (notebook, "page-removed", + G_CALLBACK (notebook_page_removed_cb), window); + g_signal_connect (notebook, "tab-close-request", + G_CALLBACK (notebook_page_close_request_cb), window); - g_signal_connect_swapped (notebook, "open-link", - G_CALLBACK (ephy_link_open), window); + g_signal_connect_swapped (notebook, "open-link", + G_CALLBACK (ephy_link_open), window); - return notebook; + return notebook; } static void ephy_window_dispose (GObject *object) { - EphyWindow *window = EPHY_WINDOW (object); - GSList *popups; + EphyWindow *window = EPHY_WINDOW (object); + GSList *popups; - LOG ("EphyWindow dispose %p", window); + LOG ("EphyWindow dispose %p", window); - /* Only do these once */ - if (window->closing == FALSE) - { - window->closing = TRUE; + /* Only do these once */ + if (window->closing == FALSE) { + window->closing = TRUE; - ephy_bookmarks_ui_detach_window (window); + ephy_bookmarks_ui_detach_window (window); - /* Deactivate menus */ - popups = gtk_ui_manager_get_toplevels (window->manager, GTK_UI_MANAGER_POPUP); - g_slist_foreach (popups, (GFunc) gtk_menu_shell_deactivate, NULL); - g_slist_free (popups); + /* Deactivate menus */ + popups = gtk_ui_manager_get_toplevels (window->manager, GTK_UI_MANAGER_POPUP); + g_slist_foreach (popups, (GFunc)gtk_menu_shell_deactivate, NULL); + g_slist_free (popups); - window->action_group = NULL; - window->popups_action_group = NULL; - window->tab_accels_action_group = NULL; + window->action_group = NULL; + window->popups_action_group = NULL; + window->tab_accels_action_group = NULL; - g_object_unref (window->manager); - window->manager = NULL; + g_object_unref (window->manager); + window->manager = NULL; - _ephy_window_set_context_event (window, NULL); + _ephy_window_set_context_event (window, NULL); - g_clear_object (&window->hit_test_result); - } + g_clear_object (&window->hit_test_result); + } - G_OBJECT_CLASS (ephy_window_parent_class)->dispose (object); + G_OBJECT_CLASS (ephy_window_parent_class)->dispose (object); } static void -ephy_window_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +ephy_window_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - EphyWindow *window = EPHY_WINDOW (object); + EphyWindow *window = EPHY_WINDOW (object); - switch (prop_id) - { - case PROP_ACTIVE_CHILD: - impl_set_active_child (EPHY_EMBED_CONTAINER (window), - g_value_get_object (value)); - break; - case PROP_CHROME: - ephy_window_set_chrome (window, g_value_get_flags (value)); - break; - case PROP_SINGLE_TAB_MODE: - ephy_window_set_is_popup (window, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + switch (prop_id) { + case PROP_ACTIVE_CHILD: + impl_set_active_child (EPHY_EMBED_CONTAINER (window), + g_value_get_object (value)); + break; + case PROP_CHROME: + ephy_window_set_chrome (window, g_value_get_flags (value)); + break; + case PROP_SINGLE_TAB_MODE: + ephy_window_set_is_popup (window, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static void -ephy_window_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +ephy_window_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) { - EphyWindow *window = EPHY_WINDOW (object); + EphyWindow *window = EPHY_WINDOW (object); - switch (prop_id) - { - case PROP_ACTIVE_CHILD: - g_value_set_object (value, window->active_embed); - break; - case PROP_CHROME: - g_value_set_flags (value, window->chrome); - break; - case PROP_SINGLE_TAB_MODE: - g_value_set_boolean (value, window->is_popup); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + switch (prop_id) { + case PROP_ACTIVE_CHILD: + g_value_set_object (value, window->active_embed); + break; + case PROP_CHROME: + g_value_set_flags (value, window->chrome); + break; + case PROP_SINGLE_TAB_MODE: + g_value_set_boolean (value, window->is_popup); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static gboolean -ephy_window_state_event (GtkWidget *widget, - GdkEventWindowState *event) +ephy_window_state_event (GtkWidget *widget, + GdkEventWindowState *event) { - EphyWindow *window = EPHY_WINDOW (widget); + EphyWindow *window = EPHY_WINDOW (widget); - if (GTK_WIDGET_CLASS (ephy_window_parent_class)->window_state_event) - { - GTK_WIDGET_CLASS (ephy_window_parent_class)->window_state_event (widget, event); - } + if (GTK_WIDGET_CLASS (ephy_window_parent_class)->window_state_event) { + GTK_WIDGET_CLASS (ephy_window_parent_class)->window_state_event (widget, event); + } - if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) - { - GtkActionGroup *action_group; - GtkAction *action; - gboolean fullscreen; + if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { + GtkActionGroup *action_group; + GtkAction *action; + gboolean fullscreen; - fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; + fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; - if (fullscreen) - { - ephy_window_fullscreen (window); - } - else - { - ephy_window_unfullscreen (window); - } + if (fullscreen) { + ephy_window_fullscreen (window); + } else { + ephy_window_unfullscreen (window); + } - action_group = window->action_group; + action_group = window->action_group; - action = gtk_action_group_get_action (action_group, "ViewFullscreen"); - g_signal_handlers_block_by_func - (action, G_CALLBACK (window_cmd_view_fullscreen), window); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen); - g_signal_handlers_unblock_by_func - (action, G_CALLBACK (window_cmd_view_fullscreen), window); - } + action = gtk_action_group_get_action (action_group, "ViewFullscreen"); + g_signal_handlers_block_by_func + (action, G_CALLBACK (window_cmd_view_fullscreen), window); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen); + g_signal_handlers_unblock_by_func + (action, G_CALLBACK (window_cmd_view_fullscreen), window); + } - return FALSE; + return FALSE; } static void ephy_window_finalize (GObject *object) { - EphyWindow *window = EPHY_WINDOW (object); + EphyWindow *window = EPHY_WINDOW (object); - if (window->app_menu_visibility_handler != 0) - g_signal_handler_disconnect (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))), - window->app_menu_visibility_handler); + if (window->app_menu_visibility_handler != 0) + g_signal_handler_disconnect (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))), + window->app_menu_visibility_handler); - G_OBJECT_CLASS (ephy_window_parent_class)->finalize (object); + G_OBJECT_CLASS (ephy_window_parent_class)->finalize (object); - LOG ("EphyWindow finalised %p", object); + LOG ("EphyWindow finalised %p", object); } static void -allow_popups_notifier (GSettings *settings, - char *key, - EphyWindow *window) +allow_popups_notifier (GSettings *settings, + char *key, + EphyWindow *window) { - GList *tabs; - EphyEmbed *embed; + GList *tabs; + EphyEmbed *embed; - g_return_if_fail (EPHY_IS_WINDOW (window)); + g_return_if_fail (EPHY_IS_WINDOW (window)); - tabs = impl_get_children (EPHY_EMBED_CONTAINER (window)); + tabs = impl_get_children (EPHY_EMBED_CONTAINER (window)); - for (; tabs; tabs = g_list_next (tabs)) - { - embed = EPHY_EMBED (tabs->data); - g_return_if_fail (EPHY_IS_EMBED (embed)); + for (; tabs; tabs = g_list_next (tabs)) { + embed = EPHY_EMBED (tabs->data); + g_return_if_fail (EPHY_IS_EMBED (embed)); - g_object_notify (G_OBJECT (ephy_embed_get_web_view (embed)), "popups-allowed"); - } - g_list_free (tabs); + g_object_notify (G_OBJECT (ephy_embed_get_web_view (embed)), "popups-allowed"); + } + g_list_free (tabs); } static void sync_user_input_cb (EphyLocationController *action, - GParamSpec *pspec, - EphyWindow *window) + GParamSpec *pspec, + EphyWindow *window) { - EphyEmbed *embed; - const char *address; + EphyEmbed *embed; + const char *address; - LOG ("sync_user_input_cb"); + LOG ("sync_user_input_cb"); - if (window->updating_address) return; + if (window->updating_address) return; - embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window)); - g_assert (EPHY_IS_EMBED (embed)); + embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window)); + g_assert (EPHY_IS_EMBED (embed)); - address = ephy_location_controller_get_address (action); + address = ephy_location_controller_get_address (action); - window->updating_address = TRUE; - ephy_web_view_set_typed_address (ephy_embed_get_web_view (embed), address); - window->updating_address = FALSE; + window->updating_address = TRUE; + ephy_web_view_set_typed_address (ephy_embed_get_web_view (embed), address); + window->updating_address = FALSE; } static void -zoom_to_level_cb (GtkAction *action, - float zoom, - EphyWindow *window) +zoom_to_level_cb (GtkAction *action, + float zoom, + EphyWindow *window) { - ephy_window_set_zoom (window, zoom); + ephy_window_set_zoom (window, zoom); } static void -open_security_popover (EphyWindow *window, - GtkWidget *relative_to, - GdkRectangle *lock_position) +open_security_popover (EphyWindow *window, + GtkWidget *relative_to, + GdkRectangle *lock_position) { - EphyWebView *view; - GTlsCertificate *certificate; - GTlsCertificateFlags tls_errors; - EphySecurityLevel security_level; - GtkWidget *location_entry; - GtkWidget *security_popover; + EphyWebView *view; + GTlsCertificate *certificate; + GTlsCertificateFlags tls_errors; + EphySecurityLevel security_level; + GtkWidget *location_entry; + GtkWidget *security_popover; - view = ephy_embed_get_web_view (window->active_embed); - ephy_web_view_get_security_level (view, &security_level, &certificate, &tls_errors); - location_entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); + view = ephy_embed_get_web_view (window->active_embed); + ephy_web_view_get_security_level (view, &security_level, &certificate, &tls_errors); + location_entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); - security_popover = ephy_security_popover_new (relative_to, - ephy_location_entry_get_location (EPHY_LOCATION_ENTRY (location_entry)), - certificate, - tls_errors, - security_level); + security_popover = ephy_security_popover_new (relative_to, + ephy_location_entry_get_location (EPHY_LOCATION_ENTRY (location_entry)), + certificate, + tls_errors, + security_level); - g_signal_connect (security_popover, "closed", - G_CALLBACK (gtk_widget_destroy), NULL); - gtk_popover_set_pointing_to (GTK_POPOVER (security_popover), lock_position); - gtk_widget_show (security_popover); + g_signal_connect (security_popover, "closed", + G_CALLBACK (gtk_widget_destroy), NULL); + gtk_popover_set_pointing_to (GTK_POPOVER (security_popover), lock_position); + gtk_widget_show (security_popover); } static void location_controller_lock_clicked_cb (EphyLocationController *controller, - gpointer user_data) + gpointer user_data) { - EphyWindow *window = EPHY_WINDOW (user_data); - GtkWidget *location_entry; - GdkRectangle lock_position; + EphyWindow *window = EPHY_WINDOW (user_data); + GtkWidget *location_entry; + GdkRectangle lock_position; - location_entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); - gtk_entry_get_icon_area (GTK_ENTRY (location_entry), GTK_ENTRY_ICON_SECONDARY, &lock_position); - open_security_popover (window, location_entry, &lock_position); + location_entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); + gtk_entry_get_icon_area (GTK_ENTRY (location_entry), GTK_ENTRY_ICON_SECONDARY, &lock_position); + open_security_popover (window, location_entry, &lock_position); } static void title_box_lock_clicked_cb (EphyTitleBox *title_box, - GdkRectangle *lock_position, - gpointer user_data) + GdkRectangle *lock_position, + gpointer user_data) { - EphyWindow *window = EPHY_WINDOW (user_data); + EphyWindow *window = EPHY_WINDOW (user_data); - open_security_popover (window, GTK_WIDGET (title_box), lock_position); + open_security_popover (window, GTK_WIDGET (title_box), lock_position); } static GtkWidget * setup_toolbar (EphyWindow *window) { - GtkWidget *toolbar; - GtkAction *action; - EphyEmbedShellMode app_mode; - EphyTitleBox *title_box; + GtkWidget *toolbar; + GtkAction *action; + EphyEmbedShellMode app_mode; + EphyTitleBox *title_box; - toolbar = ephy_toolbar_new (window); - gtk_window_set_titlebar (GTK_WINDOW (window), toolbar); - gtk_widget_show (toolbar); + toolbar = ephy_toolbar_new (window); + gtk_window_set_titlebar (GTK_WINDOW (window), toolbar); + gtk_widget_show (toolbar); - app_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()); - if (app_mode == EPHY_EMBED_SHELL_MODE_INCOGNITO) - gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), "incognito-mode"); + app_mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()); + if (app_mode == EPHY_EMBED_SHELL_MODE_INCOGNITO) + gtk_style_context_add_class (gtk_widget_get_style_context (toolbar), "incognito-mode"); - action = gtk_action_group_get_action (window->toolbar_action_group, - "NavigationBack"); - g_signal_connect_swapped (action, "open-link", - G_CALLBACK (ephy_link_open), window); + action = gtk_action_group_get_action (window->toolbar_action_group, + "NavigationBack"); + g_signal_connect_swapped (action, "open-link", + G_CALLBACK (ephy_link_open), window); - action = gtk_action_group_get_action (window->toolbar_action_group, - "NavigationForward"); - g_signal_connect_swapped (action, "open-link", - G_CALLBACK (ephy_link_open), window); + action = gtk_action_group_get_action (window->toolbar_action_group, + "NavigationForward"); + g_signal_connect_swapped (action, "open-link", + G_CALLBACK (ephy_link_open), window); - action = gtk_action_group_get_action (window->toolbar_action_group, - "FileNewTab"); - g_signal_connect_swapped (action, "open-link", - G_CALLBACK (ephy_link_open), window); + action = gtk_action_group_get_action (window->toolbar_action_group, + "FileNewTab"); + g_signal_connect_swapped (action, "open-link", + G_CALLBACK (ephy_link_open), window); - action = gtk_action_group_get_action (window->toolbar_action_group, - "Zoom"); - g_signal_connect (action, "zoom-to-level", - G_CALLBACK (zoom_to_level_cb), window); + action = gtk_action_group_get_action (window->toolbar_action_group, + "Zoom"); + g_signal_connect (action, "zoom-to-level", + G_CALLBACK (zoom_to_level_cb), window); - title_box = ephy_toolbar_get_title_box (EPHY_TOOLBAR (toolbar)); - g_signal_connect (title_box, "lock-clicked", - G_CALLBACK (title_box_lock_clicked_cb), window); + title_box = ephy_toolbar_get_title_box (EPHY_TOOLBAR (toolbar)); + g_signal_connect (title_box, "lock-clicked", + G_CALLBACK (title_box_lock_clicked_cb), window); - return toolbar; + return toolbar; } static EphyLocationController * -setup_location_controller (EphyWindow *window, - EphyToolbar *toolbar) -{ - EphyLocationController *location_controller; - - location_controller = - g_object_new (EPHY_TYPE_LOCATION_CONTROLLER, - "window", window, - "location-entry", ephy_toolbar_get_location_entry (toolbar), - "title-box", ephy_toolbar_get_title_box (toolbar), - NULL); - g_signal_connect (location_controller, "notify::address", - G_CALLBACK (sync_user_input_cb), window); - g_signal_connect_swapped (location_controller, "open-link", - G_CALLBACK (ephy_link_open), window); - g_signal_connect (location_controller, "lock-clicked", - G_CALLBACK (location_controller_lock_clicked_cb), window); - - return location_controller; -} - -static const char* disabled_actions_for_app_mode[] = { "FileOpen", - "FileNewWindow", - "FileNewWindowIncognito", - "FileSaveAs", - "FileSaveAsApplication", - "ViewEncoding", - "ViewPageSource", - "FileBookmarkPage", - "EditBookmarks", - "EditHistory", - "EditPreferences"}; +setup_location_controller (EphyWindow *window, + EphyToolbar *toolbar) +{ + EphyLocationController *location_controller; + + location_controller = + g_object_new (EPHY_TYPE_LOCATION_CONTROLLER, + "window", window, + "location-entry", ephy_toolbar_get_location_entry (toolbar), + "title-box", ephy_toolbar_get_title_box (toolbar), + NULL); + g_signal_connect (location_controller, "notify::address", + G_CALLBACK (sync_user_input_cb), window); + g_signal_connect_swapped (location_controller, "open-link", + G_CALLBACK (ephy_link_open), window); + g_signal_connect (location_controller, "lock-clicked", + G_CALLBACK (location_controller_lock_clicked_cb), window); + + return location_controller; +} + +static const char *disabled_actions_for_app_mode[] = { "FileOpen", + "FileNewWindow", + "FileNewWindowIncognito", + "FileSaveAs", + "FileSaveAsApplication", + "ViewEncoding", + "ViewPageSource", + "FileBookmarkPage", + "EditBookmarks", + "EditHistory", + "EditPreferences" }; static void parse_css_error (GtkCssProvider *provider, - GtkCssSection *section, - GError *error, - gpointer user_data) -{ - g_warning ("CSS error in section beginning line %u at offset %u:\n %s", - gtk_css_section_get_start_line (section) + 1, - gtk_css_section_get_start_position (section), - error->message); -} - -static const gchar* app_actions[] = { - "FileNewWindow", - "FileNewWindowIncognito", - "EditPreferences", - "EditBookmarks", - "EditHistory", - "FileQuit", - "HelpContents", - "HelpAbout" + GtkCssSection *section, + GError *error, + gpointer user_data) +{ + g_warning ("CSS error in section beginning line %u at offset %u:\n %s", + gtk_css_section_get_start_line (section) + 1, + gtk_css_section_get_start_position (section), + error->message); +} + +static const gchar *app_actions[] = { + "FileNewWindow", + "FileNewWindowIncognito", + "EditPreferences", + "EditBookmarks", + "EditHistory", + "FileQuit", + "HelpContents", + "HelpAbout" }; static void ephy_window_toggle_visibility_for_app_menu (EphyWindow *window) { - const gchar *action_name; - gboolean shows_app_menu; - GtkSettings *settings; - GtkAction *action; - guint i; + const gchar *action_name; + gboolean shows_app_menu; + GtkSettings *settings; + GtkAction *action; + guint i; - settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))); - g_object_get (settings, - "gtk-shell-shows-app-menu", &shows_app_menu, - NULL); + settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))); + g_object_get (settings, + "gtk-shell-shows-app-menu", &shows_app_menu, + NULL); - for (i = 0; i < G_N_ELEMENTS (app_actions); i++) { - action_name = app_actions[i]; - action = gtk_action_group_get_action (window->action_group, action_name); + for (i = 0; i < G_N_ELEMENTS (app_actions); i++) { + action_name = app_actions[i]; + action = gtk_action_group_get_action (window->action_group, action_name); - gtk_action_set_visible (action, !shows_app_menu); - } + gtk_action_set_visible (action, !shows_app_menu); + } } static GObject * -ephy_window_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params) -{ - GObject *object; - EphyWindow *window; - GtkSettings *settings; - GtkAction *action; - GtkActionGroup *toolbar_action_group; - GError *error = NULL; - guint settings_connection; - GtkCssProvider *css_provider; - guint i; - EphyEmbedShellMode mode; - EphyWindowChrome chrome = EPHY_WINDOW_CHROME_DEFAULT; - - object = G_OBJECT_CLASS (ephy_window_parent_class)->constructor - (type, n_construct_properties, construct_params); - - window = EPHY_WINDOW (object); - - ephy_gui_ensure_window_group (GTK_WINDOW (window)); - - /* initialize the listener for the key theme - * FIXME: Need to handle multi-head and migration. - */ - settings = gtk_settings_get_default (); - settings_connection = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (settings), - SETTINGS_CONNECTION_DATA_KEY)); - if (settings_connection == 0) - { - settings_connection = - g_signal_connect (settings, "notify::gtk-key-theme-name", - G_CALLBACK (settings_changed_cb), NULL); - g_object_set_data (G_OBJECT (settings), SETTINGS_CONNECTION_DATA_KEY, - GUINT_TO_POINTER (settings_connection)); - - } - - settings_change_notify (settings, window); - - /* Setup the UI manager and connect verbs */ - setup_ui_manager (window); - setup_tab_accels (window); - - window->notebook = setup_notebook (window); - - /* Now load the UI definition (needed by EphyToolbar). */ - gtk_ui_manager_add_ui_from_resource (window->manager, - "/org/gnome/epiphany/epiphany-ui.xml", - &error); - if (error != NULL) - { - g_warning ("Could not merge epiphany-ui.xml: %s", error->message); - g_error_free (error); - error = NULL; - } - - /* Setup the toolbar. */ - window->toolbar = setup_toolbar (window); - window->location_controller = setup_location_controller (window, EPHY_TOOLBAR (window->toolbar)); - gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (window->notebook)); - gtk_widget_show (GTK_WIDGET (window->notebook)); - - /* Attach the CSS provider to the window. */ - css_provider = gtk_css_provider_new (); - g_signal_connect (css_provider, - "parsing-error", - G_CALLBACK (parse_css_error), window); - gtk_css_provider_load_from_resource (css_provider, "/org/gnome/epiphany/epiphany.css"); - gtk_style_context_add_provider_for_screen (gtk_widget_get_screen (GTK_WIDGET (window)), - GTK_STYLE_PROVIDER (css_provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - g_object_unref (css_provider); - - /* Initialize the menus */ - ephy_bookmarks_ui_attach_window (window); - - /* other notifiers */ - action = gtk_action_group_get_action (window->action_group, - "BrowseWithCaret"); - - g_settings_bind (EPHY_SETTINGS_MAIN, - EPHY_PREFS_ENABLE_CARET_BROWSING, - action, "active", - G_SETTINGS_BIND_GET); - - g_signal_connect (EPHY_SETTINGS_WEB, - "changed::" EPHY_PREFS_WEB_ENABLE_POPUPS, - G_CALLBACK (allow_popups_notifier), window); - - /* Disable actions not needed for popup mode. */ - toolbar_action_group = window->toolbar_action_group; - action = gtk_action_group_get_action (toolbar_action_group, "FileNewTab"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, - window->is_popup); - - action = gtk_action_group_get_action (window->popups_action_group, "OpenLinkInNewTab"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, - window->is_popup); - - /* Disabled actions not needed for application mode. */ - mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()); - if (mode == EPHY_EMBED_SHELL_MODE_APPLICATION) - { - g_object_set (window->location_controller, "editable", FALSE, NULL); - - /* We don't need to show the page menu in web application mode. */ - action = gtk_action_group_get_action (toolbar_action_group, "PageMenu"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); - gtk_action_set_visible (action, FALSE); - - action = gtk_action_group_get_action (toolbar_action_group, "FileNewTab"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, - TRUE); - gtk_action_set_visible (action, FALSE); - - action = gtk_action_group_get_action (window->popups_action_group, "ContextBookmarkPage"); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); - gtk_action_set_visible (action, FALSE); - - for (i = 0; i < G_N_ELEMENTS (disabled_actions_for_app_mode); i++) - { - action = gtk_action_group_get_action (window->action_group, - disabled_actions_for_app_mode[i]); - ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); - gtk_action_set_visible (action, FALSE); - } - chrome &= ~(EPHY_WINDOW_CHROME_MENU | EPHY_WINDOW_CHROME_TABSBAR); - } - - /* We never want the menubar shown, we merge the app menu into - * our super menu manually when running outside the Shell. */ - gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (window), FALSE); - - ephy_window_toggle_visibility_for_app_menu (window); - window->app_menu_visibility_handler = g_signal_connect_swapped (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))), - "notify::gtk-shell-shows-app-menu", - G_CALLBACK (ephy_window_toggle_visibility_for_app_menu), window); - - /* ensure the UI is updated */ - gtk_ui_manager_ensure_update (window->manager); - - init_menu_updaters (window); - - ephy_window_set_chrome (window, chrome); - - return object; +ephy_window_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + EphyWindow *window; + GtkSettings *settings; + GtkAction *action; + GtkActionGroup *toolbar_action_group; + GError *error = NULL; + guint settings_connection; + GtkCssProvider *css_provider; + guint i; + EphyEmbedShellMode mode; + EphyWindowChrome chrome = EPHY_WINDOW_CHROME_DEFAULT; + + object = G_OBJECT_CLASS (ephy_window_parent_class)->constructor + (type, n_construct_properties, construct_params); + + window = EPHY_WINDOW (object); + + ephy_gui_ensure_window_group (GTK_WINDOW (window)); + + /* initialize the listener for the key theme + * FIXME: Need to handle multi-head and migration. + */ + settings = gtk_settings_get_default (); + settings_connection = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (settings), + SETTINGS_CONNECTION_DATA_KEY)); + if (settings_connection == 0) { + settings_connection = + g_signal_connect (settings, "notify::gtk-key-theme-name", + G_CALLBACK (settings_changed_cb), NULL); + g_object_set_data (G_OBJECT (settings), SETTINGS_CONNECTION_DATA_KEY, + GUINT_TO_POINTER (settings_connection)); + } + + settings_change_notify (settings, window); + + /* Setup the UI manager and connect verbs */ + setup_ui_manager (window); + setup_tab_accels (window); + + window->notebook = setup_notebook (window); + + /* Now load the UI definition (needed by EphyToolbar). */ + gtk_ui_manager_add_ui_from_resource (window->manager, + "/org/gnome/epiphany/epiphany-ui.xml", + &error); + if (error != NULL) { + g_warning ("Could not merge epiphany-ui.xml: %s", error->message); + g_error_free (error); + error = NULL; + } + + /* Setup the toolbar. */ + window->toolbar = setup_toolbar (window); + window->location_controller = setup_location_controller (window, EPHY_TOOLBAR (window->toolbar)); + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (window->notebook)); + gtk_widget_show (GTK_WIDGET (window->notebook)); + + /* Attach the CSS provider to the window. */ + css_provider = gtk_css_provider_new (); + g_signal_connect (css_provider, + "parsing-error", + G_CALLBACK (parse_css_error), window); + gtk_css_provider_load_from_resource (css_provider, "/org/gnome/epiphany/epiphany.css"); + gtk_style_context_add_provider_for_screen (gtk_widget_get_screen (GTK_WIDGET (window)), + GTK_STYLE_PROVIDER (css_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + g_object_unref (css_provider); + + /* Initialize the menus */ + ephy_bookmarks_ui_attach_window (window); + + /* other notifiers */ + action = gtk_action_group_get_action (window->action_group, + "BrowseWithCaret"); + + g_settings_bind (EPHY_SETTINGS_MAIN, + EPHY_PREFS_ENABLE_CARET_BROWSING, + action, "active", + G_SETTINGS_BIND_GET); + + g_signal_connect (EPHY_SETTINGS_WEB, + "changed::" EPHY_PREFS_WEB_ENABLE_POPUPS, + G_CALLBACK (allow_popups_notifier), window); + + /* Disable actions not needed for popup mode. */ + toolbar_action_group = window->toolbar_action_group; + action = gtk_action_group_get_action (toolbar_action_group, "FileNewTab"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, + window->is_popup); + + action = gtk_action_group_get_action (window->popups_action_group, "OpenLinkInNewTab"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, + window->is_popup); + + /* Disabled actions not needed for application mode. */ + mode = ephy_embed_shell_get_mode (ephy_embed_shell_get_default ()); + if (mode == EPHY_EMBED_SHELL_MODE_APPLICATION) { + g_object_set (window->location_controller, "editable", FALSE, NULL); + + /* We don't need to show the page menu in web application mode. */ + action = gtk_action_group_get_action (toolbar_action_group, "PageMenu"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); + gtk_action_set_visible (action, FALSE); + + action = gtk_action_group_get_action (toolbar_action_group, "FileNewTab"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, + TRUE); + gtk_action_set_visible (action, FALSE); + + action = gtk_action_group_get_action (window->popups_action_group, "ContextBookmarkPage"); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); + gtk_action_set_visible (action, FALSE); + + for (i = 0; i < G_N_ELEMENTS (disabled_actions_for_app_mode); i++) { + action = gtk_action_group_get_action (window->action_group, + disabled_actions_for_app_mode[i]); + ephy_action_change_sensitivity_flags (action, SENS_FLAG_CHROME, TRUE); + gtk_action_set_visible (action, FALSE); + } + chrome &= ~(EPHY_WINDOW_CHROME_MENU | EPHY_WINDOW_CHROME_TABSBAR); + } + + /* We never want the menubar shown, we merge the app menu into + * our super menu manually when running outside the Shell. */ + gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (window), FALSE); + + ephy_window_toggle_visibility_for_app_menu (window); + window->app_menu_visibility_handler = g_signal_connect_swapped (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))), + "notify::gtk-shell-shows-app-menu", + G_CALLBACK (ephy_window_toggle_visibility_for_app_menu), window); + + /* ensure the UI is updated */ + gtk_ui_manager_ensure_update (window->manager); + + init_menu_updaters (window); + + ephy_window_set_chrome (window, chrome); + + return object; } static void ephy_window_show (GtkWidget *widget) { - EphyWindow *window = EPHY_WINDOW (widget); + EphyWindow *window = EPHY_WINDOW (widget); - if (!window->has_size) - { - EphyEmbed *embed; - int flags = 0; + if (!window->has_size) { + EphyEmbed *embed; + int flags = 0; - embed = window->active_embed; - g_return_if_fail (EPHY_IS_EMBED (embed)); + embed = window->active_embed; + g_return_if_fail (EPHY_IS_EMBED (embed)); - if (!window->is_popup) - flags = EPHY_INITIAL_STATE_WINDOW_SAVE_SIZE; + if (!window->is_popup) + flags = EPHY_INITIAL_STATE_WINDOW_SAVE_SIZE; - ephy_initial_state_add_window (widget, "main_window", 600, 500, - TRUE, flags); - window->has_size = TRUE; - } + ephy_initial_state_add_window (widget, "main_window", 600, 500, + TRUE, flags); + window->has_size = TRUE; + } - GTK_WIDGET_CLASS (ephy_window_parent_class)->show (widget); + GTK_WIDGET_CLASS (ephy_window_parent_class)->show (widget); } static void ephy_window_class_init (EphyWindowClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - object_class->constructor = ephy_window_constructor; - object_class->dispose = ephy_window_dispose; - object_class->finalize = ephy_window_finalize; - object_class->get_property = ephy_window_get_property; - object_class->set_property = ephy_window_set_property; + object_class->constructor = ephy_window_constructor; + object_class->dispose = ephy_window_dispose; + object_class->finalize = ephy_window_finalize; + object_class->get_property = ephy_window_get_property; + object_class->set_property = ephy_window_set_property; - widget_class->show = ephy_window_show; - widget_class->key_press_event = ephy_window_key_press_event; - widget_class->window_state_event = ephy_window_state_event; - widget_class->delete_event = ephy_window_delete_event; + widget_class->show = ephy_window_show; + widget_class->key_press_event = ephy_window_key_press_event; + widget_class->window_state_event = ephy_window_state_event; + widget_class->delete_event = ephy_window_delete_event; - g_object_class_override_property (object_class, - PROP_ACTIVE_CHILD, - "active-child"); + g_object_class_override_property (object_class, + PROP_ACTIVE_CHILD, + "active-child"); - g_object_class_override_property (object_class, - PROP_SINGLE_TAB_MODE, - "is-popup"); + g_object_class_override_property (object_class, + PROP_SINGLE_TAB_MODE, + "is-popup"); - g_object_class_install_property (object_class, - PROP_CHROME, - g_param_spec_flags ("chrome", - NULL, - NULL, - EPHY_TYPE_WINDOW_CHROME, - EPHY_WINDOW_CHROME_DEFAULT, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_CHROME, + g_param_spec_flags ("chrome", + NULL, + NULL, + EPHY_TYPE_WINDOW_CHROME, + EPHY_WINDOW_CHROME_DEFAULT, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); } static void ephy_window_init (EphyWindow *window) { - LOG ("EphyWindow initialising %p", window); + LOG ("EphyWindow initialising %p", window); } /** @@ -3484,10 +3336,10 @@ ephy_window_init (EphyWindow *window) EphyWindow * ephy_window_new (void) { - return g_object_new (EPHY_TYPE_WINDOW, - "application", GTK_APPLICATION (ephy_shell_get_default ()), - "icon-name", "web-browser", - NULL); + return g_object_new (EPHY_TYPE_WINDOW, + "application", GTK_APPLICATION (ephy_shell_get_default ()), + "icon-name", "web-browser", + NULL); } /** @@ -3501,9 +3353,9 @@ ephy_window_new (void) GtkUIManager * ephy_window_get_ui_manager (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return window->manager; + return window->manager; } /** @@ -3517,9 +3369,9 @@ ephy_window_get_ui_manager (EphyWindow *window) GtkWidget * ephy_window_get_notebook (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return GTK_WIDGET (window->notebook); + return GTK_WIDGET (window->notebook); } /** @@ -3533,9 +3385,9 @@ ephy_window_get_notebook (EphyWindow *window) GtkWidget * ephy_window_get_current_find_toolbar (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return GTK_WIDGET (ephy_embed_get_find_toolbar (window->active_embed)); + return GTK_WIDGET (ephy_embed_get_find_toolbar (window->active_embed)); } /** @@ -3550,11 +3402,11 @@ ephy_window_get_current_find_toolbar (EphyWindow *window) **/ void ephy_window_load_url (EphyWindow *window, - const char *url) + const char *url) { - g_return_if_fail (url != NULL); + g_return_if_fail (url != NULL); - ephy_link_open (EPHY_LINK (window), url, NULL, 0); + ephy_link_open (EPHY_LINK (window), url, NULL, 0); } /** @@ -3566,16 +3418,16 @@ ephy_window_load_url (EphyWindow *window, void ephy_window_activate_location (EphyWindow *window) { - GtkWidget *entry; + GtkWidget *entry; - if (!(window->chrome & EPHY_WINDOW_CHROME_LOCATION)) - return; + if (!(window->chrome & EPHY_WINDOW_CHROME_LOCATION)) + return; - ephy_title_box_set_mode (ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)), - EPHY_TITLE_BOX_MODE_LOCATION_ENTRY); + ephy_title_box_set_mode (ephy_toolbar_get_title_box (EPHY_TOOLBAR (window->toolbar)), + EPHY_TITLE_BOX_MODE_LOCATION_ENTRY); - entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); - ephy_location_entry_activate (EPHY_LOCATION_ENTRY (entry)); + entry = ephy_toolbar_get_location_entry (EPHY_TOOLBAR (window->toolbar)); + ephy_location_entry_activate (EPHY_LOCATION_ENTRY (entry)); } /** @@ -3588,58 +3440,51 @@ ephy_window_activate_location (EphyWindow *window) **/ void ephy_window_set_zoom (EphyWindow *window, - float zoom) + float zoom) { - EphyEmbed *embed; - double current_zoom = 1.0; - WebKitWebView *web_view; + EphyEmbed *embed; + double current_zoom = 1.0; + WebKitWebView *web_view; - g_return_if_fail (EPHY_IS_WINDOW (window)); + g_return_if_fail (EPHY_IS_WINDOW (window)); - embed = window->active_embed; - g_return_if_fail (embed != NULL); + embed = window->active_embed; + g_return_if_fail (embed != NULL); - web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); + web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed); - current_zoom = webkit_web_view_get_zoom_level (web_view); + current_zoom = webkit_web_view_get_zoom_level (web_view); - if (zoom == ZOOM_IN) - { - zoom = ephy_zoom_get_changed_zoom_level (current_zoom, 1); - } - else if (zoom == ZOOM_OUT) - { - zoom = ephy_zoom_get_changed_zoom_level (current_zoom, -1); - } + if (zoom == ZOOM_IN) { + zoom = ephy_zoom_get_changed_zoom_level (current_zoom, 1); + } else if (zoom == ZOOM_OUT) { + zoom = ephy_zoom_get_changed_zoom_level (current_zoom, -1); + } - if (zoom != current_zoom) - { - webkit_web_view_set_zoom_level (web_view, zoom); - } + if (zoom != current_zoom) { + webkit_web_view_set_zoom_level (web_view, zoom); + } } static void -ephy_window_view_popup_windows_cb (GtkAction *action, - EphyWindow *window) +ephy_window_view_popup_windows_cb (GtkAction *action, + EphyWindow *window) { - EphyEmbed *embed; - gboolean allow; + EphyEmbed *embed; + gboolean allow; - g_return_if_fail (EPHY_IS_WINDOW (window)); + g_return_if_fail (EPHY_IS_WINDOW (window)); - embed = window->active_embed; - g_return_if_fail (EPHY_IS_EMBED (embed)); + embed = window->active_embed; + g_return_if_fail (EPHY_IS_EMBED (embed)); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) - { - allow = TRUE; - } - else - { - allow = FALSE; - } + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { + allow = TRUE; + } else { + allow = FALSE; + } - g_object_set (G_OBJECT (ephy_embed_get_web_view (embed)), "popups-allowed", allow, NULL); + g_object_set (G_OBJECT (ephy_embed_get_web_view (embed)), "popups-allowed", allow, NULL); } /** @@ -3654,9 +3499,9 @@ ephy_window_view_popup_windows_cb (GtkAction *action, EphyEmbedEvent * ephy_window_get_context_event (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return window->context_event; + return window->context_event; } /** @@ -3670,7 +3515,7 @@ ephy_window_get_context_event (EphyWindow *window) const char * ephy_window_get_location (EphyWindow *window) { - return ephy_location_controller_get_address (window->location_controller); + return ephy_location_controller_get_address (window->location_controller); } /** @@ -3682,46 +3527,46 @@ ephy_window_get_location (EphyWindow *window) **/ void ephy_window_set_location (EphyWindow *window, - const char *address) + const char *address) { - if (window->updating_address) return; + if (window->updating_address) return; - window->updating_address = TRUE; - ephy_location_controller_set_address (window->location_controller, address); - window->updating_address = FALSE; + window->updating_address = TRUE; + ephy_location_controller_set_address (window->location_controller, address); + window->updating_address = FALSE; } /** * ephy_window_get_toolbar_action_group: * @window: an #EphyWindow - * + * * Returns the toolbar #GtkActionGroup for this @window - * + * * Returns: (transfer none): the #GtkActionGroup for this @window's * toolbar actions **/ GtkActionGroup * ephy_window_get_toolbar_action_group (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return window->toolbar_action_group; + return window->toolbar_action_group; } /** * ephy_window_get_location_controller: * @window: an #EphyWindow - * + * * Returns the @window #EphyLocationController - * + * * Returns: (transfer none): the @window #EphyLocationController **/ EphyLocationController * ephy_window_get_location_controller (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); + g_return_val_if_fail (EPHY_IS_WINDOW (window), NULL); - return window->location_controller; + return window->location_controller; } /** @@ -3735,119 +3580,116 @@ ephy_window_get_location_controller (EphyWindow *window) gboolean ephy_window_is_on_current_workspace (EphyWindow *window) { - GdkWindow *gdk_window = NULL; - WnckWorkspace *workspace = NULL; - WnckWindow *wnck_window = NULL; + GdkWindow *gdk_window = NULL; + WnckWorkspace *workspace = NULL; + WnckWindow *wnck_window = NULL; - if (!gtk_widget_get_realized (GTK_WIDGET (window))) - return TRUE; + if (!gtk_widget_get_realized (GTK_WIDGET (window))) + return TRUE; - gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); + gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); - if(!GDK_IS_X11_WINDOW (gdk_window)) - return TRUE; + if (!GDK_IS_X11_WINDOW (gdk_window)) + return TRUE; - workspace = wnck_screen_get_active_workspace (wnck_screen_get_default ()); + workspace = wnck_screen_get_active_workspace (wnck_screen_get_default ()); - /* From WNCK docs: - * "May return NULL sometimes, if libwnck is in a weird state due to - * the asynchronous nature of the interaction with the window manager." - * In such a case we cannot really check, so assume we are. - */ - if (!workspace) - return TRUE; + /* From WNCK docs: + * "May return NULL sometimes, if libwnck is in a weird state due to + * the asynchronous nature of the interaction with the window manager." + * In such a case we cannot really check, so assume we are. + */ + if (!workspace) + return TRUE; - wnck_window = wnck_window_get (GDK_WINDOW_XID (gdk_window)); + wnck_window = wnck_window_get (GDK_WINDOW_XID (gdk_window)); - return wnck_window_is_on_workspace (wnck_window, workspace); + return wnck_window_is_on_workspace (wnck_window, workspace); } typedef struct { - EphyWindow *window; - GCancellable *cancellable; + EphyWindow *window; + GCancellable *cancellable; - guint embeds_to_check; - EphyEmbed *modified_embed; + guint embeds_to_check; + EphyEmbed *modified_embed; } ModifiedFormsData; static void modified_forms_data_free (ModifiedFormsData *data) { - g_object_unref (data->cancellable); + g_object_unref (data->cancellable); - g_slice_free (ModifiedFormsData, data); + g_slice_free (ModifiedFormsData, data); } static void continue_window_close_after_modified_forms_check (ModifiedFormsData *data) { - gboolean should_close; + gboolean should_close; - data->window->checking_modified_forms = FALSE; + data->window->checking_modified_forms = FALSE; - if (data->modified_embed) - { - /* jump to the first tab with modified forms */ - impl_set_active_child (EPHY_EMBED_CONTAINER (data->window), - data->modified_embed); - if (!confirm_close_with_modified_forms (data->window)) - return; - } + if (data->modified_embed) { + /* jump to the first tab with modified forms */ + impl_set_active_child (EPHY_EMBED_CONTAINER (data->window), + data->modified_embed); + if (!confirm_close_with_modified_forms (data->window)) + return; + } - data->window->force_close = TRUE; - should_close = ephy_window_close (data->window); - data->window->force_close = FALSE; - if (should_close) - gtk_widget_destroy (GTK_WIDGET (data->window)); + data->window->force_close = TRUE; + should_close = ephy_window_close (data->window); + data->window->force_close = FALSE; + if (should_close) + gtk_widget_destroy (GTK_WIDGET (data->window)); } static void -has_modified_forms_cb (EphyWebView *view, - GAsyncResult *result, - ModifiedFormsData *data) +has_modified_forms_cb (EphyWebView *view, + GAsyncResult *result, + ModifiedFormsData *data) { - gboolean has_modified_forms; + gboolean has_modified_forms; - data->embeds_to_check--; - has_modified_forms = ephy_web_view_has_modified_forms_finish (view, result, NULL); - if (has_modified_forms) - { - /* Cancel all others */ - g_cancellable_cancel (data->cancellable); - data->modified_embed = EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view); - } + data->embeds_to_check--; + has_modified_forms = ephy_web_view_has_modified_forms_finish (view, result, NULL); + if (has_modified_forms) { + /* Cancel all others */ + g_cancellable_cancel (data->cancellable); + data->modified_embed = EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view); + } - if (data->embeds_to_check > 0) - return; + if (data->embeds_to_check > 0) + return; - continue_window_close_after_modified_forms_check (data); - modified_forms_data_free (data); + continue_window_close_after_modified_forms_check (data); + modified_forms_data_free (data); } static void ephy_window_check_modified_forms (EphyWindow *window) { - GList *tabs, *l; - ModifiedFormsData *data; + GList *tabs, *l; + ModifiedFormsData *data; - window->checking_modified_forms = TRUE; + window->checking_modified_forms = TRUE; - data = g_slice_new0 (ModifiedFormsData); - data->window = window; - data->cancellable = g_cancellable_new (); - data->embeds_to_check = gtk_notebook_get_n_pages (window->notebook); + data = g_slice_new0 (ModifiedFormsData); + data->window = window; + data->cancellable = g_cancellable_new (); + data->embeds_to_check = gtk_notebook_get_n_pages (window->notebook); - tabs = impl_get_children (EPHY_EMBED_CONTAINER (window)); - for (l = tabs; l != NULL; l = l->next) - { - EphyEmbed *embed = (EphyEmbed *) l->data; + tabs = impl_get_children (EPHY_EMBED_CONTAINER (window)); + for (l = tabs; l != NULL; l = l->next) { + EphyEmbed *embed = (EphyEmbed *)l->data; - ephy_web_view_has_modified_forms (ephy_embed_get_web_view (embed), - data->cancellable, - (GAsyncReadyCallback)has_modified_forms_cb, - data); - } - g_list_free (tabs); + ephy_web_view_has_modified_forms (ephy_embed_get_web_view (embed), + data->cancellable, + (GAsyncReadyCallback)has_modified_forms_cb, + data); + } + g_list_free (tabs); } /** @@ -3863,51 +3705,48 @@ ephy_window_check_modified_forms (EphyWindow *window) gboolean ephy_window_close (EphyWindow *window) { - /* We ignore the delete_event if the disable_quit lockdown has been set - */ - if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, - EPHY_PREFS_LOCKDOWN_QUIT)) return FALSE; - - if (window->checking_modified_forms) { - /* stop window close */ - return FALSE; - } - - if (!window->force_close && - g_settings_get_boolean (EPHY_SETTINGS_MAIN, - EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA) && - gtk_notebook_get_n_pages (window->notebook) > 0) - { - ephy_window_check_modified_forms (window); - /* stop window close */ - return FALSE; - } - - /* If this is the last window, check ongoing downloads and save its state in the session. */ - if (ephy_shell_get_n_windows (ephy_shell_get_default ()) == 1) - { - EphyDownloadsManager *manager = ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())); - - if (ephy_downloads_manager_has_active_downloads (manager) && - !confirm_close_with_downloads (window)) - { - /* stop window close */ - return FALSE; - } + /* We ignore the delete_event if the disable_quit lockdown has been set + */ + if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN, + EPHY_PREFS_LOCKDOWN_QUIT)) return FALSE; + + if (window->checking_modified_forms) { + /* stop window close */ + return FALSE; + } + + if (!window->force_close && + g_settings_get_boolean (EPHY_SETTINGS_MAIN, + EPHY_PREFS_WARN_ON_CLOSE_UNSUBMITTED_DATA) && + gtk_notebook_get_n_pages (window->notebook) > 0) { + ephy_window_check_modified_forms (window); + /* stop window close */ + return FALSE; + } + + /* If this is the last window, check ongoing downloads and save its state in the session. */ + if (ephy_shell_get_n_windows (ephy_shell_get_default ()) == 1) { + EphyDownloadsManager *manager = ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ())); + + if (ephy_downloads_manager_has_active_downloads (manager) && + !confirm_close_with_downloads (window)) { + /* stop window close */ + return FALSE; + } - ephy_session_close (ephy_shell_get_session (ephy_shell_get_default ())); - } + ephy_session_close (ephy_shell_get_session (ephy_shell_get_default ())); + } - /* See bug #114689 */ - gtk_widget_hide (GTK_WIDGET (window)); + /* See bug #114689 */ + gtk_widget_hide (GTK_WIDGET (window)); - return TRUE; + return TRUE; } EphyWindowChrome ephy_window_get_chrome (EphyWindow *window) { - g_return_val_if_fail (EPHY_IS_WINDOW (window), EPHY_WINDOW_CHROME_DEFAULT); + g_return_val_if_fail (EPHY_IS_WINDOW (window), EPHY_WINDOW_CHROME_DEFAULT); - return window->chrome; + return window->chrome; } |