David Zeuthen 6b7e7b3
Index: gui/modules/dwellmouselistener.c
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- gui/modules/dwellmouselistener.c	(revision 4608)
David Zeuthen 6b7e7b3
+++ gui/modules/dwellmouselistener.c	(working copy)
David Zeuthen 6b7e7b3
@@ -665,6 +665,8 @@
David Zeuthen 6b7e7b3
 					G_CALLBACK (gtk_widget_destroy), NULL);
David Zeuthen 6b7e7b3
 				gtk_widget_show (dialog);
David Zeuthen 6b7e7b3
 			} else {
David Zeuthen 6b7e7b3
+				const char *at_name;
David Zeuthen 6b7e7b3
+				const char *ats_launched;
David Zeuthen 6b7e7b3
 				GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
David Zeuthen 6b7e7b3
 				gdk_window_set_cursor (gdk_get_default_root_window (),
David Zeuthen 6b7e7b3
 					cursor);
David Zeuthen 6b7e7b3
@@ -673,6 +675,26 @@
David Zeuthen 6b7e7b3
 				latch_core_pointer = FALSE;
David Zeuthen 6b7e7b3
 				/* once we've recognized a gesture, we need to *
David Zeuthen 6b7e7b3
 				 * leave the pointer alone */
David Zeuthen 6b7e7b3
+				
David Zeuthen 6b7e7b3
+				at_name = strstr (action, "#AT_TYPE=");
David Zeuthen 6b7e7b3
+				if (at_name != NULL) {
David Zeuthen 6b7e7b3
+					int i;
David Zeuthen 6b7e7b3
+					char **v;
David Zeuthen 6b7e7b3
+					at_name += 9;
David Zeuthen 6b7e7b3
+					v = g_strsplit (at_name, " ", 0);
David Zeuthen 6b7e7b3
+					for (i = 0; v[i] != NULL; i++) {
David Zeuthen 6b7e7b3
+						ats_launched = g_getenv ("GDM_ATS");
David Zeuthen 6b7e7b3
+						if (ats_launched == NULL) {
David Zeuthen 6b7e7b3
+							g_setenv ("GDM_ATS", v[i], TRUE);
David Zeuthen 6b7e7b3
+						} else if (strstr (ats_launched, v[i]) == NULL) {
David Zeuthen 6b7e7b3
+							char *s;
David Zeuthen 6b7e7b3
+							s = g_strdup_printf ("%s %s", ats_launched, v[i]);
David Zeuthen 6b7e7b3
+							g_setenv ("GDM_ATS", s, TRUE);
David Zeuthen 6b7e7b3
+							g_free (s);
David Zeuthen 6b7e7b3
+						}
David Zeuthen 6b7e7b3
+					}
David Zeuthen 6b7e7b3
+					g_strfreev (v);
David Zeuthen 6b7e7b3
+				}
David Zeuthen 6b7e7b3
 			}
David Zeuthen 6b7e7b3
 		}
David Zeuthen 6b7e7b3
 	}
David Zeuthen 6b7e7b3
Index: gui/modules/keymouselistener.c
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- gui/modules/keymouselistener.c	(revision 4608)
David Zeuthen 6b7e7b3
+++ gui/modules/keymouselistener.c	(working copy)
David Zeuthen 6b7e7b3
@@ -937,6 +937,8 @@
David Zeuthen 6b7e7b3
 						NULL);
David Zeuthen 6b7e7b3
 					gtk_widget_show (dialog);
