1 |
/* X Communication module for terminals which understand the X protocol. |
/* X Communication module for terminals which understand the X protocol. |
2 |
Copyright (C) 1986, 88, 93, 94, 96, 99, 2000, 2001 |
Copyright (C) 1986, 88, 93, 94, 96, 99, 2000, 2001, 2003 |
3 |
Free Software Foundation, Inc. |
Free Software Foundation, Inc. |
4 |
|
|
5 |
This file is part of GNU Emacs. |
This file is part of GNU Emacs. |
68 |
#include "dispextern.h" |
#include "dispextern.h" |
69 |
|
|
70 |
#ifdef HAVE_X_WINDOWS |
#ifdef HAVE_X_WINDOWS |
71 |
|
/* Defining HAVE_MULTILINGUAL_MENU would mean that the toolkit menu |
72 |
|
code accepts the Emacs internal encoding. */ |
73 |
#undef HAVE_MULTILINGUAL_MENU |
#undef HAVE_MULTILINGUAL_MENU |
74 |
#ifdef USE_X_TOOLKIT |
#ifdef USE_X_TOOLKIT |
75 |
#include "widget.h" |
#include "widget.h" |
129 |
static Lisp_Object xdialog_show (); |
static Lisp_Object xdialog_show (); |
130 |
#endif |
#endif |
131 |
|
|
132 |
|
/* This is how to deal with multibyte text if HAVE_MULTILINGUAL_MENU |
133 |
|
isn't defined. The use of HAVE_MULTILINGUAL_MENU could probably be |
134 |
|
confined to an extended version of this with sections of code below |
135 |
|
using it unconditionally. */ |
136 |
|
#ifdef USE_GTK |
137 |
|
/* gtk just uses utf-8. */ |
138 |
|
# define ENCODE_MENU_STRING(str) ENCODE_UTF_8 (str) |
139 |
|
#else |
140 |
|
/* I'm not convinced ENCODE_SYSTEM is defined correctly, or maybe |
141 |
|
something else should be used here. Except under MS-Windows it |
142 |
|
just converts to unibyte, but encoding with `locale-coding-system' |
143 |
|
seems better -- X may actually display the result correctly, and |
144 |
|
it's not necessarily equivalent to the unibyte text. -- fx */ |
145 |
|
# define ENCODE_MENU_STRING(str) ENCODE_SYSTEM (str) |
146 |
|
#endif |
147 |
|
|
148 |
static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
149 |
Lisp_Object, Lisp_Object, Lisp_Object, |
Lisp_Object, Lisp_Object, Lisp_Object, |
150 |
Lisp_Object, Lisp_Object)); |
Lisp_Object, Lisp_Object)); |
154 |
static void keymap_panes P_ ((Lisp_Object *, int, int)); |
static void keymap_panes P_ ((Lisp_Object *, int, int)); |
155 |
static void single_keymap_panes P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
static void single_keymap_panes P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
156 |
int, int)); |
int, int)); |
|
static void single_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object *, |
|
|
int, int, int *)); |
|
157 |
static void list_of_panes P_ ((Lisp_Object)); |
static void list_of_panes P_ ((Lisp_Object)); |
158 |
static void list_of_items P_ ((Lisp_Object)); |
static void list_of_items P_ ((Lisp_Object)); |
159 |
|
|
426 |
finish_menu_items (); |
finish_menu_items (); |
427 |
} |
} |
428 |
|
|
429 |
|
/* Args passed between single_keymap_panes and single_menu_item. */ |
430 |
|
struct skp |
431 |
|
{ |
432 |
|
Lisp_Object pending_maps; |
433 |
|
int maxdepth, notreal; |
434 |
|
int notbuttons; |
435 |
|
}; |
436 |
|
|
437 |
|
static void single_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
438 |
|
void *)); |
439 |
|
|
440 |
/* This is a recursive subroutine of keymap_panes. |
/* This is a recursive subroutine of keymap_panes. |
441 |
It handles one keymap, KEYMAP. |
It handles one keymap, KEYMAP. |
442 |
The other arguments are passed along |
The other arguments are passed along |
454 |
int notreal; |
int notreal; |
455 |
int maxdepth; |
int maxdepth; |
456 |
{ |
{ |
457 |
Lisp_Object pending_maps = Qnil; |
struct skp skp; |
458 |
Lisp_Object tail, item; |
struct gcpro gcpro1; |
459 |
struct gcpro gcpro1, gcpro2; |
|
460 |
int notbuttons = 0; |
skp.pending_maps = Qnil; |
461 |
|
skp.maxdepth = maxdepth; |
462 |
|
skp.notreal = notreal; |
463 |
|
skp.notbuttons = 0; |
464 |
|
|
465 |
if (maxdepth <= 0) |
if (maxdepth <= 0) |
466 |
return; |
return; |
472 |
add a prefix when (if) we see the first button. After that, notbuttons |
add a prefix when (if) we see the first button. After that, notbuttons |
473 |
is set to 0, to mark that we have seen a button and all non button |
is set to 0, to mark that we have seen a button and all non button |
474 |
items need a prefix. */ |
items need a prefix. */ |
475 |
notbuttons = menu_items_used; |
skp.notbuttons = menu_items_used; |
476 |
#endif |
#endif |
477 |
|
|
478 |
for (tail = keymap; CONSP (tail); tail = XCDR (tail)) |
GCPRO1 (skp.pending_maps); |
479 |
{ |
map_keymap (keymap, single_menu_item, Qnil, &skp, 1); |
480 |
GCPRO2 (keymap, pending_maps); |
UNGCPRO; |
|
/* Look at each key binding, and if it is a menu item add it |
|
|
to this menu. */ |
|
|
item = XCAR (tail); |
|
|
if (CONSP (item)) |
|
|
single_menu_item (XCAR (item), XCDR (item), |
|
|
&pending_maps, notreal, maxdepth, ¬buttons); |
|
|
else if (VECTORP (item)) |
|
|
{ |
|
|
/* Loop over the char values represented in the vector. */ |
|
|
int len = XVECTOR (item)->size; |
|
|
int c; |
|
|
for (c = 0; c < len; c++) |
|
|
{ |
|
|
Lisp_Object character; |
|
|
XSETFASTINT (character, c); |
|
|
single_menu_item (character, XVECTOR (item)->contents[c], |
|
|
&pending_maps, notreal, maxdepth, ¬buttons); |
|
|
} |
|
|
} |
|
|
UNGCPRO; |
|
|
} |
|
481 |
|
|
482 |
/* Process now any submenus which want to be panes at this level. */ |
/* Process now any submenus which want to be panes at this level. */ |
483 |
while (!NILP (pending_maps)) |
while (CONSP (skp.pending_maps)) |
484 |
{ |
{ |
485 |
Lisp_Object elt, eltcdr, string; |
Lisp_Object elt, eltcdr, string; |
486 |
elt = Fcar (pending_maps); |
elt = XCAR (skp.pending_maps); |
487 |
eltcdr = XCDR (elt); |
eltcdr = XCDR (elt); |
488 |
string = XCAR (eltcdr); |
string = XCAR (eltcdr); |
489 |
/* We no longer discard the @ from the beginning of the string here. |
/* We no longer discard the @ from the beginning of the string here. |
490 |
Instead, we do this in xmenu_show. */ |
Instead, we do this in xmenu_show. */ |
491 |
single_keymap_panes (Fcar (elt), string, |
single_keymap_panes (Fcar (elt), string, |
492 |
XCDR (eltcdr), notreal, maxdepth - 1); |
XCDR (eltcdr), notreal, maxdepth - 1); |
493 |
pending_maps = Fcdr (pending_maps); |
skp.pending_maps = XCDR (skp.pending_maps); |
494 |
} |
} |
495 |
} |
} |
496 |
|
|
497 |
/* This is a subroutine of single_keymap_panes that handles one |
/* This is a subroutine of single_keymap_panes that handles one |
498 |
keymap entry. |
keymap entry. |
499 |
KEY is a key in a keymap and ITEM is its binding. |
KEY is a key in a keymap and ITEM is its binding. |
500 |
PENDING_MAPS_PTR points to a list of keymaps waiting to be made into |
SKP->PENDING_MAPS_PTR is a list of keymaps waiting to be made into |
501 |
separate panes. |
separate panes. |
502 |
If NOTREAL is nonzero, only check for equivalent key bindings, don't |
If SKP->NOTREAL is nonzero, only check for equivalent key bindings, don't |
503 |
evaluate expressions in menu items and don't make any menu. |
evaluate expressions in menu items and don't make any menu. |
504 |
If we encounter submenus deeper than MAXDEPTH levels, ignore them. |
If we encounter submenus deeper than SKP->MAXDEPTH levels, ignore them. |
505 |
NOTBUTTONS_PTR is only used when simulating toggle boxes and radio |
SKP->NOTBUTTONS is only used when simulating toggle boxes and radio |
506 |
buttons. It points to variable notbuttons in single_keymap_panes, |
buttons. It keeps track of if we have seen a button in this menu or |
507 |
which keeps track of if we have seen a button in this menu or not. */ |
not. */ |
508 |
|
|
509 |
static void |
static void |
510 |
single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth, |
single_menu_item (key, item, dummy, skp_v) |
511 |
notbuttons_ptr) |
Lisp_Object key, item, dummy; |
512 |
Lisp_Object key, item; |
void *skp_v; |
|
Lisp_Object *pending_maps_ptr; |
|
|
int maxdepth, notreal; |
|
|
int *notbuttons_ptr; |
|
513 |
{ |
{ |
514 |
Lisp_Object map, item_string, enabled; |
Lisp_Object map, item_string, enabled; |
515 |
struct gcpro gcpro1, gcpro2; |
struct gcpro gcpro1, gcpro2; |
516 |
int res; |
int res; |
517 |
|
struct skp *skp = skp_v; |
518 |
|
|
519 |
/* Parse the menu item and leave the result in item_properties. */ |
/* Parse the menu item and leave the result in item_properties. */ |
520 |
GCPRO2 (key, item); |
GCPRO2 (key, item); |
521 |
res = parse_menu_item (item, notreal, 0); |
res = parse_menu_item (item, skp->notreal, 0); |
522 |
UNGCPRO; |
UNGCPRO; |
523 |
if (!res) |
if (!res) |
524 |
return; /* Not a menu item. */ |
return; /* Not a menu item. */ |
525 |
|
|
526 |
map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; |
map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; |
527 |
|
|
528 |
if (notreal) |
if (skp->notreal) |
529 |
{ |
{ |
530 |
/* We don't want to make a menu, just traverse the keymaps to |
/* We don't want to make a menu, just traverse the keymaps to |
531 |
precompute equivalent key bindings. */ |
precompute equivalent key bindings. */ |
532 |
if (!NILP (map)) |
if (!NILP (map)) |
533 |
single_keymap_panes (map, Qnil, key, 1, maxdepth - 1); |
single_keymap_panes (map, Qnil, key, 1, skp->maxdepth - 1); |
534 |
return; |
return; |
535 |
} |
} |
536 |
|
|
541 |
{ |
{ |
542 |
if (!NILP (enabled)) |
if (!NILP (enabled)) |
543 |
/* An enabled separate pane. Remember this to handle it later. */ |
/* An enabled separate pane. Remember this to handle it later. */ |
544 |
*pending_maps_ptr = Fcons (Fcons (map, Fcons (item_string, key)), |
skp->pending_maps = Fcons (Fcons (map, Fcons (item_string, key)), |
545 |
*pending_maps_ptr); |
skp->pending_maps); |
546 |
return; |
return; |
547 |
} |
} |
548 |
|
|
557 |
Lisp_Object selected |
Lisp_Object selected |
558 |
= XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]; |
= XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]; |
559 |
|
|
560 |
if (*notbuttons_ptr) |
if (skp->notbuttons) |
561 |
/* The first button. Line up previous items in this menu. */ |
/* The first button. Line up previous items in this menu. */ |
562 |
{ |
{ |
563 |
int index = *notbuttons_ptr; /* Index for first item this menu. */ |
int index = skp->notbuttons; /* Index for first item this menu. */ |
564 |
int submenu = 0; |
int submenu = 0; |
565 |
Lisp_Object tem; |
Lisp_Object tem; |
566 |
while (index < menu_items_used) |
while (index < menu_items_used) |
590 |
index += MENU_ITEMS_ITEM_LENGTH; |
index += MENU_ITEMS_ITEM_LENGTH; |
591 |
} |
} |
592 |
} |
} |
593 |
*notbuttons_ptr = 0; |
skp->notbuttons = 0; |
594 |
} |
} |
595 |
|
|
596 |
/* Calculate prefix, if any, for this item. */ |
/* Calculate prefix, if any, for this item. */ |
600 |
prefix = build_string (NILP (selected) ? "( ) " : "(*) "); |
prefix = build_string (NILP (selected) ? "( ) " : "(*) "); |
601 |
} |
} |
602 |
/* Not a button. If we have earlier buttons, then we need a prefix. */ |
/* Not a button. If we have earlier buttons, then we need a prefix. */ |
603 |
else if (!*notbuttons_ptr && SREF (item_string, 0) != '\0' |
else if (!skp->notbuttons && SREF (item_string, 0) != '\0' |
604 |
&& SREF (item_string, 0) != '-') |
&& SREF (item_string, 0) != '-') |
605 |
prefix = build_string (" "); |
prefix = build_string (" "); |
606 |
|
|
627 |
if (! (NILP (map) || NILP (enabled))) |
if (! (NILP (map) || NILP (enabled))) |
628 |
{ |
{ |
629 |
push_submenu_start (); |
push_submenu_start (); |
630 |
single_keymap_panes (map, Qnil, key, 0, maxdepth - 1); |
single_keymap_panes (map, Qnil, key, 0, skp->maxdepth - 1); |
631 |
push_submenu_end (); |
push_submenu_end (); |
632 |
} |
} |
633 |
#endif |
#endif |
651 |
elt = Fcar (tail); |
elt = Fcar (tail); |
652 |
pane_name = Fcar (elt); |
pane_name = Fcar (elt); |
653 |
CHECK_STRING (pane_name); |
CHECK_STRING (pane_name); |
654 |
push_menu_pane (pane_name, Qnil); |
push_menu_pane (ENCODE_MENU_STRING (pane_name), Qnil); |
655 |
pane_data = Fcdr (elt); |
pane_data = Fcdr (elt); |
656 |
CHECK_CONS (pane_data); |
CHECK_CONS (pane_data); |
657 |
list_of_items (pane_data); |
list_of_items (pane_data); |
672 |
{ |
{ |
673 |
item = Fcar (tail); |
item = Fcar (tail); |
674 |
if (STRINGP (item)) |
if (STRINGP (item)) |
675 |
push_menu_item (item, Qnil, Qnil, Qt, Qnil, Qnil, Qnil, Qnil); |
push_menu_item (ENCODE_MENU_STRING (item), Qnil, Qnil, Qt, |
676 |
|
Qnil, Qnil, Qnil, Qnil); |
677 |
else if (NILP (item)) |
else if (NILP (item)) |
678 |
push_left_right_boundary (); |
push_left_right_boundary (); |
679 |
else |
else |
681 |
CHECK_CONS (item); |
CHECK_CONS (item); |
682 |
item1 = Fcar (item); |
item1 = Fcar (item); |
683 |
CHECK_STRING (item1); |
CHECK_STRING (item1); |
684 |
push_menu_item (item1, Qt, Fcdr (item), Qt, Qnil, Qnil, Qnil, Qnil); |
push_menu_item (ENCODE_MENU_STRING (item1), Qt, Fcdr (item), |
685 |
|
Qt, Qnil, Qnil, Qnil, Qnil); |
686 |
} |
} |
687 |
} |
} |
688 |
} |
} |
729 |
|
|
730 |
/* xmenu_show expects window coordinates, not root window |
/* xmenu_show expects window coordinates, not root window |
731 |
coordinates. Translate. */ |
coordinates. Translate. */ |
732 |
*x -= f->output_data.x->left_pos |
*x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
733 |
+ FRAME_OUTER_TO_INNER_DIFF_X (f); |
*y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
|
*y -= f->output_data.x->top_pos |
|
|
+ FRAME_OUTER_TO_INNER_DIFF_Y (f); |
|
734 |
} |
} |
735 |
|
|
736 |
#endif /* HAVE_X_WINDOWS */ |
#endif /* HAVE_X_WINDOWS */ |
879 |
CHECK_LIVE_WINDOW (window); |
CHECK_LIVE_WINDOW (window); |
880 |
f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
881 |
|
|
882 |
xpos = (FONT_WIDTH (FRAME_FONT (f)) |
xpos = WINDOW_LEFT_EDGE_X (XWINDOW (window)); |
883 |
* XFASTINT (XWINDOW (window)->left)); |
ypos = WINDOW_TOP_EDGE_Y (XWINDOW (window)); |
|
ypos = (FRAME_LINE_HEIGHT (f) |
|
|
* XFASTINT (XWINDOW (window)->top)); |
|
884 |
} |
} |
885 |
else |
else |
886 |
/* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, |
/* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, |
1419 |
int j; |
int j; |
1420 |
struct input_event buf; |
struct input_event buf; |
1421 |
Lisp_Object frame; |
Lisp_Object frame; |
1422 |
|
EVENT_INIT (buf); |
1423 |
|
|
1424 |
XSETFRAME (frame, f); |
XSETFRAME (frame, f); |
1425 |
buf.kind = MENU_BAR_EVENT; |
buf.kind = MENU_BAR_EVENT; |
1718 |
#ifndef HAVE_MULTILINGUAL_MENU |
#ifndef HAVE_MULTILINGUAL_MENU |
1719 |
if (STRING_MULTIBYTE (item_name)) |
if (STRING_MULTIBYTE (item_name)) |
1720 |
{ |
{ |
1721 |
item_name = ENCODE_SYSTEM (item_name); |
item_name = ENCODE_MENU_STRING (item_name); |
1722 |
AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
1723 |
} |
} |
1724 |
|
|
1725 |
if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
1726 |
{ |
{ |
1727 |
descrip = ENCODE_SYSTEM (descrip); |
descrip = ENCODE_MENU_STRING (descrip); |
1728 |
AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
1729 |
} |
} |
1730 |
#endif /* not HAVE_MULTILINGUAL_MENU */ |
#endif /* not HAVE_MULTILINGUAL_MENU */ |
1796 |
BLOCK_INPUT; |
BLOCK_INPUT; |
1797 |
/* Save the size of the frame because the pane widget doesn't accept |
/* Save the size of the frame because the pane widget doesn't accept |
1798 |
to resize itself. So force it. */ |
to resize itself. So force it. */ |
1799 |
columns = f->width; |
columns = FRAME_COLS (f); |
1800 |
rows = f->height; |
rows = FRAME_LINES (f); |
1801 |
|
|
1802 |
/* Do the voodoo which means "I'm changing lots of things, don't try |
/* Do the voodoo which means "I'm changing lots of things, don't try |
1803 |
to refigure sizes until I'm done." */ |
to refigure sizes until I'm done." */ |
2331 |
pos_func = menu_position_func; |
pos_func = menu_position_func; |
2332 |
|
|
2333 |
/* Adjust coordinates to be root-window-relative. */ |
/* Adjust coordinates to be root-window-relative. */ |
2334 |
x += f->output_data.x->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
x += f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
2335 |
y += f->output_data.x->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
y += f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
2336 |
|
|
2337 |
popup_x_y.x = x; |
popup_x_y.x = x; |
2338 |
popup_x_y.y = y; |
popup_x_y.y = y; |
2398 |
XButtonPressedEvent dummy; |
XButtonPressedEvent dummy; |
2399 |
LWLIB_ID menu_id; |
LWLIB_ID menu_id; |
2400 |
Widget menu; |
Widget menu; |
|
Window child; |
|
2401 |
|
|
2402 |
menu_id = widget_id_tick++; |
menu_id = widget_id_tick++; |
2403 |
menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, |
menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, |
2418 |
dummy.y = y; |
dummy.y = y; |
2419 |
|
|
2420 |
/* Adjust coordinates to be root-window-relative. */ |
/* Adjust coordinates to be root-window-relative. */ |
2421 |
x += f->output_data.x->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
x += f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
2422 |
y += f->output_data.x->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
y += f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
2423 |
|
|
2424 |
dummy.x_root = x; |
dummy.x_root = x; |
2425 |
dummy.y_root = y; |
dummy.y_root = y; |
2581 |
#ifndef HAVE_MULTILINGUAL_MENU |
#ifndef HAVE_MULTILINGUAL_MENU |
2582 |
if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
2583 |
{ |
{ |
2584 |
item_name = ENCODE_SYSTEM (item_name); |
item_name = ENCODE_MENU_STRING (item_name); |
2585 |
AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
2586 |
} |
} |
2587 |
|
|
2588 |
if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
2589 |
{ |
{ |
2590 |
descrip = ENCODE_SYSTEM (descrip); |
descrip = ENCODE_MENU_STRING (descrip); |
2591 |
AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
2592 |
} |
} |
2593 |
#endif /* not HAVE_MULTILINGUAL_MENU */ |
#endif /* not HAVE_MULTILINGUAL_MENU */ |
2647 |
|
|
2648 |
#ifndef HAVE_MULTILINGUAL_MENU |
#ifndef HAVE_MULTILINGUAL_MENU |
2649 |
if (STRING_MULTIBYTE (title)) |
if (STRING_MULTIBYTE (title)) |
2650 |
title = ENCODE_SYSTEM (title); |
title = ENCODE_MENU_STRING (title); |
2651 |
#endif |
#endif |
2652 |
|
|
2653 |
wv_title->name = (char *) SDATA (title); |
wv_title->name = (char *) SDATA (title); |
3136 |
#endif /* HAVE_X_WINDOWS */ |
#endif /* HAVE_X_WINDOWS */ |
3137 |
|
|
3138 |
/* Adjust coordinates to be root-window-relative. */ |
/* Adjust coordinates to be root-window-relative. */ |
3139 |
x += f->output_data.x->left_pos; |
x += f->left_pos; |
3140 |
y += f->output_data.x->top_pos; |
y += f->top_pos; |
3141 |
|
|
3142 |
/* Create all the necessary panes and their items. */ |
/* Create all the necessary panes and their items. */ |
3143 |
i = 0; |
i = 0; |
3376 |
defsubr (&Sx_popup_dialog); |
defsubr (&Sx_popup_dialog); |
3377 |
#endif |
#endif |
3378 |
} |
} |
3379 |
|
|
3380 |
|
/* arch-tag: 92ea573c-398e-496e-ac73-2436f7d63242 |
3381 |
|
(do not change this comment) */ |