aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1995-07-21 08:31:15 +0000
committerRichard M. Stallman1995-07-21 08:31:15 +0000
commit8d8a349485120e4076af76ba92ab12984760f05a (patch)
tree001ca6ca91950cde3ee36f3a4f942d4844a79022 /src
parent3f5572980b4b8559e5d0febb726899ca35f87007 (diff)
downloademacs-8d8a349485120e4076af76ba92ab12984760f05a.tar.gz
emacs-8d8a349485120e4076af76ba92ab12984760f05a.zip
(set_frame_menubar): If the Lisp-level menu bar menus
are unchanged, don't recompute the widgets.
Diffstat (limited to 'src')
-rw-r--r--src/xmenu.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index 6ed239d4e86..c0574fe0779 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1520,6 +1520,9 @@ set_frame_menubar (f, first_time)
1520 Widget menubar_widget = f->display.x->menubar_widget; 1520 Widget menubar_widget = f->display.x->menubar_widget;
1521 Lisp_Object tail, items, frame; 1521 Lisp_Object tail, items, frame;
1522 widget_value *wv, *first_wv, *prev_wv = 0; 1522 widget_value *wv, *first_wv, *prev_wv = 0;
1523 int previous_menu_items_used = f->menu_bar_items_used;
1524 Lisp_Object *previous_items
1525 = (Lisp_Object *) alloca (previous_menu_items_used * sizeof (Lisp_Object));
1523 int i; 1526 int i;
1524 int id; 1527 int id;
1525 int count; 1528 int count;
@@ -1540,10 +1543,15 @@ set_frame_menubar (f, first_time)
1540 wv->enabled = 1; 1543 wv->enabled = 1;
1541 first_wv = wv; 1544 first_wv = wv;
1542 items = FRAME_MENU_BAR_ITEMS (f); 1545 items = FRAME_MENU_BAR_ITEMS (f);
1546
1547 /* Save the frame's previous menu bar contents data. */
1548 bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items,
1549 previous_menu_items_used * sizeof (Lisp_Object));
1550
1551 /* Fill in the current menu bar contents. */
1543 menu_items = f->menu_bar_vector; 1552 menu_items = f->menu_bar_vector;
1544 menu_items_allocated = XVECTOR (menu_items)->size; 1553 menu_items_allocated = XVECTOR (menu_items)->size;
1545 init_menu_items (); 1554 init_menu_items ();
1546
1547 for (i = 0; i < XVECTOR (items)->size; i += 3) 1555 for (i = 0; i < XVECTOR (items)->size; i += 3)
1548 { 1556 {
1549 Lisp_Object key, string, maps; 1557 Lisp_Object key, string, maps;
@@ -1564,6 +1572,24 @@ set_frame_menubar (f, first_time)
1564 prev_wv = wv; 1572 prev_wv = wv;
1565 } 1573 }
1566 1574
1575 finish_menu_items ();
1576
1577 /* If there has been no change in the Lisp-level contents
1578 of the menu bar, skip redisplaying it. Just exit. */
1579
1580 for (i = 0; i < previous_menu_items_used; i++)
1581 if (menu_items_used == i
1582 || (previous_items[i] != XVECTOR (menu_items)->contents[i]))
1583 break;
1584 if (i == menu_items_used && i == previous_menu_items_used)
1585 {
1586 free_menubar_widget_value_tree (first_wv);
1587 menu_items = Qnil;
1588
1589 unbind_to (specpdl_count, Qnil);
1590 return;
1591 }
1592
1567 /* Now GC cannot happen during the lifetime of the widget_value, 1593 /* Now GC cannot happen during the lifetime of the widget_value,
1568 so it's safe to store data from a Lisp_String. */ 1594 so it's safe to store data from a Lisp_String. */
1569 wv = first_wv->contents; 1595 wv = first_wv->contents;
@@ -1577,8 +1603,6 @@ set_frame_menubar (f, first_time)
1577 wv = wv->next; 1603 wv = wv->next;
1578 } 1604 }
1579 1605
1580 finish_menu_items ();
1581
1582 f->menu_bar_vector = menu_items; 1606 f->menu_bar_vector = menu_items;
1583 f->menu_bar_items_used = menu_items_used; 1607 f->menu_bar_items_used = menu_items_used;
1584 menu_items = Qnil; 1608 menu_items = Qnil;
@@ -1633,9 +1657,9 @@ set_frame_menubar (f, first_time)
1633 1657
1634 update_frame_menubar (f); 1658 update_frame_menubar (f);
1635 1659
1636 unbind_to (specpdl_count, Qnil);
1637
1638 UNBLOCK_INPUT; 1660 UNBLOCK_INPUT;
1661
1662 unbind_to (specpdl_count, Qnil);
1639} 1663}
1640 1664
1641/* Called from Fx_create_frame to create the inital menubar of a frame 1665/* Called from Fx_create_frame to create the inital menubar of a frame