diff options
| author | Richard M. Stallman | 1995-07-21 08:31:15 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1995-07-21 08:31:15 +0000 |
| commit | 8d8a349485120e4076af76ba92ab12984760f05a (patch) | |
| tree | 001ca6ca91950cde3ee36f3a4f942d4844a79022 /src | |
| parent | 3f5572980b4b8559e5d0febb726899ca35f87007 (diff) | |
| download | emacs-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.c | 34 |
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 |