+ if (control || shift || ui->cur_mode) {
+ int x = ui->cur_x, y = ui->cur_y, xwrap = x, ywrap = y;
+ if (x < 0 || x >= state->w || y < 0 || y >= state->h)
+ return NULL;
+ move_cursor(button | pad, &x, &y,
+ state->w, state->h, FALSE);
+ move_cursor(button | pad, &xwrap, &ywrap,
+ state->w, state->h, TRUE);
+
+ if (x != xwrap) {
+ sprintf(buf, "R%d,%c1", y, x ? '+' : '-');
+ } else if (y != ywrap) {
+ sprintf(buf, "C%d,%c1", x, y ? '+' : '-');
+ } else if (x == ui->cur_x)
+ sprintf(buf, "C%d,%d", x, y - ui->cur_y);
+ else
+ sprintf(buf, "R%d,%d", y, x - ui->cur_x);
+
+ if (control || (!shift && ui->cur_mode == lock_tile)) {
+ ui->cur_x = xwrap;
+ ui->cur_y = ywrap;
+ }
+
+ return dupstr(buf);
+ } else {
+ int x = ui->cur_x + 1, y = ui->cur_y + 1;
+
+ move_cursor(button | pad, &x, &y,
+ state->w + 2, state->h + 2, FALSE);
+
+ if (x == 0 && y == 0) {
+ int t = ui->cur_x;
+ ui->cur_x = ui->cur_y;
+ ui->cur_y = t;
+ } else if (x == 0 && y == state->h + 1) {
+ int t = ui->cur_x;
+ ui->cur_x = (state->h - 1) - ui->cur_y;
+ ui->cur_y = (state->h - 1) - t;
+ } else if (x == state->w + 1 && y == 0) {
+ int t = ui->cur_x;
+ ui->cur_x = (state->w - 1) - ui->cur_y;
+ ui->cur_y = (state->w - 1) - t;
+ } else if (x == state->w + 1 && y == state->h + 1) {
+ int t = ui->cur_x;
+ ui->cur_x = state->w - state->h + ui->cur_y;
+ ui->cur_y = state->h - state->w + t;
+ } else {
+ ui->cur_x = x - 1;
+ ui->cur_y = y - 1;
+ }