View | Details | Raw Unified | Return to bug 304399
Collapse All | Expand All

(-)gnome-screensaver-2.20.0-orig/src/gnome-screensaver-dialog.c (+28 lines)
Lines 109-118 response_ok (void) Link Here
109
        fflush (stdout);
109
        fflush (stdout);
110
}
110
}
111
111
112
static GPid    xvkbd_pid;
113
static gboolean xvkbd_running = FALSE;
114
112
static gboolean
115
static gboolean
113
quit_response_ok (void)
116
quit_response_ok (void)
114
{
117
{
115
        response_ok ();
118
        response_ok ();
119
120
        if (xvkbd_running)
121
                kill (xvkbd_pid, 9);
122
116
        gtk_main_quit ();
123
        gtk_main_quit ();
117
        return FALSE;
124
        return FALSE;
118
}
125
}
Lines 121-126 static gboolean Link Here
121
quit_response_cancel (void)
128
quit_response_cancel (void)
122
{
129
{
123
        response_cancel ();
130
        response_cancel ();
131
132
        if (xvkbd_running) 
133
                kill (xvkbd_pid, 9);
134
124
        gtk_main_quit ();
135
        gtk_main_quit ();
125
        return FALSE;
136
        return FALSE;
126
}
137
}
Lines 566-575 main (int argc, Link Here
566
577
567
        gs_debug_init (verbose, FALSE);
578
        gs_debug_init (verbose, FALSE);
568
579
580
        //int status = system ("hal-find-by-property --key system.formfactor.subtype --string tabletpc");
581
        //if (WIFEXITED (status) && WEXITSTATUS (status) == 0) {
582
                gchar **arguments[] = { "/usr/bin/xvkbd", "-always-on-top", "-compact", "-geometry", "-0-0", NULL };
583
                error = NULL;
584
585
                if (g_spawn_async (g_get_home_dir (), arguments, NULL, 0, NULL, NULL,
586
                                    &xvkbd_pid, &error))
587
                        xvkbd_running = TRUE;
588
                else {
589
                        g_warning ("Could not spawn xvkbd: %s\n", error->message);
590
                        g_error_free (error);
591
592
                }
593
569
        g_idle_add ((GSourceFunc)popup_dialog_idle, NULL);
594
        g_idle_add ((GSourceFunc)popup_dialog_idle, NULL);
570
595
571
        gtk_main ();
596
        gtk_main ();
572
597
598
        if (xvkbd_running)
599
                kill (xvkbd_pid, 9);
600
573
        gs_profile_end (NULL);
601
        gs_profile_end (NULL);
574
        gs_debug_shutdown ();
602
        gs_debug_shutdown ();
575
603
(-)gnome-screensaver-2.20.0-orig/src/gs-window-x11.c (-1 / +54 lines)
Lines 647-652 x11_window_is_ours (Window window) Link Here
647
        return ret;
647
        return ret;
648
}
648
}
649
649
650
#define GET_DISPLAY gdk_x11_display_get_xdisplay (gdk_display_get_default ())
651
652
GdkWindow *xvkbd_window = NULL;
653
654
static gboolean
655
is_xvkbd_window (Window window)
656
{
657
        gboolean ret = FALSE;
658
        XClassHint class_hint = { NULL, NULL };
659
660
	gdk_error_trap_push ();
661
        if (XGetClassHint (GET_DISPLAY, window, &class_hint)) {
662
                if (g_strstr_len (class_hint.res_name,
663
                                  strlen (class_hint.res_name),
664
                                  "xvkbd"))
665
                        ret = TRUE;
666
        }
667
668
	if (G_UNLIKELY (gdk_error_trap_pop () == BadWindow)) ;
669
670
        return ret;
671
}
672
673
static void
674
setup_xvkbd_window (GSWindow *gswindow, Window window)
675
{
676
	gs_debug ("Setting up xvkbd_window from window %d", (int) window);
677
678
	xvkbd_window = gdk_window_foreign_new (window);
679
        gdk_window_hide (xvkbd_window);
680
        gdk_window_set_override_redirect (xvkbd_window, TRUE);
681
        gdk_window_set_events (xvkbd_window, gdk_window_get_events (xvkbd_window) | GDK_STRUCTURE_MASK);
682
       
683
        int display_width, display_height, width, height;
684
        GdkWindow *root = gdk_screen_get_root_window (gdk_drawable_get_screen (xvkbd_window));
685
       
686
        gdk_window_get_geometry (xvkbd_window, NULL, NULL, &width, &height, NULL);
687
        gdk_window_get_geometry (root, NULL, NULL, &display_width, &display_height, NULL);
688
        gdk_window_reparent (xvkbd_window, NULL, display_width - width, display_height - height);
689
        gdk_window_set_transient_for (xvkbd_window, GTK_WIDGET (gswindow)->window);
690
        gdk_window_show (xvkbd_window);
691
}
692
650
#ifdef HAVE_SHAPE_EXT
693
#ifdef HAVE_SHAPE_EXT
651
static void
694
static void
652
unshape_window (GSWindow *window)
695
unshape_window (GSWindow *window)
Lines 669-674 gs_window_xevent (GSWindow *window, Link Here
669
        /* MapNotify is used to tell us when new windows are mapped.
712
        /* MapNotify is used to tell us when new windows are mapped.
670
           ConfigureNofify is used to tell us when windows are raised. */
713
           ConfigureNofify is used to tell us when windows are raised. */
671
        switch (ev->xany.type) {
714
        switch (ev->xany.type) {
715
        case CreateNotify :
716
                {
717
                        XCreateWindowEvent *create_event;
718
719
                        create_event = &ev->xcreatewindow;
720
                        if (!x11_window_is_ours (create_event->window) && is_xvkbd_window (create_event->window))
721
                                setup_xvkbd_window (window, create_event->window);
722
723
                        break;
724
                }
672
        case MapNotify:
725
        case MapNotify:
673
                {
726
                {
674
                        XMapEvent *xme = &ev->xmap;
727
                        XMapEvent *xme = &ev->xmap;
Lines 686-692 gs_window_xevent (GSWindow *window, Link Here
686
                        XConfigureEvent *xce = &ev->xconfigure;
739
                        XConfigureEvent *xce = &ev->xconfigure;
687
740
688
                        if (! x11_window_is_ours (xce->window)) {
741
                        if (! x11_window_is_ours (xce->window)) {
689
                                gs_window_raise (window);
742
				gs_window_raise (window);
690
                        } else {
743
                        } else {
691
                                gs_debug ("not raising our windows");
744
                                gs_debug ("not raising our windows");
692
                        }
745
                        }

Return to bug 304399