e5d220f
diff -up gdm-2.19.6/gui/gdmlogin.c.pass-ats-to-session gdm-2.19.6/gui/gdmlogin.c
e5d220f
--- gdm-2.19.6/gui/gdmlogin.c.pass-ats-to-session	2007-08-15 23:16:09.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/gdmlogin.c	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -1570,6 +1570,19 @@ process_operation (guchar       op_code,
e5d220f
 	fflush (stdout);
e5d220f
 	break;
e5d220f
 
e5d220f
+    case GDM_A11Y:
e5d220f
+    {
e5d220f
+	const char *ats_launched;
e5d220f
+	/* print out the assistive technologies that we've started for the user */
e5d220f
+	ats_launched = g_getenv ("GDM_ATS");
e5d220f
+	if (ats_launched != NULL)
e5d220f
+		printf ("%c%s\n", STX, ats_launched);
e5d220f
+	else
e5d220f
+		printf ("%c\n", STX);
e5d220f
+	fflush (stdout);
e5d220f
+	break;
e5d220f
+    }
e5d220f
+
e5d220f
     case GDM_LANG:
e5d220f
 	gdm_lang_op_lang (args);
e5d220f
 	break;
e5d220f
diff -up gdm-2.19.6/gui/modules/dwellmouselistener.c.pass-ats-to-session gdm-2.19.6/gui/modules/dwellmouselistener.c
e5d220f
--- gdm-2.19.6/gui/modules/dwellmouselistener.c.pass-ats-to-session	2007-08-15 14:14:07.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/modules/dwellmouselistener.c	2007-08-15 23:25:29.000000000 -0400
e5d220f
@@ -601,11 +601,33 @@ leave_enter_emission_hook (GSignalInvoca
e5d220f
 					G_CALLBACK (gtk_widget_destroy), NULL);
e5d220f
 				gtk_widget_show (dialog);
e5d220f
 			} else {
e5d220f
+				const char *at_name;
e5d220f
+				const char *ats_launched;
e5d220f
 				GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
e5d220f
 				gdk_window_set_cursor (gdk_get_default_root_window (),
e5d220f
 					cursor);
e5d220f
 				gdk_cursor_unref (cursor);
e5d220f
 				g_timeout_add (2000, change_cursor_back, NULL);
e5d220f
+
e5d220f
+				at_name = strstr (action, "#AT_TYPE=");
e5d220f
+				if (at_name != NULL) {
e5d220f
+					int i;
e5d220f
+					char **v;
e5d220f
+					at_name += 9;
e5d220f
+					v = g_strsplit (at_name, " ", 0);
e5d220f
+					for (i = 0; v[i] != NULL; i++) {
e5d220f
+						ats_launched = g_getenv ("GDM_ATS");
e5d220f
+						if (ats_launched == NULL) {
e5d220f
+							g_setenv ("GDM_ATS", v[i], TRUE);
e5d220f
+						} else if (strstr (ats_launched, v[i]) == NULL) {
e5d220f
+							char *s;
e5d220f
+							s = g_strdup_printf ("%s %s", ats_launched, v[i]);
e5d220f
+							g_setenv ("GDM_ATS", s, TRUE);
e5d220f
+							g_free (s);
e5d220f
+						}
e5d220f
+					}
e5d220f
+					g_strfreev (v);
e5d220f
+				}
e5d220f
 			}
e5d220f
 		}
e5d220f
 	}
e5d220f
diff -up gdm-2.19.6/gui/modules/AccessKeyMouseEvents.in.pass-ats-to-session gdm-2.19.6/gui/modules/AccessKeyMouseEvents.in
e5d220f
--- gdm-2.19.6/gui/modules/AccessKeyMouseEvents.in.pass-ats-to-session	2007-08-15 14:14:07.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/modules/AccessKeyMouseEvents.in	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -78,14 +78,14 @@
e5d220f
 #
e5d220f
 # press ctrl-s for 1 second to launch orca in speech mode
e5d220f
 #
e5d220f
-<Control>s  1 1000 10000  @AT_BINDIR@/orca -n -d main-window
e5d220f
+<Control>s  1 1000 10000  @AT_BINDIR@/orca -n -d main-window #AT_TYPE=screenreader
e5d220f
 
