#include #include static gboolean on_window2_configure (GtkWidget *window, GdkEventConfigure *event, gpointer useless_data) { GtkWidget *window1; gint x, y; gint dx, dy; gint x2, y2; x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(window), "pos_x")); y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(window), "pos_y")); dx = event->x - x; dy = event->y - y; window1 = GTK_WIDGET(useless_data); g_message ("dx:%d, dy:%d", dx, dy); g_object_set_data (G_OBJECT(window), "pos_x", GINT_TO_POINTER(event->x)); g_object_set_data (G_OBJECT(window), "pos_y", GINT_TO_POINTER(event->y)); gtk_window_get_position (GTK_WINDOW(window1), &x2, &y2); x2 += dx; y2 += dy; gtk_window_move (GTK_WINDOW(window1), x2, y2); return FALSE; } static void on_window1_button_press (GtkWidget *widget, GdkEventButton *event, gpointer null) { if (event->button == 1) { gtk_window_begin_move_drag (GTK_WINDOW(widget), event->button, event->x_root, event->y_root, event->time); } } static void on_window2_button_press (GtkWidget *widget, GdkEventButton *event, gpointer null) { if (event->button == 1) { gtk_window_begin_move_drag (GTK_WINDOW(widget), event->button, event->x_root, event->y_root, event->time); } } gint main (gint argc, gchar **argv) { GtkWidget *window1, *window2; gtk_init (&argc, &argv); window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_add_events (window1, GDK_BUTTON_PRESS_MASK); gtk_widget_realize (window1); gtk_widget_set_size_request (window1, 100, 100); gtk_window_set_decorated (GTK_WINDOW(window1), FALSE); gtk_widget_show_all (window1); gtk_window_move (GTK_WINDOW(window1), 100, 100); window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_add_events (window2, GDK_BUTTON_PRESS_MASK); gtk_widget_realize (window2); gtk_widget_set_size_request (window2, 100, 100); gtk_window_set_decorated (GTK_WINDOW(window2), FALSE); gtk_widget_show_all (window2); gtk_window_move (GTK_WINDOW(window2), 200, 300); g_object_set_data (G_OBJECT(window2), "pos_x", GINT_TO_POINTER(200)); g_object_set_data (G_OBJECT(window2), "pos_y", GINT_TO_POINTER(300)); g_signal_connect (G_OBJECT(window2), "configure-event", G_CALLBACK(on_window2_configure), window1); g_signal_connect (G_OBJECT(window1), "button-press-event", G_CALLBACK(on_window1_button_press), NULL); g_signal_connect (G_OBJECT(window2), "button-press-event", G_CALLBACK(on_window2_button_press), NULL); gtk_main (); return EXIT_SUCCESS; }