File gnome-screensaver-xvkbd-on-lock.patch of Package gnome-screensaver.import4334
commit a6180a624e2f325f32edecd284fa8c394a25ec45
Author: Hans Petter Jansson <hpj@cl.no>
Date: Tue Jan 11 22:31:04 2011 +0100
Patch 7: gnome-screensaver-xvkbd-on-lock.patch
diff --git a/src/gnome-screensaver-dialog.c b/src/gnome-screensaver-dialog.c
index 9d72fcb..2db1e9b 100644
--- a/src/gnome-screensaver-dialog.c
+++ b/src/gnome-screensaver-dialog.c
@@ -115,10 +115,19 @@ response_ok (void)
fflush (stdout);
}
+static GPid xvkbd_pid;
+static gboolean xvkbd_running = FALSE;
+
static gboolean
quit_response_ok (void)
{
response_ok ();
+
+ if (xvkbd_running) {
+ xvkbd_running = FALSE;
+ kill (xvkbd_pid, 9);
+ }
+
gtk_main_quit ();
return FALSE;
}
@@ -127,6 +136,12 @@ static gboolean
quit_response_cancel (void)
{
response_cancel ();
+
+ if (xvkbd_running) {
+ xvkbd_running = FALSE;
+ kill (xvkbd_pid, 9);
+ }
+
gtk_main_quit ();
return FALSE;
}
@@ -418,6 +433,14 @@ popup_dialog_idle (void)
return FALSE;
}
+static void
+handle_sigterm (int sig)
+{
+ if (xvkbd_running)
+ kill (xvkbd_pid, 9);
+
+ exit (0);
+}
/*
* Copyright (c) 1991-2004 Jamie Zawinski <jwz@jwz.org>
@@ -578,6 +601,8 @@ main (int argc,
exit (1);
}
+ signal (SIGTERM, handle_sigterm);
+
if (show_version) {
g_print ("%s %s\n", argv [0], VERSION);
exit (1);
@@ -594,10 +619,27 @@ main (int argc,
gs_debug_init (verbose, FALSE);
+ int status = system ("hal-find-by-property --key system.formfactor.subtype --string tabletpc");
+ if (WIFEXITED (status) && WEXITSTATUS (status) == 0) {
+ gchar **arguments[] = { "/usr/bin/xvkbd", "-always-on-top", "-compact", "-geometry", "-0-0", NULL };
+ error = NULL;
+
+ if (g_spawn_async (g_get_home_dir (), arguments, NULL, 0, NULL, NULL,
+ &xvkbd_pid, &error))
+ xvkbd_running = TRUE;
+ else {
+ g_warning ("Could not spawn xvkbd: %s\n", error->message);
+ g_error_free (error);
+
+ }
+ }
g_idle_add ((GSourceFunc)popup_dialog_idle, NULL);
gtk_main ();
+ if (xvkbd_running)
+ kill (xvkbd_pid, 9);
+
gs_profile_end (NULL);
gs_debug_shutdown ();
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index 4216ea4..3b6b1f7 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -769,6 +769,49 @@ x11_window_is_ours (Window window)
return ret;
}
+#define GET_DISPLAY gdk_x11_display_get_xdisplay (gdk_display_get_default ())
+
+GdkWindow *xvkbd_window = NULL;
+
+static gboolean
+is_xvkbd_window (Window window)
+{
+ gboolean ret = FALSE;
+ XClassHint class_hint = { NULL, NULL };
+
+ gdk_error_trap_push ();
+ if (XGetClassHint (GET_DISPLAY, window, &class_hint)) {
+ if (g_strstr_len (class_hint.res_name,
+ strlen (class_hint.res_name),
+ "xvkbd"))
+ ret = TRUE;
+ }
+
+ if (G_UNLIKELY (gdk_error_trap_pop () == BadWindow)) ;
+
+ return ret;
+}
+
+static void
+setup_xvkbd_window (GSWindow *gswindow, Window window)
+{
+ gs_debug ("Setting up xvkbd_window from window %d", (int) window);
+
+ xvkbd_window = gdk_window_foreign_new (window);
+ gdk_window_hide (xvkbd_window);
+ gdk_window_set_override_redirect (xvkbd_window, TRUE);
+ gdk_window_set_events (xvkbd_window, gdk_window_get_events (xvkbd_window) | GDK_STRUCTURE_MASK);
+
+ int display_width, display_height, width, height;
+ GdkWindow *root = gdk_screen_get_root_window (gdk_drawable_get_screen (xvkbd_window));
+
+ gdk_window_get_geometry (xvkbd_window, NULL, NULL, &width, &height, NULL);
+ gdk_window_get_geometry (root, NULL, NULL, &display_width, &display_height, NULL);
+ gdk_window_reparent (xvkbd_window, NULL, display_width - width, display_height - height);
+ gdk_window_set_transient_for (xvkbd_window, GTK_WIDGET (gswindow)->window);
+ gdk_window_show (xvkbd_window);
+}
+
#ifdef HAVE_SHAPE_EXT
static void
unshape_window (GSWindow *window)
@@ -791,6 +834,16 @@ gs_window_xevent (GSWindow *window,
/* MapNotify is used to tell us when new windows are mapped.
ConfigureNofify is used to tell us when windows are raised. */
switch (ev->xany.type) {
+ case CreateNotify :
+ {
+ XCreateWindowEvent *create_event;
+
+ create_event = &ev->xcreatewindow;
+ if (!x11_window_is_ours (create_event->window) && is_xvkbd_window (create_event->window))
+ setup_xvkbd_window (window, create_event->window);
+
+ break;
+ }
case MapNotify:
{
XMapEvent *xme = &ev->xmap;
@@ -808,7 +861,7 @@ gs_window_xevent (GSWindow *window,
XConfigureEvent *xce = &ev->xconfigure;
if (! x11_window_is_ours (xce->window)) {
- gs_window_raise (window);
+ gs_window_raise (window);
} else {
gs_debug ("not raising our windows");
}