e5d220f
 # press ctrl-m for 1 second to launch orca in mag mode
e5d220f
 #
e5d220f
-<Control>m  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier
e5d220f
+<Control>m  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier #AT_TYPE=magnifier
e5d220f
 
e5d220f
 # press ctrl-o or ctrl-g for 1 second to launch orca in speech and mag mode
e5d220f
 #
e5d220f
-<Control>o  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier
e5d220f
-<Control>g  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier
e5d220f
+<Control>o  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
e5d220f
+<Control>g  1 1000 10000  @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
e5d220f
 
e5d220f
diff -up gdm-2.19.6/gui/modules/AccessDwellMouseEvents.in.pass-ats-to-session gdm-2.19.6/gui/modules/AccessDwellMouseEvents.in
e5d220f
--- gdm-2.19.6/gui/modules/AccessDwellMouseEvents.in.pass-ats-to-session	2007-08-15 14:14:07.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/modules/AccessDwellMouseEvents.in	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -38,10 +38,10 @@
e5d220f
 # Support several different options for different user needs.  Note these
e5d220f
 # gestures all start by moving the mouse into the top window border.
e5d220f
 #
e5d220f
-TBLR I 10000    @AT_BINDIR@/gok --login --access-method=dwellselection
e5d220f
-TLBR I 10000    @AT_BINDIR@/gok --login --access-method=automaticscanning --scan-action=switch1 --select-action=switch1
e5d220f
-TRBL I 10000    @AT_BINDIR@/gok --login --access-method=inversescanning --scan-action=switch1 --select-action=switch2
e5d220f
-TBRL I 10000    @AT_BINDIR@/gok --login  --access-method=automaticscanning --scan-action=switch3 --select-action=switch3
e5d220f
+TBLR I 10000    @AT_BINDIR@/gok --login --access-method=dwellselection #AT_TYPE=onscreenkeyboard
e5d220f
+TLBR I 10000    @AT_BINDIR@/gok --login --access-method=automaticscanning --scan-action=switch1 --select-action=switch1 #AT_TYPE=onscreenkeyboard
e5d220f
+TRBL I 10000    @AT_BINDIR@/gok --login --access-method=inversescanning --scan-action=switch1 --select-action=switch2 #AT_TYPE=onscreenkeyboard
e5d220f
+TBRL I 10000    @AT_BINDIR@/gok --login  --access-method=automaticscanning --scan-action=switch3 --select-action=switch3 #AT_TYPE=onscreenkeyboard
e5d220f
 
e5d220f
 # AT Program - ORCA
e5d220f
 #
e5d220f
@@ -50,13 +50,13 @@ TBRL I 10000    @AT_BINDIR@/gok --login 
e5d220f
 #
e5d220f
 # Speech
e5d220f
 #
e5d220f
-BTRL I 10000    @AT_BINDIR@/orca -n -d main-window
e5d220f
+BTRL I 10000    @AT_BINDIR@/orca -n -d main-window #AT_TYPE=screenreader
e5d220f
 
e5d220f
 # Magnifier
e5d220f
 #
e5d220f
-BTLR I 10000    @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier
e5d220f
+BTLR I 10000    @AT_BINDIR@/orca -n -d main-window -d speech -e magnifier #AT_TYPE=magnifier
e5d220f
 
e5d220f
 # Speech and Magnifier
e5d220f
 #
e5d220f
-BRTL I 10000    @AT_BINDIR@/orca -n -d main-window -e magnifier
e5d220f
+BRTL I 10000    @AT_BINDIR@/orca -n -d main-window -e magnifier #AT_TYPE=screenreader magnifier
e5d220f
 
e5d220f
diff -up gdm-2.19.6/gui/modules/keymouselistener.c.pass-ats-to-session gdm-2.19.6/gui/modules/keymouselistener.c
e5d220f
--- gdm-2.19.6/gui/modules/keymouselistener.c.pass-ats-to-session	2007-08-15 14:14:07.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/modules/keymouselistener.c	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -953,6 +953,8 @@ gestures_filter (GdkXEvent *gdk_xevent,
e5d220f
 						NULL);
