aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.gdbinit6
-rw-r--r--src/ChangeLog48
-rw-r--r--src/callproc.c3
-rw-r--r--src/emacs.c3
-rw-r--r--src/keymap.c129
-rw-r--r--src/lread.c33
-rw-r--r--src/minibuf.c19
-rw-r--r--src/process.c2
-rw-r--r--src/term.c16
-rw-r--r--src/textprop.c6
10 files changed, 234 insertions, 31 deletions
diff --git a/src/.gdbinit b/src/.gdbinit
index 10f993fdd9f..4120b1e10bf 100644
--- a/src/.gdbinit
+++ b/src/.gdbinit
@@ -764,6 +764,12 @@ show environment DISPLAY
764show environment TERM 764show environment TERM
765#set args -geometry 80x40+0+0 765#set args -geometry 80x40+0+0
766 766
767# People get bothered when they see messages about non-existent functions...
768echo \n
769echo If you see messages below about functions not being defined,\n
770echo don\'t worry about them. Nothing is wrong.\n
771echo \n
772
767# Don't let abort actually run, as it will make 773# Don't let abort actually run, as it will make
768# stdio stop working and therefore the `pr' command above as well. 774# stdio stop working and therefore the `pr' command above as well.
769break abort 775break abort
diff --git a/src/ChangeLog b/src/ChangeLog
index 4f6cb895004..6ad7c939bce 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,51 @@
12006-01-01 Ken Raeburn <raeburn@gnu.org>
2
3 * callproc.c (Fcall_process_region): Bind file-name-handler-alist
4 to nil for the call to Fwrite_region.
5
62005-12-31 Richard M. Stallman <rms@gnu.org>
7
8 * minibuf.c (read_minibuf): Clear out all other minibuffer windows.
9
102005-12-31 Eli Zaretskii <eliz@gnu.org>
11
12 * emacs.c (gdb_pvec_type): A dummy variable for GDB's sake.
13
142005-12-30 Luc Teirlinck <teirllm@auburn.edu>
15
16 * textprop.c (set_text_properties): Reword description of return value.
17 Return Qnil if caller wants to remove all text properties from a
18 string and the string already has no intervals.
19
202005-12-30 Stefan Monnier <monnier@iro.umontreal.ca>
21
22 * term.c (visible_cursor): New boolean var.
23 (set_terminal_modes, tty_show_cursor): Use "vs" or "ve" depending on
24 visible_cursor.
25 (syms_of_term): Export the new var as "visible-cursor".
26
272005-12-30 Eli Zaretskii <eliz@gnu.org>
28
29 * .gdbinit: Tell users not to worry about GDB warnings that some
30 functions do not exist in the binary.
31
322005-12-30 Andreas Schwab <schwab@suse.de>
33
34 * process.c (Fnetwork_interface_info): Correctly terminate the
35 loop over ifflag_table.
36
372005-12-29 Richard M. Stallman <rms@gnu.org>
38
39 * lread.c (readevalloop): Test for reading a whole buffer
40 before actually reading anything. Handle all cases, including
41 START = END = nil and an already-narrowed buffer.
42 Convert END to a marker if it is a number.
43
44 * keymap.c (describe_map): Put sparse map elements into an array,
45 sort them, then output a sequence of identical bindings on one line.
46 (struct describe_map_elt): New data type.
47 (describe_map_compare): New function.
48
12005-12-28 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> 492005-12-28 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2 50
3 * gtkutil.c (xg_get_file_with_chooser): Changed message shown 51 * gtkutil.c (xg_get_file_with_chooser): Changed message shown
diff --git a/src/callproc.c b/src/callproc.c
index f38b7c03ab3..c7804b485c7 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1133,6 +1133,9 @@ usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &r
1133 int count1 = SPECPDL_INDEX (); 1133 int count1 = SPECPDL_INDEX ();
1134 1134
1135 specbind (intern ("coding-system-for-write"), val); 1135 specbind (intern ("coding-system-for-write"), val);
1136 /* POSIX lets mk[s]temp use "."; don't invoke jka-compr if we
1137 happen to get a ".Z" suffix. */
1138 specbind (intern ("file-name-handler-alist"), Qnil);
1136 Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil); 1139 Fwrite_region (start, end, filename_string, Qnil, Qlambda, Qnil, Qnil);
1137 1140
1138 unbind_to (count1, Qnil); 1141 unbind_to (count1, Qnil);
diff --git a/src/emacs.c b/src/emacs.c
index 142da86df95..d38cf4379bf 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -113,6 +113,9 @@ EMACS_INT gdb_data_seg_bits = 0;
113#endif 113#endif
114EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG; 114EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
115EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG; 115EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG;
116/* GDB might say "No enum type named pvec_type" if we don't have at
117 least one symbol with that type, and then xbacktrace could fail. */
118enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK;
116 119
117/* Command line args from shell, as list of strings. */ 120/* Command line args from shell, as list of strings. */
118Lisp_Object Vcommand_line_args; 121Lisp_Object Vcommand_line_args;
diff --git a/src/keymap.c b/src/keymap.c
index 97789a75f1d..64069ca4deb 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -3167,6 +3167,34 @@ describe_translation (definition, args)
3167 insert_string ("??\n"); 3167 insert_string ("??\n");
3168} 3168}
3169 3169
3170/* describe_map puts all the usable elements of a sparse keymap
3171 into an array of `struct describe_map_elt',
3172 then sorts them by the events. */
3173
3174struct describe_map_elt { Lisp_Object event; Lisp_Object definition; int shadowed; };
3175
3176/* qsort comparison function for sorting `struct describe_map_elt' by
3177 the event field. */
3178
3179static int
3180describe_map_compare (aa, bb)
3181 const void *aa, *bb;
3182{
3183 const struct describe_map_elt *a = aa, *b = bb;
3184 if (INTEGERP (a->event) && INTEGERP (b->event))
3185 return ((XINT (a->event) > XINT (b->event))
3186 - (XINT (a->event) < XINT (b->event)));
3187 if (!INTEGERP (a->event) && INTEGERP (b->event))
3188 return 1;
3189 if (INTEGERP (a->event) && !INTEGERP (b->event))
3190 return -1;
3191 if (SYMBOLP (a->event) && SYMBOLP (b->event))
3192 return (Fstring_lessp (a->event, b->event) ? -1
3193 : Fstring_lessp (b->event, a->event) ? 1
3194 : 0);
3195 return 0;
3196}
3197
3170/* Describe the contents of map MAP, assuming that this map itself is 3198/* Describe the contents of map MAP, assuming that this map itself is
3171 reached by the sequence of prefix keys PREFIX (a string or vector). 3199 reached by the sequence of prefix keys PREFIX (a string or vector).
3172 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */ 3200 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */
@@ -3190,6 +3218,13 @@ describe_map (map, prefix, elt_describer, partial, shadow,
3190 int first = 1; 3218 int first = 1;
3191 struct gcpro gcpro1, gcpro2, gcpro3; 3219 struct gcpro gcpro1, gcpro2, gcpro3;
3192 3220
3221 /* These accumulate the values from sparse keymap bindings,
3222 so we can sort them and handle them in order. */
3223 int length_needed = 0;
3224 struct describe_map_elt *vect;
3225 int slots_used = 0;
3226 int i;
3227
3193 suppress = Qnil; 3228 suppress = Qnil;
3194 3229
3195 if (partial) 3230 if (partial)
@@ -3201,6 +3236,12 @@ describe_map (map, prefix, elt_describer, partial, shadow,
3201 kludge = Fmake_vector (make_number (1), Qnil); 3236 kludge = Fmake_vector (make_number (1), Qnil);
3202 definition = Qnil; 3237 definition = Qnil;
3203 3238
3239 for (tail = map; CONSP (tail); tail = XCDR (tail))
3240 length_needed++;
3241
3242 vect = ((struct describe_map_elt *)
3243 alloca (sizeof (struct describe_map_elt) * length_needed));
3244
3204 GCPRO3 (prefix, definition, kludge); 3245 GCPRO3 (prefix, definition, kludge);
3205 3246
3206 for (tail = map; CONSP (tail); tail = XCDR (tail)) 3247 for (tail = map; CONSP (tail); tail = XCDR (tail))
@@ -3215,6 +3256,7 @@ describe_map (map, prefix, elt_describer, partial, shadow,
3215 else if (CONSP (XCAR (tail))) 3256 else if (CONSP (XCAR (tail)))
3216 { 3257 {
3217 int this_shadowed = 0; 3258 int this_shadowed = 0;
3259
3218 event = XCAR (XCAR (tail)); 3260 event = XCAR (XCAR (tail));
3219 3261
3220 /* Ignore bindings whose "prefix" are not really valid events. 3262 /* Ignore bindings whose "prefix" are not really valid events.
@@ -3255,27 +3297,10 @@ describe_map (map, prefix, elt_describer, partial, shadow,
3255 tem = Flookup_key (map, kludge, Qt); 3297 tem = Flookup_key (map, kludge, Qt);
3256 if (!EQ (tem, definition)) continue; 3298 if (!EQ (tem, definition)) continue;
3257 3299
3258 if (first) 3300 vect[slots_used].event = event;
3259 { 3301 vect[slots_used].definition = definition;
3260 previous_description_column = 0; 3302 vect[slots_used].shadowed = this_shadowed;
3261 insert ("\n", 1); 3303 slots_used++;
3262 first = 0;
3263 }
3264
3265 /* THIS gets the string to describe the character EVENT. */
3266 insert1 (Fkey_description (kludge, prefix));
3267
3268 /* Print a description of the definition of this character.
3269 elt_describer will take care of spacing out far enough
3270 for alignment purposes. */
3271 (*elt_describer) (definition, Qnil);
3272
3273 if (this_shadowed)
3274 {
3275 SET_PT (PT - 1);
3276 insert_string (" (binding currently shadowed)");
3277 SET_PT (PT + 1);
3278 }
3279 } 3304 }
3280 else if (EQ (XCAR (tail), Qkeymap)) 3305 else if (EQ (XCAR (tail), Qkeymap))
3281 { 3306 {
@@ -3289,6 +3314,68 @@ describe_map (map, prefix, elt_describer, partial, shadow,
3289 } 3314 }
3290 } 3315 }
3291 3316
3317 /* If we found some sparse map events, sort them. */
3318
3319 qsort (vect, slots_used, sizeof (struct describe_map_elt),
3320 describe_map_compare);
3321
3322 /* Now output them in sorted order. */
3323
3324 for (i = 0; i < slots_used; i++)
3325 {
3326 Lisp_Object start, end;
3327
3328 if (first)
3329 {
3330 previous_description_column = 0;
3331 insert ("\n", 1);
3332 first = 0;
3333 }
3334
3335 ASET (kludge, 0, vect[i].event);
3336 start = vect[i].event;
3337 end = start;
3338
3339 definition = vect[i].definition;
3340
3341 /* Find consecutive chars that are identically defined. */
3342 if (INTEGERP (vect[i].event))
3343 {
3344 while (i + 1 < slots_used
3345 && XINT (vect[i + 1].event) == XINT (vect[i].event) + 1
3346 && !NILP (Fequal (vect[i + 1].definition, definition))
3347 && vect[i].shadowed == vect[i + 1].shadowed)
3348 i++;
3349 end = vect[i].event;
3350 }
3351
3352 /* Now START .. END is the range to describe next. */
3353
3354 /* Insert the string to describe the event START. */
3355 insert1 (Fkey_description (kludge, prefix));
3356
3357 if (!EQ (start, end))
3358 {
3359 insert (" .. ", 4);
3360
3361 ASET (kludge, 0, end);
3362 /* Insert the string to describe the character END. */
3363 insert1 (Fkey_description (kludge, prefix));
3364 }
3365
3366 /* Print a description of the definition of this character.
3367 elt_describer will take care of spacing out far enough
3368 for alignment purposes. */
3369 (*elt_describer) (vect[i].definition, Qnil);
3370
3371 if (vect[i].shadowed)
3372 {
3373 SET_PT (PT - 1);
3374 insert_string (" (binding currently shadowed)");
3375 SET_PT (PT + 1);
3376 }
3377 }
3378
3292 UNGCPRO; 3379 UNGCPRO;
3293} 3380}
3294 3381
diff --git a/src/lread.c b/src/lread.c
index 236ebebda13..0eb54393482 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1323,7 +1323,18 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
1323 int count = SPECPDL_INDEX (); 1323 int count = SPECPDL_INDEX ();
1324 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; 1324 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1325 struct buffer *b = 0; 1325 struct buffer *b = 0;
1326 int bpos;
1326 int continue_reading_p; 1327 int continue_reading_p;
1328 /* Nonzero if reading an entire buffer. */
1329 int whole_buffer = 0;
1330 /* 1 on the first time around. */
1331 int first_sexp = 1;
1332
1333 if (MARKERP (readcharfun))
1334 {
1335 if (NILP (start))
1336 start = readcharfun;
1337 }
1327 1338
1328 if (BUFFERP (readcharfun)) 1339 if (BUFFERP (readcharfun))
1329 b = XBUFFER (readcharfun); 1340 b = XBUFFER (readcharfun);
@@ -1349,7 +1360,6 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
1349 if (b != 0 && NILP (b->name)) 1360 if (b != 0 && NILP (b->name))
1350 error ("Reading from killed buffer"); 1361 error ("Reading from killed buffer");
1351 1362
1352
1353 if (!NILP (start)) 1363 if (!NILP (start))
1354 { 1364 {
1355 /* Switch to the buffer we are reading from. */ 1365 /* Switch to the buffer we are reading from. */
@@ -1364,9 +1374,20 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
1364 1374
1365 /* Set point and ZV around stuff to be read. */ 1375 /* Set point and ZV around stuff to be read. */
1366 Fgoto_char (start); 1376 Fgoto_char (start);
1367 Fnarrow_to_region (make_number (BEGV), end); 1377 if (!NILP (end))
1378 Fnarrow_to_region (make_number (BEGV), end);
1379
1380 /* Just for cleanliness, convert END to a marker
1381 if it is an integer. */
1382 if (INTEGERP (end))
1383 end = Fpoint_max_marker ();
1368 } 1384 }
1369 1385
1386 /* On the first cycle, we can easily test here
1387 whether we are reading the whole buffer. */
1388 if (b && first_sexp)
1389 whole_buffer = (PT == BEG && ZV == Z);
1390
1370 instream = stream; 1391 instream = stream;
1371 read_next: 1392 read_next:
1372 c = READCHAR; 1393 c = READCHAR;
@@ -1416,8 +1437,11 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
1416 1437
1417 if (!NILP (start) && continue_reading_p) 1438 if (!NILP (start) && continue_reading_p)
1418 start = Fpoint_marker (); 1439 start = Fpoint_marker ();
1440
1441 /* Restore saved point and BEGV. */
1419 unbind_to (count1, Qnil); 1442 unbind_to (count1, Qnil);
1420 1443
1444 /* Now eval what we just read. */
1421 val = (*evalfun) (val); 1445 val = (*evalfun) (val);
1422 1446
1423 if (printflag) 1447 if (printflag)
@@ -1428,11 +1452,12 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
1428 else 1452 else
1429 Fprint (val, Qnil); 1453 Fprint (val, Qnil);
1430 } 1454 }
1455
1456 first_sexp = 0;
1431 } 1457 }
1432 1458
1433 build_load_history (sourcename, 1459 build_load_history (sourcename,
1434 stream || (INTEGERP (start) && INTEGERP (end) 1460 stream || whole_buffer);
1435 && XINT (start) == BEG && XINT (end) == Z));
1436 1461
1437 UNGCPRO; 1462 UNGCPRO;
1438 1463
diff --git a/src/minibuf.c b/src/minibuf.c
index 7f3f7fe87ea..b327f2d040a 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -464,6 +464,9 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
464 /* String to add to the history. */ 464 /* String to add to the history. */
465 Lisp_Object histstring; 465 Lisp_Object histstring;
466 466
467 Lisp_Object empty_minibuf;
468 Lisp_Object dummy, frame;
469
467 extern Lisp_Object Qfront_sticky; 470 extern Lisp_Object Qfront_sticky;
468 extern Lisp_Object Qrear_nonsticky; 471 extern Lisp_Object Qrear_nonsticky;
469 472
@@ -641,6 +644,22 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
641 Vminibuf_scroll_window = selected_window; 644 Vminibuf_scroll_window = selected_window;
642 if (minibuf_level == 1 || !EQ (minibuf_window, selected_window)) 645 if (minibuf_level == 1 || !EQ (minibuf_window, selected_window))
643 minibuf_selected_window = selected_window; 646 minibuf_selected_window = selected_window;
647
648 /* Empty out the minibuffers of all frames other than the one
649 where we are going to display one now.
650 Set them to point to ` *Minibuf-0*', which is always empty. */
651 empty_minibuf = Fget_buffer (build_string (" *Minibuf-0*"));
652
653 FOR_EACH_FRAME (dummy, frame)
654 {
655 Lisp_Object root_window = Fframe_root_window (frame);
656 Lisp_Object mini_window = XWINDOW (root_window)->next;
657
658 if (! NILP (mini_window) && !NILP (Fwindow_minibuffer_p (mini_window)))
659 Fset_window_buffer (mini_window, empty_minibuf, Qnil);
660 }
661
662 /* Display this minibuffer in the proper window. */
644 Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil); 663 Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil);
645 Fselect_window (minibuf_window, Qnil); 664 Fselect_window (minibuf_window, Qnil);
646 XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); 665 XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
diff --git a/src/process.c b/src/process.c
index 752768a7bad..e869456e5c8 100644
--- a/src/process.c
+++ b/src/process.c
@@ -3558,7 +3558,7 @@ FLAGS is the current flags of the interface. */)
3558 int fnum; 3558 int fnum;
3559 3559
3560 any++; 3560 any++;
3561 for (fp = ifflag_table; flags != 0 && fp; fp++) 3561 for (fp = ifflag_table; flags != 0 && fp->flag_sym; fp++)
3562 { 3562 {
3563 if (flags & fp->flag_bit) 3563 if (flags & fp->flag_bit)
3564 { 3564 {
diff --git a/src/term.c b/src/term.c
index 49356348545..899739de6ae 100644
--- a/src/term.c
+++ b/src/term.c
@@ -109,6 +109,10 @@ static void delete_tty P_ ((struct terminal *));
109 109
110#define OUTPUT1_IF(tty, a) do { if (a) emacs_tputs ((tty), a, 1, cmputc); } while (0) 110#define OUTPUT1_IF(tty, a) do { if (a) emacs_tputs ((tty), a, 1, cmputc); } while (0)
111 111
112/* If true, use "vs", otherwise use "ve" to make the cursor visible. */
113
114static int visible_cursor;
115
112/* Display space properties */ 116/* Display space properties */
113 117
114extern Lisp_Object Qspace, QCalign_to, QCwidth; 118extern Lisp_Object Qspace, QCalign_to, QCwidth;
@@ -217,7 +221,7 @@ tty_set_terminal_modes (struct terminal *terminal)
217 } 221 }
218 222
219 OUTPUT_IF (tty, tty->TS_termcap_modes); 223 OUTPUT_IF (tty, tty->TS_termcap_modes);
220 OUTPUT_IF (tty, tty->TS_cursor_visible); 224 OUTPUT_IF (tty, visible_cursor ? tty->TS_cursor_visible : tty->TS_cursor_normal);
221 OUTPUT_IF (tty, tty->TS_keypad_mode); 225 OUTPUT_IF (tty, tty->TS_keypad_mode);
222 losecursor (tty); 226 losecursor (tty);
223 fflush (tty->output); 227 fflush (tty->output);
@@ -359,7 +363,8 @@ tty_show_cursor (struct tty_display_info *tty)
359 { 363 {
360 tty->cursor_hidden = 0; 364 tty->cursor_hidden = 0;
361 OUTPUT_IF (tty, tty->TS_cursor_normal); 365 OUTPUT_IF (tty, tty->TS_cursor_normal);
362 OUTPUT_IF (tty, tty->TS_cursor_visible); 366 if (visible_cursor)
367 OUTPUT_IF (tty, tty->TS_cursor_visible);
363 } 368 }
364} 369}
365 370
@@ -3031,6 +3036,13 @@ The functions are run with one argument, the name of the tty that was revived.
3031See `resume-tty'. */); 3036See `resume-tty'. */);
3032 Vresume_tty_functions = Qnil; 3037 Vresume_tty_functions = Qnil;
3033 3038
3039 DEFVAR_BOOL ("visible-cursor", &visible_cursor,
3040 doc: /* Non-nil means to make the cursor very visible.
3041This only has an effect when running in a text terminal.
3042What means \"very visible\" is up to your terminal. It may make the cursor
3043bigger, or it may make it blink, or it may do nothing at all. */);
3044 visible_cursor = 1;
3045
3034 defsubr (&Stty_display_color_p); 3046 defsubr (&Stty_display_color_p);
3035 defsubr (&Stty_display_color_cells); 3047 defsubr (&Stty_display_color_cells);
3036 defsubr (&Stty_no_underline); 3048 defsubr (&Stty_no_underline);
diff --git a/src/textprop.c b/src/textprop.c
index fa9b0e498c5..029f2f41031 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -1316,8 +1316,8 @@ the designated part of OBJECT. */)
1316 properties PROPERTIES. OBJECT is the buffer or string containing 1316 properties PROPERTIES. OBJECT is the buffer or string containing
1317 the text. OBJECT nil means use the current buffer. 1317 the text. OBJECT nil means use the current buffer.
1318 SIGNAL_AFTER_CHANGE_P nil means don't signal after changes. Value 1318 SIGNAL_AFTER_CHANGE_P nil means don't signal after changes. Value
1319 is non-nil if properties were replaced; it is nil if there weren't 1319 is nil if the function _detected_ that it did not replace any
1320 any properties to replace. */ 1320 properties, non-nil otherwise. */
1321 1321
1322Lisp_Object 1322Lisp_Object
1323set_text_properties (start, end, properties, object, signal_after_change_p) 1323set_text_properties (start, end, properties, object, signal_after_change_p)
@@ -1341,7 +1341,7 @@ set_text_properties (start, end, properties, object, signal_after_change_p)
1341 && XFASTINT (end) == SCHARS (object)) 1341 && XFASTINT (end) == SCHARS (object))
1342 { 1342 {
1343 if (! STRING_INTERVALS (object)) 1343 if (! STRING_INTERVALS (object))
1344 return Qt; 1344 return Qnil;
1345 1345
1346 STRING_SET_INTERVALS (object, NULL_INTERVAL); 1346 STRING_SET_INTERVALS (object, NULL_INTERVAL);
1347 return Qt; 1347 return Qt;