David Zeuthen 6b7e7b3
 				} else {
David Zeuthen 6b7e7b3
+					char *at_name;
David Zeuthen 6b7e7b3
+					const char *ats_launched;
David Zeuthen 6b7e7b3
 					GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
David Zeuthen 6b7e7b3
 					gdk_window_set_cursor (gdk_get_default_root_window (),
David Zeuthen 6b7e7b3
 						cursor);
David Zeuthen 6b7e7b3
@@ -944,6 +946,26 @@
David Zeuthen 6b7e7b3
 					g_timeout_add (2000,
David Zeuthen 6b7e7b3
 						       change_cursor_back,
David Zeuthen 6b7e7b3
 						       NULL);
David Zeuthen 6b7e7b3
+
David Zeuthen 6b7e7b3
+					at_name = strstr (action, "#AT_TYPE=");
David Zeuthen 6b7e7b3
+					if (at_name != NULL) {
David Zeuthen 6b7e7b3
+						int i;
David Zeuthen 6b7e7b3
+						char **v;
David Zeuthen 6b7e7b3
+						at_name += 9;
David Zeuthen 6b7e7b3
+						v = g_strsplit (at_name, " ", 0);
David Zeuthen 6b7e7b3
+						for (i = 0; v[i] != NULL; i++) {
David Zeuthen 6b7e7b3
+							ats_launched = g_getenv ("GDM_ATS");
David Zeuthen 6b7e7b3
+							if (ats_launched == NULL) {
David Zeuthen 6b7e7b3
+								g_setenv ("GDM_ATS", v[i], TRUE);
David Zeuthen 6b7e7b3
+							} else if (strstr (ats_launched, v[i]) == NULL) {
David Zeuthen 6b7e7b3
+								char *s;
David Zeuthen 6b7e7b3
+								s = g_strdup_printf ("%s %s", ats_launched, v[i]);
David Zeuthen 6b7e7b3
+								g_setenv ("GDM_ATS", s, TRUE);
David Zeuthen 6b7e7b3
+								g_free (s);
David Zeuthen 6b7e7b3
+							}
David Zeuthen 6b7e7b3
+						}
David Zeuthen 6b7e7b3
+						g_strfreev (v);
David Zeuthen 6b7e7b3
+					}
David Zeuthen 6b7e7b3
 				}
David Zeuthen 6b7e7b3
 			}
David Zeuthen 6b7e7b3
    			return GDK_FILTER_CONTINUE;
David Zeuthen 6b7e7b3
Index: gui/modules/AccessDwellMouseEvents.in
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- gui/modules/AccessDwellMouseEvents.in	(revision 4608)
David Zeuthen 6b7e7b3
+++ gui/modules/AccessDwellMouseEvents.in	(working copy)
David Zeuthen 6b7e7b3
@@ -37,23 +37,23 @@
David Zeuthen 6b7e7b3
 # user needs.  Note these gestures all start by moving the mouse into the top
