1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3
* Copyright (C) 2004-2005 William Jon McCann <mccann@jhu.edu>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program 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
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
* Authors: William Jon McCann <mccann@jhu.edu>
25
#include <sys/types.h>
31
#include <gdk/gdkkeysyms.h>
34
#include "gs-window.h"
37
static void gs_window_class_init (GSWindowClass *klass);
38
static void gs_window_init (GSWindow *window);
39
static void gs_window_finalize (GObject *object);
42
DIALOG_RESPONSE_CANCEL,
46
#define GS_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_WINDOW, GSWindowPrivate))
48
struct GSWindowPrivate
52
GdkRectangle geometry;
54
guint lock_enabled : 1;
55
guint logout_enabled : 1;
56
guint user_switch_enabled : 1;
57
guint64 logout_timeout;
62
guint request_unlock_idle_id;
63
guint popup_dialog_idle_id;
65
guint dialog_map_signal_id;
66
guint dialog_unmap_signal_id;
67
guint dialog_response_signal_id;
93
static GObjectClass *parent_class = NULL;
94
static guint signals [LAST_SIGNAL] = { 0, };
96
G_DEFINE_TYPE (GSWindow, gs_window, GTK_TYPE_WINDOW);
99
set_invisible_cursor (GdkWindow *window,
102
GdkBitmap *empty_bitmap;
103
GdkCursor *cursor = NULL;
105
char invisible_cursor_bits [] = { 0x0 };
108
useless.red = useless.green = useless.blue = 0;
111
empty_bitmap = gdk_bitmap_create_from_data (window,
112
invisible_cursor_bits,
115
cursor = gdk_cursor_new_from_pixmap (empty_bitmap,
120
g_object_unref (empty_bitmap);
123
gdk_window_set_cursor (window, cursor);
126
gdk_cursor_unref (cursor);
129
/* derived from tomboy */
131
gs_window_override_user_time (GSWindow *window)
133
guint32 ev_time = gtk_get_current_event_time ();
136
gint ev_mask = gtk_widget_get_events (GTK_WIDGET (window));
137
if (!(ev_mask & GDK_PROPERTY_CHANGE_MASK)) {
138
gtk_widget_add_events (GTK_WIDGET (window),
139
GDK_PROPERTY_CHANGE_MASK);
143
* NOTE: Last resort for D-BUS or other non-interactive
144
* openings. Causes roundtrip to server. Lame.
146
ev_time = gdk_x11_get_server_time (GTK_WIDGET (window)->window);
149
gdk_x11_window_set_user_time (GTK_WIDGET (window)->window, ev_time);
153
gs_window_clear (GSWindow *window)
155
GdkColor color = { 0, 0, 0 };
156
GdkColormap *colormap;
158
gtk_widget_modify_bg (GTK_WIDGET (window), GTK_STATE_NORMAL, &color);
159
colormap = gdk_drawable_get_colormap (GTK_WIDGET (window)->window);
160
gdk_colormap_alloc_color (colormap, &color, FALSE, TRUE);
161
gdk_window_set_background (GTK_WIDGET (window)->window, &color);
162
gdk_window_clear (GTK_WIDGET (window)->window);
167
update_geometry (GSWindow *window)
169
GdkRectangle geometry;
171
gdk_screen_get_monitor_geometry (GTK_WINDOW (window)->screen,
172
window->priv->monitor,
175
window->priv->geometry.x = geometry.x;
176
window->priv->geometry.y = geometry.y;
177
window->priv->geometry.width = geometry.width;
178
window->priv->geometry.height = geometry.height;
182
screen_size_changed (GdkScreen *screen,
185
gtk_widget_queue_resize (GTK_WIDGET (window));
188
/* copied from panel-toplevel.c */
190
gs_window_move_resize_window (GSWindow *window,
196
widget = GTK_WIDGET (window);
198
g_assert (GTK_WIDGET_REALIZED (widget));
201
gdk_window_move_resize (widget->window,
202
window->priv->geometry.x,
203
window->priv->geometry.y,
204
window->priv->geometry.width,
205
window->priv->geometry.height);
207
gdk_window_move (widget->window,
208
window->priv->geometry.x,
209
window->priv->geometry.y);
211
gdk_window_resize (widget->window,
212
window->priv->geometry.width,
213
window->priv->geometry.height);
217
gs_window_real_realize (GtkWidget *widget)
219
if (GTK_WIDGET_CLASS (parent_class)->realize)
220
GTK_WIDGET_CLASS (parent_class)->realize (widget);
222
gs_window_override_user_time (GS_WINDOW (widget));
223
gs_window_clear (GS_WINDOW (widget));
225
gs_window_move_resize_window (GS_WINDOW (widget), TRUE, TRUE);
227
g_signal_connect (gtk_window_get_screen (GTK_WINDOW (widget)),
229
G_CALLBACK (screen_size_changed),
234
gs_window_real_show (GtkWidget *widget)
238
if (GTK_WIDGET_CLASS (parent_class)->show)
239
GTK_WIDGET_CLASS (parent_class)->show (widget);
241
set_invisible_cursor (widget->window, TRUE);
243
window = GS_WINDOW (widget);
244
if (window->priv->timer)
245
g_timer_destroy (window->priv->timer);
246
window->priv->timer = g_timer_new ();
250
gs_window_show (GSWindow *window)
252
g_return_if_fail (GS_IS_WINDOW (window));
254
gtk_widget_show (GTK_WIDGET (window));
258
gs_window_destroy (GSWindow *window)
260
g_return_if_fail (GS_IS_WINDOW (window));
262
gtk_widget_destroy (GTK_WIDGET (window));
266
gs_window_get_gdk_window (GSWindow *window)
268
g_return_val_if_fail (GS_IS_WINDOW (window), NULL);
270
return GTK_WIDGET (window)->window;
274
emit_unblanked_idle (GSWindow *window)
276
g_signal_emit (window, signals [UNBLANKED], 0);
282
spawn_on_window (GSWindow *window,
300
if (!g_shell_parse_argv (command, &argc, &argv, NULL))
303
env = g_ptr_array_new ();
305
str = gdk_screen_make_display_name (GTK_WINDOW (window)->screen);
306
g_ptr_array_add (env, g_strdup_printf ("DISPLAY=%s", str));
309
g_ptr_array_add (env, g_strdup_printf ("HOME=%s",
311
if (g_getenv ("PATH"))
312
g_ptr_array_add (env, g_strdup_printf ("PATH=%s",
314
if (g_getenv ("SESSION_MANAGER"))
315
g_ptr_array_add (env, g_strdup_printf ("SESSION_MANAGER=%s",
316
g_getenv ("SESSION_MANAGER")));
317
if (g_getenv ("XAUTHORITY"))
318
g_ptr_array_add (env, g_strdup_printf ("XAUTHORITY=%s",
319
g_getenv ("XAUTHORITY")));
320
if (g_getenv ("XAUTHLOCALHOSTNAME"))
321
g_ptr_array_add (env, g_strdup_printf ("XAUTHLOCALHOSTNAME=%s",
322
g_getenv ("XAUTHLOCALHOSTNAME")));
323
if (g_getenv ("LANG"))
324
g_ptr_array_add (env, g_strdup_printf ("LANG=%s",
326
if (g_getenv ("LANGUAGE"))
327
g_ptr_array_add (env, g_strdup_printf ("LANGUAGE=%s",
328
g_getenv ("LANGUAGE")));
329
g_ptr_array_add (env, NULL);
331
result = gdk_spawn_on_screen_with_pipes (GTK_WINDOW (window)->screen,
335
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
344
for (i = 0; i < env->len; i++)
345
g_free (g_ptr_array_index (env, i));
346
g_ptr_array_free (env, TRUE);
354
g_spawn_close_pid (child_pid);
356
channel = g_io_channel_unix_new (standard_output);
357
g_io_channel_set_close_on_unref (channel, TRUE);
358
g_io_channel_set_flags (channel,
359
g_io_channel_get_flags (channel) | G_IO_FLAG_NONBLOCK,
361
id = g_io_add_watch (channel,
362
G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
368
g_io_channel_unref (channel);
376
plug_added (GtkWidget *widget,
379
gtk_widget_show (window->priv->socket);
383
plug_removed (GtkWidget *widget,
386
gtk_widget_hide (window->priv->socket);
387
gtk_container_remove (GTK_CONTAINER (window), GTK_WIDGET (window->priv->box));
393
forward_key_events (GSWindow *window)
395
window->priv->key_events = g_list_reverse (window->priv->key_events);
397
while (window->priv->key_events) {
398
GdkEventKey *event = window->priv->key_events->data;
400
gtk_window_propagate_key_event (GTK_WINDOW (window), event);
402
gdk_event_free ((GdkEvent *)event);
403
window->priv->key_events = g_list_delete_link (window->priv->key_events,
404
window->priv->key_events);
409
remove_key_events (GSWindow *window)
411
window->priv->key_events = g_list_reverse (window->priv->key_events);
413
while (window->priv->key_events) {
414
GdkEventKey *event = window->priv->key_events->data;
416
gdk_event_free ((GdkEvent *)event);
417
window->priv->key_events = g_list_delete_link (window->priv->key_events,
418
window->priv->key_events);
423
socket_show (GtkWidget *widget,
426
gtk_widget_child_focus (window->priv->socket, GTK_DIR_TAB_FORWARD);
428
/* send queued events to the dialog */
429
forward_key_events (window);
433
socket_destroyed (GtkWidget *widget,
436
window->priv->socket = NULL;
440
create_socket (GSWindow *window,
443
window->priv->socket = gtk_socket_new ();
444
window->priv->box = gtk_alignment_new (0.5, 0.5, 0, 0);
445
gtk_widget_show (window->priv->box);
447
gtk_container_add (GTK_CONTAINER (window), window->priv->box);
449
gtk_container_add (GTK_CONTAINER (window->priv->box), window->priv->socket);
451
g_signal_connect (window->priv->socket, "show",
452
G_CALLBACK (socket_show), window);
453
g_signal_connect (window->priv->socket, "destroy",
454
G_CALLBACK (socket_destroyed), window);
455
g_signal_connect (window->priv->socket, "plug_added",
456
G_CALLBACK (plug_added), window);
457
g_signal_connect (window->priv->socket, "plug_removed",
458
G_CALLBACK (plug_removed), window);
460
gtk_socket_add_id (GTK_SOCKET (window->priv->socket), id);
463
/* adapted from gspawn.c */
465
wait_on_child (int pid)
470
if (waitpid (pid, &status, 0) < 0) {
473
else if (errno == ECHILD)
474
; /* do nothing, child already reaped */
476
g_warning ("waitpid () should not fail in 'GSWindow'");
483
gs_window_dialog_finish (GSWindow *window)
485
g_return_if_fail (GS_IS_WINDOW (window));
487
if (window->priv->pid > 0) {
490
exit_status = wait_on_child (window->priv->pid);
493
g_spawn_close_pid (window->priv->pid);
494
window->priv->pid = 0;
496
/* remove events for the case were we failed to show socket */
497
remove_key_events (window);
501
command_watch (GIOChannel *source,
502
GIOCondition condition,
505
gboolean finished = FALSE;
507
g_return_val_if_fail (GS_IS_WINDOW (window), FALSE);
509
if (condition & G_IO_IN) {
511
GError *error = NULL;
514
status = g_io_channel_read_line (source, &line, NULL, NULL, &error);
517
case G_IO_STATUS_NORMAL:
518
/*g_message ("LINE: %s", line);*/
520
if (strstr (line, "WINDOW ID=")) {
523
if (1 == sscanf (line, " WINDOW ID= 0x%x %c", &id, &c)) {
524
create_socket (window, id);
526
} else if (strstr (line, "RESPONSE=")) {
527
if (strstr (line, "RESPONSE=OK")) {
528
window->priv->dialog_response = DIALOG_RESPONSE_OK;
530
window->priv->dialog_response = DIALOG_RESPONSE_CANCEL;
537
case G_IO_STATUS_EOF:
540
case G_IO_STATUS_ERROR:
542
fprintf (stderr, "Error reading fd from child: %s\n", error->message);
544
case G_IO_STATUS_AGAIN:
549
} else if (condition & G_IO_HUP)
553
gs_window_dialog_finish (window);
555
if (window->priv->dialog_response == DIALOG_RESPONSE_OK) {
556
g_idle_add ((GSourceFunc)emit_unblanked_idle, window);
559
gs_window_clear (window);
560
set_invisible_cursor (GTK_WIDGET (window)->window, TRUE);
561
g_signal_emit (window, signals [DIALOG_DOWN], 0);
563
window->priv->watch_id = 0;
571
is_logout_enabled (GSWindow *window)
575
if (! window->priv->logout_enabled)
578
elapsed = g_timer_elapsed (window->priv->timer, NULL);
580
if (window->priv->logout_timeout < (elapsed * 1000))
587
is_user_switch_enabled (GSWindow *window)
589
return window->priv->user_switch_enabled;
593
popup_dialog_idle (GSWindow *window)
599
tmp = g_build_filename (LIBEXECDIR, "gnome-screensaver-dialog", NULL);
600
command = g_string_new (tmp);
603
if (is_logout_enabled (window)) {
604
command = g_string_append (command, " --enable-logout");
606
if (is_user_switch_enabled (window)) {
607
command = g_string_append (command, " --enable-switch");
610
gs_window_clear (window);
611
set_invisible_cursor (GTK_WIDGET (window)->window, FALSE);
613
result = spawn_on_window (window,
616
(GIOFunc)command_watch,
618
&window->priv->watch_id);
620
g_warning ("Could not start command: %s", command->str);
622
g_string_free (command, TRUE);
624
window->priv->popup_dialog_idle_id = 0;
630
gs_window_request_unlock (GSWindow *window)
632
g_return_if_fail (GS_IS_WINDOW (window));
634
if (window->priv->watch_id)
637
if (! window->priv->lock_enabled) {
638
g_idle_add ((GSourceFunc)emit_unblanked_idle, window);
642
if (window->priv->popup_dialog_idle_id == 0) {
643
window->priv->popup_dialog_idle_id = g_idle_add ((GSourceFunc)popup_dialog_idle, window);
646
g_signal_emit (window, signals [DIALOG_UP], 0);
650
gs_window_set_lock_enabled (GSWindow *window,
651
gboolean lock_enabled)
653
g_return_if_fail (GS_IS_WINDOW (window));
655
if (window->priv->lock_enabled == lock_enabled)
658
window->priv->lock_enabled = lock_enabled;
659
g_object_notify (G_OBJECT (window), "lock-enabled");
663
gs_window_set_screen (GSWindow *window,
667
g_return_if_fail (GS_IS_WINDOW (window));
668
g_return_if_fail (GDK_IS_SCREEN (screen));
670
gtk_window_set_screen (GTK_WINDOW (window), screen);
674
gs_window_get_screen (GSWindow *window)
676
g_return_val_if_fail (GS_IS_WINDOW (window), NULL);
678
return GTK_WINDOW (window)->screen;
682
gs_window_set_logout_enabled (GSWindow *window,
683
gboolean logout_enabled)
685
g_return_if_fail (GS_IS_WINDOW (window));
687
window->priv->logout_enabled = logout_enabled;
691
gs_window_set_user_switch_enabled (GSWindow *window,
692
gboolean user_switch_enabled)
694
g_return_if_fail (GS_IS_WINDOW (window));
696
window->priv->user_switch_enabled = user_switch_enabled;
700
gs_window_set_logout_timeout (GSWindow *window,
701
glong logout_timeout)
703
g_return_if_fail (GS_IS_WINDOW (window));
705
if (logout_timeout < 0)
706
window->priv->logout_timeout = 0;
708
window->priv->logout_timeout = logout_timeout;
712
gs_window_set_monitor (GSWindow *window,
715
g_return_if_fail (GS_IS_WINDOW (window));
717
if (window->priv->monitor == monitor)
720
window->priv->monitor = monitor;
722
gtk_widget_queue_resize (GTK_WIDGET (window));
724
g_object_notify (G_OBJECT (window), "monitor");
728
gs_window_get_monitor (GSWindow *window)
730
g_return_val_if_fail (GS_IS_WINDOW (window), -1);
732
return window->priv->monitor;
736
gs_window_set_property (GObject *object,
743
self = GS_WINDOW (object);
746
case PROP_LOCK_ENABLED:
747
gs_window_set_lock_enabled (self, g_value_get_boolean (value));
749
case PROP_LOGOUT_ENABLED:
750
gs_window_set_logout_enabled (self, g_value_get_boolean (value));
752
case PROP_LOGOUT_TIMEOUT:
753
gs_window_set_logout_timeout (self, g_value_get_long (value));
756
gs_window_set_monitor (self, g_value_get_int (value));
759
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
765
gs_window_get_property (GObject *object,
772
self = GS_WINDOW (object);
775
case PROP_LOCK_ENABLED:
776
g_value_set_boolean (value, self->priv->lock_enabled);
778
case PROP_LOGOUT_ENABLED:
779
g_value_set_boolean (value, self->priv->logout_enabled);
781
case PROP_LOGOUT_TIMEOUT:
782
g_value_set_long (value, self->priv->logout_timeout);
785
g_value_set_int (value, self->priv->monitor);
788
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
794
gs_window_request_unlock_idle (GSWindow *window)
796
gs_window_request_unlock (window);
798
window->priv->request_unlock_idle_id = 0;
804
queue_key_event (GSWindow *window,
807
/* Eat the first return or space */
808
if (window->priv->key_events == NULL
809
&& (event->keyval == GDK_Return
810
|| event->keyval == GDK_space)) {
814
window->priv->key_events = g_list_prepend (window->priv->key_events,
815
gdk_event_copy ((GdkEvent *)event));
819
gs_window_real_key_press_event (GtkWidget *widget,
822
gboolean catch_events = FALSE;
824
/*g_message ("KEY PRESS state: %u keyval %u", event->state, event->keyval);*/
826
/* if we don't already have a socket then request an unlock */
827
if (! GS_WINDOW (widget)->priv->socket) {
828
if (GS_WINDOW (widget)->priv->request_unlock_idle_id == 0) {
829
GS_WINDOW (widget)->priv->request_unlock_idle_id = g_idle_add ((GSourceFunc)gs_window_request_unlock_idle, widget);
834
if (! GTK_WIDGET_VISIBLE (GS_WINDOW (widget)->priv->socket)) {
839
/* Catch all keypresses up until the lock dialog is shown */
841
queue_key_event (GS_WINDOW (widget), event);
844
if (GTK_WIDGET_CLASS (parent_class)->key_press_event)
845
GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
851
gs_window_real_motion_notify_event (GtkWidget *widget,
852
GdkEventMotion *event)
855
/* if we don't already have a socket then request an unlock */
856
if (! GS_WINDOW (widget)->priv->socket
857
&& (GS_WINDOW (widget)->priv->request_unlock_idle_id == 0)) {
858
GS_WINDOW (widget)->priv->request_unlock_idle_id = g_idle_add ((GSourceFunc)gs_window_request_unlock_idle, widget);
865
gs_window_real_size_request (GtkWidget *widget,
866
GtkRequisition *requisition)
870
GdkRectangle old_geometry;
871
int position_changed = FALSE;
872
int size_changed = FALSE;
874
window = GS_WINDOW (widget);
875
bin = GTK_BIN (widget);
877
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
878
gtk_widget_size_request (bin->child, requisition);
880
old_geometry = window->priv->geometry;
882
update_geometry (window);
884
requisition->width = window->priv->geometry.width;
885
requisition->height = window->priv->geometry.height;
887
if (! GTK_WIDGET_REALIZED (widget))
890
if (old_geometry.width != window->priv->geometry.width ||
891
old_geometry.height != window->priv->geometry.height)
894
if (old_geometry.x != window->priv->geometry.x ||
895
old_geometry.y != window->priv->geometry.y)
896
position_changed = TRUE;
898
gs_window_move_resize_window (window, position_changed, size_changed);
902
gs_window_class_init (GSWindowClass *klass)
904
GObjectClass *object_class = G_OBJECT_CLASS (klass);
905
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
907
parent_class = g_type_class_peek_parent (klass);
909
object_class->finalize = gs_window_finalize;
910
object_class->get_property = gs_window_get_property;
911
object_class->set_property = gs_window_set_property;
913
widget_class->show = gs_window_real_show;
914
widget_class->realize = gs_window_real_realize;
915
widget_class->key_press_event = gs_window_real_key_press_event;
916
widget_class->motion_notify_event = gs_window_real_motion_notify_event;
917
widget_class->size_request = gs_window_real_size_request;
919
g_type_class_add_private (klass, sizeof (GSWindowPrivate));
921
signals [UNBLANKED] =
922
g_signal_new ("unblanked",
923
G_TYPE_FROM_CLASS (object_class),
925
G_STRUCT_OFFSET (GSWindowClass, unblanked),
928
g_cclosure_marshal_VOID__VOID,
931
signals [DIALOG_UP] =
932
g_signal_new ("dialog-up",
933
G_TYPE_FROM_CLASS (object_class),
935
G_STRUCT_OFFSET (GSWindowClass, dialog_up),
938
g_cclosure_marshal_VOID__VOID,
941
signals [DIALOG_DOWN] =
942
g_signal_new ("dialog-down",
943
G_TYPE_FROM_CLASS (object_class),
945
G_STRUCT_OFFSET (GSWindowClass, dialog_down),
948
g_cclosure_marshal_VOID__VOID,
952
g_object_class_install_property (object_class,
954
g_param_spec_boolean ("lock-enabled",
959
g_object_class_install_property (object_class,
961
g_param_spec_int ("monitor",
963
"The monitor (in terms of Xinerama) which the panel is on",
967
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
972
gs_window_init (GSWindow *window)
974
window->priv = GS_WINDOW_GET_PRIVATE (window);
976
window->priv->geometry.x = -1;
977
window->priv->geometry.y = -1;
978
window->priv->geometry.width = -1;
979
window->priv->geometry.height = -1;
981
gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
983
gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE);
984
gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE);
986
gtk_window_set_keep_above (GTK_WINDOW (window), TRUE);
988
gtk_window_fullscreen (GTK_WINDOW (window));
990
gtk_widget_set_events (GTK_WIDGET (window),
991
gtk_widget_get_events (GTK_WIDGET (window))
992
| GDK_POINTER_MOTION_MASK
993
| GDK_BUTTON_PRESS_MASK
994
| GDK_BUTTON_RELEASE_MASK
996
| GDK_KEY_RELEASE_MASK
998
| GDK_ENTER_NOTIFY_MASK
999
| GDK_LEAVE_NOTIFY_MASK);
1003
gs_window_finalize (GObject *object)
1007
g_return_if_fail (object != NULL);
1008
g_return_if_fail (GS_IS_WINDOW (object));
1010
window = GS_WINDOW (object);
1012
g_return_if_fail (window->priv != NULL);
1014
if (window->priv->request_unlock_idle_id)
1015
g_source_remove (window->priv->request_unlock_idle_id);
1016
if (window->priv->popup_dialog_idle_id)
1017
g_source_remove (window->priv->popup_dialog_idle_id);
1019
if (window->priv->timer)
1020
g_timer_destroy (window->priv->timer);
1022
/* just in case they weren't removed */
1023
remove_key_events (window);
1025
G_OBJECT_CLASS (parent_class)->finalize (object);
1029
gs_window_new (GdkScreen *screen,
1031
gboolean lock_enabled)
1035
result = g_object_new (GS_TYPE_WINDOW,
1038
"lock-enabled", lock_enabled,
1041
return GS_WINDOW (result);