diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 229 |
1 files changed, 124 insertions, 105 deletions
diff --git a/src/Window.cc b/src/Window.cc index ba18a05..a6689cb 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.cc,v 1.37 2002/04/04 11:28:19 fluxgen Exp $ | 25 | // $Id: Window.cc,v 1.38 2002/04/04 13:19:10 fluxgen Exp $ |
26 | 26 | ||
27 | //use GNU extensions | 27 | //use GNU extensions |
28 | #ifndef _GNU_SOURCE | 28 | #ifndef _GNU_SOURCE |
@@ -1495,9 +1495,9 @@ void FluxboxWindow::getWMIconName(void) { | |||
1495 | 1495 | ||
1496 | XFree((char *) text_prop.value); | 1496 | XFree((char *) text_prop.value); |
1497 | } else | 1497 | } else |
1498 | client.icon_title = getTitle(); //assign title to icon title | 1498 | client.icon_title = getTitle(); |
1499 | } else | 1499 | } else |
1500 | client.icon_title = getTitle(); //assign title to icon title | 1500 | client.icon_title = getTitle(); |
1501 | } | 1501 | } |
1502 | 1502 | ||
1503 | 1503 | ||
@@ -2035,6 +2035,10 @@ void FluxboxWindow::close(void) { | |||
2035 | void FluxboxWindow::withdraw(void) { | 2035 | void FluxboxWindow::withdraw(void) { |
2036 | visible = false; | 2036 | visible = false; |
2037 | iconic = false; | 2037 | iconic = false; |
2038 | if (isMoving()) | ||
2039 | stopMoving(); | ||
2040 | if (isResizing()) | ||
2041 | stopResizing(); | ||
2038 | 2042 | ||
2039 | XUnmapWindow(display, frame.window); | 2043 | XUnmapWindow(display, frame.window); |
2040 | 2044 | ||
@@ -3295,46 +3299,11 @@ void FluxboxWindow::buttonReleaseEvent(XButtonEvent *re) { | |||
3295 | if (! validateClient()) | 3299 | if (! validateClient()) |
3296 | return; | 3300 | return; |
3297 | 3301 | ||
3298 | if (moving) { | 3302 | if (isMoving()) |
3299 | moving = false; | 3303 | stopMoving(); |
3300 | 3304 | else if (isResizing()) | |
3301 | fluxbox->maskWindowEvents(0, (FluxboxWindow *) 0); | 3305 | stopResizing(); |
3302 | 3306 | else if (re->window == frame.window) { | |
3303 | if (! screen->doOpaqueMove()) { | ||
3304 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3305 | frame.move_x, frame.move_y, frame.resize_w, | ||
3306 | frame.resize_h); | ||
3307 | |||
3308 | configure(frame.move_x, frame.move_y, frame.width, frame.height); | ||
3309 | fluxbox->ungrab(); | ||
3310 | } else | ||
3311 | configure(frame.x, frame.y, frame.width, frame.height); | ||
3312 | |||
3313 | screen->hideGeometry(); | ||
3314 | XUngrabPointer(display, CurrentTime); | ||
3315 | } else if (resizing) { | ||
3316 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3317 | frame.resize_x, frame.resize_y, | ||
3318 | frame.resize_w, frame.resize_h); | ||
3319 | |||
3320 | screen->hideGeometry(); | ||
3321 | |||
3322 | if (re->window == frame.left_grip) | ||
3323 | left_fixsize(); | ||
3324 | else | ||
3325 | right_fixsize(); | ||
3326 | |||
3327 | resizing = false; | ||
3328 | configure(frame.resize_x, frame.resize_y, | ||
3329 | frame.resize_w - screen->getBorderWidth2x(), | ||
3330 | frame.resize_h - screen->getBorderWidth2x()); | ||
3331 | |||
3332 | if (tab) | ||
3333 | tab->resize(); | ||
3334 | |||
3335 | fluxbox->ungrab(); | ||
3336 | XUngrabPointer(display, CurrentTime); | ||
3337 | } else if (re->window == frame.window) { | ||
3338 | if (re->button == 2 && re->state == Mod1Mask) | 3307 | if (re->button == 2 && re->state == Mod1Mask) |
3339 | XUngrabPointer(display, CurrentTime); | 3308 | XUngrabPointer(display, CurrentTime); |
3340 | } else { | 3309 | } else { |
@@ -3356,39 +3325,13 @@ void FluxboxWindow::buttonReleaseEvent(XButtonEvent *re) { | |||
3356 | 3325 | ||
3357 | 3326 | ||
3358 | void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) { | 3327 | void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) { |
3359 | Fluxbox *fluxbox = Fluxbox::instance(); | ||
3360 | if ((me->state & Button1Mask) && functions.move && | 3328 | if ((me->state & Button1Mask) && functions.move && |
3361 | (frame.title == me->window || frame.label == me->window || | 3329 | (frame.title == me->window || frame.label == me->window || |
3362 | frame.handle == me->window || frame.window == me->window) && !resizing) { | 3330 | frame.handle == me->window || frame.window == me->window) && !isResizing()) { |
3363 | 3331 | ||
3364 | if (! moving) { | 3332 | if (! isMoving()) { |
3365 | XGrabPointer(display, me->window, False, Button1MotionMask | | 3333 | startMoving(me->window); |
3366 | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, | 3334 | } else { |
3367 | None, fluxbox->getMoveCursor(), CurrentTime); | ||
3368 | |||
3369 | if (windowmenu && windowmenu->isVisible()) | ||
3370 | windowmenu->hide(); | ||
3371 | |||
3372 | moving = true; | ||
3373 | |||
3374 | fluxbox->maskWindowEvents(client.window, this); | ||
3375 | |||
3376 | if (! screen->doOpaqueMove()) { | ||
3377 | fluxbox->grab(); | ||
3378 | |||
3379 | frame.move_x = frame.x; | ||
3380 | frame.move_y = frame.y; | ||
3381 | frame.resize_w = frame.width + screen->getBorderWidth2x(); | ||
3382 | frame.resize_h = ((shaded) ? frame.title_h : frame.height) + | ||
3383 | screen->getBorderWidth2x(); | ||
3384 | |||
3385 | screen->showPosition(frame.x, frame.y); | ||
3386 | |||
3387 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3388 | frame.move_x, frame.move_y, | ||
3389 | frame.resize_w, frame.resize_h); | ||
3390 | } | ||
3391 | } else { | ||
3392 | int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y; | 3335 | int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y; |
3393 | 3336 | ||
3394 | dx -= screen->getBorderWidth(); | 3337 | dx -= screen->getBorderWidth(); |
@@ -3429,8 +3372,7 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) { | |||
3429 | 3372 | ||
3430 | if (! screen->doOpaqueMove()) { | 3373 | if (! screen->doOpaqueMove()) { |
3431 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | 3374 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), |
3432 | frame.move_x, frame.move_y, frame.resize_w, | 3375 | frame.move_x, frame.move_y, frame.resize_w, frame.resize_h); |
3433 | frame.resize_h); | ||
3434 | 3376 | ||
3435 | frame.move_x = dx; | 3377 | frame.move_x = dx; |
3436 | frame.move_y = dy; | 3378 | frame.move_y = dy; |
@@ -3441,7 +3383,7 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) { | |||
3441 | } else | 3383 | } else |
3442 | configure(dx, dy, frame.width, frame.height); | 3384 | configure(dx, dy, frame.width, frame.height); |
3443 | 3385 | ||
3444 | screen->showPosition(dx, dy); | 3386 | screen->showPosition(dx, dy); |
3445 | } | 3387 | } |
3446 | } else if (functions.resize && | 3388 | } else if (functions.resize && |
3447 | (((me->state & Button1Mask) && (me->window == frame.right_grip || | 3389 | (((me->state & Button1Mask) && (me->window == frame.right_grip || |
@@ -3449,35 +3391,8 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent *me) { | |||
3449 | me->window == frame.window)) { | 3391 | me->window == frame.window)) { |
3450 | bool left = (me->window == frame.left_grip); | 3392 | bool left = (me->window == frame.left_grip); |
3451 | 3393 | ||
3452 | if (! resizing) { | 3394 | if (! resizing) { |
3453 | XGrabPointer(display, me->window, false, ButtonMotionMask | | 3395 | startResizing(me, left); |
3454 | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, | ||
3455 | ((left) ? fluxbox->getLowerLeftAngleCursor() : | ||
3456 | fluxbox->getLowerRightAngleCursor()), | ||
3457 | CurrentTime); | ||
3458 | |||
3459 | resizing = true; | ||
3460 | |||
3461 | // fluxbox->grab(); | ||
3462 | |||
3463 | int gx, gy; | ||
3464 | frame.grab_x = me->x - screen->getBorderWidth(); | ||
3465 | frame.grab_y = me->y - screen->getBorderWidth2x(); | ||
3466 | frame.resize_x = frame.x; | ||
3467 | frame.resize_y = frame.y; | ||
3468 | frame.resize_w = frame.width + screen->getBorderWidth2x(); | ||
3469 | frame.resize_h = frame.height + screen->getBorderWidth2x(); | ||
3470 | |||
3471 | if (left) | ||
3472 | left_fixsize(&gx, &gy); | ||
3473 | else | ||
3474 | right_fixsize(&gx, &gy); | ||
3475 | |||
3476 | screen->showGeometry(gx, gy); | ||
3477 | |||
3478 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3479 | frame.resize_x, frame.resize_y, | ||
3480 | frame.resize_w, frame.resize_h); | ||
3481 | } else if (resizing) { | 3396 | } else if (resizing) { |
3482 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | 3397 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), |
3483 | frame.resize_x, frame.resize_y, | 3398 | frame.resize_x, frame.resize_y, |
@@ -3566,6 +3481,110 @@ bool FluxboxWindow::validateClient(void) { | |||
3566 | return true; | 3481 | return true; |
3567 | } | 3482 | } |
3568 | 3483 | ||
3484 | void FluxboxWindow::startMoving(Window win) { | ||
3485 | moving = true; | ||
3486 | Fluxbox *fluxbox = Fluxbox::instance(); | ||
3487 | XGrabPointer(display, win, False, Button1MotionMask | | ||
3488 | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, | ||
3489 | None, fluxbox->getMoveCursor(), CurrentTime); | ||
3490 | |||
3491 | if (windowmenu && windowmenu->isVisible()) | ||
3492 | windowmenu->hide(); | ||
3493 | |||
3494 | fluxbox->maskWindowEvents(client.window, this); | ||
3495 | |||
3496 | if (! screen->doOpaqueMove()) { | ||
3497 | fluxbox->grab(); | ||
3498 | |||
3499 | frame.move_x = frame.x; | ||
3500 | frame.move_y = frame.y; | ||
3501 | frame.resize_w = frame.width + screen->getBorderWidth2x(); | ||
3502 | frame.resize_h = ((shaded) ? frame.title_h : frame.height) + | ||
3503 | screen->getBorderWidth2x(); | ||
3504 | |||
3505 | screen->showPosition(frame.x, frame.y); | ||
3506 | |||
3507 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3508 | frame.move_x, frame.move_y, | ||
3509 | frame.resize_w, frame.resize_h); | ||
3510 | } | ||
3511 | } | ||
3512 | |||
3513 | void FluxboxWindow::stopMoving() { | ||
3514 | moving = false; | ||
3515 | Fluxbox *fluxbox = Fluxbox::instance(); | ||
3516 | |||
3517 | fluxbox->maskWindowEvents(0, (FluxboxWindow *) 0); | ||
3518 | |||
3519 | if (! screen->doOpaqueMove()) { | ||
3520 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3521 | frame.move_x, frame.move_y, frame.resize_w, | ||
3522 | frame.resize_h); | ||
3523 | |||
3524 | configure(frame.move_x, frame.move_y, frame.width, frame.height); | ||
3525 | fluxbox->ungrab(); | ||
3526 | } else | ||
3527 | configure(frame.x, frame.y, frame.width, frame.height); | ||
3528 | |||
3529 | screen->hideGeometry(); | ||
3530 | XUngrabPointer(display, CurrentTime); | ||
3531 | |||
3532 | XSync(display, False); //make sure the redraw is made before we continue | ||
3533 | } | ||
3534 | |||
3535 | void FluxboxWindow::startResizing(XMotionEvent *me, bool left) { | ||
3536 | resizing = true; | ||
3537 | Fluxbox *fluxbox = Fluxbox::instance(); | ||
3538 | XGrabPointer(display, me->window, false, ButtonMotionMask | ButtonReleaseMask, | ||
3539 | GrabModeAsync, GrabModeAsync, None, | ||
3540 | ((left) ? fluxbox->getLowerLeftAngleCursor() : fluxbox->getLowerRightAngleCursor()), | ||
3541 | CurrentTime); | ||
3542 | |||
3543 | int gx, gy; | ||
3544 | frame.grab_x = me->x - screen->getBorderWidth(); | ||
3545 | frame.grab_y = me->y - screen->getBorderWidth2x(); | ||
3546 | frame.resize_x = frame.x; | ||
3547 | frame.resize_y = frame.y; | ||
3548 | frame.resize_w = frame.width + screen->getBorderWidth2x(); | ||
3549 | frame.resize_h = frame.height + screen->getBorderWidth2x(); | ||
3550 | |||
3551 | if (left) | ||
3552 | left_fixsize(&gx, &gy); | ||
3553 | else | ||
3554 | right_fixsize(&gx, &gy); | ||
3555 | |||
3556 | screen->showGeometry(gx, gy); | ||
3557 | |||
3558 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3559 | frame.resize_x, frame.resize_y, | ||
3560 | frame.resize_w, frame.resize_h); | ||
3561 | } | ||
3562 | |||
3563 | void FluxboxWindow::stopResizing(Window win) { | ||
3564 | resizing = false; | ||
3565 | |||
3566 | XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), | ||
3567 | frame.resize_x, frame.resize_y, | ||
3568 | frame.resize_w, frame.resize_h); | ||
3569 | |||
3570 | screen->hideGeometry(); | ||
3571 | |||
3572 | if (win == frame.left_grip) | ||
3573 | left_fixsize(); | ||
3574 | else | ||
3575 | right_fixsize(); | ||
3576 | |||
3577 | |||
3578 | configure(frame.resize_x, frame.resize_y, | ||
3579 | frame.resize_w - screen->getBorderWidth2x(), | ||
3580 | frame.resize_h - screen->getBorderWidth2x()); | ||
3581 | |||
3582 | if (tab) | ||
3583 | tab->resize(); | ||
3584 | |||
3585 | Fluxbox::instance()->ungrab(); | ||
3586 | XUngrabPointer(display, CurrentTime); | ||
3587 | } | ||
3569 | 3588 | ||
3570 | void FluxboxWindow::restore(void) { | 3589 | void FluxboxWindow::restore(void) { |
3571 | XChangeSaveSet(display, client.window, SetModeDelete); | 3590 | XChangeSaveSet(display, client.window, SetModeDelete); |