blob: 8f1e261aa93d36055e52fb9c291e7993a70b6cc3 [file] [log] [blame]
/*
* Copyright (C) 2011 Igalia S.L.
*
* 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 "WebKitWindowProperties.h"
#include "APIDictionary.h"
#include "APINumber.h"
#include "APIURLRequest.h"
#include "WebKitWindowPropertiesPrivate.h"
#include <WebCore/IntRect.h>
#include <WebCore/WindowFeatures.h>
#include <glib/gi18n-lib.h>
#include <wtf/glib/WTFGType.h>
using namespace WebCore;
/**
* SECTION: WebKitWindowProperties
* @short_description: Window properties of a #WebKitWebView
* @title: WebKitWindowProperties
* @see_also: #WebKitWebView::ready-to-show
*
* The content of a #WebKitWebView can request to change certain
* properties of the window containing the view. 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,
* and the request to show the #WebKitWebView fullscreen.
*
* The #WebKitWebView::ready-to-show signal handler is the proper place
* to apply the initial window properties. Then you can monitor the
* #WebKitWindowProperties by connecting to ::notify signal.
*
* <informalexample><programlisting>
* static void ready_to_show_cb (WebKitWebView *web_view, gpointer user_data)
* {
* GtkWidget *window;
* WebKitWindowProperties *window_properties;
* gboolean visible;
*
* /<!-- -->* Create the window to contain the WebKitWebView *<!-- -->/
* window = browser_window_new ();
* gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (web_view));
* gtk_widget_show (GTK_WIDGET (web_view));
*
* /<!-- -->* Get the WebKitWindowProperties of the web view and monitor it *<!-- -->/
* window_properties = webkit_web_view_get_window_properties (web_view);
* g_signal_connect (window_properties, "notify::geometry",
* G_CALLBACK (window_geometry_changed), window);
* g_signal_connect (window_properties, "notify::toolbar-visible",
* G_CALLBACK (window_toolbar_visibility_changed), window);
* g_signal_connect (window_properties, "notify::menubar-visible",
* G_CALLBACK (window_menubar_visibility_changed), window);
* ....
*
* /<!-- -->* Apply the window properties before showing the window *<!-- -->/
* visible = webkit_window_properties_get_toolbar_visible (window_properties);
* browser_window_set_toolbar_visible (BROWSER_WINDOW (window), visible);
* visible = webkit_window_properties_get_menubar_visible (window_properties);
* browser_window_set_menubar_visible (BROWSER_WINDOW (window), visible);
* ....
*
* if (webkit_window_properties_get_fullscreen (window_properties)) {
* gtk_window_fullscreen (GTK_WINDOW (window));
* } else {
* GdkRectangle geometry;
*
* gtk_window_set_resizable (GTK_WINDOW (window),
* webkit_window_properties_get_resizable (window_properties));
* webkit_window_properties_get_geometry (window_properties, &geometry);
* gtk_window_move (GTK_WINDOW (window), geometry.x, geometry.y);
* gtk_window_resize (GTK_WINDOW (window), geometry.width, geometry.height);
* }
*
* gtk_widget_show (window);
* }
* </programlisting></informalexample>
*/
enum {
PROP_0,
#if PLATFORM(GTK)
PROP_GEOMETRY,
#endif
PROP_TOOLBAR_VISIBLE,
PROP_STATUSBAR_VISIBLE,
PROP_SCROLLBARS_VISIBLE,
PROP_MENUBAR_VISIBLE,
PROP_LOCATIONBAR_VISIBLE,
PROP_RESIZABLE,
PROP_FULLSCREEN
};
struct _WebKitWindowPropertiesPrivate {
#if PLATFORM(GTK)
GdkRectangle geometry;
#endif
bool toolbarVisible : 1;
bool statusbarVisible : 1;
bool scrollbarsVisible : 1;
bool menubarVisible : 1;
bool locationbarVisible : 1;
bool resizable : 1;
bool fullscreen : 1;
};
WEBKIT_DEFINE_TYPE(WebKitWindowProperties, webkit_window_properties, G_TYPE_OBJECT)
static void webkitWindowPropertiesGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
WebKitWindowProperties* windowProperties = WEBKIT_WINDOW_PROPERTIES(object);
switch (propId) {
#if PLATFORM(GTK)
case PROP_GEOMETRY:
g_value_set_boxed(value, &windowProperties->priv->geometry);
break;
#endif
case PROP_TOOLBAR_VISIBLE:
g_value_set_boolean(value, webkit_window_properties_get_toolbar_visible(windowProperties));
break;
case PROP_STATUSBAR_VISIBLE:
g_value_set_boolean(value, webkit_window_properties_get_statusbar_visible(windowProperties));
break;
case PROP_SCROLLBARS_VISIBLE:
g_value_set_boolean(value, webkit_window_properties_get_scrollbars_visible(windowProperties));
break;
case PROP_MENUBAR_VISIBLE:
g_value_set_boolean(value, webkit_window_properties_get_menubar_visible(windowProperties));
break;
case PROP_LOCATIONBAR_VISIBLE:
g_value_set_boolean(value, webkit_window_properties_get_locationbar_visible(windowProperties));
break;
case PROP_RESIZABLE:
g_value_set_boolean(value, webkit_window_properties_get_resizable(windowProperties));
break;
case PROP_FULLSCREEN:
g_value_set_boolean(value, webkit_window_properties_get_fullscreen(windowProperties));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkitWindowPropertiesSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec)
{
WebKitWindowProperties* windowProperties = WEBKIT_WINDOW_PROPERTIES(object);
switch (propId) {
#if PLATFORM(GTK)
case PROP_GEOMETRY:
if (GdkRectangle* geometry = static_cast<GdkRectangle*>(g_value_get_boxed(value)))
windowProperties->priv->geometry = *geometry;
break;
#endif
case PROP_TOOLBAR_VISIBLE:
windowProperties->priv->toolbarVisible = g_value_get_boolean(value);
break;
case PROP_STATUSBAR_VISIBLE:
windowProperties->priv->statusbarVisible = g_value_get_boolean(value);
break;
case PROP_SCROLLBARS_VISIBLE:
windowProperties->priv->scrollbarsVisible = g_value_get_boolean(value);
break;
case PROP_MENUBAR_VISIBLE:
windowProperties->priv->menubarVisible = g_value_get_boolean(value);
break;
case PROP_LOCATIONBAR_VISIBLE:
windowProperties->priv->locationbarVisible = g_value_get_boolean(value);
break;
case PROP_RESIZABLE:
windowProperties->priv->resizable = g_value_get_boolean(value);
break;
case PROP_FULLSCREEN:
windowProperties->priv->fullscreen = g_value_get_boolean(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkit_window_properties_class_init(WebKitWindowPropertiesClass* requestClass)
{
GObjectClass* objectClass = G_OBJECT_CLASS(requestClass);
objectClass->get_property = webkitWindowPropertiesGetProperty;
objectClass->set_property = webkitWindowPropertiesSetProperty;
GParamFlags paramFlags = static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
#if PLATFORM(GTK)
/**
* WebKitWebWindowProperties:geometry:
*
* The size and position of the window on the screen.
*/
g_object_class_install_property(objectClass,
PROP_GEOMETRY,
g_param_spec_boxed("geometry",
_("Geometry"),
_("The size and position of the window on the screen."),
GDK_TYPE_RECTANGLE,
paramFlags));
#endif
/**
* WebKitWebWindowProperties:toolbar-visible:
*
* Whether the toolbar should be visible for the window.
*/
g_object_class_install_property(objectClass,
PROP_TOOLBAR_VISIBLE,
g_param_spec_boolean("toolbar-visible",
_("Toolbar Visible"),
_("Whether the toolbar should be visible for the window."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:statusbar-visible:
*
* Whether the statusbar should be visible for the window.
*/
g_object_class_install_property(objectClass,
PROP_STATUSBAR_VISIBLE,
g_param_spec_boolean("statusbar-visible",
_("Statusbar Visible"),
_("Whether the statusbar should be visible for the window."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:scrollbars-visible:
*
* Whether the scrollbars should be visible for the window.
*/
g_object_class_install_property(objectClass,
PROP_SCROLLBARS_VISIBLE,
g_param_spec_boolean("scrollbars-visible",
_("Scrollbars Visible"),
_("Whether the scrollbars should be visible for the window."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:menubar-visible:
*
* Whether the menubar should be visible for the window.
*/
g_object_class_install_property(objectClass,
PROP_MENUBAR_VISIBLE,
g_param_spec_boolean("menubar-visible",
_("Menubar Visible"),
_("Whether the menubar should be visible for the window."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:locationbar-visible:
*
* Whether the locationbar should be visible for the window.
*/
g_object_class_install_property(objectClass,
PROP_LOCATIONBAR_VISIBLE,
g_param_spec_boolean("locationbar-visible",
_("Locationbar Visible"),
_("Whether the locationbar should be visible for the window."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:resizable:
*
* Whether the window can be resized.
*/
g_object_class_install_property(objectClass,
PROP_RESIZABLE,
g_param_spec_boolean("resizable",
_("Resizable"),
_("Whether the window can be resized."),
TRUE,
paramFlags));
/**
* WebKitWebWindowProperties:fullscreen:
*
* Whether window will be displayed fullscreen.
*/
g_object_class_install_property(objectClass,
PROP_FULLSCREEN,
g_param_spec_boolean("fullscreen",
_("Fullscreen"),
_("Whether window will be displayed fullscreen."),
FALSE,
paramFlags));
}
WebKitWindowProperties* webkitWindowPropertiesCreate()
{
return WEBKIT_WINDOW_PROPERTIES(g_object_new(WEBKIT_TYPE_WINDOW_PROPERTIES, NULL));
}
#if PLATFORM(GTK)
void webkitWindowPropertiesSetGeometry(WebKitWindowProperties* windowProperties, GdkRectangle* geometry)
{
if (windowProperties->priv->geometry.x == geometry->x
&& windowProperties->priv->geometry.y == geometry->y
&& windowProperties->priv->geometry.width == geometry->width
&& windowProperties->priv->geometry.height == geometry->height)
return;
windowProperties->priv->geometry = *geometry;
g_object_notify(G_OBJECT(windowProperties), "geometry");
}
#endif
void webkitWindowPropertiesSetToolbarVisible(WebKitWindowProperties* windowProperties, bool toolbarsVisible)
{
if (windowProperties->priv->toolbarVisible == toolbarsVisible)
return;
windowProperties->priv->toolbarVisible = toolbarsVisible;
g_object_notify(G_OBJECT(windowProperties), "toolbar-visible");
}
void webkitWindowPropertiesSetMenubarVisible(WebKitWindowProperties* windowProperties, bool menuBarVisible)
{
if (windowProperties->priv->menubarVisible == menuBarVisible)
return;
windowProperties->priv->menubarVisible = menuBarVisible;
g_object_notify(G_OBJECT(windowProperties), "menubar-visible");
}
void webkitWindowPropertiesSetStatusbarVisible(WebKitWindowProperties* windowProperties, bool statusBarVisible)
{
if (windowProperties->priv->statusbarVisible == statusBarVisible)
return;
windowProperties->priv->statusbarVisible = statusBarVisible;
g_object_notify(G_OBJECT(windowProperties), "statusbar-visible");
}
void webkitWindowPropertiesSetLocationbarVisible(WebKitWindowProperties* windowProperties, bool locationBarVisible)
{
if (windowProperties->priv->locationbarVisible == locationBarVisible)
return;
windowProperties->priv->locationbarVisible = locationBarVisible;
g_object_notify(G_OBJECT(windowProperties), "locationbar-visible");
}
void webkitWindowPropertiesSetScrollbarsVisible(WebKitWindowProperties* windowProperties, bool scrollBarsVisible)
{
if (windowProperties->priv->scrollbarsVisible == scrollBarsVisible)
return;
windowProperties->priv->scrollbarsVisible = scrollBarsVisible;
g_object_notify(G_OBJECT(windowProperties), "scrollbars-visible");
}
void webkitWindowPropertiesSetResizable(WebKitWindowProperties* windowProperties, bool resizable)
{
if (windowProperties->priv->resizable == resizable)
return;
windowProperties->priv->resizable = resizable;
g_object_notify(G_OBJECT(windowProperties), "resizable");
}
void webkitWindowPropertiesSetFullscreen(WebKitWindowProperties* windowProperties, bool fullscreen)
{
if (windowProperties->priv->fullscreen == fullscreen)
return;
windowProperties->priv->fullscreen = fullscreen;
g_object_notify(G_OBJECT(windowProperties), "fullscreen");
}
void webkitWindowPropertiesUpdateFromWebWindowFeatures(WebKitWindowProperties* windowProperties, const WindowFeatures& windowFeatures)
{
#if PLATFORM(GTK)
GdkRectangle geometry = windowProperties->priv->geometry;
if (windowFeatures.x)
geometry.x = *windowFeatures.x;
if (windowFeatures.y)
geometry.y = *windowFeatures.y;
if (windowFeatures.width)
geometry.width = *windowFeatures.width;
if (windowFeatures.height)
geometry.height = *windowFeatures.height;
webkitWindowPropertiesSetGeometry(windowProperties, &geometry);
#endif
webkitWindowPropertiesSetMenubarVisible(windowProperties, windowFeatures.menuBarVisible);
webkitWindowPropertiesSetStatusbarVisible(windowProperties, windowFeatures.statusBarVisible);
webkitWindowPropertiesSetToolbarVisible(windowProperties, windowFeatures.toolBarVisible);
webkitWindowPropertiesSetLocationbarVisible(windowProperties, windowFeatures.locationBarVisible);
webkitWindowPropertiesSetScrollbarsVisible(windowProperties, windowFeatures.scrollbarsVisible);
webkitWindowPropertiesSetResizable(windowProperties, windowFeatures.resizable);
webkitWindowPropertiesSetFullscreen(windowProperties, windowFeatures.fullscreen);
}
#if PLATFORM(GTK)
/**
* webkit_window_properties_get_geometry:
* @window_properties: a #WebKitWindowProperties
* @geometry: (out): return location for the window geometry
*
* Get the geometry the window should have on the screen when shown.
*/
void webkit_window_properties_get_geometry(WebKitWindowProperties* windowProperties, GdkRectangle* geometry)
{
g_return_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties));
g_return_if_fail(geometry);
*geometry = windowProperties->priv->geometry;
}
#endif
/**
* webkit_window_properties_get_toolbar_visible:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should have the toolbar visible or not.
*
* Returns: %TRUE if toolbar should be visible or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_toolbar_visible(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->toolbarVisible;
}
/**
* webkit_window_properties_get_statusbar_visible:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should have the statusbar visible or not.
*
* Returns: %TRUE if statusbar should be visible or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_statusbar_visible(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->statusbarVisible;
}
/**
* webkit_window_properties_get_scrollbars_visible:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should have the scrollbars visible or not.
*
* Returns: %TRUE if scrollbars should be visible or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_scrollbars_visible(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->scrollbarsVisible;
}
/**
* webkit_window_properties_get_menubar_visible:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should have the menubar visible or not.
*
* Returns: %TRUE if menubar should be visible or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_menubar_visible(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->menubarVisible;
}
/**
* webkit_window_properties_get_locationbar_visible:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should have the locationbar visible or not.
*
* Returns: %TRUE if locationbar should be visible or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_locationbar_visible(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->locationbarVisible;
}
/**
* webkit_window_properties_get_resizable:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should be resizable by the user or not.
*
* Returns: %TRUE if the window should be resizable or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_resizable(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), TRUE);
return windowProperties->priv->resizable;
}
/**
* webkit_window_properties_get_fullscreen:
* @window_properties: a #WebKitWindowProperties
*
* Get whether the window should be shown in fullscreen state or not.
*
* Returns: %TRUE if the window should be fullscreen or %FALSE otherwise.
*/
gboolean webkit_window_properties_get_fullscreen(WebKitWindowProperties* windowProperties)
{
g_return_val_if_fail(WEBKIT_IS_WINDOW_PROPERTIES(windowProperties), FALSE);
return windowProperties->priv->fullscreen;
}