David Zeuthen 6b7e7b3
 # window border.
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-TBLR I 10000    @AT_BINDIR@/gok --login --access-method=dwellselection
David Zeuthen 6b7e7b3
-TLBR I 10000    @AT_BINDIR@/gok --login --access-method=automaticscanning --scan-action=switch1 --select-action=switch1
David Zeuthen 6b7e7b3
-TRBL I 10000    @AT_BINDIR@/gok --login --access-method=inversescanning --scan-action=switch1 --select-action=switch2
David Zeuthen 6b7e7b3
-TBRL I 10000    @AT_BINDIR@/gok --login  --access-method=automaticscanning --scan-action=switch3 --select-action=switch3
David Zeuthen 6b7e7b3
+TBLR I 10000    @AT_BINDIR@/gok --login --access-method=dwellselection #AT_TYPE=onscreenkeyboard
David Zeuthen 6b7e7b3
+TLBR I 10000    @AT_BINDIR@/gok --login --access-method=automaticscanning --scan-action=switch1 --select-action=switch1 #AT_TYPE=onscreenkeyboard
David Zeuthen 6b7e7b3
+TRBL I 10000    @AT_BINDIR@/gok --login --access-method=inversescanning --scan-action=switch1 --select-action=switch2 #AT_TYPE=onscreenkeyboard
David Zeuthen 6b7e7b3
+TBRL I 10000    @AT_BINDIR@/gok --login  --access-method=automaticscanning --scan-action=switch3 --select-action=switch3 #AT_TYPE=onscreenkeyboard
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # Orca.  Note these gestures all start by moving the mouse into the
David Zeuthen 6b7e7b3
 # bottom window border.
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
 # Speech
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-BTRL I 10000    @AT_BINDIR@/orca -n -d main-window
David Zeuthen 6b7e7b3
+BTRL I 10000    @AT_BINDIR@/orca -n -d main-window #AT_TYPE=screenreader
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # Magnifier
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-BTLR I 10000    @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier
David Zeuthen 6b7e7b3
+BTLR I 10000    @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier #AT_TYPE=magnifier
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # Speech and Magnifier
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-BRTL I 10000    @AT_BINDIR@/orca -n -d main-window -e magnifier
David Zeuthen 6b7e7b3
+BRTL I 10000    @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
Index: gui/modules/AccessKeyMouseEvents.in
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- gui/modules/AccessKeyMouseEvents.in	(revision 4608)
David Zeuthen 6b7e7b3
+++ gui/modules/AccessKeyMouseEvents.in	(working copy)
David Zeuthen 6b7e7b3
@@ -69,18 +69,18 @@
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # press ctrl-s for 1 second to launch orca in speech mode
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-<Control>s  1 1000 10000  @AT_BINDIR@/orca -n -d main-window
David Zeuthen 6b7e7b3
+<Control>s  1 1000 10000  @AT_BINDIR@/orca -n -d main-window #AT_TYPE=screenreader
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # press ctrl-m for 1 second to launch orca in mag mode
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-<Control>m  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier
David Zeuthen 6b7e7b3
+<Control>m  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier #AT_TYPE=magnifier
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # press ctrl-o or ctrl-g for 1 second to launch orca in speech and mag mode
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-<Control>o  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier
David Zeuthen 6b7e7b3
-<Control>g  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier
David Zeuthen 6b7e7b3
+<Control>o  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
David Zeuthen 6b7e7b3
+<Control>g  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
 # Start GOK with direct selection mode.
David Zeuthen 6b7e7b3
 #
David Zeuthen 6b7e7b3
-<Control>k  5 1000 10000  @AT_BINDIR@/gok --login --access-method=directselection
David Zeuthen 6b7e7b3
+<Control>k  5 1000 10000  @AT_BINDIR@/gok --login --access-method=directselection #AT_TYPE=onscreenkeyboard
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
Index: gui/greeter/greeter.c
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- gui/greeter/greeter.c	(revision 4608)
David Zeuthen 6b7e7b3
+++ gui/greeter/greeter.c	(working copy)
David Zeuthen 6b7e7b3
@@ -340,6 +340,19 @@
David Zeuthen 6b7e7b3
 	g_free (session);
David Zeuthen 6b7e7b3
 	break;
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
+    case GDM_A11Y:
David Zeuthen 6b7e7b3
+    {
David Zeuthen 6b7e7b3
+	const char *ats_launched;
David Zeuthen 6b7e7b3
+	/* print out the assistive technologies that we've started for the user */
David Zeuthen 6b7e7b3
+	ats_launched = g_getenv ("GDM_ATS");
David Zeuthen 6b7e7b3
+	if (ats_launched != NULL)
David Zeuthen 6b7e7b3
+		printf ("%c%s\n", STX, ats_launched);
David Zeuthen 6b7e7b3
+	else
David Zeuthen 6b7e7b3
+		printf ("%c\n", STX);
David Zeuthen 6b7e7b3
+	fflush (stdout);
David Zeuthen 6b7e7b3
+	break;
David Zeuthen 6b7e7b3
+    }
David Zeuthen 6b7e7b3
+
David Zeuthen 6b7e7b3
     case GDM_LANG:
David Zeuthen 6b7e7b3
 	language = greeter_language_get_language (args);
David Zeuthen 6b7e7b3
 	if (greeter_language_get_save_language () == GTK_RESPONSE_CANCEL)
David Zeuthen 6b7e7b3
Index: daemon/gdm.h
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- daemon/gdm.h	(revision 4608)
David Zeuthen 6b7e7b3
+++ daemon/gdm.h	(working copy)
David Zeuthen 6b7e7b3
@@ -98,6 +98,7 @@
David Zeuthen 6b7e7b3
 #define GDM_PROMPT     'N'
