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, &current_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 {