X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmoveresize.c;h=2c9f0cdfb7b2820ca5642de41b46255a95193503;hb=43139ed3734c11c858f92f1c2cc7ed4cdba169cb;hp=c8263179829ca9570758c42c6dca959374b65d27;hpb=7886b797a36f5a035a75a19424e0b3cf7825baf8;p=chaz%2Fopenbox diff --git a/openbox/moveresize.c b/openbox/moveresize.c index c8263179..2c9f0cdf 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -19,9 +19,22 @@ static guint button; static guint32 corner; static Corner lockcorner; +static guint button_return, button_escape, button_left, button_right, + button_up, button_down; + #define POPUP_X (10) #define POPUP_Y (10) +void moveresize_startup() +{ + button_return = XKeysymToKeycode(ob_display, XStringToKeysym("Return")); + button_escape = XKeysymToKeycode(ob_display, XStringToKeysym("Escape")); + button_left = XKeysymToKeycode(ob_display, XStringToKeysym("Left")); + button_right = XKeysymToKeycode(ob_display, XStringToKeysym("Right")); + button_up = XKeysymToKeycode(ob_display, XStringToKeysym("Up")); + button_down = XKeysymToKeycode(ob_display, XStringToKeysym("Down")); +} + static void popup_coords(char *format, int a, int b) { XSetWindowAttributes attrib; @@ -59,29 +72,42 @@ void moveresize_start(Client *c, int x, int y, guint b, guint32 cnr) start_ch = c->area.height; start_x = x; start_y = y; - button = b; + if (corner == prop_atoms.net_wm_moveresize_move_keyboard || + corner == prop_atoms.net_wm_moveresize_size_keyboard) + button = 0; /* mouse can't end it without being pressed first */ + else + button = b; corner = cnr; + if (corner == prop_atoms.net_wm_moveresize_move || + corner == prop_atoms.net_wm_moveresize_move_keyboard) { + cur_x = start_cx; + cur_y = start_cy; + moving = TRUE; + } else { + cur_x = start_cw; + cur_y = start_ch; + moving = FALSE; + } + moveresize_in_progress = TRUE; - moving = (corner == prop_atoms.net_wm_moveresize_move || - corner == prop_atoms.net_wm_moveresize_move_keyboard); if (corner == prop_atoms.net_wm_moveresize_size_topleft) cur = ob_cursors.tl; else if (corner == prop_atoms.net_wm_moveresize_size_top) - cur = ob_cursors.tl; + cur = ob_cursors.t; else if (corner == prop_atoms.net_wm_moveresize_size_topright) cur = ob_cursors.tr; else if (corner == prop_atoms.net_wm_moveresize_size_right) - cur = ob_cursors.tr; + cur = ob_cursors.r; else if (corner == prop_atoms.net_wm_moveresize_size_bottomright) cur = ob_cursors.br; else if (corner == prop_atoms.net_wm_moveresize_size_bottom) - cur = ob_cursors.br; + cur = ob_cursors.b; else if (corner == prop_atoms.net_wm_moveresize_size_bottomleft) cur = ob_cursors.bl; else if (corner == prop_atoms.net_wm_moveresize_size_left) - cur = ob_cursors.bl; + cur = ob_cursors.l; else if (corner == prop_atoms.net_wm_moveresize_size_keyboard) cur = ob_cursors.br; else if (corner == prop_atoms.net_wm_moveresize_move) @@ -91,27 +117,80 @@ void moveresize_start(Client *c, int x, int y, guint b, guint32 cnr) else g_assert_not_reached(); - grab_keyboard(TRUE); grab_pointer(TRUE, cur); + grab_keyboard(TRUE); +} + +static void end_moveresize(gboolean cancel) +{ + grab_keyboard(FALSE); + grab_pointer(FALSE, None); + + XDestroyWindow(ob_display, coords); + coords = None; + + moveresize_in_progress = FALSE; + + if (moving) { + client_configure(client, Corner_TopLeft, (cancel ? start_cx : cur_x), + (cancel ? start_cy : cur_y), + start_cw, start_ch, TRUE, TRUE); + } else { + client_configure(client, lockcorner, client->area.x, + client->area.y, (cancel ? start_cw : cur_x), + (cancel ? start_ch : cur_y), TRUE, TRUE); + } +} + +static void do_move() +{ + dispatch_move(client, &cur_x, &cur_y); + + popup_coords("X: %d Y: %d", cur_x, cur_y); + + /* get where the client should be */ + frame_frame_gravity(client->frame, &cur_x, &cur_y); + client_configure(client, Corner_TopLeft, cur_x, cur_y, + start_cw, start_ch, TRUE, FALSE); +} + +static void do_resize() +{ + /* dispatch_resize needs the frame size */ + cur_x += client->frame->size.left + client->frame->size.right; + cur_y += client->frame->size.top + client->frame->size.bottom; + + dispatch_resize(client, &cur_x, &cur_y, lockcorner); + + cur_x -= client->frame->size.left + client->frame->size.right; + cur_y -= client->frame->size.top + client->frame->size.bottom; + + client_configure(client, lockcorner, client->area.x, + client->area.y, cur_x, cur_y, TRUE, FALSE); + + popup_coords("W: %d H: %d", client->logical_size.width, + client->logical_size.height); } void moveresize_event(XEvent *e) { g_assert(moveresize_in_progress); - if (e->type == MotionNotify) { + if (e->type == ButtonPress) { + if (!button) { + start_x = e->xbutton.x_root; + start_y = e->xbutton.y_root; + button = e->xbutton.button; /* this will end it now */ + } + } else if (e->type == ButtonRelease) { + if (!button || e->xbutton.button == button) { + end_moveresize(FALSE); + } + } else if (e->type == MotionNotify) { if (moving) { cur_x = start_cx + e->xmotion.x_root - start_x; cur_y = start_cy + e->xmotion.y_root - start_y; - - dispatch_move(client, &cur_x, &cur_y); - - popup_coords("X: %d Y: %d", cur_x, cur_y); - - /* get where the client should be */ - frame_frame_gravity(client->frame, &cur_x, &cur_y); - client_configure(client, Corner_TopLeft, cur_x, cur_y, - start_cw, start_ch, TRUE, FALSE); + do_move(); } else { if (corner == prop_atoms.net_wm_moveresize_size_topleft) { cur_x = start_cw - (e->xmotion.x_root - start_x); @@ -154,39 +233,39 @@ void moveresize_event(XEvent *e) } else g_assert_not_reached(); - /* dispatch_resize needs the frame size */ - cur_x += client->frame->size.left + client->frame->size.right; - cur_y += client->frame->size.top + client->frame->size.bottom; - - dispatch_resize(client, &cur_x, &cur_y, lockcorner); - - cur_x -= client->frame->size.left + client->frame->size.right; - cur_y -= client->frame->size.top + client->frame->size.bottom; - - client_configure(client, lockcorner, client->area.x, - client->area.y, cur_x, cur_y, TRUE, FALSE); - - popup_coords("W: %d H: %d", client->logical_size.width, - client->logical_size.height); + do_resize(); } - } else if (e->type == ButtonRelease) { - if (e->xbutton.button == button) { - grab_keyboard(FALSE); - grab_pointer(FALSE, None); - - XDestroyWindow(ob_display, coords); - coords = None; - - moveresize_in_progress = FALSE; - - if (moving) { - client_configure(client, Corner_TopLeft, cur_x, cur_y, - start_cw, start_ch, TRUE, TRUE); - } else { - client_configure(client, lockcorner, client->area.x, - client->area.y, cur_x, cur_y, TRUE, TRUE); + } else if (e->type == KeyPress) { + if (e->xkey.keycode == button_escape) + end_moveresize(TRUE); + else if (e->xkey.keycode == button_return) + end_moveresize(FALSE); + else { + if (corner == prop_atoms.net_wm_moveresize_size_keyboard) { + if (e->xkey.keycode == button_right) + cur_x += MAX(4, client->size_inc.width); + else if (e->xkey.keycode == button_left) + cur_x -= MAX(4, client->size_inc.width); + else if (e->xkey.keycode == button_down) + cur_y += MAX(4, client->size_inc.height); + else if (e->xkey.keycode == button_up) + cur_y -= MAX(4, client->size_inc.height); + else + return; + do_resize(); + } else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) { + if (e->xkey.keycode == button_right) + cur_x += 4; + else if (e->xkey.keycode == button_left) + cur_x -= 4; + else if (e->xkey.keycode == button_down) + cur_y += 4; + else if (e->xkey.keycode == button_up) + cur_y -= 4; + else + return; + do_move(); } } - } else if (e->type == KeyPress) { } }