Mercurial > emacs
comparison src/xmenu.c @ 9725:98d374d51f4d
(set_frame_menubar): Don't copy string during GC risk.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Thu, 27 Oct 1994 18:44:47 +0000 |
parents | 910da93766c8 |
children | 358d48409854 |
comparison
equal
deleted
inserted
replaced
9724:193eeb5e78aa | 9725:98d374d51f4d |
---|---|
1375 int first_time; | 1375 int first_time; |
1376 { | 1376 { |
1377 Widget menubar_widget = f->display.x->menubar_widget; | 1377 Widget menubar_widget = f->display.x->menubar_widget; |
1378 int id = (int) f; | 1378 int id = (int) f; |
1379 Lisp_Object tail, items; | 1379 Lisp_Object tail, items; |
1380 widget_value *wv, *save_wv, *first_wv, *prev_wv = 0; | 1380 widget_value *wv, *first_wv, *prev_wv = 0; |
1381 int i; | 1381 int i; |
1382 | 1382 |
1383 BLOCK_INPUT; | 1383 BLOCK_INPUT; |
1384 | 1384 |
1385 wv = malloc_widget_value (); | 1385 wv = malloc_widget_value (); |
1386 wv->name = "menubar"; | 1386 wv->name = "menubar"; |
1387 wv->value = 0; | 1387 wv->value = 0; |
1388 wv->enabled = 1; | 1388 wv->enabled = 1; |
1389 save_wv = first_wv = wv; | 1389 first_wv = wv; |
1390 items = FRAME_MENU_BAR_ITEMS (f); | 1390 items = FRAME_MENU_BAR_ITEMS (f); |
1391 menu_items = f->menu_bar_vector; | 1391 menu_items = f->menu_bar_vector; |
1392 menu_items_allocated = XVECTOR (menu_items)->size; | 1392 menu_items_allocated = XVECTOR (menu_items)->size; |
1393 init_menu_items (); | 1393 init_menu_items (); |
1394 | 1394 |
1403 break; | 1403 break; |
1404 | 1404 |
1405 wv = single_submenu (key, string, maps); | 1405 wv = single_submenu (key, string, maps); |
1406 if (prev_wv) | 1406 if (prev_wv) |
1407 prev_wv->next = wv; | 1407 prev_wv->next = wv; |
1408 else | 1408 else |
1409 save_wv->contents = wv; | 1409 first_wv->contents = wv; |
1410 wv->name = (char *) XSTRING (string)->data; | 1410 /* Don't set wv->name here; GC during the loop might relocate it. */ |
1411 wv->enabled = 1; | 1411 wv->enabled = 1; |
1412 prev_wv = wv; | 1412 prev_wv = wv; |
1413 } | |
1414 | |
1415 /* Now GC cannot happen during the lifetime of the widget_value, | |
1416 so it's safe to store data from a Lisp_String. */ | |
1417 wv = first_wv->contents; | |
1418 for (i = 0; i < XVECTOR (items)->size; i += 3) | |
1419 { | |
1420 Lisp_Object string; | |
1421 string = XVECTOR (items)->contents[i + 1]; | |
1422 if (NILP (string)) | |
1423 break; | |
1424 wv->name = (char *) XSTRING (string)->data; | |
1425 wv = wv->next; | |
1413 } | 1426 } |
1414 | 1427 |
1415 finish_menu_items (); | 1428 finish_menu_items (); |
1416 | 1429 |
1417 f->menu_bar_vector = menu_items; | 1430 f->menu_bar_vector = menu_items; |