diff --git a/src/actions.c b/src/actions.c index 4365679..05b619a 100644 --- a/src/actions.c +++ b/src/actions.c @@ -4116,12 +4116,20 @@ cmd_exchangeright (int interactive, struct cmdarg **args) cmdret * cmd_swap (int interactive, struct cmdarg **args) { + rp_screen *s; rp_frame *dest_frame; rp_frame *src_frame; dest_frame = ARG(0, frame); src_frame = args[1] ? ARG (1, frame) : current_frame(); - + + if (!rp_have_xinerama) + { + s = find_screen_by_frame(src_frame); + if (screen_find_frame_by_frame(s, dest_frame) == NULL) + return cmdret_new (RET_FAILURE, "swap: frames on different screens"); + } + exchange_with_frame (current_screen(), src_frame, dest_frame); return cmdret_new (RET_SUCCESS, NULL); diff --git a/src/ratpoison.h b/src/ratpoison.h diff --git a/src/screen.c b/src/screen.c index 88b95b7..f474996 100644 --- a/src/screen.c +++ b/src/screen.c @@ -161,6 +161,19 @@ find_screen (Window w) return NULL; } +/* Given a frame, return the rp_screen struct it belongs to */ +rp_screen * +find_screen_by_frame (rp_frame *f) +{ + int i; + + for (i=0; i