Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.4
gnome-screensaver.import4334
gnome-screensaver-xvkbd-on-lock.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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"); }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor