/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright © 2000, 2001, 2002, 2003, 2004 Marco Pesenti Gritti
* Copyright © 2003, 2004 Christian Persch
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
*/
#include "config.h"
#include "ephy-window.h"
#include "ephy-type-builtins.h"
#include "ephy-embed-type-builtins.h"
#include "ephy-command-manager.h"
#include "ephy-state.h"
#include "ppview-toolbar.h"
#include "window-commands.h"
#include "ephy-embed-shell.h"
#include "ephy-embed-single.h"
#include "ephy-shell.h"
#include "eel-gconf-extensions.h"
#include "ephy-prefs.h"
#include "ephy-embed-prefs.h"
#include "ephy-zoom.h"
#include "ephy-debug.h"
#include "ephy-file-helpers.h"
#include "ephy-statusbar.h"
#include "egg-editable-toolbar.h"
#include "ephy-toolbar.h"
#include "popup-commands.h"
#include "ephy-encoding-menu.h"
#include "ephy-tabs-menu.h"
#include "ephy-stock-icons.h"
#include "ephy-extension.h"
#include "ephy-bookmarks-ui.h"
#include "ephy-link.h"
#include "ephy-gui.h"
#include "ephy-notebook.h"
#include "ephy-fullscreen-popup.h"
#include "ephy-action-helper.h"
#include "ephy-find-toolbar.h"
#include <string.h>
#include <glib/gi18n.h>
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomeui/gnome-stock-icons.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkactiongroup.h>
#include <gtk/gtktoggleaction.h>
#include <gtk/gtkuimanager.h>
#include <gtk/gtktoggleaction.h>
#include <gtk/gtkdialog.h>
#include <gtk/gtkmessagedialog.h>
#ifdef HAVE_X11_XF86KEYSYM_H
#include <X11/XF86keysym.h>
#endif
#ifdef ENABLE_PYTHON
#include "ephy-python.h"
#endif
static void ephy_window_class_init (EphyWindowClass *klass);
static void ephy_window_link_iface_init (EphyLinkIface *iface);
static void ephy_window_init (EphyWindow *gs);
static GObject *ephy_window_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_params);
static void ephy_window_finalize (GObject *object);
static void ephy_window_show (GtkWidget *widget);
static EphyTab *ephy_window_open_link (EphyLink *link,
const char *address,
EphyTab *tab,
EphyLinkFlags flags);
static void notebook_switch_page_cb (GtkNotebook *notebook,
GtkNotebookPage *page,
guint page_num,
EphyWindow *window);
static void ephy_window_view_statusbar_cb (GtkAction *action,
EphyWindow *window);
static void ephy_window_view_toolbar_cb (GtkAction *action,
EphyWindow *window);
static void ephy_window_view_popup_windows_cb (GtkAction *action,
EphyWindow *window);
static void sync_tab_load_status (EphyTab *tab,
GParamSpec *pspec,
EphyWindow *window);
static void sync_tab_security (EphyTab *tab,
GParamSpec *pspec,
EphyWindow *window);
static void sync_tab_zoom (EphyTab *tab,
GParamSpec *pspec,
EphyWindow *window);
static const GtkActionEntry ephy_menu_entries [] = {
/* Toplevel */
{ "File", NULL, N_("_File") },
{ "Edit", NULL, N_("_Edit") },
{ "View", NULL, N_("_View") },
{ "Bookmarks", NULL, N_("_Bookmarks") },
{ "Go", NULL, N_("_Go") },
{ "Tools", NULL, N_("T_ools") },
{ "Tabs", NULL, N_("_Tabs") },
{ "Help", NULL, N_("_Help") },
{ "Toolbar", NULL, N_("_Toolbars") },
{ "PopupAction", NULL, "" },
{ "NotebookPopupAction", NULL, "" },
/* File menu */
{ "FileOpen", GTK_STOCK_OPEN, N_("_Open..."), "<control>O",
N_("Open a file"),
G_CALLBACK (window_cmd_file_open) },
{ "FileSaveAs", GTK_STOCK_SAVE_AS, N_("Save _As..."), "<shift><control>S",
N_("Save the current page"),
G_CALLBACK (window_cmd_file_save_as) },
{ "FilePrintSetup", STOCK_PRINT_SETUP, N_("Print Set_up..."), NULL,
N_("Setup the page settings for printing"),
G_CALLBACK (window_cmd_file_print_setup) },
{ "FilePrintPreview", GTK_STOCK_PRINT_PREVIEW, N_("Print Pre_view"),"<control><shift>P",
N_("Print preview"),
G_CALLBACK (window_cmd_file_print_preview) },
{ "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
N_("Print the current page"),
G_CALLBACK (window_cmd_file_print) },
{ "FileSendTo", STOCK_SEND_MAIL, N_("S_end Link by Email..."), NULL,
N_("Send a link of the current page"),
G_CALLBACK (window_cmd_file_send_to) },
{ "FileCloseTab", GTK_STOCK_CLOSE, N_("_Close"), "<control>W",
N_("Close this tab"),
G_CALLBACK (window_cmd_file_close_window) },
/* Edit menu */
{ "EditUndo", GTK_STOCK_UNDO, N_("_Undo"), "<control>Z",
N_("Undo the last action"),
G_CALLBACK (window_cmd_edit_undo) },
{ "EditRedo", GTK_STOCK_REDO, N_("Re_do"), "<shift><control>Z",
N_("Redo the last undone action"),
G_CALLBACK (window_cmd_edit_redo) },
{ "EditCut", GTK_STOCK_CUT, N_("Cu_t"), "<control>X",
N_("Cut the selection"),
G_CALLBACK (window_cmd_edit_cut) },
{ "EditCopy", GTK_STOCK_COPY, N_("_Copy"), "<control>C",
N_("Copy the selection"),
G_CALLBACK (window_cmd_edit_copy) },
{ "EditPaste", GTK_STOCK_PASTE, N_("_Paste"), "<control>V",
N_("Paste clipboard"),
G_CALLBACK (window_cmd_edit_paste) },
{ "EditDelete", GTK_STOCK_DELETE, NULL, NULL,
N_("Delete text"),
G_CALLBACK (window_cmd_edit_delete) },
{ "EditSelectAll", NULL, N_("Select _All"), "<control>A",
N_("Select the entire page"),
G_CALLBACK (window_cmd_edit_select_all) },
{ "EditFind", GTK_STOCK_FIND, N_("_Find..."), "<control>F",
N_("Find a word or phrase in the page"),
G_CALLBACK (window_cmd_edit_find) },
{ "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G",
N_("Find next occurrence of the word or phrase"),
G_CALLBACK (window_cmd_edit_find_next) },
{ "EditFindPrev", NULL, N_("Find Pre_vious"), "<shift><control>G",
N_("Find previous occurrence of the word or phrase"),
G_CALLBACK (window_cmd_edit_find_prev) },
{ "EditPersonalData", NULL, N_("P_ersonal Data"), NULL,
N_("View and remove cookies and passwords"),
G_CALLBACK (window_cmd_edit_personal_data) },
#ifdef ENABLE_CERTIFICATE_MANAGER
{ "EditCertificates", NULL, N_("Certificate_s"), NULL,
N_("Manage Certificates"),
G_CALLBACK (window_cmd_edit_certificates) },
#endif
{ "EditPrefs", GTK_STOCK_PREFERENCES, N_("P_references"), NULL,
N_("Configure the web browser"),
G_CALLBACK (window_cmd_edit_prefs) },
/* View menu */
{ "ViewToolbarEditor", NULL, N_("_Customize Toolbars..."), NULL,
N_("Customize toolbars"),
G_CALLBACK (window_cmd_edit_toolbar) },
{ "ViewStop", GTK_STOCK_STOP, N_("_Stop"), "Escape",
N_("Stop current data transfer"),
G_CALLBACK (window_cmd_view_stop) },
{ "ViewAlwaysStop", GTK_STOCK_STOP, N_("_Stop"), "Escape",
NULL, G_CALLBACK (window_cmd_view_stop) },
{ "ViewReload", GTK_STOCK_REFRESH, N_("_Reload"), "<control>R",
N_("Display the latest content of the current page"),
G_CALLBACK (window_cmd_view_reload) },
{ "ViewZoomIn", GTK_STOCK_ZOOM_IN, N_("_Larger Text"), "<control>plus",
N_("Increase the text size"),
G_CALLBACK (window_cmd_view_zoom_in) },
{ "ViewZoomOut", GTK_STOCK_ZOOM_OUT, N_("S_maller Text"), "<control>minus",
N_("Decrease the text size"),
G_CALLBACK (window_cmd_view_zoom_out) },
{ "ViewZoomNormal", GTK_STOCK_ZOOM_100, N_("_Normal Size"), "<control>0",
N_("Use the normal text size"),
G_CALLBACK (window_cmd_view_zoom_normal) },
{ "ViewEncoding", NULL, N_("Text _Encoding"), NULL,
N_("Change the text encoding"),
NULL },
{ "ViewPageSource", STOCK_VIEW_SOURCE, N_("_Page Source"), "<control>U",
N_("View the source code of the page"),
G_CALLBACK (window_cmd_view_page_source) },
{ "ViewPageSecurityInfo", NULL, N_("Page _Security Information..."), NULL,
N_("Display security information for the web page"),
G_CALLBACK (window_cmd_view_page_security_info) },
/* Bookmarks menu */
{ "FileBookmarkPage", STOCK_ADD_BOOKMARK, N_("_Add Bookmark..."), "<control>D",
N_("Add a bookmark for the current page"),
G_CALLBACK (window_cmd_file_bookmark_page) },
{ "GoBookmarks", EPHY_STOCK_BOOKMARKS, N_("_Edit Bookmarks"), "<control>B",
N_("Open the bookmarks window"),
G_CALLBACK (window_cmd_go_bookmarks) },
/* Go menu */
{ "GoLocation", NULL, N_("_Location..."), "<control>L",
N_("Go to a specified location"),
G_CALLBACK (window_cmd_go_location) },
{ "GoHistory", EPHY_STOCK_HISTORY, N_("Hi_story"), "<control>H",
N_("Open the history window"),
G_CALLBACK (window_cmd_go_history) },
/* Tabs menu */
{ "TabsPrevious", NULL, N_("_Previous Tab"), "<control>Page_Up",
N_("Activate previous tab"),
G_CALLBACK (window_cmd_tabs_previous) },
{ "TabsNext", NULL, N_("_Next Tab"), "<control>Page_Down",
N_("Activate next tab"),
G_CALLBACK (window_cmd_tabs_next) },
{ "TabsMoveLeft", NULL, N_("Move Tab _Left"), "<shift><control>Page_Up",
N_("Move current tab to left"),
G_CALLBACK (window_cmd_tabs_move_left) },
{ "TabsMoveRight", NULL, N_("Move Tab _Right"), "<shift><control>Page_Down",
N_("Move current tab to right"),
G_CALLBACK (window_cmd_tabs_move_right) },
/* Help menu */
{"HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1",
N_("Display web browser help"),
G_CALLBACK (window_cmd_help_contents) },
{ "HelpAbout", GNOME_STOCK_ABOUT, N_("_About"), NULL,
N_("Display credits for the web browser creators"),
G_CALLBACK (window_cmd_help_about) },
};
static const GtkToggleActionEntry ephy_menu_toggle_entries [] =
{
/* File Menu */
{ "FileWorkOffline", NULL, N_("_Work Offline"), NULL,
N_("Switch to offline mode"),
G_CALLBACK (window_cmd_file_work_offline), FALSE },
/* View Menu */
{ "ViewToolbar", NULL, N_("_Hide Toolbars"), NULL,
N_("Show or hide toolbar"),
G_CALLBACK (ephy_window_view_toolbar_cb), FALSE },
{ "ViewStatusbar", NULL, N_("St_atusbar"), NULL,
N_("Show or hide statusbar"),
G_CALLBACK (ephy_window_view_statusbar_cb), TRUE },
{ "ViewFullscreen", GTK_STOCK_FULLSCREEN, N_("_Fullscreen"), "F11",
N_("Browse at full screen"),
G_CALLBACK (window_cmd_view_fullscreen), FALSE },
{ "ViewPopupWindows", EPHY_STOCK_POPUPS, N_("Popup _Windows"), NULL,
N_("Show or hide unrequested popup windows from this site"),
G_CALLBACK (ephy_window_view_popup_windows_cb), FALSE },
{ "BrowseWithCaret", NULL, N_("Selection Caret"), "F7",
"",
G_CALLBACK (window_cmd_browse_with_caret), FALSE }
};
static const GtkActionEntry ephy_popups_entries [] = {
/* Document */
{ "ContextBookmarkPage", STOCK_ADD_BOOKMARK, N_("Add Boo_kmark..."), "<control>D",
N_("Add a bookmark for the current page"),
G_CALLBACK (window_cmd_file_bookmark_page) },
/* Framed document */
{ "OpenFrame", NULL, N_("Show Only _This Frame"), NULL,
N_("Show only this frame in this window"),
G_CALLBACK (popup_cmd_open_frame) },
/* Links */
{ "OpenLink", GTK_STOCK_OPEN, N_("_Open Link"), NULL,
N_("Open link in this window"),
G_CALLBACK (popup_cmd_open_link) },
{ "OpenLinkInNewWindow", NULL, N_("Open Link in New _Window"), NULL,
N_("Open link in a new window"),
G_CALLBACK (popup_cmd_link_in_new_window) },
{ "OpenLinkInNewTab", NULL, N_("Open Link in New _Tab"), NULL,
N_("Open link in a new tab"),
G_CALLBACK (popup_cmd_link_in_new_tab) },
{ "DownloadLink", EPHY_STOCK_DOWNLOAD, N_("_Download Link"), NULL,
NULL, G_CALLBACK (popup_cmd_download_link) },
{ "DownloadLinkAs", GTK_STOCK_SAVE_AS, N_("_Save Link As..."), NULL,
N_("Save link with a different name"),
G_CALLBACK (popup_cmd_download_link_as) },
{ "BookmarkLink", STOCK_ADD_BOOKMARK, N_("_Bookmark Link..."),
NULL, NULL, G_CALLBACK (popup_cmd_bookmark_link) },
{ "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL,
NULL, G_CALLBACK (popup_cmd_copy_link_address) },
/* Email links */
/* This is on the context menu on a mailto: link and opens the mail program */
{ "SendEmail", GTK_STOCK_OPEN, N_("_Send Email..."),
NULL, NULL, G_CALLBACK (popup_cmd_open_link) },
{ "CopyEmailAddress", NULL, N_("_Copy Email Address"), NULL,
NULL, G_CALLBACK (popup_cmd_copy_link_address) },
/* Images */
{ "OpenImage", GTK_STOCK_OPEN, N_("Open _Image"), NULL,
NULL, G_CALLBACK (popup_cmd_open_image) },
{ "SaveImageAs", GTK_STOCK_SAVE_AS, N_("_Save Image As..."), NULL,
NULL, G_CALLBACK (popup_cmd_save_image_as) },
{ "SetImageAsBackground", NULL, N_("_Use Image As Background"), NULL,
NULL, G_CALLBACK (popup_cmd_set_image_as_background) },
{ "CopyImageLocation", NULL, N_("Copy I_mage Address"), NULL,
NULL, G_CALLBACK (popup_cmd_copy_image_location) },
{ "StartImageAnimation", NULL, N_("St_art Animation"), NULL,
NULL, NULL },
{ "StopImageAnimation", NULL, N_("St_op Animation"), NULL,
NULL, NULL },
};
static const struct
{
guint keyval;
GdkModifierType modifier;
const gchar *action;
gboolean fromToolbar;
} extra_keybindings [] = {
{ GDK_s, GDK_CONTROL_MASK, "FileSaveAs", FALSE },
{ GDK_R, GDK_CONTROL_MASK |
GDK_SHIFT_MASK, "ViewReload", FALSE },
/* Support all the MSIE tricks as well ;) */
{ GDK_F5, 0, "ViewReload", FALSE },
{ GDK_F5, GDK_CONTROL_MASK, "ViewReload", FALSE },
{ GDK_F5, GDK_SHIFT_MASK, "ViewReload", FALSE },
{ GDK_F5, GDK_CONTROL_MASK |
GDK_SHIFT_MASK, "ViewReload", FALSE },
{ GDK_KP_Add, GDK_CONTROL_MASK, "ViewZoomIn", FALSE },
{ GDK_KP_Subtract, GDK_CONTROL_MASK, "ViewZoomOut", FALSE },
{ GDK_equal, GDK_CONTROL_MASK, "ViewZoomIn", 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_KP_Left, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE },
{ GDK_KP_4, GDK_MOD1_MASK /*Alt*/, "NavigationBack", TRUE },
{ GDK_KP_Right, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE },
{ GDK_KP_6, GDK_MOD1_MASK /*Alt*/, "NavigationForward", TRUE },
{ GDK_KP_Up, GDK_MOD1_MASK /*Alt*/, "NavigationUp", TRUE },
{ GDK_KP_8, GDK_MOD1_MASK /*Alt*/, "NavigationUp", TRUE },
{ GDK_KP_Page_Up, GDK_CONTROL_MASK, "TabsPrevious", FALSE },
{ GDK_KP_9, GDK_CONTROL_MASK, "TabsPrevious", FALSE },
{ GDK_KP_Page_Down, GDK_CONTROL_MASK, "TabsNext", FALSE },
{ GDK_KP_3, GDK_CONTROL_MASK, "TabsNext", FALSE },
{ GDK_KP_Page_Up, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE },
{ GDK_KP_9, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveLeft", FALSE },
{ GDK_KP_Page_Down, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE },
{ GDK_KP_3, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "TabsMoveRight", FALSE },
#ifdef HAVE_X11_XF86KEYSYM_H
{ XF86XK_Back, 0, "NavigationBack", TRUE },
{ XF86XK_Favorites, 0, "GoBookmarks", FALSE },
{ XF86XK_Forward, 0, "NavigationForward", TRUE },
{ XF86XK_Go, 0, "GoLocation", FALSE },
{ XF86XK_History, 0, "GoHistory", FALSE },
{ XF86XK_HomePage, 0, "GoHome", TRUE },
{ 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_Start, 0, "GoHome", TRUE },
{ 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 */
};
#define CONF_LOCKDOWN_HIDE_MENUBAR "/apps/epiphany/lockdown/hide_menubar"
#define BOOKMARKS_MENU_PATH "/menubar/BookmarksMenu"
#define SETTINGS_CONNECTION_DATA_KEY "EphyWindowSettings"
/* Until https://bugzilla.mozilla.org/show_bug.cgi?id=296002 is fixed */
#define EPHY_WINDOW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_WINDOW, EphyWindowPrivate))
struct _EphyWindowPrivate
{
GtkWidget *main_vbox;
GtkWidget *menu_dock;
GtkWidget *fullscreen_popup;
EphyToolbar *toolbar;
GtkWidget *statusbar;
GtkUIManager *manager;
GtkActionGroup *action_group;
GtkActionGroup *popups_action_group;
EphyEncodingMenu *enc_menu;
EphyTabsMenu *tabs_menu;
PPViewToolbar *ppview_toolbar;
GtkNotebook *notebook;
|