static VALUE rg_find_window(int argc, VALUE *argv, VALUE self) { VALUE drag_window, x_root, y_root; GdkWindow *dest_window; GdkDragProtocol prot; if (argc == 3) { rb_scan_args(argc, argv, "30", &drag_window, &x_root, &y_root); gdk_drag_find_window(_SELF(self), GDK_WINDOW(RVAL2GOBJ(drag_window)), NUM2INT(x_root), NUM2INT(y_root), &dest_window, &prot); } else { VALUE screen; rb_scan_args(argc, argv, "40", &drag_window, &screen, &x_root, &y_root); gdk_drag_find_window_for_screen(_SELF(self), GDK_WINDOW(RVAL2GOBJ(drag_window)), GDK_SCREEN(RVAL2GOBJ(screen)), NUM2INT(x_root), NUM2INT(y_root), &dest_window, &prot); } return rb_ary_new3(2, GOBJ2RVAL(dest_window), GENUM2RVAL(prot, GDK_TYPE_DRAG_PROTOCOL)); }
static void process_drag_motion(gint x_root, gint y_root, guint state) { GdkWindow *dest_window; GdkDragProtocol prot; gdk_drag_find_window_for_screen(get_drag_context(), NULL, gdk_screen_get_default(), x_root, y_root, &dest_window, &prot); if (prot != GDK_DRAG_PROTO_NONE) { GdkDragAction action, possible_actions; determine_actions(state, &action, &possible_actions); gdk_drag_motion(get_drag_context(), dest_window, prot, x_root, y_root, action, possible_actions, GDK_CURRENT_TIME); } }