e5d220f
 					gtk_widget_show (dialog);
e5d220f
 				} else {
e5d220f
+					char *at_name;
e5d220f
+					const char *ats_launched;
e5d220f
 					GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
e5d220f
 					gdk_window_set_cursor (gdk_get_default_root_window (),
e5d220f
 						cursor);
e5d220f
@@ -960,6 +962,26 @@ gestures_filter (GdkXEvent *gdk_xevent,
e5d220f
 					g_timeout_add (2000,
e5d220f
 						       change_cursor_back,
e5d220f
 						       NULL);
e5d220f
+
e5d220f
+					at_name = strstr (action, "#AT_TYPE=");
e5d220f
+					if (at_name != NULL) {
e5d220f
+						int i;
e5d220f
+						char **v;
e5d220f
+						at_name += 9;
e5d220f
+						v = g_strsplit (at_name, " ", 0);
e5d220f
+						for (i = 0; v[i] != NULL; i++) {
e5d220f
+							ats_launched = g_getenv ("GDM_ATS");
e5d220f
+							if (ats_launched == NULL) {
e5d220f
+								g_setenv ("GDM_ATS", v[i], TRUE);
e5d220f
+							} else if (strstr (ats_launched, v[i]) == NULL) {
e5d220f
+								char *s;
e5d220f
+								s = g_strdup_printf ("%s %s", ats_launched, v[i]);
e5d220f
+								g_setenv ("GDM_ATS", s, TRUE);
e5d220f
+								g_free (s);
e5d220f
+							}
e5d220f
+						}
e5d220f
+						g_strfreev (v);
e5d220f
+					}
e5d220f
 				}
e5d220f
 			}
e5d220f
    			return GDK_FILTER_CONTINUE;
