#include #include #include static gboolean client_cb (GtkWidget *widget, GdkEventClient *event, gpointer data) { if (event->message_type == gdk_atom_intern ("_NET_CHANGE_DISPLAY", FALSE)) { g_print ("old window %#lx\n", event->data.l[0]); switch (event->data.l[1]) { case GTK_WINDOW_CHANGE_SCREEN_SUCCESS: g_print ("success\n"); break; case GTK_WINDOW_CHANGE_SCREEN_NO_DISPLAY: g_print ("no display\n"); break; case GTK_WINDOW_CHANGE_SCREEN_NO_SCREEN: g_print ("no screen\n"); break; case GTK_WINDOW_CHANGE_SCREEN_NO_AUTH: g_print ("no auth\n"); break; case GTK_WINDOW_CHANGE_SCREEN_FAILURE: g_print ("failure\n"); break; case GTK_WINDOW_CHANGE_SCREEN_REFUSED: g_print ("refused\n"); break; default: g_print ("unknown\n"); break; } g_print ("new window %#lx\n", event->data.l[2]); gtk_main_quit (); } } static void send_change_display (GdkDisplay *display, gulong id, const gchar *display_name, GdkWindow *status_window) { GdkWindow *window; GdkAtom atom; GdkEventClient event; window = gdk_window_foreign_new (id); atom = gdk_atom_intern ("_NET_CHANGE_DISPLAY", FALSE); gdk_property_change (window, atom, gdk_atom_intern ("UTF8_STRING", FALSE), 8, GDK_PROP_MODE_REPLACE, display_name, strlen (display_name) + 1); event.type = GDK_CLIENT_EVENT; event.window = status_window; event.data_format = 32; event.message_type = gdk_atom_intern ("WM_PROTOCOLS", FALSE); event.data.l[0] = gdk_x11_atom_to_xatom_for_display (display, atom); event.data.l[1] = gtk_get_current_event_time (); event.data.l[2] = gdk_x11_atom_to_xatom_for_display (display, atom); event.data.l[3] = GDK_WINDOW_XID (status_window); gdk_event_send_client_message_for_display (gdk_display_get_default (), (GdkEvent *)&event, id); } static void usage (void) { g_print ("usage: movewindow \n"); exit (1); } int main (int argc, char *argv[]) { GtkWidget *status_window; gchar *display_name; gulong id; gtk_init (&argc, &argv); if (argc < 3) usage (); id = strtol (argv[1], NULL, 0); display_name = argv[2]; status_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_realize (status_window); g_signal_connect (status_window, "client-event", G_CALLBACK (client_cb), NULL); send_change_display (gdk_display_get_default (), id, display_name, status_window->window); gtk_main (); return 0; }