Home | History | Annotate | Download | only in webkit
      1 /*
      2  * Copyright (C) 2008 Gustavo Noronha Silva <gns (at) gnome.org>
      3  * Copyright (C) 2008 Holger Hans Peter Freyther
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  */
     20 
     21 #include "config.h"
     22 #include "webkitwebwindowfeatures.h"
     23 
     24 #include "WindowFeatures.h"
     25 #include "webkitglobalsprivate.h"
     26 #include "webkitwebwindowfeaturesprivate.h"
     27 
     28 /**
     29  * SECTION:webkitwebwindowfeatures
     30  * @short_description: Window properties of a #WebKitWebView
     31  * @see_also: #WebKitWebView::web-view-ready
     32  *
     33  * The content of a #WebKitWebView can request to change certain
     34  * properties of a #WebKitWebView. This can include the x, y position
     35  * of the window, the width and height but also if a toolbar,
     36  * scrollbar, statusbar, locationbar should be visible to the user,
     37  * the request to show the #WebKitWebView fullscreen.
     38  *
     39  * In the normal case one will use #webkit_web_view_get_window_features
     40  * to get the #WebKitWebWindowFeatures and then monitor the property
     41  * changes. Be aware that the #WebKitWebWindowFeatures might change
     42  * before #WebKitWebView::web-view-ready signal is emitted.
     43  * To be safe listen to the notify::window-features signal of the #WebKitWebView
     44  * and reconnect the signals whenever the #WebKitWebWindowFeatures of
     45  * a #WebKitWebView changes.
     46  *
     47  * <informalexample><programlisting>
     48  * /<!-- -->* Get the current WebKitWebWindowFeatures *<!-- -->/
     49  * WebKitWebWindowFeatures *features = webkit_web_view_get_window_features (my_webview);
     50  *
     51  * /<!-- -->* Connect to the property changes *<!-- -->/
     52  * g_signal_connect (G_OBJECT(features), "notify::menubar-visible", G_CALLBACK(make_menu_bar_visible), NULL);
     53  * g_signal_connect (G_OBJECT(features), "notify::statusbar-visible", G_CALLBACK(make_status_bar_visible), NULL);
     54  *
     55  * </programlisting></informalexample>
     56  */
     57 
     58 enum {
     59     PROP_0,
     60 
     61     PROP_X,
     62     PROP_Y,
     63     PROP_WIDTH,
     64     PROP_HEIGHT,
     65     PROP_TOOLBAR_VISIBLE,
     66     PROP_STATUSBAR_VISIBLE,
     67     PROP_SCROLLBAR_VISIBLE,
     68     PROP_MENUBAR_VISIBLE,
     69     PROP_LOCATIONBAR_VISIBLE,
     70     PROP_FULLSCREEN,
     71 };
     72 
     73 G_DEFINE_TYPE(WebKitWebWindowFeatures, webkit_web_window_features, G_TYPE_OBJECT)
     74 
     75 struct _WebKitWebWindowFeaturesPrivate {
     76     gint x;
     77     gint y;
     78     gint width;
     79     gint height;
     80 
     81     gboolean toolbar_visible;
     82     gboolean statusbar_visible;
     83     gboolean scrollbar_visible;
     84     gboolean menubar_visible;
     85     gboolean locationbar_visible;
     86 
     87     gboolean fullscreen;
     88 };
     89 
     90 #define WEBKIT_WEB_WINDOW_FEATURES_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_WINDOW_FEATURES, WebKitWebWindowFeaturesPrivate))
     91 
     92 static void webkit_web_window_features_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
     93 
     94 static void webkit_web_window_features_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
     95 
     96 static void webkit_web_window_features_class_init(WebKitWebWindowFeaturesClass* klass)
     97 {
     98     GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
     99     gobject_class->set_property = webkit_web_window_features_set_property;
    100     gobject_class->get_property = webkit_web_window_features_get_property;
    101 
    102     GParamFlags flags = (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT);
    103 
    104     webkitInit();
    105 
    106     /**
    107      * WebKitWebWindowFeatures:x:
    108      *
    109      * The starting x position of the window on the screen.
    110      *
    111      * Since: 1.0.3
    112      */
    113     g_object_class_install_property(gobject_class,
    114                                     PROP_X,
    115                                     g_param_spec_int(
    116                                     "x",
    117                                     "x",
    118                                     "The starting x position of the window on the screen.",
    119                                     -1,
    120                                     G_MAXINT,
    121                                     -1,
    122                                     flags));
    123 
    124     /**
    125      * WebKitWebWindowFeatures:y:
    126      *
    127      * The starting y position of the window on the screen.
    128      *
    129      * Since: 1.0.3
    130      */
    131     g_object_class_install_property(gobject_class,
    132                                     PROP_Y,
    133                                     g_param_spec_int(
    134                                     "y",
    135                                     "y",
    136                                     "The starting y position of the window on the screen.",
    137                                     -1,
    138                                     G_MAXINT,
    139                                     -1,
    140                                     flags));
    141 
    142     /**
    143      * WebKitWebWindowFeatures:width:
    144      *
    145      * The width of the window on the screen.
    146      *
    147      * Since: 1.0.3
    148      */
    149     g_object_class_install_property(gobject_class,
    150                                     PROP_WIDTH,
    151                                     g_param_spec_int(
    152                                     "width",
    153                                     "Width",
    154                                     "The width of the window on the screen.",
    155                                     -1,
    156                                     G_MAXINT,
    157                                     -1,
    158                                     flags));
    159 
    160     /**
    161      * WebKitWebWindowFeatures:height:
    162      *
    163      * The height of the window on the screen.
    164      *
    165      * Since: 1.0.3
    166      */
    167     g_object_class_install_property(gobject_class,
    168                                     PROP_HEIGHT,
    169                                     g_param_spec_int(
    170                                     "height",
    171                                     "Height",
    172                                     "The height of the window on the screen.",
    173                                     -1,
    174                                     G_MAXINT,
    175                                     -1,
    176                                     flags));
    177 
    178     /**
    179      * WebKitWebWindowFeatures:toolbar-visible:
    180      *
    181      * Controls whether the toolbar should be visible for the window.
    182      *
    183      * Since: 1.0.3
    184      */
    185     g_object_class_install_property(gobject_class,
    186                                     PROP_TOOLBAR_VISIBLE,
    187                                     g_param_spec_boolean(
    188                                     "toolbar-visible",
    189                                     "Toolbar Visible",
    190                                     "Controls whether the toolbar should be visible for the window.",
    191                                     TRUE,
    192                                     flags));
    193 
    194     /**
    195      * WebKitWebWindowFeatures:statusbar-visible:
    196      *
    197      * Controls whether the statusbar should be visible for the window.
    198      *
    199      * Since: 1.0.3
    200      */
    201     g_object_class_install_property(gobject_class,
    202                                     PROP_STATUSBAR_VISIBLE,
    203                                     g_param_spec_boolean(
    204                                     "statusbar-visible",
    205                                     "Statusbar Visible",
    206                                     "Controls whether the statusbar should be visible for the window.",
    207                                     TRUE,
    208                                     flags));
    209 
    210     /**
    211      * WebKitWebWindowFeatures:scrollbar-visible:
    212      *
    213      * Controls whether the scrollbars should be visible for the window.
    214      *
    215      * Since: 1.0.3
    216      */
    217     g_object_class_install_property(gobject_class,
    218                                     PROP_SCROLLBAR_VISIBLE,
    219                                     g_param_spec_boolean(
    220                                     "scrollbar-visible",
    221                                     "Scrollbar Visible",
    222                                     "Controls whether the scrollbars should be visible for the window.",
    223                                     TRUE,
    224                                     flags));
    225 
    226     /**
    227      * WebKitWebWindowFeatures:menubar-visible:
    228      *
    229      * Controls whether the menubar should be visible for the window.
    230      *
    231      * Since: 1.0.3
    232      */
    233     g_object_class_install_property(gobject_class,
    234                                     PROP_MENUBAR_VISIBLE,
    235                                     g_param_spec_boolean(
    236                                     "menubar-visible",
    237                                     "Menubar Visible",
    238                                     "Controls whether the menubar should be visible for the window.",
    239                                     TRUE,
    240                                     flags));
    241 
    242     /**
    243      * WebKitWebWindowFeatures:locationbar-visible:
    244      *
    245      * Controls whether the locationbar should be visible for the window.
    246      *
    247      * Since: 1.0.3
    248      */
    249     g_object_class_install_property(gobject_class,
    250                                     PROP_LOCATIONBAR_VISIBLE,
    251                                     g_param_spec_boolean(
    252                                     "locationbar-visible",
    253                                     "Locationbar Visible",
    254                                     "Controls whether the locationbar should be visible for the window.",
    255                                     TRUE,
    256                                     flags));
    257 
    258     /**
    259      * WebKitWebWindowFeatures:fullscreen:
    260      *
    261      * Controls whether window will be displayed fullscreen.
    262      *
    263      * Since: 1.0.3
    264      */
    265     g_object_class_install_property(gobject_class,
    266                                     PROP_FULLSCREEN,
    267                                     g_param_spec_boolean(
    268                                     "fullscreen",
    269                                     "Fullscreen",
    270                                     "Controls whether window will be displayed fullscreen.",
    271                                     FALSE,
    272                                     flags));
    273 
    274 
    275     g_type_class_add_private(klass, sizeof(WebKitWebWindowFeaturesPrivate));
    276 }
    277 
    278 static void webkit_web_window_features_init(WebKitWebWindowFeatures* web_window_features)
    279 {
    280     web_window_features->priv = G_TYPE_INSTANCE_GET_PRIVATE(web_window_features, WEBKIT_TYPE_WEB_WINDOW_FEATURES, WebKitWebWindowFeaturesPrivate);
    281 }
    282 
    283 static void webkit_web_window_features_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
    284 {
    285     WebKitWebWindowFeatures* web_window_features = WEBKIT_WEB_WINDOW_FEATURES(object);
    286     WebKitWebWindowFeaturesPrivate* priv = web_window_features->priv;
    287 
    288     switch(prop_id) {
    289     case PROP_X:
    290         priv->x = g_value_get_int(value);
    291         break;
    292     case PROP_Y:
    293         priv->y = g_value_get_int(value);
    294         break;
    295     case PROP_WIDTH:
    296         priv->width = g_value_get_int(value);
    297         break;
    298     case PROP_HEIGHT:
    299         priv->height = g_value_get_int(value);
    300         break;
    301     case PROP_TOOLBAR_VISIBLE:
    302         priv->toolbar_visible = g_value_get_boolean(value);
    303         break;
    304     case PROP_STATUSBAR_VISIBLE:
    305         priv->statusbar_visible = g_value_get_boolean(value);
    306         break;
    307     case PROP_SCROLLBAR_VISIBLE:
    308         priv->scrollbar_visible = g_value_get_boolean(value);
    309         break;
    310     case PROP_MENUBAR_VISIBLE:
    311         priv->menubar_visible = g_value_get_boolean(value);
    312         break;
    313     case PROP_LOCATIONBAR_VISIBLE:
    314         priv->locationbar_visible = g_value_get_boolean(value);
    315         break;
    316     case PROP_FULLSCREEN:
    317         priv->fullscreen = g_value_get_boolean(value);
    318         break;
    319     default:
    320         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    321         break;
    322     }
    323 }
    324 
    325 static void webkit_web_window_features_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
    326 {
    327     WebKitWebWindowFeatures* web_window_features = WEBKIT_WEB_WINDOW_FEATURES(object);
    328     WebKitWebWindowFeaturesPrivate* priv = web_window_features->priv;
    329 
    330     switch (prop_id) {
    331     case PROP_X:
    332         g_value_set_int(value, priv->x);
    333         break;
    334     case PROP_Y:
    335         g_value_set_int(value, priv->y);
    336         break;
    337     case PROP_WIDTH:
    338         g_value_set_int(value, priv->width);
    339         break;
    340     case PROP_HEIGHT:
    341         g_value_set_int(value, priv->height);
    342         break;
    343     case PROP_TOOLBAR_VISIBLE:
    344         g_value_set_boolean(value, priv->toolbar_visible);
    345         break;
    346     case PROP_STATUSBAR_VISIBLE:
    347         g_value_set_boolean(value, priv->statusbar_visible);
    348         break;
    349     case PROP_SCROLLBAR_VISIBLE:
    350         g_value_set_boolean(value, priv->scrollbar_visible);
    351         break;
    352     case PROP_MENUBAR_VISIBLE:
    353         g_value_set_boolean(value, priv->menubar_visible);
    354         break;
    355     case PROP_LOCATIONBAR_VISIBLE:
    356         g_value_set_boolean(value, priv->locationbar_visible);
    357         break;
    358     case PROP_FULLSCREEN:
    359         g_value_set_boolean(value, priv->fullscreen);
    360         break;
    361     default:
    362         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    363         break;
    364     }
    365 }
    366 
    367 /**
    368  * webkit_web_window_features_new:
    369  *
    370  * Creates a new #WebKitWebWindowFeatures instance with default values. It must
    371  * be manually attached to a WebView.
    372  *
    373  * Returns: a new #WebKitWebWindowFeatures instance
    374  *
    375  * Since: 1.0.3
    376  */
    377 WebKitWebWindowFeatures* webkit_web_window_features_new()
    378 {
    379     return WEBKIT_WEB_WINDOW_FEATURES(g_object_new(WEBKIT_TYPE_WEB_WINDOW_FEATURES, NULL));
    380 }
    381 
    382 /**
    383  * webkit_web_window_features_equal:
    384  * @features1: a #WebKitWebWindowFeatures instance
    385  * @features2: another #WebKitWebWindowFeatures instance
    386  *
    387  * Decides if a #WebKitWebWindowFeatures instance equals another, as
    388  * in has the same values.
    389  *
    390  * Returns: %TRUE if the instances have the same values, %FALSE
    391  * otherwise
    392  *
    393  * Since: 1.0.3
    394  */
    395 gboolean webkit_web_window_features_equal(WebKitWebWindowFeatures* features1, WebKitWebWindowFeatures* features2)
    396 {
    397     if (features1 == features2)
    398         return TRUE;
    399     if (!features1 || !features2)
    400         return FALSE;
    401 
    402     WebKitWebWindowFeaturesPrivate* priv1 = features1->priv;
    403     WebKitWebWindowFeaturesPrivate* priv2 = features2->priv;
    404 
    405     if ((priv1->x == priv2->x)
    406         && (priv1->y == priv2->y)
    407         && (priv1->width == priv2->width)
    408         && (priv1->height == priv2->height)
    409         && (priv1->toolbar_visible == priv2->toolbar_visible)
    410         && (priv1->statusbar_visible == priv2->statusbar_visible)
    411         && (priv1->scrollbar_visible == priv2->scrollbar_visible)
    412         && (priv1->menubar_visible == priv2->menubar_visible)
    413         && (priv1->locationbar_visible == priv2->locationbar_visible)
    414         && (priv1->fullscreen == priv2->fullscreen))
    415         return TRUE;
    416     return FALSE;
    417 }
    418 
    419 namespace WebKit {
    420 
    421 WebKitWebWindowFeatures* kitNew(const WebCore::WindowFeatures& features)
    422 {
    423     WebKitWebWindowFeatures *webWindowFeatures = webkit_web_window_features_new();
    424 
    425     if(features.xSet)
    426         g_object_set(webWindowFeatures, "x", static_cast<int>(features.x), NULL);
    427 
    428     if(features.ySet)
    429         g_object_set(webWindowFeatures, "y", static_cast<int>(features.y), NULL);
    430 
    431     if(features.widthSet)
    432         g_object_set(webWindowFeatures, "width", static_cast<int>(features.width), NULL);
    433 
    434     if(features.heightSet)
    435         g_object_set(webWindowFeatures, "height", static_cast<int>(features.height), NULL);
    436 
    437     g_object_set(webWindowFeatures,
    438                  "toolbar-visible", features.toolBarVisible,
    439                  "statusbar-visible", features.statusBarVisible,
    440                  "scrollbar-visible", features.scrollbarsVisible,
    441                  "menubar-visible", features.menuBarVisible,
    442                  "locationbar-visible", features.locationBarVisible,
    443                  "fullscreen", features.fullscreen,
    444                  NULL);
    445 
    446     return webWindowFeatures;
    447 }
    448 
    449 }
    450