e5d220f
diff -up gdm-2.19.6/gui/greeter/greeter.c.pass-ats-to-session gdm-2.19.6/gui/greeter/greeter.c
e5d220f
--- gdm-2.19.6/gui/greeter/greeter.c.pass-ats-to-session	2007-08-15 23:16:08.000000000 -0400
e5d220f
+++ gdm-2.19.6/gui/greeter/greeter.c	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -390,6 +390,19 @@ process_operation (guchar       op_code,
e5d220f
 	g_free (session);
e5d220f
 	break;
e5d220f
 
e5d220f
+    case GDM_A11Y:
e5d220f
+    {
e5d220f
+	const char *ats_launched;
e5d220f
+	/* print out the assistive technologies that we've started for the user */
e5d220f
+	ats_launched = g_getenv ("GDM_ATS");
e5d220f
+	if (ats_launched != NULL)
e5d220f
+		printf ("%c%s\n", STX, ats_launched);
e5d220f
+	else
e5d220f
+		printf ("%c\n", STX);
e5d220f
+	fflush (stdout);
e5d220f
+	break;
e5d220f
+    }
e5d220f
+
e5d220f
     case GDM_LANG:
e5d220f
 	gdm_lang_op_lang (args);
e5d220f
 	break;
e5d220f
diff -up gdm-2.19.6/daemon/gdm-socket-protocol.h.pass-ats-to-session gdm-2.19.6/daemon/gdm-socket-protocol.h
e5d220f
--- gdm-2.19.6/daemon/gdm-socket-protocol.h.pass-ats-to-session	2007-08-15 23:16:08.000000000 -0400
e5d220f
+++ gdm-2.19.6/daemon/gdm-socket-protocol.h	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -41,6 +41,7 @@
e5d220f
 #define GDM_PROMPT     'N'
e5d220f
 #define GDM_SESS       'G'
e5d220f
 #define GDM_LANG       '&'
e5d220f
+#define GDM_A11Y       'Z'
e5d220f
 #define GDM_SSESS      'C'
e5d220f
 #define GDM_SLANG      'R'
e5d220f
 #define GDM_SETLANG    'L'
e5d220f
diff -up gdm-2.19.6/daemon/slave.c.pass-ats-to-session gdm-2.19.6/daemon/slave.c
e5d220f
--- gdm-2.19.6/daemon/slave.c.pass-ats-to-session	2007-08-15 23:16:08.000000000 -0400
e5d220f
+++ gdm-2.19.6/daemon/slave.c	2007-08-15 23:16:09.000000000 -0400
e5d220f
@@ -3575,6 +3575,7 @@ session_child_run (struct passwd *pwent,
e5d220f
 		   const char *session,
e5d220f
 		   const char *save_session,
e5d220f
 		   const char *language,
e5d220f
+		   const char *a11y_ats,
e5d220f
 		   const char *gnome_session,
e5d220f
 		   gboolean usrcfgok,
e5d220f
 		   gboolean savesess,
e5d220f
@@ -3667,6 +3668,9 @@ session_child_run (struct passwd *pwent,
e5d220f
 	}
e5d220f
 #endif
e5d220f
 	g_setenv ("PWD", home_dir, TRUE);
e5d220f
+	if (a11y_ats != NULL) {
e5d220f
+		g_setenv ("GDM_ATS", a11y_ats, TRUE);
e5d220f
+	}
e5d220f
 	g_setenv ("GDMSESSION", session, TRUE);
e5d220f
 	g_setenv ("DESKTOP_SESSION", session, TRUE);
e5d220f
 	g_setenv ("SHELL", pwent->pw_shell, TRUE);
e5d220f
@@ -4454,6 +4458,7 @@ gdm_slave_session_start (void)
e5d220f
 	struct passwd *pwent;
e5d220f
 	const char *home_dir = NULL;
e5d220f
 	char *save_session = NULL, *session = NULL, *language = NULL, *usrsess, *usrlang;
e5d220f
+	char *a11y_ats = NULL;
e5d220f
 	char *gnome_session = NULL;
e5d220f
 #ifdef WITH_CONSOLE_KIT
e5d220f
 	char *ck_session_cookie;
e5d220f
@@ -4622,9 +4627,19 @@ gdm_slave_session_start (void)
e5d220f
 			g_free (usrlang);
e5d220f
 			return;
e5d220f
 		}
e5d220f
+
e5d220f
+		a11y_ats = gdm_slave_greeter_ctl (GDM_A11Y, NULL);
e5d220f
+		if (a11y_ats != NULL && 
e5d220f
+		    strcmp (a11y_ats, GDM_RESPONSE_CANCEL) == 0) {
e5d220f
+			gdm_debug ("User canceled login");
e5d220f
+			gdm_verify_cleanup (d);
e5d220f
+			session_started = FALSE;
e5d220f
+			return;
e5d220f
+		}
e5d220f
 	} else {
e5d220f
 		session = g_strdup (usrsess);
e5d220f
 		language = g_strdup (usrlang);
e5d220f
+		a11y_ats = NULL;
e5d220f
 	}
e5d220f
 
e5d220f
 	tmp = gdm_strip_extension (session, ".desktop");
e5d220f
@@ -4645,10 +4660,15 @@ gdm_slave_session_start (void)
e5d220f
 		language = NULL;
e5d220f
 	}
e5d220f
 
e5d220f
+	if G_LIKELY (ve_string_empty (a11y_ats)) {
e5d220f
+		g_free (a11y_ats);
e5d220f
+		a11y_ats = NULL;
e5d220f
+	}
e5d220f
+
e5d220f
 	g_free (usrsess);
e5d220f
 
e5d220f
-	gdm_debug ("Initial setting: session: '%s' language: '%s'\n",
e5d220f
-		   session, ve_sure_string (language));
e5d220f
+	gdm_debug ("Initial setting: session: '%s' language: '%s'i ATs enabled in gdm: '%s'\n",
e5d220f
+		   session, ve_sure_string (language), ve_sure_string (a11y_ats));
e5d220f
 
e5d220f
 	/* save this session as the users session */
e5d220f
 	save_session = g_strdup (session);
e5d220f
@@ -4840,6 +4860,7 @@ gdm_slave_session_start (void)
e5d220f
 					   session,
e5d220f
 					   save_session,
e5d220f
 					   lang,
e5d220f
+					   a11y_ats,
e5d220f
 					   gnome_session,
e5d220f
 					   usrcfgok,
e5d220f
 					   savesess,