Mercurial > hg > xemacs-beta
annotate src/dialog-x.c @ 4976:16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-04 Ben Wing <ben@xemacs.org>
* alloc.c (release_breathing_space):
* alloc.c (resize_string):
* alloc.c (sweep_lcrecords_1):
* alloc.c (SWEEP_FIXED_TYPE_BLOCK_1):
* alloc.c (ADDITIONAL_FREE_compiled_function):
* alloc.c (compact_string_chars):
* alloc.c (ADDITIONAL_FREE_string):
* alloc.c (sweep_strings):
* alloca.c (xemacs_c_alloca):
* alsaplay.c (alsa_play_sound_file):
* buffer.c (init_initial_directory):
* buffer.h:
* buffer.h (BUFFER_FREE):
* console-stream.c (stream_delete_console):
* console-tty.c (free_tty_console_struct):
* data.c (Fnumber_to_string):
* device-gtk.c (gtk_init_device):
* device-gtk.c (free_gtk_device_struct):
* device-gtk.c (gtk_delete_device):
* device-msw.c (mswindows_delete_device):
* device-msw.c (msprinter_delete_device):
* device-tty.c (free_tty_device_struct):
* device-tty.c (tty_delete_device):
* device-x.c (x_init_device):
* device-x.c (free_x_device_struct):
* device-x.c (x_delete_device):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-x.c (dbox_descriptor_to_widget_value):
* dired-msw.c (Fmswindows_insert_directory):
* dired.c (free_user_cache):
* dired.c (user_name_completion_unwind):
* doc.c (unparesseuxify_doc_string):
* doc.c (Fsubstitute_command_keys):
* doprnt.c (emacs_doprnt_1):
* dumper.c (pdump_load_finish):
* dumper.c (pdump_file_free):
* dumper.c (pdump_file_unmap):
* dynarr.c:
* dynarr.c (Dynarr_free):
* editfns.c (uncache_home_directory):
* editfns.c (Fset_time_zone_rule):
* elhash.c:
* elhash.c (pdump_reorganize_hash_table):
* elhash.c (maphash_unwind):
* emacs.c (make_arg_list_1):
* emacs.c (free_argc_argv):
* emacs.c (sort_args):
* emacs.c (Frunning_temacs_p):
* emodules.c (attempt_module_delete):
* eval.c (free_pointer):
* event-Xt.c (unselect_filedesc):
* event-Xt.c (emacs_Xt_select_process):
* event-gtk.c (unselect_filedesc):
* event-gtk.c (dragndrop_data_received):
* event-msw.c (winsock_closer):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* event-stream.c (finalize_command_builder):
* event-stream.c (free_command_builder):
* extents.c (free_gap_array):
* extents.c (free_extent_list):
* extents.c (free_soe):
* extents.c (extent_fragment_delete):
* extents.c (extent_priority_sort_function):
* file-coding.c (make_coding_system_1):
* file-coding.c (coding_finalizer):
* file-coding.c (set_coding_stream_coding_system):
* file-coding.c (chain_finalize_coding_stream_1):
* file-coding.c (chain_finalize):
* file-coding.c (free_detection_state):
* file-coding.c (coding_category_symbol_to_id):
* fileio.c:
* fileio.c (Ffile_name_directory):
* fileio.c (if):
* fileio.c (Ffile_symlink_p):
* filelock.c (FREE_LOCK_INFO):
* filelock.c (current_lock_owner):
* font-mgr.c (Ffc_name_unparse):
* font-mgr.c (Ffc_pattern_duplicate):
* frame-gtk.c (gtk_delete_frame):
* frame-msw.c (mswindows_delete_frame):
* frame-msw.c (msprinter_delete_frame):
* frame-x.c (x_cde_destroy_callback):
* frame-x.c (Fcde_start_drag_internal):
* frame-x.c (x_cde_transfer_callback):
* frame-x.c (x_delete_frame):
* frame.c (update_frame_title):
* frame.c (Fset_frame_pointer):
* gc.c (register_for_finalization):
* gccache-gtk.c (free_gc_cache):
* gccache-gtk.c (gc_cache_lookup):
* gccache-x.c (free_gc_cache):
* gccache-x.c (gc_cache_lookup):
* glyphs-eimage.c:
* glyphs-eimage.c (jpeg_instantiate_unwind):
* glyphs-eimage.c (gif_instantiate_unwind):
* glyphs-eimage.c (png_instantiate_unwind):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate_unwind):
* glyphs-gtk.c (convert_EImage_to_GDKImage):
* glyphs-gtk.c (gtk_finalize_image_instance):
* glyphs-gtk.c (gtk_init_image_instance_from_eimage):
* glyphs-gtk.c (gtk_xpm_instantiate):
* glyphs-msw.c (convert_EImage_to_DIBitmap):
* glyphs-msw.c (mswindows_init_image_instance_from_eimage):
* glyphs-msw.c (mswindows_initialize_image_instance_mask):
* glyphs-msw.c (xpm_to_eimage):
* glyphs-msw.c (mswindows_xpm_instantiate):
* glyphs-msw.c (xbm_create_bitmap_from_data):
* glyphs-msw.c (mswindows_finalize_image_instance):
* glyphs-x.c (convert_EImage_to_XImage):
* glyphs-x.c (x_finalize_image_instance):
* glyphs-x.c (x_init_image_instance_from_eimage):
* glyphs-x.c (x_xpm_instantiate):
* gui-x.c (free_popup_widget_value_tree):
* hash.c (free_hash_table):
* hash.c (grow_hash_table):
* hash.c (pregrow_hash_table_if_necessary):
* imgproc.c (build_EImage_quantable):
* insdel.c (uninit_buffer_text):
* intl-win32.c (convert_multibyte_to_internal_malloc):
* intl.c:
* intl.c (Fset_current_locale):
* keymap.c:
* keymap.c (where_is_recursive_mapper):
* keymap.c (where_is_internal):
* lisp.h:
* lisp.h (xfree):
* lstream.c (Lstream_close):
* lstream.c (resizing_buffer_closer):
* mule-coding.c:
* mule-coding.c (iso2022_finalize_detection_state):
* nt.c:
* nt.c (mswindows_get_long_filename):
* nt.c (nt_get_resource):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_opendir):
* nt.c (mswindows_closedir):
* nt.c (mswindows_readdir):
* nt.c (mswindows_stat):
* nt.c (mswindows_getdcwd):
* nt.c (Fmswindows_long_file_name):
* ntplay.c (nt_play_sound_file):
* ntplay.c (play_sound_data_1):
* number-gmp.c (gmp_free):
* number-gmp.c (init_number_gmp):
* number-mp.c (bignum_to_string):
* number-mp.c (BIGNUM_TO_TYPE):
* number.c (bignum_print):
* number.c (bignum_convfree):
* number.c (ratio_print):
* number.c (bigfloat_print):
* number.c (bigfloat_finalize):
* objects-gtk.c (gtk_finalize_color_instance):
* objects-gtk.c (gtk_finalize_font_instance):
* objects-msw.c (mswindows_finalize_color_instance):
* objects-msw.c (mswindows_finalize_font_instance):
* objects-tty.c (tty_finalize_color_instance):
* objects-tty.c (tty_finalize_font_instance):
* objects-tty.c (tty_font_list):
* objects-x.c (x_finalize_color_instance):
* objects-x.c (x_finalize_font_instance):
* process.c:
* process.c (finalize_process):
* realpath.c:
* redisplay.c (add_propagation_runes):
* regex.c:
* regex.c (xfree):
* regex.c (REGEX_FREE_STACK):
* regex.c (FREE_STACK_RETURN):
* regex.c (regex_compile):
* regex.c (regexec):
* regex.c (regfree):
* scrollbar-gtk.c (gtk_free_scrollbar_instance):
* scrollbar-gtk.c (gtk_release_scrollbar_instance):
* scrollbar-msw.c (mswindows_free_scrollbar_instance):
* scrollbar-msw.c (unshow_that_mofo):
* scrollbar-x.c (x_free_scrollbar_instance):
* scrollbar-x.c (x_release_scrollbar_instance):
* select-gtk.c (emacs_gtk_selection_handle):
* select-msw.c (mswindows_own_selection):
* select-x.c:
* select-x.c (x_handle_selection_request):
* select-x.c (unexpect_property_change):
* select-x.c (x_handle_property_notify):
* select-x.c (receive_incremental_selection):
* select-x.c (x_get_window_property_as_lisp_data):
* select-x.c (Fx_get_cutbuffer_internal):
* specifier.c (finalize_specifier):
* syntax.c (uninit_buffer_syntax_cache):
* sysdep.c (qxe_allocating_getcwd):
* sysdep.c (qxe_lstat):
* sysdep.c (copy_in_passwd):
* sysdep.c (qxe_ctime):
* sysdep.c (closedir):
* sysdep.c (DIRSIZ):
* termcap.c (tgetent):
* termcap.c (tprint):
* tests.c (Ftest_data_format_conversion):
* text.c (new_dfc_convert_copy_data):
* text.h (eifree):
* text.h (eito_alloca):
* text.h (eito_external):
* toolbar-msw.c (mswindows_output_toolbar):
* ui-gtk.c (CONVERT_RETVAL):
* ui-gtk.c (__allocate_object_storage):
* unicode.c (free_from_unicode_table):
* unicode.c (free_to_unicode_table):
* unicode.c (free_charset_unicode_tables):
* win32.c (mswindows_read_link_1):
Rename: xfree(VAL, TYPE)->xfree(VAL)
Command used:
gr 'xfree *\((.*),.*\);' 'xfree (\1);' *.[ch]
Followed by grepping for 'xfree.*,' and fixing anything left.
Rationale: Having to specify the TYPE argument is annoying and
error-prone. It was originally put in to work around warnings
due to strict aliasing but years and years ago I rewrote it
in a way that doesn't use the TYPE argument at all and no one
has complained since then. (And anyway, XEmacs is far from
ever being in compliance with strict aliasing and would require
far-reaching changes to get that way.)
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Thu, 04 Feb 2010 07:28:14 -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"); |
442 | 174 LISP_STRING_TO_EXTERNAL_MALLOC (question, prev->value, 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) | |
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
210 xfree (wv->value); |
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 } |