diff --git a/src/tests/test-client.c b/src/tests/test-client.c index 657ecc27d..650f81857 100644 --- a/src/tests/test-client.c +++ b/src/tests/test-client.c @@ -212,6 +212,56 @@ process_line (const char *line) gboolean enabled = g_ascii_strcasecmp (argv[2], "true") == 0; gtk_window_set_accept_focus (GTK_WINDOW (window), enabled); } + else if (strcmp (argv[0], "can_take_focus") == 0) + { + if (argc != 3) + { + g_print ("usage: %s [true|false]", argv[0]); + goto out; + } + + GtkWidget *window = lookup_window (argv[1]); + if (!window) + { + g_print ("unknown window %s", argv[1]); + goto out; + } + + if (wayland) + { + g_print ("%s not supported under wayland", argv[0]); + goto out; + } + + GdkDisplay *display = gdk_display_get_default (); + GdkWindow *gdkwindow = gtk_widget_get_window (window); + Display *xdisplay = gdk_x11_display_get_xdisplay (display); + Window xwindow = GDK_WINDOW_XID (gdkwindow); + Atom wm_take_focus = gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"); + gboolean add = g_ascii_strcasecmp(argv[2], "true") == 0; + Atom *protocols = NULL; + Atom *new_protocols; + int n_protocols = 0; + int i, n = 0; + + gdk_display_sync (display); + XGetWMProtocols (xdisplay, xwindow, &protocols, &n_protocols); + new_protocols = g_new0 (Atom, n_protocols + (add ? 1 : 0)); + + for (i = 0; i < n_protocols; ++i) + { + if (protocols[i] != wm_take_focus) + new_protocols[n++] = protocols[i]; + } + + if (add) + new_protocols[n++] = wm_take_focus; + + XSetWMProtocols (xdisplay, xwindow, new_protocols, n); + + XFree (new_protocols); + XFree (protocols); + } else if (strcmp (argv[0], "show") == 0) { if (argc != 2) diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c index cd3a85854..b24ddcb73 100644 --- a/src/tests/test-runner.c +++ b/src/tests/test-runner.c @@ -460,6 +460,25 @@ test_case_do (TestCase *test, NULL)) return FALSE; } + else if (strcmp (argv[0], "can_take_focus") == 0) + { + if (argc != 3 || + (g_ascii_strcasecmp (argv[2], "true") != 0 && + g_ascii_strcasecmp (argv[2], "false") != 0)) + BAD_COMMAND("usage: %s / [true|false]", + argv[0]); + + TestClient *client; + const char *window_id; + if (!test_case_parse_window_id (test, argv[1], &client, &window_id, error)) + return FALSE; + + if (!test_client_do (client, error, + argv[0], window_id, + argv[2], + NULL)) + return FALSE; + } else if (strcmp (argv[0], "show") == 0) { if (argc != 2)