Bugzilla – Attachment 175991 Details for
Bug 304399
login not possible when a tablet is used
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Forgot Password
[patch]
gnome-screensaver-xvkbd-on-lock.patch
gnome-screensaver-xvkbd-on-lock.patch (text/plain), 5.40 KB, created by
Federico Mena Quintero
on 2007-10-02 19:14:38 UTC
(
hide
)
Description:
gnome-screensaver-xvkbd-on-lock.patch
Filename:
MIME Type:
Creator:
Federico Mena Quintero
Created:
2007-10-02 19:14:38 UTC
Size:
5.40 KB
patch
obsolete
>diff -upr gnome-screensaver-2.14.0-orig/src/gnome-screensaver-dialog.c gnome-screensaver-2.14.0/src/gnome-screensaver-dialog.c >--- gnome-screensaver-2.14.0-orig/src/gnome-screensaver-dialog.c 2006-02-14 22:21:27.000000000 +0100 >+++ gnome-screensaver-2.14.0/src/gnome-screensaver-dialog.c 2007-01-15 12:06:55.000000000 +0100 >@@ -183,6 +183,7 @@ response_cb (GSLockPlug *plug, > break; > } > >+ gtk_widget_destroy (GTK_WIDGET (plug)); > gtk_main_quit (); > } > >diff -upr gnome-screensaver-2.14.0-orig/src/gs-lock-plug.c gnome-screensaver-2.14.0/src/gs-lock-plug.c >--- gnome-screensaver-2.14.0-orig/src/gs-lock-plug.c 2006-03-06 19:42:45.000000000 +0100 >+++ gnome-screensaver-2.14.0/src/gs-lock-plug.c 2007-01-15 14:45:55.000000000 +0100 >@@ -23,6 +23,7 @@ > #include "config.h" > > #include <stdlib.h> >+#include <sys/wait.h> > #include <unistd.h> > #include <string.h> > #include <errno.h> >@@ -145,6 +146,8 @@ struct GSLockPlugPrivate > guint response_idle_id; > > GTimeVal start_time; >+ >+ GPid xvkbd_pid; > }; > > typedef struct _ResponseData ResponseData; >@@ -1727,6 +1730,21 @@ gs_lock_plug_init (GSLockPlug *plug) > g_signal_connect (plug->priv->logout_button, "clicked", > G_CALLBACK (logout_button_clicked), plug); > >+ int status = system ("hal-find-by-property --key system.formfactor.subtype --string tabletpc"); >+ if (WIFEXITED (status) && WEXITSTATUS (status) == 0) { >+ gchar **argv[] = { "/usr/X11R6/bin/xvkbd", "-always-on-top", "-compact", "-geometry", "-0-0", NULL }; >+ GError *error = NULL; >+ >+ if (!g_spawn_async (g_get_home_dir (), argv, NULL, 0, NULL, NULL, >+ &plug->priv->xvkbd_pid, &error)) { >+ g_warning ("Could not spawn xvkbd: %s\n", error->message); >+ g_error_free (error); >+ >+ plug->priv->xvkbd_pid = -1; >+ } >+ } else >+ plug->priv->xvkbd_pid = -1; >+ > profile_end ("end", NULL); > } > >@@ -1742,6 +1760,11 @@ gs_lock_plug_finalize (GObject *object) > > g_return_if_fail (plug->priv != NULL); > >+ if (plug->priv->xvkbd_pid != -1) { >+ kill (plug->priv->xvkbd_pid, 9); >+ plug->priv->xvkbd_pid = -1; >+ } >+ > g_free (plug->priv->logout_command); > > if (plug->priv->fusa_manager) { >diff -upr gnome-screensaver-2.14.0-orig/src/gs-window-x11.c gnome-screensaver-2.14.0/src/gs-window-x11.c >--- gnome-screensaver-2.14.0-orig/src/gs-window-x11.c 2006-03-06 19:30:03.000000000 +0100 >+++ gnome-screensaver-2.14.0/src/gs-window-x11.c 2007-01-15 19:08:57.000000000 +0100 >@@ -413,11 +413,69 @@ x11_window_is_ours (Window window) > gwindow = gdk_window_lookup (window); > if (gwindow && (window != GDK_ROOT_WINDOW ())) { > ret = TRUE; >- } >+ } > > return ret; > } > >+#define GET_DISPLAY gdk_x11_display_get_xdisplay (gdk_display_get_default ()) >+ >+static gboolean >+is_xvkbd_window (Window window) >+{ >+ gboolean ret = FALSE; >+ XClassHint class_hint; >+ >+ if (XGetClassHint (GET_DISPLAY, window, &class_hint) == Success) { >+ if (g_strstr_len (class_hint.res_name, >+ strlen (class_hint.res_name), >+ "xvkbd")) >+ ret = TRUE; >+ } >+ >+ return ret; >+} >+ >+static void >+setup_xvkbd_window (Window window) >+{ >+ XWithdrawWindow (GET_DISPLAY, window, gdk_x11_get_default_screen ()); >+ for(;;) { >+ Atom type; >+ int format; >+ unsigned long length, after; >+ unsigned char *data; >+ int r; >+ >+ r = XGetWindowProperty (GET_DISPLAY, >+ window, XInternAtom (GET_DISPLAY, "WM_STATE", TRUE), 0, 2, >+ FALSE, AnyPropertyType, &type, &format, >+ &length, &after, &data ); >+ gboolean withdrawn = TRUE; >+ if (r == Success && data && format == 32) { >+ guint32 *wstate = (guint32 *) data; >+ withdrawn = (*wstate == WithdrawnState ); >+ XFree ((char *) data); >+ } >+ if (withdrawn) >+ break; >+ } >+ >+ XSelectInput (GET_DISPLAY, window, StructureNotifyMask); >+ XWindowAttributes attr_geom; >+ >+ if (!XGetWindowAttributes (GET_DISPLAY, window, &attr_geom )) >+ return; >+ int x = XDisplayWidth (GET_DISPLAY, gdk_x11_get_default_screen ()) - attr_geom.width; >+ int y = XDisplayHeight (GET_DISPLAY, gdk_x11_get_default_screen ()) - attr_geom.height; >+ >+ XSetWindowAttributes attr; >+ attr.override_redirect = True; >+ XChangeWindowAttributes (GET_DISPLAY, window, CWOverrideRedirect, &attr); >+ XReparentWindow (GET_DISPLAY, window, GDK_ROOT_WINDOW(), x, y ); >+ XMapWindow (GET_DISPLAY, window); >+} >+ > static void > gs_window_xevent (GSWindow *window, > GdkXEvent *xevent) >@@ -434,7 +492,10 @@ gs_window_xevent (GSWindow *window, > XMapEvent *xme = &ev->xmap; > > if (! x11_window_is_ours (xme->window)) { >- gs_window_raise (window); >+ if (is_xvkbd_window (xme->window)) >+ setup_xvkbd_window (xme->window); >+ else >+ gs_window_raise (window); > } else { > gs_debug ("not raising our windows"); > } >@@ -446,7 +507,10 @@ gs_window_xevent (GSWindow *window, > XConfigureEvent *xce = &ev->xconfigure; > > if (! x11_window_is_ours (xce->window)) { >- gs_window_raise (window); >+ if (is_xvkbd_window (xce->window)) >+ XRaiseWindow (GET_DISPLAY, xce->window); >+ else >+ gs_window_raise (window); > } else { > gs_debug ("not raising our windows"); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
Attachments on
bug 304399
:
175991
|
176123
|
176214
|
176294
|
176295
|
176296
|
176628
|
182807
|
183888
|
183897