Mercurial > hg > xemacs-beta
comparison src/scrollbar-x.c @ 288:e11d67e05968 r21-0b42
Import from CVS: tag r21-0b42
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:35:54 +0200 |
parents | c42ec1d1cded |
children | 182f72e8cd0d |
comparison
equal
deleted
inserted
replaced
287:13a0bd77a29d | 288:e11d67e05968 |
---|---|
398 { | 398 { |
399 /* This function can GC */ | 399 /* This function can GC */ |
400 scroll_event *data = (scroll_event *) client_data; | 400 scroll_event *data = (scroll_event *) client_data; |
401 struct device *d = get_device_from_display (XtDisplay (widget)); | 401 struct device *d = get_device_from_display (XtDisplay (widget)); |
402 struct frame *f = x_any_window_to_frame (d, XtWindow (widget)); | 402 struct frame *f = x_any_window_to_frame (d, XtWindow (widget)); |
403 Lisp_Object win; | 403 Lisp_Object win, frame; |
404 struct scrollbar_instance *instance; | 404 struct scrollbar_instance *instance; |
405 struct window_mirror *mirror; | 405 struct window_mirror *mirror; |
406 | 406 |
407 if (!f) | 407 if (!f) |
408 return; | 408 return; |
411 win = real_window (mirror, 1); | 411 win = real_window (mirror, 1); |
412 | 412 |
413 if (NILP (win)) | 413 if (NILP (win)) |
414 return; | 414 return; |
415 instance = mirror->scrollbar_vertical_instance; | 415 instance = mirror->scrollbar_vertical_instance; |
416 frame = WINDOW_FRAME (XWINDOW (win)); | |
416 | 417 |
417 /* It seems that this is necessary whenever signal_special_Xt_user_event() | 418 /* It seems that this is necessary whenever signal_special_Xt_user_event() |
418 is called. #### Why??? */ | 419 is called. #### Why??? */ |
419 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d); | 420 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d); |
420 | 421 |
421 switch (data->action) | 422 switch (data->action) |
422 { | 423 { |
423 case SCROLLBAR_LINE_UP: | 424 case SCROLLBAR_LINE_UP: |
424 signal_special_Xt_user_event (win, Qscrollbar_line_up, win); | 425 signal_special_Xt_user_event (frame, Qscrollbar_line_up, win); |
425 break; | 426 break; |
426 | 427 |
427 case SCROLLBAR_LINE_DOWN: | 428 case SCROLLBAR_LINE_DOWN: |
428 signal_special_Xt_user_event (win, Qscrollbar_line_down, win); | 429 signal_special_Xt_user_event (frame, Qscrollbar_line_down, win); |
429 break; | 430 break; |
430 | 431 |
431 /* The Athena scrollbar paging behavior is that of xterms. | 432 /* The Athena scrollbar paging behavior is that of xterms. |
432 Depending on where you click the size of the page varies. | 433 Depending on where you click the size of the page varies. |
433 Motif always does a standard Emacs page. */ | 434 Motif always does a standard Emacs page. */ |
440 double line = tmp * | 441 double line = tmp * |
441 (double) window_displayed_height (XWINDOW (win)); | 442 (double) window_displayed_height (XWINDOW (win)); |
442 | 443 |
443 if (line > -1.0) | 444 if (line > -1.0) |
444 line = -1.0; | 445 line = -1.0; |
445 signal_special_Xt_user_event (win, Qscrollbar_page_up, | 446 signal_special_Xt_user_event (frame, Qscrollbar_page_up, |
446 Fcons (win, make_int ((int) line))); | 447 Fcons (win, make_int ((int) line))); |
447 } | 448 } |
448 #else | 449 #else |
449 signal_special_Xt_user_event (win, Qscrollbar_page_up, | 450 signal_special_Xt_user_event (frame, Qscrollbar_page_up, |
450 Fcons (win, Qnil)); | 451 Fcons (win, Qnil)); |
451 #endif | 452 #endif |
452 break; | 453 break; |
453 | 454 |
454 case SCROLLBAR_PAGE_DOWN: | 455 case SCROLLBAR_PAGE_DOWN: |
463 if (SCROLLBAR_X_POS_DATA(instance).maximum > | 464 if (SCROLLBAR_X_POS_DATA(instance).maximum > |
464 (SCROLLBAR_X_POS_DATA(instance).slider_size + SCROLLBAR_X_POS_DATA(instance).slider_position)) | 465 (SCROLLBAR_X_POS_DATA(instance).slider_size + SCROLLBAR_X_POS_DATA(instance).slider_position)) |
465 { | 466 { |
466 if (line < 1.0) | 467 if (line < 1.0) |
467 line = 1.0; | 468 line = 1.0; |
468 signal_special_Xt_user_event (win, Qscrollbar_page_down, | 469 signal_special_Xt_user_event (frame, Qscrollbar_page_down, |
469 Fcons (win, | 470 Fcons (win, |
470 make_int ((int) line))); | 471 make_int ((int) line))); |
471 } | 472 } |
472 } | 473 } |
473 #else | 474 #else |
474 signal_special_Xt_user_event (win, Qscrollbar_page_down, | 475 signal_special_Xt_user_event (frame, Qscrollbar_page_down, |
475 Fcons (win, Qnil)); | 476 Fcons (win, Qnil)); |
476 #endif | 477 #endif |
477 break; | 478 break; |
478 | 479 |
479 case SCROLLBAR_TOP: | 480 case SCROLLBAR_TOP: |
480 signal_special_Xt_user_event (win, Qscrollbar_to_top, win); | 481 signal_special_Xt_user_event (frame, Qscrollbar_to_top, win); |
481 break; | 482 break; |
482 | 483 |
483 case SCROLLBAR_BOTTOM: | 484 case SCROLLBAR_BOTTOM: |
484 signal_special_Xt_user_event (win, Qscrollbar_to_bottom, win); | 485 signal_special_Xt_user_event (frame, Qscrollbar_to_bottom, win); |
485 break; | 486 break; |
486 | 487 |
487 | 488 |
488 case SCROLLBAR_CHANGE: | 489 case SCROLLBAR_CHANGE: |
489 inhibit_slider_size_change = 0; | 490 inhibit_slider_size_change = 0; |
581 if (value >= SCROLLBAR_X_POS_DATA (instance).maximum) | 582 if (value >= SCROLLBAR_X_POS_DATA (instance).maximum) |
582 value = SCROLLBAR_X_POS_DATA (instance).maximum - 1; | 583 value = SCROLLBAR_X_POS_DATA (instance).maximum - 1; |
583 if (value < SCROLLBAR_X_POS_DATA (instance).minimum) | 584 if (value < SCROLLBAR_X_POS_DATA (instance).minimum) |
584 value = SCROLLBAR_X_POS_DATA (instance).minimum; | 585 value = SCROLLBAR_X_POS_DATA (instance).minimum; |
585 | 586 |
586 signal_special_Xt_user_event (win, Qscrollbar_vertical_drag, | 587 signal_special_Xt_user_event (frame, Qscrollbar_vertical_drag, |
587 Fcons (win, make_int (value))); | 588 Fcons (win, make_int (value))); |
588 } | 589 } |
589 break; | 590 break; |
590 | 591 |
591 } | 592 } |
601 XtPointer client_data) | 602 XtPointer client_data) |
602 { | 603 { |
603 scroll_event *data = (scroll_event *) client_data; | 604 scroll_event *data = (scroll_event *) client_data; |
604 struct device *d = get_device_from_display (XtDisplay (widget)); | 605 struct device *d = get_device_from_display (XtDisplay (widget)); |
605 struct frame *f = x_any_window_to_frame (d, XtWindow (widget)); | 606 struct frame *f = x_any_window_to_frame (d, XtWindow (widget)); |
606 Lisp_Object win; | 607 Lisp_Object win, frame; |
607 struct window_mirror *mirror; | 608 struct window_mirror *mirror; |
608 | 609 |
609 if (!f) | 610 if (!f) |
610 return; | 611 return; |
611 | 612 |
612 mirror = find_scrollbar_window_mirror (f, id); | 613 mirror = find_scrollbar_window_mirror (f, id); |
613 win = real_window (mirror, 1); | 614 win = real_window (mirror, 1); |
614 | 615 |
615 if (NILP (win)) | 616 if (NILP (win)) |
616 return; | 617 return; |
618 frame = WINDOW_FRAME (XWINDOW (win)); | |
617 | 619 |
618 /* It seems that this is necessary whenever signal_special_Xt_user_event() | 620 /* It seems that this is necessary whenever signal_special_Xt_user_event() |
619 is called. #### Why??? */ | 621 is called. #### Why??? */ |
620 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d); | 622 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d); |
621 | 623 |
622 switch (data->action) | 624 switch (data->action) |
623 { | 625 { |
624 case SCROLLBAR_LINE_UP: | 626 case SCROLLBAR_LINE_UP: |
625 signal_special_Xt_user_event (win, Qscrollbar_char_left, win); | 627 signal_special_Xt_user_event (frame, Qscrollbar_char_left, win); |
626 break; | 628 break; |
627 case SCROLLBAR_LINE_DOWN: | 629 case SCROLLBAR_LINE_DOWN: |
628 signal_special_Xt_user_event (win, Qscrollbar_char_right, win); | 630 signal_special_Xt_user_event (frame, Qscrollbar_char_right, win); |
629 break; | 631 break; |
630 case SCROLLBAR_PAGE_UP: | 632 case SCROLLBAR_PAGE_UP: |
631 signal_special_Xt_user_event (win, Qscrollbar_page_left, win); | 633 signal_special_Xt_user_event (frame, Qscrollbar_page_left, win); |
632 break; | 634 break; |
633 case SCROLLBAR_PAGE_DOWN: | 635 case SCROLLBAR_PAGE_DOWN: |
634 signal_special_Xt_user_event (win, Qscrollbar_page_right, win); | 636 signal_special_Xt_user_event (frame, Qscrollbar_page_right, win); |
635 break; | 637 break; |
636 case SCROLLBAR_TOP: | 638 case SCROLLBAR_TOP: |
637 signal_special_Xt_user_event (win, Qscrollbar_to_left, win); | 639 signal_special_Xt_user_event (frame, Qscrollbar_to_left, win); |
638 break; | 640 break; |
639 case SCROLLBAR_BOTTOM: | 641 case SCROLLBAR_BOTTOM: |
640 signal_special_Xt_user_event (win, Qscrollbar_to_right, win); | 642 signal_special_Xt_user_event (frame, Qscrollbar_to_right, win); |
641 break; | 643 break; |
642 case SCROLLBAR_CHANGE: | 644 case SCROLLBAR_CHANGE: |
643 inhibit_slider_size_change = 0; | 645 inhibit_slider_size_change = 0; |
644 break; | 646 break; |
645 case SCROLLBAR_DRAG: | 647 case SCROLLBAR_DRAG: |
646 inhibit_slider_size_change = 1; | 648 inhibit_slider_size_change = 1; |
647 /* #### Fix the damn toolkit code so they all work the same way. | 649 /* #### Fix the damn toolkit code so they all work the same way. |
648 Lucid is the one mostly wrong.*/ | 650 Lucid is the one mostly wrong.*/ |
649 #if defined (LWLIB_SCROLLBARS_LUCID) || defined (LWLIB_SCROLLBARS_ATHENA3D) | 651 #if defined (LWLIB_SCROLLBARS_LUCID) || defined (LWLIB_SCROLLBARS_ATHENA3D) |
650 signal_special_Xt_user_event (win, Qscrollbar_horizontal_drag, | 652 signal_special_Xt_user_event (frame, Qscrollbar_horizontal_drag, |
651 (Fcons | 653 (Fcons |
652 (win, make_int (data->slider_value)))); | 654 (win, make_int (data->slider_value)))); |
653 #else | 655 #else |
654 signal_special_Xt_user_event (win, Qscrollbar_horizontal_drag, | 656 signal_special_Xt_user_event (frame, Qscrollbar_horizontal_drag, |
655 (Fcons | 657 (Fcons |
656 (win, | 658 (win, |
657 make_int (data->slider_value - 1)))); | 659 make_int (data->slider_value - 1)))); |
658 #endif | 660 #endif |
659 break; | 661 break; |