initial import
[vuplus_webkit] / Source / WebKit / gtk / webkit / webkitwebwindowfeatures.cpp
1 /*
2  * Copyright (C) 2008 Gustavo Noronha Silva <gns@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 }