Fix handling of input strings
b6d2cc9a
1 file(s) · +21 −14
| 308 | 308 | { |
|
| 309 | 309 | char buf[32]; |
|
| 310 | 310 | int len; |
|
| 311 | - | KeySym ksym = NoSymbol; |
|
| 311 | + | KeySym ksym; |
|
| 312 | 312 | Status status; |
|
| 313 | 313 | ||
| 314 | 314 | len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); |
|
| 315 | - | if (status == XBufferOverflow) |
|
| 315 | + | switch (status) { |
|
| 316 | + | default: /* XLookupNone, XBufferOverflow */ |
|
| 316 | 317 | return; |
|
| 317 | - | if (ev->state & ControlMask) |
|
| 318 | + | case XLookupChars: |
|
| 319 | + | goto insert; |
|
| 320 | + | case XLookupKeySym: |
|
| 321 | + | case XLookupBoth: |
|
| 322 | + | break; |
|
| 323 | + | } |
|
| 324 | + | ||
| 325 | + | if (ev->state & ControlMask) { |
|
| 318 | 326 | switch(ksym) { |
|
| 319 | 327 | case XK_a: ksym = XK_Home; break; |
|
| 320 | 328 | case XK_b: ksym = XK_Left; break; |
|
| 352 | 360 | return; |
|
| 353 | 361 | case XK_Left: |
|
| 354 | 362 | movewordedge(-1); |
|
| 355 | - | ksym = NoSymbol; |
|
| 356 | - | break; |
|
| 363 | + | goto draw; |
|
| 357 | 364 | case XK_Right: |
|
| 358 | 365 | movewordedge(+1); |
|
| 359 | - | ksym = NoSymbol; |
|
| 360 | - | break; |
|
| 366 | + | goto draw; |
|
| 361 | 367 | case XK_Return: |
|
| 362 | 368 | case XK_KP_Enter: |
|
| 363 | 369 | break; |
|
| 367 | 373 | default: |
|
| 368 | 374 | return; |
|
| 369 | 375 | } |
|
| 370 | - | else if (ev->state & Mod1Mask) |
|
| 376 | + | } else if (ev->state & Mod1Mask) { |
|
| 371 | 377 | switch(ksym) { |
|
| 372 | 378 | case XK_b: |
|
| 373 | 379 | movewordedge(-1); |
|
| 374 | - | ksym = NoSymbol; |
|
| 375 | - | break; |
|
| 380 | + | goto draw; |
|
| 376 | 381 | case XK_f: |
|
| 377 | 382 | movewordedge(+1); |
|
| 378 | - | ksym = NoSymbol; |
|
| 379 | - | break; |
|
| 383 | + | goto draw; |
|
| 380 | 384 | case XK_g: ksym = XK_Home; break; |
|
| 381 | 385 | case XK_G: ksym = XK_End; break; |
|
| 382 | 386 | case XK_h: ksym = XK_Up; break; |
|
| 386 | 390 | default: |
|
| 387 | 391 | return; |
|
| 388 | 392 | } |
|
| 393 | + | } |
|
| 394 | + | ||
| 389 | 395 | switch(ksym) { |
|
| 390 | 396 | default: |
|
| 397 | + | insert: |
|
| 391 | 398 | if (!iscntrl(*buf)) |
|
| 392 | 399 | insert(buf, len); |
|
| 393 | - | break; |
|
| 394 | - | case NoSymbol: |
|
| 395 | 400 | break; |
|
| 396 | 401 | case XK_Delete: |
|
| 397 | 402 | if (text[cursor] == '\0') |
|
| 489 | 494 | match(); |
|
| 490 | 495 | break; |
|
| 491 | 496 | } |
|
| 497 | + | ||
| 498 | + | draw: |
|
| 492 | 499 | drawmenu(); |
|
| 493 | 500 | } |
|
| 494 | 501 | ||