Mercurial > hg > xemacs-beta
annotate src/dialog-x.c @ 4981:4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_lo_import):
* postgresql/postgresql.c (Fpq_lo_export):
* ldap/eldap.c (Fldap_open):
* ldap/eldap.c (Fldap_search_basic):
* ldap/eldap.c (Fldap_add):
* ldap/eldap.c (Fldap_modify):
* ldap/eldap.c (Fldap_delete):
* canna/canna_api.c (Fcanna_initialize):
* canna/canna_api.c (Fcanna_store_yomi):
* canna/canna_api.c (Fcanna_parse):
* canna/canna_api.c (Fcanna_henkan_begin):
EXTERNAL_TO_C_STRING returns its argument instead of storing it
in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar
things happen to related macros. See entry in src/ChangeLog.
More Mule-izing of postgresql.c. Extract out common code
between `pq-connectdb' and `pq-connect-start'. Fix places
that signal an error string using a formatted string to instead
follow the standard and have a fixed reason followed by the
particular error message stored as one of the frobs.
src/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.c (Fmswindows_message_box):
* console-x.c (x_perhaps_init_unseen_key_defaults):
* console.c:
* database.c (dbm_get):
* database.c (dbm_put):
* database.c (dbm_remove):
* database.c (berkdb_get):
* database.c (berkdb_put):
* database.c (berkdb_remove):
* database.c (Fopen_database):
* device-gtk.c (gtk_init_device):
* device-msw.c (msprinter_init_device_internal):
* device-msw.c (msprinter_default_printer):
* device-msw.c (msprinter_init_device):
* device-msw.c (sync_printer_with_devmode):
* device-msw.c (Fmsprinter_select_settings):
* device-x.c (sanity_check_geometry_resource):
* device-x.c (Dynarr_add_validified_lisp_string):
* device-x.c (x_init_device):
* device-x.c (Fx_put_resource):
* device-x.c (Fx_valid_keysym_name_p):
* device-x.c (Fx_set_font_path):
* dialog-msw.c (push_lisp_string_as_unicode):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-x.c (dbox_descriptor_to_widget_value):
* editfns.c (Fformat_time_string):
* editfns.c (Fencode_time):
* editfns.c (Fset_time_zone_rule):
* emacs.c (make_argc_argv):
* emacs.c (Fdump_emacs):
* emodules.c (emodules_load):
* eval.c:
* eval.c (maybe_signal_error_1):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* fileio.c (report_error_with_errno):
* fileio.c (Fsysnetunam):
* fileio.c (Fdo_auto_save):
* font-mgr.c (extract_fcapi_string):
* font-mgr.c (Ffc_config_app_font_add_file):
* font-mgr.c (Ffc_config_app_font_add_dir):
* font-mgr.c (Ffc_config_filename):
* frame-gtk.c (gtk_set_frame_text_value):
* frame-gtk.c (gtk_create_widgets):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_set_title_from_ibyte):
* frame-msw.c (msprinter_init_frame_3):
* frame-x.c (x_set_frame_text_value):
* frame-x.c (x_set_frame_properties):
* frame-x.c (start_drag_internal_1):
* frame-x.c (x_cde_transfer_callback):
* frame-x.c (x_create_widgets):
* glyphs-eimage.c (my_jpeg_output_message):
* glyphs-eimage.c (jpeg_instantiate):
* glyphs-eimage.c (gif_instantiate):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (xbm_instantiate_1):
* glyphs-gtk.c (gtk_xbm_instantiate):
* glyphs-gtk.c (gtk_xpm_instantiate):
* glyphs-gtk.c (gtk_xface_instantiate):
* glyphs-gtk.c (cursor_font_instantiate):
* glyphs-gtk.c (gtk_redisplay_widget):
* glyphs-gtk.c (gtk_widget_instantiate_1):
* glyphs-gtk.c (gtk_add_tab_item):
* glyphs-msw.c (mswindows_xpm_instantiate):
* glyphs-msw.c (bmp_instantiate):
* glyphs-msw.c (mswindows_resource_instantiate):
* glyphs-msw.c (xbm_instantiate_1):
* glyphs-msw.c (mswindows_xbm_instantiate):
* glyphs-msw.c (mswindows_xface_instantiate):
* glyphs-msw.c (mswindows_redisplay_widget):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-msw.c (add_tree_item):
* glyphs-msw.c (add_tab_item):
* glyphs-msw.c (mswindows_combo_box_instantiate):
* glyphs-msw.c (mswindows_widget_query_string_geometry):
* glyphs-x.c (x_locate_pixmap_file):
* glyphs-x.c (xbm_instantiate_1):
* glyphs-x.c (x_xbm_instantiate):
* glyphs-x.c (extract_xpm_color_names):
* glyphs-x.c (x_xpm_instantiate):
* glyphs-x.c (x_xface_instantiate):
* glyphs-x.c (autodetect_instantiate):
* glyphs-x.c (safe_XLoadFont):
* glyphs-x.c (cursor_font_instantiate):
* glyphs-x.c (x_redisplay_widget):
* glyphs-x.c (Fchange_subwindow_property):
* glyphs-x.c (x_widget_instantiate):
* glyphs-x.c (x_tab_control_redisplay):
* glyphs.c (pixmap_to_lisp_data):
* gui-x.c (menu_separator_style_and_to_external):
* gui-x.c (add_accel_and_to_external):
* gui-x.c (button_item_to_widget_value):
* hpplay.c (player_error_internal):
* hpplay.c (play_sound_file):
* hpplay.c (play_sound_data):
* intl.c (Fset_current_locale):
* lisp.h:
* menubar-gtk.c (gtk_xemacs_set_accel_keys):
* menubar-msw.c (populate_menu_add_item):
* menubar-msw.c (populate_or_checksum_helper):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* nt.c (init_user_info):
* nt.c (get_long_basename):
* nt.c (nt_get_resource):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_readdir):
* nt.c (read_unc_volume):
* nt.c (mswindows_stat):
* nt.c (mswindows_getdcwd):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* ntplay.c (nt_play_sound_file):
* objects-gtk.c:
* objects-gtk.c (gtk_valid_color_name_p):
* objects-gtk.c (gtk_initialize_font_instance):
* objects-gtk.c (gtk_font_list):
* objects-msw.c (font_enum_callback_2):
* objects-msw.c (parse_font_spec):
* objects-x.c (x_parse_nearest_color):
* objects-x.c (x_valid_color_name_p):
* objects-x.c (x_initialize_font_instance):
* objects-x.c (x_font_instance_truename):
* objects-x.c (x_font_list):
* objects-xlike-inc.c (XFUN):
* objects-xlike-inc.c (xft_find_charset_font):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-nt.c (nt_open_network_stream):
* process-unix.c:
* process-unix.c (allocate_pty):
* process-unix.c (get_internet_address):
* process-unix.c (unix_canonicalize_host_name):
* process-unix.c (unix_open_network_stream):
* realpath.c:
* select-common.h (lisp_data_to_selection_data):
* select-gtk.c (symbol_to_gtk_atom):
* select-gtk.c (atom_to_symbol):
* select-msw.c (symbol_to_ms_cf):
* select-msw.c (mswindows_register_selection_data_type):
* select-x.c (symbol_to_x_atom):
* select-x.c (x_atom_to_symbol):
* select-x.c (hack_motif_clipboard_selection):
* select-x.c (Fx_store_cutbuffer_internal):
* sound.c (Fplay_sound_file):
* sound.c (Fplay_sound):
* sound.h (sound_perror):
* sysdep.c:
* sysdep.c (qxe_allocating_getcwd):
* sysdep.c (qxe_execve):
* sysdep.c (copy_in_passwd):
* sysdep.c (qxe_getpwnam):
* sysdep.c (qxe_ctime):
* sysdll.c (dll_open):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (search_linked_libs):
* sysdll.c (dll_error):
* sysfile.h:
* sysfile.h (PATHNAME_CONVERT_OUT_TSTR):
* sysfile.h (PATHNAME_CONVERT_OUT_UTF_8):
* sysfile.h (PATHNAME_CONVERT_OUT):
* sysfile.h (LISP_PATHNAME_CONVERT_OUT):
* syswindows.h (ITEXT_TO_TSTR):
* syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR):
* syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT):
* syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN):
* syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR):
* text.h:
* text.h (eicpy_ext_len):
* text.h (enum new_dfc_src_type):
* text.h (EXTERNAL_TO_ITEXT):
* text.h (GET_STRERROR):
* tooltalk.c (check_status):
* tooltalk.c (Fadd_tooltalk_message_arg):
* tooltalk.c (Fadd_tooltalk_pattern_attribute):
* tooltalk.c (Fadd_tooltalk_pattern_arg):
* win32.c (tstr_to_local_file_format):
* win32.c (mswindows_lisp_error_1):
* win32.c (mswindows_report_process_error):
* win32.c (Fmswindows_shell_execute):
* win32.c (mswindows_read_link_1):
Changes involving external/internal format conversion,
mostly code cleanup and renaming.
1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL
that stored its result in a parameter. The new version of
LISP_STRING_TO_EXTERNAL returns its result through the
return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL.
Use the new-style macros throughout the code.
2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL,
in keeping with overall naming rationalization involving
Itext and related types.
Macros involved in previous two:
EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT
EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC
SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT
SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC
C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL
C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC
LISP_STRING_TO_EXTERNAL
LISP_STRING_TO_EXTERNAL_MALLOC
LISP_STRING_TO_TSTR
C_STRING_TO_TSTR -> ITEXT_TO_TSTR
TSTR_TO_C_STRING -> TSTR_TO_ITEXT
The following four still return their values through parameters,
since they have more than one value to return:
C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL
LISP_STRING_TO_SIZED_EXTERNAL
C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC
LISP_STRING_TO_SIZED_EXTERNAL_MALLOC
Sometimes additional casts had to be inserted, since the old
macros played strange games and completely defeated the type system
of the store params.
3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT
occurred with calls to one of the convenience macros listed above,
or to make_extstring().
4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway)
and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT.
4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something
like LISP_STRING_TO_EXTERNAL(..., Qfile_name).
5. Eliminate some temporary variables that are no longer necessary
now that we return a value rather than storing it into a variable.
6. Some Mule-izing in database.c.
7. Error functions:
-- A bit of code cleanup in maybe_signal_error_1.
-- Eliminate report_file_type_error; it's just an alias for
signal_error_2 with params in a different order.
-- Fix some places in the hostname-handling code that directly
inserted externally-retrieved error strings into the
supposed ASCII "reason" param instead of doing the right thing
and sticking text descriptive of what was going on in "reason"
and putting the external message in a frob.
8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one
or two other places.
9. Some code cleanup in copy_in_passwd() in sysdep.c.
10. Fix a real bug due to accidental variable shadowing in
tstr_to_local_file_format() in win32.c.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 05 Feb 2010 11:02:24 -0600 |
parents | 304aebb79cd3 |
children | 3c3c1d139863 |
rev | line source |
---|---|
428 | 1 /* Implements elisp-programmable dialog boxes -- X interface. |
2 Copyright (C) 1993, 1994 Free Software Foundation, Inc. | |
3 Copyright (C) 1995 Tinker Systems and INS Engineering Corp. | |
1346 | 4 Copyright (C) 2000, 2002, 2003 Ben Wing. |
428 | 5 |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
12 | |
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: Not in FSF. */ | |
24 | |
442 | 25 /* This file Mule-ized by Ben Wing, 7-8-00. */ |
26 | |
428 | 27 #include <config.h> |
28 #include "lisp.h" | |
29 | |
30 #include "buffer.h" | |
31 #include "commands.h" /* zmacs_regions */ | |
32 #include "events.h" | |
872 | 33 #include "frame-impl.h" |
428 | 34 #include "gui.h" |
35 #include "opaque.h" | |
36 #include "window.h" | |
37 | |
872 | 38 #include "console-x-impl.h" |
39 | |
40 #include "EmacsFrame.h" | |
428 | 41 |
42 static void | |
43 maybe_run_dbox_text_callback (LWLIB_ID id) | |
44 { | |
45 widget_value *wv; | |
46 int got_some; | |
47 wv = xmalloc_widget_value (); | |
436 | 48 wv->name = xstrdup ("value"); |
428 | 49 got_some = lw_get_some_values (id, wv); |
50 if (got_some) | |
51 { | |
52 Lisp_Object text_field_callback; | |
442 | 53 Extbyte *text_field_value = wv->value; |
826 | 54 text_field_callback = VOID_TO_LISP (wv->call_data); |
442 | 55 text_field_callback = XCAR (XCDR (text_field_callback)); |
428 | 56 if (text_field_value) |
57 { | |
442 | 58 void *tmp = |
59 LISP_TO_VOID (cons3 (Qnil, | |
60 list2 (text_field_callback, | |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
3466
diff
changeset
|
61 build_extstring (text_field_value, |
442 | 62 Qlwlib_encoding)), |
63 Qnil)); | |
428 | 64 popup_selection_callback (0, id, (XtPointer) tmp); |
65 } | |
66 } | |
436 | 67 /* This code tried to optimize, newing/freeing. This is generally |
442 | 68 unsafe so we will always strdup and always use |
436 | 69 free_widget_value_tree. */ |
70 free_widget_value_tree (wv); | |
428 | 71 } |
72 | |
73 static void | |
74 dbox_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) | |
75 { | |
76 /* This is called with client_data == -1 when WM_DELETE_WINDOW is sent | |
77 instead of a button being selected. */ | |
78 struct device *d = get_device_from_display (XtDisplay (widget)); | |
79 struct frame *f = 0; | |
80 Widget cur_widget = widget; | |
81 | |
82 /* The parent which is actually connected to our EmacsFrame may be a | |
83 ways up the tree. */ | |
84 while (!f && cur_widget) | |
85 { | |
86 f = x_any_window_to_frame (d, XtWindow (cur_widget)); | |
87 cur_widget = XtParent (cur_widget); | |
88 } | |
89 | |
90 if (popup_handled_p (id)) | |
91 return; | |
92 assert (popup_up_p != 0); | |
93 ungcpro_popup_callbacks (id); | |
94 popup_up_p--; | |
95 maybe_run_dbox_text_callback (id); | |
96 popup_selection_callback (widget, id, client_data); | |
442 | 97 /* #### need to error-protect! will do so when i merge in |
98 my working ws */ | |
99 va_run_hook_with_args (Qdelete_dialog_box_hook, 1, make_int (id)); | |
428 | 100 lw_destroy_all_widgets (id); |
101 | |
102 /* The Motif dialog box sets the keyboard focus to itself. When it | |
103 goes away we have to take care of getting the focus back | |
104 ourselves. */ | |
105 #ifdef EXTERNAL_WIDGET | |
106 /* #### Not sure if this special case is necessary. */ | |
3466 | 107 if (f && !FRAME_X_EXTERNAL_WINDOW_P (f)) |
428 | 108 #else |
109 if (f) | |
110 #endif | |
111 lw_set_keyboard_focus (FRAME_X_SHELL_WIDGET (f), FRAME_X_TEXT_WIDGET (f)); | |
112 } | |
113 | |
442 | 114 static const Extbyte * const button_names [] = { |
428 | 115 "button1", "button2", "button3", "button4", "button5", |
116 "button6", "button7", "button8", "button9", "button10" }; | |
117 | |
118 static widget_value * | |
442 | 119 dbox_descriptor_to_widget_value (Lisp_Object keys) |
428 | 120 { |
121 /* This function can GC */ | |
122 int lbuttons = 0, rbuttons = 0; | |
123 int partition_seen = 0; | |
124 int text_field_p = 0; | |
125 int allow_text_p = 1; | |
126 widget_value *prev = 0, *kids = 0; | |
127 int n = 0; | |
853 | 128 int count; |
428 | 129 Lisp_Object wv_closure, gui_item; |
444 | 130 Lisp_Object question = Qnil; |
131 Lisp_Object buttons = Qnil; | |
2286 | 132 /* Lisp_Object title = Qnil; #### currently unused */ |
428 | 133 |
442 | 134 { |
135 EXTERNAL_PROPERTY_LIST_LOOP_3 (key, value, keys) | |
136 { | |
137 if (EQ (key, Q_question)) | |
138 { | |
139 CHECK_STRING (value); | |
140 question = value; | |
141 } | |
142 else if (EQ (key, Q_title)) | |
143 { | |
144 CHECK_STRING (value); | |
2286 | 145 /* title = value; */ |
442 | 146 } |
147 else if (EQ (key, Q_buttons)) | |
148 { | |
149 CHECK_LIST (value); | |
150 buttons = value; | |
151 } | |
152 else | |
563 | 153 invalid_constant ("Unrecognized question-dialog keyword", key); |
442 | 154 } |
155 } | |
156 | |
157 if (NILP (question)) | |
563 | 158 sferror ("Dialog descriptor provides no question", keys); |
428 | 159 |
160 /* Inhibit GC during this conversion. The reasons for this are | |
161 the same as in menu_item_descriptor_to_widget_value(); see | |
162 the large comment above that function. */ | |
163 | |
853 | 164 count = begin_gc_forbidden (); |
428 | 165 |
166 kids = prev = xmalloc_widget_value (); | |
167 | |
168 /* Also make sure that we free the partially-created widget_value | |
169 tree on Lisp error. */ | |
170 | |
171 wv_closure = make_opaque_ptr (kids); | |
172 record_unwind_protect (widget_value_unwind, wv_closure); | |
436 | 173 prev->name = xstrdup ("message"); |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
174 prev->value = LISP_STRING_TO_EXTERNAL_MALLOC (question, Qlwlib_encoding); |
428 | 175 prev->enabled = 1; |
176 | |
442 | 177 { |
178 EXTERNAL_LIST_LOOP_2 (button, buttons) | |
179 { | |
180 widget_value *wv; | |
428 | 181 |
442 | 182 if (NILP (button)) |
183 { | |
184 if (partition_seen) | |
563 | 185 sferror ("More than one partition (nil) seen in dbox spec", |
442 | 186 keys); |
187 partition_seen = 1; | |
188 continue; | |
189 } | |
190 CHECK_VECTOR (button); | |
191 wv = xmalloc_widget_value (); | |
428 | 192 |
442 | 193 gui_item = gui_parse_item_keywords (button); |
194 if (!button_item_to_widget_value (Qdialog, | |
195 gui_item, wv, allow_text_p, 1, 0, 1)) | |
196 { | |
197 free_widget_value_tree (wv); | |
198 continue; | |
199 } | |
428 | 200 |
442 | 201 if (wv->type == TEXT_TYPE) |
202 { | |
203 text_field_p = 1; | |
204 allow_text_p = 0; /* only allow one */ | |
205 } | |
206 else /* it's a button */ | |
207 { | |
208 allow_text_p = 0; /* only allow text field at the front */ | |
209 if (wv->value) | |
1726 | 210 xfree (wv->value, char *); |
442 | 211 wv->value = wv->name; /* what a mess... */ |
212 wv->name = xstrdup (button_names [n]); | |
428 | 213 |
442 | 214 if (partition_seen) |
215 rbuttons++; | |
216 else | |
217 lbuttons++; | |
218 n++; | |
428 | 219 |
442 | 220 if (lbuttons > 9 || rbuttons > 9) |
563 | 221 sferror ("Too many buttons (9)", |
442 | 222 keys); /* #### this leaks */ |
223 } | |
428 | 224 |
442 | 225 prev->next = wv; |
226 prev = wv; | |
227 } | |
228 } | |
428 | 229 |
230 if (n == 0) | |
563 | 231 sferror ("Dialog boxes must have some buttons", keys); |
442 | 232 |
428 | 233 { |
442 | 234 Extbyte type = (text_field_p ? 'P' : 'Q'); |
235 static Extbyte tmp_dbox_name [255]; | |
236 | |
428 | 237 widget_value *dbox; |
238 sprintf (tmp_dbox_name, "%c%dBR%d", type, lbuttons + rbuttons, rbuttons); | |
239 dbox = xmalloc_widget_value (); | |
436 | 240 dbox->name = xstrdup (tmp_dbox_name); |
428 | 241 dbox->contents = kids; |
242 | |
243 /* No more need to free the half-filled-in structures. */ | |
244 set_opaque_ptr (wv_closure, 0); | |
771 | 245 unbind_to (count); |
428 | 246 return dbox; |
247 } | |
248 } | |
249 | |
442 | 250 static Lisp_Object |
251 x_make_dialog_box_internal (struct frame* f, Lisp_Object type, | |
252 Lisp_Object keys) | |
428 | 253 { |
254 int dbox_id; | |
255 widget_value *data; | |
2286 | 256 Widget parent; |
428 | 257 |
442 | 258 if (!EQ (type, Qquestion)) |
563 | 259 signal_error (Qunimplemented, "Dialog box type", type); |
442 | 260 |
261 data = dbox_descriptor_to_widget_value (keys); | |
428 | 262 |
263 parent = FRAME_X_SHELL_WIDGET (f); | |
264 | |
265 dbox_id = new_lwlib_id (); | |
2286 | 266 (void) lw_create_widget (data->name, "dialog", dbox_id, data, parent, 1, 0, |
428 | 267 dbox_selection_callback, 0); |
268 lw_modify_all_widgets (dbox_id, data, True); | |
269 lw_modify_all_widgets (dbox_id, data->contents, True); | |
270 free_popup_widget_value_tree (data); | |
271 | |
272 gcpro_popup_callbacks (dbox_id); | |
273 | |
274 /* Setting zmacs-region-stays is necessary here because executing a | |
275 command from a dialog is really a two-command process: the first | |
276 command (bound to the button-click) simply pops up the dialog, | |
277 and returns. This causes a sequence of magic-events (destined | |
278 for the dialog widget) to begin. Eventually, a dialog item is | |
279 selected, and a misc-user-event blip is pushed onto the end of | |
280 the input stream, which is then executed by the event loop. | |
281 | |
282 So there are two command-events, with a bunch of magic-events | |
283 between them. We don't want the *first* command event to alter | |
284 the state of the region, so that the region can be available as | |
285 an argument for the second command. */ | |
286 if (zmacs_regions) | |
287 zmacs_region_stays = 1; | |
288 | |
289 popup_up_p++; | |
290 lw_pop_up_all_widgets (dbox_id); | |
442 | 291 |
292 /* #### this could (theoretically) cause problems if we are up for | |
293 a REALLY REALLY long time -- too big to fit into lisp integer. */ | |
294 return make_int (dbox_id); | |
428 | 295 } |
296 | |
297 void | |
298 syms_of_dialog_x (void) | |
299 { | |
300 } | |
301 | |
302 void | |
303 console_type_create_dialog_x (void) | |
304 { | |
442 | 305 CONSOLE_HAS_METHOD (x, make_dialog_box_internal); |
428 | 306 } |
307 | |
308 void | |
309 vars_of_dialog_x (void) | |
310 { | |
311 #if defined (LWLIB_DIALOGS_LUCID) | |
312 Fprovide (intern ("lucid-dialogs")); | |
313 #elif defined (LWLIB_DIALOGS_MOTIF) | |
314 Fprovide (intern ("motif-dialogs")); | |
315 #elif defined (LWLIB_DIALOGS_ATHENA) | |
316 Fprovide (intern ("athena-dialogs")); | |
317 #endif | |
318 } |