/* * Copyright (C) 2008 Gustavo Noronha Silva * Copyright (C) 2008 Holger Hans Peter Freyther * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "webkitwebwindowfeatures.h" #include "WindowFeatures.h" #include "webkitglobalsprivate.h" #include "webkitwebwindowfeaturesprivate.h" /** * SECTION:webkitwebwindowfeatures * @short_description: Window properties of a #WebKitWebView * @see_also: #WebKitWebView::web-view-ready * * The content of a #WebKitWebView can request to change certain * properties of a #WebKitWebView. This can include the x, y position * of the window, the width and height but also if a toolbar, * scrollbar, statusbar, locationbar should be visible to the user, * the request to show the #WebKitWebView fullscreen. * * In the normal case one will use #webkit_web_view_get_window_features * to get the #WebKitWebWindowFeatures and then monitor the property * changes. Be aware that the #WebKitWebWindowFeatures might change * before #WebKitWebView::web-view-ready signal is emitted. * To be safe listen to the notify::window-features signal of the #WebKitWebView * and reconnect the signals whenever the #WebKitWebWindowFeatures of * a #WebKitWebView changes. * * * /* Get the current WebKitWebWindowFeatures */ * WebKitWebWindowFeatures *features = webkit_web_view_get_window_features (my_webview); * * /* Connect to the property changes */ * g_signal_connect (G_OBJECT(features), "notify::menubar-visible", G_CALLBACK(make_menu_bar_visible), NULL); * g_signal_connect (G_OBJECT(features), "notify::statusbar-visible", G_CALLBACK(make_status_bar_visible), NULL); * * */ enum { PROP_0, PROP_X, PROP_Y, PROP_WIDTH, PROP_HEIGHT, PROP_TOOLBAR_VISIBLE, PROP_STATUSBAR_VISIBLE, PROP_SCROLLBAR_VISIBLE, PROP_MENUBAR_VISIBLE, PROP_LOCATIONBAR_VISIBLE, PROP_FULLSCREEN, }; G_DEFINE_TYPE(WebKitWebWindowFeatures, webkit_web_window_features, G_TYPE_OBJECT) struct _WebKitWebWindowFeaturesPrivate { gint x; gint y; gint width; gint height; gboolean toolbar_visible; gboolean statusbar_visible; gboolean scrollbar_visible; gboolean menubar_visible; gboolean locationbar_visible; gboolean fullscreen; }; #define WEBKIT_WEB_WINDOW_FEATURES_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_WINDOW_FEATURES, WebKitWebWindowFeaturesPrivate)) static void webkit_web_window_features_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); static void webkit_web_window_features_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); static void webkit_web_window_features_class_init(WebKitWebWindowFeaturesClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); gobject_class->set_property = webkit_web_window_features_set_property; gobject_class->get_property = webkit_web_window_features_get_property; GParamFlags flags = (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT); webkitInit(); /** * WebKitWebWindowFeatures:x: * * The starting x position of the window on the screen. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_X, g_param_spec_int( "x", "x", "The starting x position of the window on the screen.", -1, G_MAXINT, -1, flags)); /** * WebKitWebWindowFeatures:y: * * The starting y position of the window on the screen. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_Y, g_param_spec_int( "y", "y", "The starting y position of the window on the screen.", -1, G_MAXINT, -1, flags)); /** * WebKitWebWindowFeatures:width: * * The width of the window on the screen. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_WIDTH, g_param_spec_int( "width", "Width", "The width of the window on the screen.", -1, G_MAXINT, -1, flags)); /** * WebKitWebWindowFeatures:height: * * The height of the window on the screen. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_HEIGHT, g_param_spec_int( "height", "Height", "The height of the window on the screen.", -1, G_MAXINT, -1, flags)); /** * WebKitWebWindowFeatures:toolbar-visible: * * Controls whether the toolbar should be visible for the window. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_TOOLBAR_VISIBLE, g_param_spec_boolean( "toolbar-visible", "Toolbar Visible", "Controls whether the toolbar should be visible for the window.", TRUE, flags)); /** * WebKitWebWindowFeatures:statusbar-visible: * * Controls whether the statusbar should be visible for the window. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_STATUSBAR_VISIBLE, g_param_spec_boolean( "statusbar-visible", "Statusbar Visible", "Controls whether the statusbar should be visible for the window.", TRUE, flags)); /** * WebKitWebWindowFeatures:scrollbar-visible: * * Controls whether the scrollbars should be visible for the window. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_SCROLLBAR_VISIBLE, g_param_spec_boolean( "scrollbar-visible", "Scrollbar Visible", "Controls whether the scrollbars should be visible for the window.", TRUE, flags)); /** * WebKitWebWindowFeatures:menubar-visible: * * Controls whether the menubar should be visible for the window. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_MENUBAR_VISIBLE, g_param_spec_boolean( "menubar-visible", "Menubar Visible", "Controls whether the menubar should be visible for the window.", TRUE, flags)); /** * WebKitWebWindowFeatures:locationbar-visible: * * Controls whether the locationbar should be visible for the window. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_LOCATIONBAR_VISIBLE, g_param_spec_boolean( "locationbar-visible", "Locationbar Visible", "Controls whether the locationbar should be visible for the window.", TRUE, flags)); /** * WebKitWebWindowFeatures:fullscreen: * * Controls whether window will be displayed fullscreen. * * Since: 1.0.3 */ g_object_class_install_property(gobject_class, PROP_FULLSCREEN, g_param_spec_boolean( "fullscreen", "Fullscreen", "Controls whether window will be displayed fullscreen.", FALSE, flags)); g_type_class_add_private(klass, sizeof(WebKitWebWindowFeaturesPrivate)); } static void webkit_web_window_features_init(WebKitWebWindowFeatures* web_window_features) { web_window_features->priv = G_TYPE_INSTANCE_GET_PRIVATE(web_window_features, WEBKIT_TYPE_WEB_WINDOW_FEATURES, WebKitWebWindowFeaturesPrivate); } static void webkit_web_window_features_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { WebKitWebWindowFeatures* web_window_features = WEBKIT_WEB_WINDOW_FEATURES(object); WebKitWebWindowFeaturesPrivate* priv = web_window_features->priv; switch(prop_id) { case PROP_X: priv->x = g_value_get_int(value); break; case PROP_Y: priv->y = g_value_get_int(value); break; case PROP_WIDTH: priv->width = g_value_get_int(value); break; case PROP_HEIGHT: priv->height = g_value_get_int(value); break; case PROP_TOOLBAR_VISIBLE: priv->toolbar_visible = g_value_get_boolean(value); break; case PROP_STATUSBAR_VISIBLE: priv->statusbar_visible = g_value_get_boolean(value); break; case PROP_SCROLLBAR_VISIBLE: priv->scrollbar_visible = g_value_get_boolean(value); break; case PROP_MENUBAR_VISIBLE: priv->menubar_visible = g_value_get_boolean(value); break; case PROP_LOCATIONBAR_VISIBLE: priv->locationbar_visible = g_value_get_boolean(value); break; case PROP_FULLSCREEN: priv->fullscreen = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void webkit_web_window_features_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) { WebKitWebWindowFeatures* web_window_features = WEBKIT_WEB_WINDOW_FEATURES(object); WebKitWebWindowFeaturesPrivate* priv = web_window_features->priv; switch (prop_id) { case PROP_X: g_value_set_int(value, priv->x); break; case PROP_Y: g_value_set_int(value, priv->y); break; case PROP_WIDTH: g_value_set_int(value, priv->width); break; case PROP_HEIGHT: g_value_set_int(value, priv->height); break; case PROP_TOOLBAR_VISIBLE: g_value_set_boolean(value, priv->toolbar_visible); break; case PROP_STATUSBAR_VISIBLE: g_value_set_boolean(value, priv->statusbar_visible); break; case PROP_SCROLLBAR_VISIBLE: g_value_set_boolean(value, priv->scrollbar_visible); break; case PROP_MENUBAR_VISIBLE: g_value_set_boolean(value, priv->menubar_visible); break; case PROP_LOCATIONBAR_VISIBLE: g_value_set_boolean(value, priv->locationbar_visible); break; case PROP_FULLSCREEN: g_value_set_boolean(value, priv->fullscreen); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } /** * webkit_web_window_features_new: * * Creates a new #WebKitWebWindowFeatures instance with default values. It must * be manually attached to a WebView. * * Returns: a new #WebKitWebWindowFeatures instance * * Since: 1.0.3 */ WebKitWebWindowFeatures* webkit_web_window_features_new() { return WEBKIT_WEB_WINDOW_FEATURES(g_object_new(WEBKIT_TYPE_WEB_WINDOW_FEATURES, NULL)); } /** * webkit_web_window_features_equal: * @features1: a #WebKitWebWindowFeatures instance * @features2: another #WebKitWebWindowFeatures instance * * Decides if a #WebKitWebWindowFeatures instance equals another, as * in has the same values. * * Returns: %TRUE if the instances have the same values, %FALSE * otherwise * * Since: 1.0.3 */ gboolean webkit_web_window_features_equal(WebKitWebWindowFeatures* features1, WebKitWebWindowFeatures* features2) { if (features1 == features2) return TRUE; if (!features1 || !features2) return FALSE; WebKitWebWindowFeaturesPrivate* priv1 = features1->priv; WebKitWebWindowFeaturesPrivate* priv2 = features2->priv; if ((priv1->x == priv2->x) && (priv1->y == priv2->y) && (priv1->width == priv2->width) && (priv1->height == priv2->height) && (priv1->toolbar_visible == priv2->toolbar_visible) && (priv1->statusbar_visible == priv2->statusbar_visible) && (priv1->scrollbar_visible == priv2->scrollbar_visible) && (priv1->menubar_visible == priv2->menubar_visible) && (priv1->locationbar_visible == priv2->locationbar_visible) && (priv1->fullscreen == priv2->fullscreen)) return TRUE; return FALSE; } namespace WebKit { WebKitWebWindowFeatures* kitNew(const WebCore::WindowFeatures& features) { WebKitWebWindowFeatures *webWindowFeatures = webkit_web_window_features_new(); if(features.xSet) g_object_set(webWindowFeatures, "x", static_cast(features.x), NULL); if(features.ySet) g_object_set(webWindowFeatures, "y", static_cast(features.y), NULL); if(features.widthSet) g_object_set(webWindowFeatures, "width", static_cast(features.width), NULL); if(features.heightSet) g_object_set(webWindowFeatures, "height", static_cast(features.height), NULL); g_object_set(webWindowFeatures, "toolbar-visible", features.toolBarVisible, "statusbar-visible", features.statusBarVisible, "scrollbar-visible", features.scrollbarsVisible, "menubar-visible", features.menuBarVisible, "locationbar-visible", features.locationBarVisible, "fullscreen", features.fullscreen, NULL); return webWindowFeatures; } }