comparison console/libgnt/gntentry.c @ 14828:91a89d5ef714

[gaim-migrate @ 17595] Two new actions for the entry box: "delete-prev-word" and "cursor-prev-word". I haven't set any default binding for either. But I think ctrl-w is a common binding for the first action. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 28 Oct 2006 06:01:30 +0000
parents 02b70dc43044
children bfcdd361357e
comparison
equal deleted inserted replaced
14827:02b70dc43044 14828:91a89d5ef714
329 { 329 {
330 GntEntry *entry = GNT_ENTRY(widget); 330 GntEntry *entry = GNT_ENTRY(widget);
331 entry->end = entry->cursor; 331 entry->end = entry->cursor;
332 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); 332 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start));
333 entry_redraw(widget); 333 entry_redraw(widget);
334 return TRUE;
335 }
336
337 static const char *
338 begin_word(const char *text, const char *begin)
339 {
340 char ch;
341 ch = *text;
342 #define SAME(a,b) ((isalpha(a) && isalpha(b)) || (isdigit(a) && isdigit(b)) || (isblank(a) && isblank(b)))
343 while (--text >= begin) {
344 if (!SAME(ch, *text))
345 break;
346 }
347 #undef SAME
348
349 return ++text;
350 }
351
352 static gboolean
353 move_back_word(GntWidget *widget, GList *null)
354 {
355 GntEntry *entry = GNT_ENTRY(widget);
356 const char *iter = entry->cursor - 1;
357 int count;
358
359 if (iter < entry->start)
360 return TRUE;
361 iter = begin_word(iter, entry->start);
362 entry->cursor = (char*)iter;
363 if (entry->cursor < entry->scroll)
364 entry->scroll = entry->cursor;
365 entry_redraw(widget);
366 return TRUE;
367 }
368
369 static gboolean
370 del_prev_word(GntWidget *widget, GList *null)
371 {
372 GntEntry *entry = GNT_ENTRY(widget);
373 char *iter = entry->cursor - 1;
374 int count;
375
376 if (iter < entry->start)
377 return TRUE;
378 iter = (char*)begin_word(iter, entry->start);
379 count = entry->cursor - iter;
380 memmove(iter, entry->cursor, entry->end - entry->cursor);
381 entry->end -= count;
382 entry->cursor = iter;
383 if (entry->cursor <= entry->scroll) {
384 entry->scroll = entry->cursor - widget->priv.width + 2;
385 if (entry->scroll < entry->start)
386 entry->scroll = entry->start;
387 }
388 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start));
389 entry_redraw(widget);
390
334 return TRUE; 391 return TRUE;
335 } 392 }
336 393
337 static gboolean 394 static gboolean
338 gnt_entry_key_pressed(GntWidget *widget, const char *text) 395 gnt_entry_key_pressed(GntWidget *widget, const char *text)
504 gnt_widget_register_binding(parent_class, "delete-next", GNT_KEY_CTRL_D, NULL); 561 gnt_widget_register_binding(parent_class, "delete-next", GNT_KEY_CTRL_D, NULL);
505 gnt_widget_class_register_action(parent_class, "delete-start", del_to_home, 562 gnt_widget_class_register_action(parent_class, "delete-start", del_to_home,
506 GNT_KEY_CTRL_U, NULL); 563 GNT_KEY_CTRL_U, NULL);
507 gnt_widget_class_register_action(parent_class, "delete-end", del_to_end, 564 gnt_widget_class_register_action(parent_class, "delete-end", del_to_end,
508 GNT_KEY_CTRL_K, NULL); 565 GNT_KEY_CTRL_K, NULL);
566 gnt_widget_class_register_action(parent_class, "delete-prev-word", del_prev_word,
567 NULL, NULL);
509 #if 0 568 #if 0
510 gnt_widget_class_register_action(parent_class, "delete-prev-word", del_prev_word,
511 NULL, 1, NULL);
512 gnt_widget_class_register_action(parent_class, "delete-next-word", del_next_word, 569 gnt_widget_class_register_action(parent_class, "delete-next-word", del_next_word,
513 NULL, 1, NULL); 570 NULL, 1, NULL);
514 #endif 571 #endif
572 gnt_widget_class_register_action(parent_class, "cursor-prev-word", move_back_word,
573 NULL, NULL);
515 gnt_widget_class_register_action(parent_class, "cursor-prev", move_back, 574 gnt_widget_class_register_action(parent_class, "cursor-prev", move_back,
516 "\033" GNT_KEY_LEFT, NULL); 575 "\033" GNT_KEY_LEFT, NULL);
517 gnt_widget_class_register_action(parent_class, "cursor-next", move_forward, 576 gnt_widget_class_register_action(parent_class, "cursor-next", move_forward,
518 "\033" GNT_KEY_RIGHT, NULL); 577 "\033" GNT_KEY_RIGHT, NULL);
519 gnt_widget_class_register_action(parent_class, "suggest-show", suggest_show, 578 gnt_widget_class_register_action(parent_class, "suggest-show", suggest_show,