233
223
gtk_accel_group_connect (self->priv->accel, GDK_Escape, (GdkModifierType) 0, GTK_ACCEL_LOCKED,
234
224
g_cclosure_new_swap (G_CALLBACK (gtk_widget_hide), (gpointer) self, NULL));
236
g_signal_connect (G_OBJECT (self), "delete_event",
226
g_signal_connect (self, "delete_event",
237
227
G_CALLBACK (gm_window_delete_event), NULL);
239
g_signal_connect (G_OBJECT (self), "show",
240
G_CALLBACK (gm_window_show), self);
242
g_signal_connect (G_OBJECT (self), "hide",
243
G_CALLBACK (gm_window_hide), self);
245
g_signal_connect (G_OBJECT (self), "configure-event",
229
g_signal_connect (self, "show",
230
G_CALLBACK (window_show_cb), self);
232
g_signal_connect (self, "hide",
233
G_CALLBACK (window_hide_cb), self);
235
g_signal_connect (self, "configure-event",
246
236
G_CALLBACK (gm_window_configure_event), self);
251
gm_window_get_type ()
253
static GType result = 0;
257
static const GTypeInfo info = {
258
sizeof (GmWindowClass),
261
gm_window_class_init,
270
result = g_type_register_static (GTK_TYPE_WINDOW,
272
&info, (GTypeFlags) 0);
244
delete_event_cb (GtkWidget* window,
245
G_GNUC_UNUSED gpointer data)
247
gm_window_hide (window);
284
253
gm_window_delete_event (GtkWidget *w,
285
254
G_GNUC_UNUSED gpointer data)
482
442
gm_window_set_hide_on_delete (GmWindow *window,
483
443
gboolean hide_on_delete)
485
g_return_if_fail (window != NULL);
486
g_return_if_fail (IS_GM_WINDOW (window));
445
g_return_if_fail (GM_IS_WINDOW (window));
488
g_object_set (GM_WINDOW (window), "hide_on_delete", hide_on_delete, NULL);
447
g_object_set (window, "hide_on_delete", hide_on_delete, NULL);
492
451
gm_window_get_hide_on_delete (GmWindow *window)
494
g_return_val_if_fail (window != NULL, FALSE);
495
g_return_val_if_fail (IS_GM_WINDOW (window), FALSE);
453
g_return_val_if_fail (GM_IS_WINDOW (window), FALSE);
497
455
return window->priv->hide_on_delete;
459
// helper copied from gdk
461
gdk_wmspec_change_state (gboolean add,
468
gm_window_set_always_on_top (GdkWindow *window,
472
gdk_wmspec_change_state (enable, window,
473
gdk_atom_intern ("_NET_WM_STATE_ABOVE", FALSE), 0);
479
gm_window_is_visible (GtkWidget* w)
481
return (gtk_widget_get_visible (w) && !(gdk_window_get_state (gtk_widget_get_window (w)) & GDK_WINDOW_STATE_ICONIFIED));
486
gm_window_show (GtkWidget* w)
491
gchar* window_name = NULL;
492
gchar* conf_key_size = NULL;
493
gchar* conf_key_position = NULL;
495
gchar* position = NULL;
496
gchar** couple = NULL;
498
g_return_if_fail (GTK_IS_WINDOW (w));
500
if (gm_window_is_visible (w)) {
502
gtk_window_present (GTK_WINDOW (w));
504
} // else we do the show :
506
window_name = (char *) g_object_get_data (G_OBJECT (w), "window_name");
510
conf_key_position = g_strdup_printf ("%s%s/position", USER_INTERFACE_KEY, window_name);
511
conf_key_size = g_strdup_printf ("%s%s/size", USER_INTERFACE_KEY, window_name);
513
if (!gm_window_is_visible (w)) {
515
position = gm_conf_get_string (conf_key_position);
517
couple = g_strsplit (position, ",", 0);
519
if (couple && couple [0])
520
x = atoi (couple [0]);
521
if (couple && couple [1])
522
y = atoi (couple [1]);
525
if (x != 0 && y != 0)
526
gtk_window_move (GTK_WINDOW (w), x, y);
532
if (gtk_window_get_resizable (GTK_WINDOW (w))) {
534
size = gm_conf_get_string (conf_key_size);
536
couple = g_strsplit (size, ",", 0);
538
if (couple && couple [0])
539
x = atoi (couple [0]);
540
if (couple && couple [1])
541
y = atoi (couple [1]);
544
gtk_window_resize (GTK_WINDOW (w), x, y);
551
gtk_window_present (GTK_WINDOW (w));
552
gtk_widget_show_all (w);
555
g_free (conf_key_position);
556
g_free (conf_key_size);
561
gm_window_hide (GtkWidget* w)
566
gchar* window_name = NULL;
567
gchar* conf_key_size = NULL;
568
gchar* conf_key_position = NULL;
570
gchar* position = NULL;
572
g_return_if_fail (GTK_IS_WINDOW (w));
574
window_name = (char *) g_object_get_data (G_OBJECT (w), "window_name");
576
g_return_if_fail (window_name != NULL);
579
g_strdup_printf ("%s%s/position", USER_INTERFACE_KEY, window_name);
581
g_strdup_printf ("%s%s/size", USER_INTERFACE_KEY, window_name);
584
/* If the window is visible, save its position and hide the window */
585
if (gm_window_is_visible (w)) {
587
gtk_window_get_position (GTK_WINDOW (w), &x, &y);
588
position = g_strdup_printf ("%d,%d", x, y);
589
gm_conf_set_string (conf_key_position, position);
592
if (gtk_window_get_resizable (GTK_WINDOW (w))) {
594
gtk_window_get_size (GTK_WINDOW (w), &x, &y);
595
size = g_strdup_printf ("%d,%d", x, y);
596
gm_conf_set_string (conf_key_size, size);
603
g_free (conf_key_position);
604
g_free (conf_key_size);
608
gm_window_hide_on_delete (GtkWidget* window)
610
g_return_if_fail (GTK_IS_WIDGET (window));
612
g_signal_connect (window, "delete-event",
613
G_CALLBACK (delete_event_cb), NULL);
616
/* Stolen from GDK */
619
gdk_wmspec_change_state (gboolean add,
624
GdkDisplay *display =
625
gdk_screen_get_display (gdk_drawable_get_screen (GDK_DRAWABLE (window)));
628
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
629
#define _NET_WM_STATE_ADD 1 /* add/set property */
630
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
632
xev.xclient.type = ClientMessage;
633
xev.xclient.serial = 0;
634
xev.xclient.send_event = True;
635
xev.xclient.window = GDK_WINDOW_XID (window);
636
xev.xclient.message_type =
637
gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE");
638
xev.xclient.format = 32;
639
xev.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
640
xev.xclient.data.l[1] = gdk_x11_atom_to_xatom_for_display (display, state1);
641
xev.xclient.data.l[2] = gdk_x11_atom_to_xatom_for_display (display, state2);
643
XSendEvent (GDK_WINDOW_XDISPLAY (window),
644
GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gdk_drawable_get_screen (GDK_DRAWABLE (window)))),
645
False, SubstructureRedirectMask | SubstructureNotifyMask,