David Zeuthen 6b7e7b3
 #define GDM_SESS       'G'
David Zeuthen 6b7e7b3
 #define GDM_LANG       '&'
David Zeuthen 6b7e7b3
+#define GDM_A11Y       'Z'
David Zeuthen 6b7e7b3
 #define GDM_SSESS      'C'
David Zeuthen 6b7e7b3
 #define GDM_SLANG      'R'
David Zeuthen 6b7e7b3
 #define GDM_RESET      'A'
David Zeuthen 6b7e7b3
Index: daemon/slave.c
David Zeuthen 6b7e7b3
===================================================================
David Zeuthen 6b7e7b3
--- daemon/slave.c	(revision 4608)
David Zeuthen 6b7e7b3
+++ daemon/slave.c	(working copy)
David Zeuthen 6b7e7b3
@@ -3430,6 +3430,7 @@
David Zeuthen 6b7e7b3
 		   const char *session,
David Zeuthen 6b7e7b3
 		   const char *save_session,
David Zeuthen 6b7e7b3
 		   const char *language,
David Zeuthen 6b7e7b3
+		   const char *a11y_ats,
David Zeuthen 6b7e7b3
 		   const char *gnome_session,
David Zeuthen 6b7e7b3
 		   gboolean usrcfgok,
David Zeuthen 6b7e7b3
 		   gboolean savesess,
David Zeuthen 6b7e7b3
@@ -3522,6 +3523,9 @@
David Zeuthen 6b7e7b3
 		g_setenv ("XDG_SESSION_COOKIE", ck_session_cookie, TRUE);
David Zeuthen 6b7e7b3
 	}
David Zeuthen 6b7e7b3
 #endif
David Zeuthen 6b7e7b3
+	if (a11y_ats != NULL) {
David Zeuthen 6b7e7b3
+		g_setenv ("GDM_ATS", a11y_ats, TRUE);
David Zeuthen 6b7e7b3
+	}
David Zeuthen 6b7e7b3
 	g_setenv ("GDMSESSION", session, TRUE);
David Zeuthen 6b7e7b3
 	g_setenv ("DESKTOP_SESSION", session, TRUE);
David Zeuthen 6b7e7b3
 	g_setenv ("SHELL", pwent->pw_shell, TRUE);
David Zeuthen 6b7e7b3
@@ -4016,7 +4020,7 @@
David Zeuthen 6b7e7b3
 {
David Zeuthen 6b7e7b3
     struct passwd *pwent;
David Zeuthen 6b7e7b3
     const char *home_dir = NULL;
David Zeuthen 6b7e7b3
-    char *save_session = NULL, *session = NULL, *language = NULL, *usrsess, *usrlang;
David Zeuthen 6b7e7b3
+    char *save_session = NULL, *session = NULL, *language = NULL, *a11y_ats = NULL, *usrsess, *usrlang;
David Zeuthen 6b7e7b3
     char *gnome_session = NULL;
David Zeuthen 6b7e7b3
 #ifdef WITH_CONSOLE_KIT
David Zeuthen 6b7e7b3
     char *ck_session_cookie;
David Zeuthen 6b7e7b3
@@ -4187,9 +4191,19 @@
David Zeuthen 6b7e7b3
 		    g_free (usrlang);
David Zeuthen 6b7e7b3
 		    return;
David Zeuthen 6b7e7b3
 	    }
