Mercurial > hg > xemacs-beta
comparison src/menubar-x.c @ 217:d44af0c54775 r20-4b7
Import from CVS: tag r20-4b7
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:08:34 +0200 |
parents | 3d6bfa290dbd |
children | 262b8bb4a523 |
comparison
equal
deleted
inserted
replaced
216:43306a74e31c | 217:d44af0c54775 |
---|---|
452 x_focus_timestamp_really_sucks_fix_me_better; | 452 x_focus_timestamp_really_sucks_fix_me_better; |
453 UNGCPRO; | 453 UNGCPRO; |
454 } | 454 } |
455 } | 455 } |
456 | 456 |
457 #ifdef ENERGIZE | |
458 extern int *get_psheets_for_buffer (Lisp_Object, int *); | |
459 | |
460 static void | |
461 set_panel_button_sensitivity (struct frame *f, widget_value *data) | |
462 { | |
463 struct window *window = XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f)); | |
464 int current_buffer_psheets_count = 0; | |
465 int *current_buffer_psheets = | |
466 get_psheets_for_buffer (window->buffer, ¤t_buffer_psheets_count); | |
467 int panel_enabled = FRAME_X_DESIRED_PSHEETS (f) || | |
468 current_buffer_psheets_count; | |
469 widget_value *val; | |
470 for (val = data->contents; val; val = val->next) | |
471 if (val->name && !strcmp (val->name, "sheet")) | |
472 { | |
473 val->enabled = panel_enabled; | |
474 return; | |
475 } | |
476 } | |
477 #endif /* ENERGIZE */ | |
478 | |
479 static widget_value * | 457 static widget_value * |
480 compute_menubar_data (struct frame *f, Lisp_Object menubar, int deep_p) | 458 compute_menubar_data (struct frame *f, Lisp_Object menubar, int deep_p) |
481 { | 459 { |
482 widget_value *data; | 460 widget_value *data; |
483 | 461 |
491 old_buffer = Fcurrent_buffer (); | 469 old_buffer = Fcurrent_buffer (); |
492 record_unwind_protect (Fset_buffer, old_buffer); | 470 record_unwind_protect (Fset_buffer, old_buffer); |
493 Fset_buffer ( XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer); | 471 Fset_buffer ( XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer); |
494 data = menu_item_descriptor_to_widget_value (menubar, MENUBAR_TYPE, | 472 data = menu_item_descriptor_to_widget_value (menubar, MENUBAR_TYPE, |
495 deep_p, 0); | 473 deep_p, 0); |
496 #ifdef ENERGIZE | |
497 if (data) | |
498 set_panel_button_sensitivity (f, data); | |
499 #endif | |
500 Fset_buffer (old_buffer); | 474 Fset_buffer (old_buffer); |
501 unbind_to (count, Qnil); | 475 unbind_to (count, Qnil); |
502 } | 476 } |
503 return data; | 477 return data; |
504 } | 478 } |
676 &btn->x, &btn->y, &btn->state); | 650 &btn->x, &btn->y, &btn->state); |
677 } | 651 } |
678 } | 652 } |
679 | 653 |
680 | 654 |
681 #ifdef ENERGIZE | |
682 extern int desired_debuggerpanel_exposed_p; | |
683 extern int current_debuggerpanel_exposed_p; | |
684 extern int debuggerpanel_sheet; | |
685 extern void notify_energize_sheet_hidden (unsigned long); | |
686 #endif | |
687 | 655 |
688 static void | 656 static void |
689 x_update_frame_menubar_internal (struct frame *f) | 657 x_update_frame_menubar_internal (struct frame *f) |
690 { | 658 { |
691 /* We assume the menubar contents has changed if the global flag is set, | 659 /* We assume the menubar contents has changed if the global flag is set, |
702 Boolean menubar_will_be_visible = menubar_was_visible; | 670 Boolean menubar_will_be_visible = menubar_was_visible; |
703 Boolean menubar_visibility_changed; | 671 Boolean menubar_visibility_changed; |
704 Cardinal new_num_top_widgets = 1; /* for the menubar */ | 672 Cardinal new_num_top_widgets = 1; /* for the menubar */ |
705 Widget container = FRAME_X_CONTAINER_WIDGET (f); | 673 Widget container = FRAME_X_CONTAINER_WIDGET (f); |
706 | 674 |
707 #ifdef ENERGIZE | |
708 int *old_sheets = FRAME_X_CURRENT_PSHEETS (f); | |
709 int *new_sheets = FRAME_X_DESIRED_PSHEETS (f); | |
710 int old_count = FRAME_X_CURRENT_PSHEET_COUNT (f); | |
711 int new_count = FRAME_X_DESIRED_PSHEET_COUNT (f); | |
712 Lisp_Object old_buf = FRAME_X_CURRENT_PSHEET_BUFFER (f); | |
713 Lisp_Object new_buf = FRAME_X_DESIRED_PSHEET_BUFFER (f); | |
714 int psheets_changed = (old_sheets != new_sheets | |
715 || old_count != new_count | |
716 || !EQ (old_buf, new_buf)); | |
717 int debuggerpanel_changed = (desired_debuggerpanel_exposed_p | |
718 != current_debuggerpanel_exposed_p); | |
719 | |
720 if (desired_debuggerpanel_exposed_p && FRAME_X_TOP_WIDGETS (f) [1] == 0) | |
721 /* This happens when the frame was just created. */ | |
722 debuggerpanel_changed = 1; | |
723 | |
724 FRAME_X_CURRENT_PSHEETS (f) = FRAME_X_DESIRED_PSHEETS (f); | |
725 FRAME_X_CURRENT_PSHEET_COUNT (f) = FRAME_X_DESIRED_PSHEET_COUNT (f); | |
726 FRAME_X_CURRENT_PSHEET_BUFFER (f) = FRAME_X_DESIRED_PSHEET_BUFFER (f); | |
727 #endif /* ENERGIZE */ | |
728 | |
729 if (menubar_contents_changed) | 675 if (menubar_contents_changed) |
730 menubar_will_be_visible = set_frame_menubar (f, 0, 0); | 676 menubar_will_be_visible = set_frame_menubar (f, 0, 0); |
731 | 677 |
732 menubar_visibility_changed = menubar_was_visible != menubar_will_be_visible; | 678 menubar_visibility_changed = menubar_was_visible != menubar_will_be_visible; |
733 | 679 |
734 if (! (menubar_visibility_changed | 680 if (! (menubar_visibility_changed |
735 #ifdef ENERGIZE | |
736 || psheets_changed || debuggerpanel_changed | |
737 #endif | |
738 )) | 681 )) |
739 return; | 682 return; |
740 | 683 |
741 | 684 |
742 /* Set menubar visibility */ | 685 /* Set menubar visibility */ |
743 if (menubar_visibility_changed) | 686 if (menubar_visibility_changed) |
744 (menubar_will_be_visible ? XtManageChild : XtUnmanageChild) | 687 (menubar_will_be_visible ? XtManageChild : XtUnmanageChild) |
745 (FRAME_X_MENUBAR_WIDGET (f)); | 688 (FRAME_X_MENUBAR_WIDGET (f)); |
746 | |
747 | |
748 #ifdef ENERGIZE | |
749 /* Set debugger panel visibility */ | |
750 if (debuggerpanel_changed) | |
751 { | |
752 Widget w; | |
753 int sheet = debuggerpanel_sheet; | |
754 | |
755 w = lw_get_widget (sheet, container, 0); | |
756 if (desired_debuggerpanel_exposed_p) | |
757 { | |
758 if (! w) | |
759 w = lw_make_widget (sheet, container, 0); | |
760 FRAME_X_TOP_WIDGETS (f)[1] = w; | |
761 XtManageChild (w); | |
762 } | |
763 else | |
764 { | |
765 notify_energize_sheet_hidden (sheet); | |
766 if (w) | |
767 XtUnmanageChild (w); | |
768 } | |
769 } | |
770 | |
771 /* Set psheet visibility. For the moment we just unmanage all the old | |
772 ones, and then manage all the new ones. If the number of psheets | |
773 ever becomes a large number (i.e. > 1), then we can worry about a | |
774 more sophisticated way of doing this. */ | |
775 if (psheets_changed) | |
776 { | |
777 int i; | |
778 Widget w; | |
779 unsigned long sheet; | |
780 | |
781 for (i=0; i<old_count; i++) | |
782 { | |
783 sheet = old_sheets[i]; | |
784 w = lw_get_widget (sheet, container, 0); | |
785 notify_energize_sheet_hidden (sheet); | |
786 if (w) | |
787 XtUnmanageChild (w); | |
788 } | |
789 | |
790 for (i=0; i<new_count; i++) | |
791 { | |
792 sheet = new_sheets[i]; | |
793 /* #### This unconditional call to lw_make_widget() is a bad | |
794 idea. Doesn't it cause a memory leak if the widget | |
795 already exists? | |
796 | |
797 #### How does Energize know that a sheet just got displayed? | |
798 #### Energize knows all. */ | |
799 w = lw_make_widget (sheet, container, 0); | |
800 FRAME_X_TOP_WIDGETS (f)[2+i] = w; | |
801 XtManageChild (w); | |
802 } | |
803 } | |
804 | |
805 new_num_top_widgets += 1+new_count; | |
806 #endif /* ENERGIZE */ | |
807 | 689 |
808 /* Note that new_num_top_widgets doesn't need to reflect the actual | 690 /* Note that new_num_top_widgets doesn't need to reflect the actual |
809 number of top widgets, but just the limit of FRAME_X_TOP_WIDGETS (f)[]. */ | 691 number of top widgets, but just the limit of FRAME_X_TOP_WIDGETS (f)[]. */ |
810 FRAME_X_NUM_TOP_WIDGETS (f) = new_num_top_widgets; | 692 FRAME_X_NUM_TOP_WIDGETS (f) = new_num_top_widgets; |
811 { | 693 { |
826 /* The window size might not have changed but the text size | 708 /* The window size might not have changed but the text size |
827 did; thus, the base size might be incorrect. So update it. */ | 709 did; thus, the base size might be incorrect. So update it. */ |
828 EmacsShellUpdateSizeHints (FRAME_X_SHELL_WIDGET (f)); | 710 EmacsShellUpdateSizeHints (FRAME_X_SHELL_WIDGET (f)); |
829 } | 711 } |
830 | 712 |
831 #ifdef ENERGIZE | |
832 /* Give back the focus to emacs if no psheets are displayed anymore */ | |
833 if (psheets_changed) | |
834 { | |
835 Lisp_Object frame; | |
836 XSETFRAME (frame, f); | |
837 Fselect_frame (frame); | |
838 } | |
839 #endif /* ENERGIZE */ | |
840 } | 713 } |
841 | 714 |
842 static void | 715 static void |
843 x_update_frame_menubars (struct frame *f) | 716 x_update_frame_menubars (struct frame *f) |
844 { | 717 { |
846 | 719 |
847 x_update_frame_menubar_internal (f); | 720 x_update_frame_menubar_internal (f); |
848 | 721 |
849 /* #### This isn't going to work right now that this function works on | 722 /* #### This isn't going to work right now that this function works on |
850 a per-frame, not per-device basis. Guess what? I don't care. */ | 723 a per-frame, not per-device basis. Guess what? I don't care. */ |
851 #ifdef ENERGIZE | |
852 current_debuggerpanel_exposed_p = desired_debuggerpanel_exposed_p; | |
853 #endif | |
854 } | 724 } |
855 | 725 |
856 static void | 726 static void |
857 x_free_frame_menubars (struct frame *f) | 727 x_free_frame_menubars (struct frame *f) |
858 { | 728 { |
865 { | 735 { |
866 LWLIB_ID id = XFRAME_MENUBAR_DATA (f)->id; | 736 LWLIB_ID id = XFRAME_MENUBAR_DATA (f)->id; |
867 lw_destroy_all_widgets (id); | 737 lw_destroy_all_widgets (id); |
868 XFRAME_MENUBAR_DATA (f)->id = 0; | 738 XFRAME_MENUBAR_DATA (f)->id = 0; |
869 } | 739 } |
870 | |
871 #ifdef ENERGIZE | |
872 { | |
873 /* Also destroy this frame's psheets */ | |
874 Widget parent = FRAME_X_CONTAINER_WIDGET (f); | |
875 int *sheets = FRAME_X_CURRENT_PSHEETS (f); | |
876 int i = FRAME_X_CURRENT_PSHEET_COUNT (f); | |
877 while (i--) | |
878 { | |
879 unsigned long sheet = sheets [i]; | |
880 Widget w = lw_get_widget (sheet, parent, 0); | |
881 if (w) | |
882 lw_destroy_widget (w); | |
883 } | |
884 FRAME_X_CURRENT_PSHEET_COUNT (f) = 0; | |
885 | |
886 /* Is this necessary? */ | |
887 sheets = FRAME_X_DESIRED_PSHEETS (f); | |
888 i = FRAME_X_DESIRED_PSHEET_COUNT (f); | |
889 while (i--) | |
890 { | |
891 unsigned long sheet = sheets [i]; | |
892 Widget w = lw_get_widget (sheet, parent, 0); | |
893 if (w) | |
894 lw_destroy_widget (w); | |
895 } | |
896 FRAME_X_DESIRED_PSHEET_COUNT (f) = 0; | |
897 | |
898 /* sigh... debugger panel is special... */ | |
899 if (debuggerpanel_sheet) | |
900 { | |
901 Widget w = lw_get_widget (debuggerpanel_sheet, parent, 0); | |
902 if (w) | |
903 lw_destroy_widget (w); | |
904 } | |
905 } | |
906 #endif /* ENERGIZE */ | |
907 } | 740 } |
908 | 741 |
909 static void | 742 static void |
910 x_popup_menu (Lisp_Object menu_desc, Lisp_Object event) | 743 x_popup_menu (Lisp_Object menu_desc, Lisp_Object event) |
911 { | 744 { |