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