comparison src/macterm.c @ 65822:00a8cdae2968

(mac_invert_rectangle): New function. (XTflash): Use it.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Tue, 04 Oct 2005 09:20:38 +0000
parents 797dc38b416e
children 41fc0bf568be 2a679c81f552 aa89c814f853
comparison
equal deleted inserted replaced
65821:943945974210 65822:00a8cdae2968
713 return err; 713 return err;
714 } 714 }
715 #endif 715 #endif
716 716
717 static void 717 static void
718 mac_invert_rectangle (display, w, x, y, width, height)
719 Display *display;
720 WindowPtr w;
721 int x, y;
722 unsigned int width, height;
723 {
724 Rect r;
725
726 SetPortWindowPort (w);
727
728 SetRect (&r, x, y, x + width, y + height);
729
730 InvertRect (&r);
731 }
732
733
734 static void
718 mac_draw_string_common (display, w, gc, x, y, buf, nchars, mode, 735 mac_draw_string_common (display, w, gc, x, y, buf, nchars, mode,
719 bytes_per_char) 736 bytes_per_char)
720 Display *display; 737 Display *display;
721 WindowPtr w; 738 WindowPtr w;
722 GC gc; 739 GC gc;
3484 3501
3485 void 3502 void
3486 XTflash (f) 3503 XTflash (f)
3487 struct frame *f; 3504 struct frame *f;
3488 { 3505 {
3506 /* Get the height not including a menu bar widget. */
3507 int height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, FRAME_LINES (f));
3508 /* Height of each line to flash. */
3509 int flash_height = FRAME_LINE_HEIGHT (f);
3510 /* These will be the left and right margins of the rectangles. */
3511 int flash_left = FRAME_INTERNAL_BORDER_WIDTH (f);
3512 int flash_right = FRAME_PIXEL_WIDTH (f) - FRAME_INTERNAL_BORDER_WIDTH (f);
3513
3514 int width;
3515
3516 /* Don't flash the area between a scroll bar and the frame
3517 edge it is next to. */
3518 switch (FRAME_VERTICAL_SCROLL_BAR_TYPE (f))
3519 {
3520 case vertical_scroll_bar_left:
3521 flash_left += VERTICAL_SCROLL_BAR_WIDTH_TRIM;
3522 break;
3523
3524 case vertical_scroll_bar_right:
3525 flash_right -= VERTICAL_SCROLL_BAR_WIDTH_TRIM;
3526 break;
3527
3528 default:
3529 break;
3530 }
3531
3532 width = flash_right - flash_left;
3533
3489 BLOCK_INPUT; 3534 BLOCK_INPUT;
3490 3535
3491 FlashMenuBar (0); 3536 /* If window is tall, flash top and bottom line. */
3537 if (height > 3 * FRAME_LINE_HEIGHT (f))
3538 {
3539 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3540 flash_left,
3541 (FRAME_INTERNAL_BORDER_WIDTH (f)
3542 + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)),
3543 width, flash_height);
3544 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3545 flash_left,
3546 (height - flash_height
3547 - FRAME_INTERNAL_BORDER_WIDTH (f)),
3548 width, flash_height);
3549 }
3550 else
3551 /* If it is short, flash it all. */
3552 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3553 flash_left, FRAME_INTERNAL_BORDER_WIDTH (f),
3554 width, height - 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
3555
3556 x_flush (f);
3492 3557
3493 { 3558 {
3494 struct timeval wakeup; 3559 struct timeval wakeup;
3495 3560
3496 EMACS_GET_TIME (wakeup); 3561 EMACS_GET_TIME (wakeup);
3498 /* Compute time to wait until, propagating carry from usecs. */ 3563 /* Compute time to wait until, propagating carry from usecs. */
3499 wakeup.tv_usec += 150000; 3564 wakeup.tv_usec += 150000;
3500 wakeup.tv_sec += (wakeup.tv_usec / 1000000); 3565 wakeup.tv_sec += (wakeup.tv_usec / 1000000);
3501 wakeup.tv_usec %= 1000000; 3566 wakeup.tv_usec %= 1000000;
3502 3567
3503 /* Keep waiting until past the time wakeup. */ 3568 /* Keep waiting until past the time wakeup or any input gets
3504 while (1) 3569 available. */
3570 while (! detect_input_pending ())
3505 { 3571 {
3506 struct timeval timeout; 3572 struct timeval current;
3507 3573 struct timeval timeout;
3508 EMACS_GET_TIME (timeout); 3574
3509 3575 EMACS_GET_TIME (current);
3510 /* In effect, timeout = wakeup - timeout. 3576
3511 Break if result would be negative. */ 3577 /* Break if result would be negative. */
3512 if (timeval_subtract (&timeout, wakeup, timeout)) 3578 if (timeval_subtract (&current, wakeup, current))
3513 break; 3579 break;
3514 3580
3515 /* Try to wait that long--but we might wake up sooner. */ 3581 /* How long `select' should wait. */
3516 select (0, NULL, NULL, NULL, &timeout); 3582 timeout.tv_sec = 0;
3583 timeout.tv_usec = 10000;
3584
3585 /* Try to wait that long--but we might wake up sooner. */
3586 select (0, NULL, NULL, NULL, &timeout);
3517 } 3587 }
3518 } 3588 }
3519 3589
3520 FlashMenuBar (0); 3590 /* If window is tall, flash top and bottom line. */
3591 if (height > 3 * FRAME_LINE_HEIGHT (f))
3592 {
3593 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3594 flash_left,
3595 (FRAME_INTERNAL_BORDER_WIDTH (f)
3596 + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)),
3597 width, flash_height);
3598 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3599 flash_left,
3600 (height - flash_height
3601 - FRAME_INTERNAL_BORDER_WIDTH (f)),
3602 width, flash_height);
3603 }
3604 else
3605 /* If it is short, flash it all. */
3606 mac_invert_rectangle (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f),
3607 flash_left, FRAME_INTERNAL_BORDER_WIDTH (f),
3608 width, height - 2 * FRAME_INTERNAL_BORDER_WIDTH (f));
3609
3610 x_flush (f);
3521 3611
3522 UNBLOCK_INPUT; 3612 UNBLOCK_INPUT;
3523 } 3613 }
3524 3614
3525 #endif /* defined (HAVE_TIMEVAL) && defined (HAVE_SELECT) */ 3615 #endif /* defined (HAVE_TIMEVAL) && defined (HAVE_SELECT) */