David Zeuthen 6b7e7b3
+
David Zeuthen 6b7e7b3
+	    a11y_ats = gdm_slave_greeter_ctl (GDM_A11Y, NULL);
David Zeuthen 6b7e7b3
+	    if (a11y_ats != NULL && 
David Zeuthen 6b7e7b3
+		strcmp (a11y_ats, GDM_RESPONSE_CANCEL) == 0) {
David Zeuthen 6b7e7b3
+		    gdm_debug ("User canceled login");
David Zeuthen 6b7e7b3
+		    gdm_verify_cleanup (d);
David Zeuthen 6b7e7b3
+		    session_started = FALSE;
David Zeuthen 6b7e7b3
+		    return;
David Zeuthen 6b7e7b3
+	    }
David Zeuthen 6b7e7b3
     } else {
David Zeuthen 6b7e7b3
 	    session = g_strdup (usrsess);
David Zeuthen 6b7e7b3
 	    language = g_strdup (usrlang);
David Zeuthen 6b7e7b3
+	    a11y_ats = NULL;
David Zeuthen 6b7e7b3
     }
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
     tmp = gdm_strip_extension (session, ".desktop");
David Zeuthen 6b7e7b3
@@ -4210,11 +4224,16 @@
David Zeuthen 6b7e7b3
 	    language = NULL;
David Zeuthen 6b7e7b3
     }
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
+    if G_LIKELY (ve_string_empty (a11y_ats)) {
David Zeuthen 6b7e7b3
+	    g_free (a11y_ats);
David Zeuthen 6b7e7b3
+	    a11y_ats = NULL;
David Zeuthen 6b7e7b3
+    }
David Zeuthen 6b7e7b3
+
David Zeuthen 6b7e7b3
     g_free (usrsess);
David Zeuthen 6b7e7b3
     g_free (usrlang);
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
-    gdm_debug ("Initial setting: session: '%s' language: '%s'\n",
David Zeuthen 6b7e7b3
-	       session, ve_sure_string (language));
David Zeuthen 6b7e7b3
+    gdm_debug ("Initial setting: session: '%s' language: '%s' ATs enabled in gdm: '%s'\n",
David Zeuthen 6b7e7b3
+	       session, ve_sure_string (language), ve_sure_string (a11y_ats));
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
     /* save this session as the users session */
David Zeuthen 6b7e7b3
     save_session = g_strdup (session);
David Zeuthen 6b7e7b3
@@ -4378,6 +4397,7 @@
David Zeuthen 6b7e7b3
 			   session,
David Zeuthen 6b7e7b3
 			   save_session,
David Zeuthen 6b7e7b3
 			   language,
David Zeuthen 6b7e7b3
+			   a11y_ats,
David Zeuthen 6b7e7b3
 			   gnome_session,
David Zeuthen 6b7e7b3
 			   usrcfgok,
David Zeuthen 6b7e7b3
 			   savesess,
David Zeuthen 6b7e7b3
--- gui/gdmlogin.c.orig	2007-03-19 23:32:04.000000000 -0400
David Zeuthen 6b7e7b3
+++ gui/gdmlogin.c	2007-03-19 23:32:33.000000000 -0400
David Zeuthen 6b7e7b3
@@ -1784,6 +1784,19 @@
David Zeuthen 6b7e7b3
 	fflush (stdout);
David Zeuthen 6b7e7b3
 	break;
David Zeuthen 6b7e7b3
 
David Zeuthen 6b7e7b3
+    case GDM_A11Y:
David Zeuthen 6b7e7b3
+    {
David Zeuthen 6b7e7b3
+	const char *ats_launched;
David Zeuthen 6b7e7b3
+	/* print out the assistive technologies that we've started for the user */
David Zeuthen 6b7e7b3
+	ats_launched = g_getenv ("GDM_ATS");
David Zeuthen 6b7e7b3
+	if (ats_launched != NULL)
David Zeuthen 6b7e7b3
+		printf ("%c%s\n", STX, ats_launched);
David Zeuthen 6b7e7b3
+	else
David Zeuthen 6b7e7b3
+		printf ("%c\n", STX);
David Zeuthen 6b7e7b3
+	fflush (stdout);
David Zeuthen 6b7e7b3
+	break;
David Zeuthen 6b7e7b3
+    }
David Zeuthen 6b7e7b3
+
David Zeuthen 6b7e7b3
     case GDM_LANG:
David Zeuthen 6b7e7b3
 	gdm_login_language_lookup (args);
David Zeuthen 6b7e7b3
 	if (savelang == GTK_RESPONSE_CANCEL)