@@ -1144,12 +1144,32 @@ make_beep(Options *opts)
1144
1144
* It is used for result of action info
1145
1145
*/
1146
1146
static int
1147
- show_info_wait (Options * opts , ScrDesc * scrdesc , char * fmt , char * par , bool beep )
1147
+ show_info_wait (Options * opts , ScrDesc * scrdesc , char * fmt , char * par , bool beep , bool refresh_first )
1148
1148
{
1149
1149
int c ;
1150
1150
WINDOW * bottom_bar = w_bottom_bar (scrdesc );
1151
1151
Theme * t = & scrdesc -> themes [WINDOW_BOTTOM_BAR ];
1152
1152
1153
+ /*
1154
+ * When refresh is required first, then store params and quit immediately.
1155
+ * Only once can be info moved after refresh
1156
+ */
1157
+ if (refresh_first && scrdesc -> fmt == NULL )
1158
+ {
1159
+ if (fmt != NULL )
1160
+ scrdesc -> fmt = strdup (fmt );
1161
+ else
1162
+ scrdesc -> fmt = NULL ;
1163
+
1164
+ if (par != NULL )
1165
+ scrdesc -> par = strdup (par );
1166
+ else
1167
+ scrdesc -> par = NULL ;
1168
+ scrdesc -> beep = beep ;
1169
+
1170
+ return 0 ;
1171
+ }
1172
+
1153
1173
wattron (bottom_bar , t -> bottom_light_attr );
1154
1174
1155
1175
if (par != NULL )
@@ -1204,6 +1224,25 @@ has_upperchr(char *str)
1204
1224
return false;
1205
1225
}
1206
1226
1227
+ static void
1228
+ reset_searching_lineinfo (LineBuffer * lnb )
1229
+ {
1230
+ while (lnb != NULL )
1231
+ {
1232
+ if (lnb -> lineinfo != NULL )
1233
+ {
1234
+ int i ;
1235
+
1236
+ for (i = 0 ; i < lnb -> nrows ; i ++ )
1237
+ {
1238
+ lnb -> lineinfo [i ].mask |= LINEINFO_UNKNOWN ;
1239
+ lnb -> lineinfo [i ].mask &= ~(LINEINFO_FOUNDSTR | LINEINFO_FOUNDSTR_MULTI );
1240
+ }
1241
+ }
1242
+ lnb = lnb -> next ;
1243
+ }
1244
+ }
1245
+
1207
1246
1208
1247
int
1209
1248
main (int argc , char * argv [])
@@ -1605,6 +1644,24 @@ main(int argc, char *argv[])
1605
1644
1606
1645
doupdate ();
1607
1646
1647
+ if (scrdesc .fmt != NULL )
1648
+ {
1649
+ c2 = show_info_wait (& opts , & scrdesc , scrdesc .fmt , scrdesc .par , scrdesc .beep , false);
1650
+ if (scrdesc .fmt != NULL )
1651
+ {
1652
+ free (scrdesc .fmt );
1653
+ scrdesc .fmt = NULL ;
1654
+ }
1655
+ if (scrdesc .par != NULL )
1656
+ {
1657
+ free (scrdesc .par );
1658
+ scrdesc .par = NULL ;
1659
+ }
1660
+
1661
+ refresh_aux_windows (& opts , & scrdesc , & desc );
1662
+ continue ;
1663
+ }
1664
+
1608
1665
c = getch ();
1609
1666
redirect_mode = false;
1610
1667
}
@@ -1647,7 +1704,7 @@ main(int argc, char *argv[])
1647
1704
use_mouse = true;
1648
1705
}
1649
1706
1650
- c2 = show_info_wait (& opts , & scrdesc , " mouse handling: %s " , use_mouse ? "on" : "off" , false);
1707
+ c2 = show_info_wait (& opts , & scrdesc , " mouse handling: %s " , use_mouse ? "on" : "off" , false, false );
1651
1708
refresh_scr = true;
1652
1709
}
1653
1710
if (second_char == 'k' ) /* ALT k - (un)set bookmark */
@@ -2274,7 +2331,7 @@ main(int argc, char *argv[])
2274
2331
exit :
2275
2332
2276
2333
if (!ok )
2277
- c2 = show_info_wait (& opts , & scrdesc , " Cannot write to %s " , buffer , true);
2334
+ c2 = show_info_wait (& opts , & scrdesc , " Cannot write to %s " , buffer , true, false );
2278
2335
2279
2336
refresh_scr = true;
2280
2337
@@ -2295,18 +2352,7 @@ main(int argc, char *argv[])
2295
2352
scrdesc .searchterm_size = strlen (scrdesc .searchterm );
2296
2353
scrdesc .searchterm_char_size = utf8len (scrdesc .searchterm );
2297
2354
2298
- if (!opts .no_highlight_search )
2299
- {
2300
- while (lnb != NULL )
2301
- {
2302
- if (lnb -> lineinfo != NULL )
2303
- {
2304
- for (i = 0 ; i < lnb -> nrows ; i ++ )
2305
- lnb -> lineinfo [i ].mask |= LINEINFO_UNKNOWN ;
2306
- }
2307
- lnb = lnb -> next ;
2308
- }
2309
- }
2355
+ reset_searching_lineinfo (& desc .rows );
2310
2356
}
2311
2357
2312
2358
search_direction = SEARCH_FORWARD ;
@@ -2350,24 +2396,19 @@ main(int argc, char *argv[])
2350
2396
const char * str ;
2351
2397
2352
2398
if (opts .ignore_case || (opts .ignore_lower_case && !scrdesc .has_upperchr ))
2353
- {
2354
- if ((str = utf8_nstrstr (lnb -> rows [rownum_cursor_row ] + skip_bytes , scrdesc .searchterm )))
2355
- {
2356
- scrdesc .found_start_x = utf8len_start_stop (lnb -> rows [rownum_cursor_row ], str );
2357
- scrdesc .found_start_bytes = str - lnb -> rows [rownum_cursor_row ];
2358
- scrdesc .found = true;
2359
- goto found_next_pattern ;
2360
- }
2361
- }
2399
+ str = utf8_nstrstr (lnb -> rows [rownum_cursor_row ] + skip_bytes , scrdesc .searchterm );
2400
+ else if (opts .ignore_lower_case && scrdesc .has_upperchr )
2401
+ str = utf8_nstrstr_ignore_lower_case (lnb -> rows [rownum_cursor_row ] + skip_bytes ,
2402
+ scrdesc .searchterm );
2362
2403
else
2404
+ str = str = strstr (lnb -> rows [rownum_cursor_row ] + skip_bytes , scrdesc .searchterm );
2405
+
2406
+ if (str != NULL )
2363
2407
{
2364
- if ((str = strstr (lnb -> rows [rownum_cursor_row ] + skip_bytes , scrdesc .searchterm )))
2365
- {
2366
- scrdesc .found_start_x = utf8len_start_stop (lnb -> rows [rownum_cursor_row ], str );
2367
- scrdesc .found_start_bytes = str - lnb -> rows [rownum_cursor_row ];
2368
- scrdesc .found = true;
2369
- goto found_next_pattern ;
2370
- }
2408
+ scrdesc .found_start_x = utf8len_start_stop (lnb -> rows [rownum_cursor_row ], str );
2409
+ scrdesc .found_start_bytes = str - lnb -> rows [rownum_cursor_row ];
2410
+ scrdesc .found = true;
2411
+ goto found_next_pattern ;
2371
2412
}
2372
2413
2373
2414
rownum += 1 ;
@@ -2400,11 +2441,8 @@ main(int argc, char *argv[])
2400
2441
first_row = max_first_row ;
2401
2442
}
2402
2443
else
2403
- {
2404
- c2 = show_info_wait (& opts , & scrdesc , " Not found " , NULL , true);
2405
- /* reset search term */
2406
- scrdesc .searchterm [0 ] = '\0' ;
2407
- }
2444
+ c2 = show_info_wait (& opts , & scrdesc , " Not found " , NULL , true, true);
2445
+
2408
2446
refresh_scr = true;
2409
2447
}
2410
2448
break ;
@@ -2416,25 +2454,12 @@ main(int argc, char *argv[])
2416
2454
get_string (& scrdesc , "?" , locsearchterm , sizeof (locsearchterm ) - 1 );
2417
2455
if (locsearchterm [0 ] != '\0' )
2418
2456
{
2419
- LineBuffer * lnb = & desc .rows ;
2420
-
2421
2457
strncpy (scrdesc .searchterm , locsearchterm , sizeof (scrdesc .searchterm ) - 1 );
2422
2458
scrdesc .has_upperchr = has_upperchr (scrdesc .searchterm );
2423
2459
scrdesc .searchterm_size = strlen (scrdesc .searchterm );
2424
2460
scrdesc .searchterm_char_size = utf8len (scrdesc .searchterm );
2425
2461
2426
- if (!opts .no_highlight_search )
2427
- {
2428
- while (lnb != NULL )
2429
- {
2430
- if (lnb -> lineinfo != NULL )
2431
- {
2432
- for (i = 0 ; i < lnb -> nrows ; i ++ )
2433
- lnb -> lineinfo [i ].mask |= LINEINFO_UNKNOWN ;
2434
- }
2435
- lnb = lnb -> next ;
2436
- }
2437
- }
2462
+ reset_searching_lineinfo (& desc .rows );
2438
2463
}
2439
2464
2440
2465
search_direction = SEARCH_BACKWARD ;
@@ -2515,9 +2540,14 @@ main(int argc, char *argv[])
2515
2540
/* try to find most right pattern */
2516
2541
while (str != NULL )
2517
2542
{
2518
- if (((opts .ignore_case || (opts .ignore_lower_case && !scrdesc .has_upperchr ))
2519
- && (str = utf8_nstrstr (str , scrdesc .searchterm )) != NULL )
2520
- || (str = strstr (str , scrdesc .searchterm )) != NULL )
2543
+ if (opts .ignore_case || (opts .ignore_lower_case && !scrdesc .has_upperchr ))
2544
+ str = utf8_nstrstr (str , scrdesc .searchterm );
2545
+ else if (opts .ignore_lower_case && scrdesc .has_upperchr )
2546
+ str = utf8_nstrstr_ignore_lower_case (str , scrdesc .searchterm );
2547
+ else
2548
+ str = str = strstr (str , scrdesc .searchterm );
2549
+
2550
+ if (str != NULL )
2521
2551
{
2522
2552
cursor_row = search_row ;
2523
2553
if (first_row > cursor_row )
@@ -2546,10 +2576,7 @@ main(int argc, char *argv[])
2546
2576
}
2547
2577
2548
2578
if (!scrdesc .found )
2549
- {
2550
- c2 = show_info_wait (& opts , & scrdesc , " Not found " , NULL , true);
2551
- scrdesc .searchterm [0 ] = '\0' ;
2552
- }
2579
+ c2 = show_info_wait (& opts , & scrdesc , " Not found " , NULL , true, true);
2553
2580
2554
2581
refresh_scr = true;
2555
2582
}
0 commit comments