Mercurial > pidgin
comparison src/buddy_chat.c @ 3790:12b29552f1d7
[gaim-migrate @ 3930]
Better than cheddar, it's i18n input...
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Wed, 23 Oct 2002 00:12:49 +0000 |
parents | 165ae100e0a7 |
children | 9bcb42faccc0 |
comparison
equal
deleted
inserted
replaced
3789:fb519383a058 | 3790:12b29552f1d7 |
---|---|
467 gtk_widget_show(invite); | 467 gtk_widget_show(invite); |
468 } | 468 } |
469 | 469 |
470 void tab_complete(struct conversation *c) | 470 void tab_complete(struct conversation *c) |
471 { | 471 { |
472 int pos = GTK_OLD_EDITABLE(c->entry)->current_pos; | 472 GtkTextIter cursor, word_start, start_buffer; |
473 int start = pos; | 473 int start; |
474 int most_matched = -1; | 474 int most_matched = -1; |
475 char *entered, *partial = NULL; | 475 char *entered, *partial = NULL; |
476 char *text; | 476 char *text; |
477 GList *matches = NULL; | 477 GList *matches = NULL; |
478 GList *nicks = c->in_room; | 478 GList *nicks = NULL; |
479 | |
480 gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer); | |
481 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor, | |
482 gtk_text_buffer_get_insert(c->entry_buffer)); | |
483 word_start = cursor; | |
479 | 484 |
480 /* if there's nothing there just return */ | 485 /* if there's nothing there just return */ |
481 if (!start) | 486 if (!gtk_text_iter_compare(&cursor, &start_buffer)) |
482 return; | 487 return; |
483 | 488 |
484 text = gtk_editable_get_chars(GTK_EDITABLE(c->entry), 0, pos); | 489 text = gtk_text_buffer_get_text(c->entry_buffer, &start_buffer, &cursor, FALSE); |
485 | 490 |
486 /* if we're at the end of ": " we need to move back 2 spaces */ | 491 /* if we're at the end of ": " we need to move back 2 spaces */ |
487 if (start >= 2 && text[start - 1] == ' ' && text[start - 2] == ':') | 492 start = strlen(text)-1; |
488 start -= 2; | 493 if (strlen(text)>=2 && !strncmp(&text[start-1], ": ", 2)) { |
489 | 494 gtk_text_iter_backward_chars(&word_start, 2); |
495 } | |
496 | |
490 /* find the start of the word that we're tabbing */ | 497 /* find the start of the word that we're tabbing */ |
491 while (start > 0 && text[start - 1] != ' ') | 498 while (start >= 0 && text[start] != ' ') { |
499 gtk_text_iter_backward_char(&word_start); | |
492 start--; | 500 start--; |
493 | 501 } |
494 entered = text + start; | 502 g_free(text); |
503 | |
504 entered = gtk_text_buffer_get_text(c->entry_buffer, &word_start, &cursor, FALSE); | |
495 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { | 505 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { |
496 if (strlen(entered) >= 2 && !strncmp(": ", entered + strlen(entered) - 2, 2)) | 506 if (strlen(entered) >= 2 && !strncmp(": ", entered + strlen(entered) - 2, 2)) |
497 entered[strlen(entered) - 2] = 0; | 507 entered[strlen(entered) - 2] = 0; |
498 } | 508 } |
499 | 509 |
500 if (!strlen(entered)) { | 510 if (!strlen(entered)) { |
501 g_free(text); | 511 g_free(entered); |
502 return; | 512 return; |
503 } | 513 } |
504 | 514 |
505 debug_printf("checking tab-completion for %s\n", entered); | 515 debug_printf("checking tab-completion for %s\n", entered); |
506 | 516 |
517 nicks = c->in_room; | |
507 while (nicks) { | 518 while (nicks) { |
508 char *nick = nicks->data; | 519 char *nick = nicks->data; |
509 /* this checks to see if the current nick could be a completion */ | 520 /* this checks to see if the current nick could be a completion */ |
510 if (g_strncasecmp(nick, entered, strlen(entered))) { | 521 if (g_strncasecmp(nick, entered, strlen(entered))) { |
511 if (nick[0] != '+' && nick[0] != '@') { | 522 if (nick[0] != '+' && nick[0] != '@') { |
529 /* if we're here, it's a possible completion */ | 540 /* if we're here, it's a possible completion */ |
530 debug_printf("possible completion: %s\n", nick); | 541 debug_printf("possible completion: %s\n", nick); |
531 | 542 |
532 /* if we're doing old-style, just fill in the completion */ | 543 /* if we're doing old-style, just fill in the completion */ |
533 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { | 544 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { |
534 gtk_editable_delete_text(GTK_EDITABLE(c->entry), start, pos); | 545 gtk_text_buffer_delete(c->entry_buffer, &word_start, &cursor); |
535 if (strlen(nick) == strlen(entered)) { | 546 if (strlen(nick) == strlen(entered)) { |
536 nicks = nicks->next ? nicks->next : c->in_room; | 547 nicks = nicks->next ? nicks->next : c->in_room; |
537 nick = nicks->data; | 548 nick = nicks->data; |
538 if (*nick == '@') | 549 if (*nick == '@') |
539 nick++; | 550 nick++; |
540 if (*nick == '+') | 551 if (*nick == '+') |
541 nick++; | 552 nick++; |
542 } | 553 } |
543 | 554 |
544 if (start == 0) { | 555 gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer); |
556 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor, | |
557 gtk_text_buffer_get_insert(c->entry_buffer)); | |
558 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
545 char *tmp = g_strdup_printf("%s: ", nick); | 559 char *tmp = g_strdup_printf("%s: ", nick); |
546 int t = start; | 560 gtk_text_buffer_insert_at_cursor(c->entry_buffer, tmp, -1); |
547 gtk_editable_insert_text(GTK_EDITABLE(c->entry), tmp, strlen(tmp), &start); | |
548 if (t == start) { | |
549 t = start + strlen(tmp); | |
550 gtk_editable_set_position(GTK_EDITABLE(c->entry), t); | |
551 } | |
552 g_free(tmp); | 561 g_free(tmp); |
553 } else { | 562 } else { |
554 int t = start; | 563 gtk_text_buffer_insert_at_cursor(c->entry_buffer, nick, -1); |
555 gtk_editable_insert_text(GTK_EDITABLE(c->entry), nick, strlen(nick), &start); | |
556 if (t == start) { | |
557 t = start + strlen(nick); | |
558 gtk_editable_set_position(GTK_EDITABLE(c->entry), t); | |
559 } | |
560 } | 564 } |
561 g_free(text); | 565 g_free(entered); |
562 return; | 566 return; |
563 } | 567 } |
564 | 568 |
565 /* we're only here if we're doing new style */ | 569 /* we're only here if we're doing new style */ |
566 if (most_matched == -1) { | 570 if (most_matched == -1) { |
579 /* we're only here if we're doing new style */ | 583 /* we're only here if we're doing new style */ |
580 | 584 |
581 /* if there weren't any matches, return */ | 585 /* if there weren't any matches, return */ |
582 if (!matches) { | 586 if (!matches) { |
583 /* if matches isn't set partials won't be either */ | 587 /* if matches isn't set partials won't be either */ |
584 g_free(text); | 588 g_free(entered); |
585 return; | 589 return; |
586 } | 590 } |
587 | 591 |
588 gtk_editable_delete_text(GTK_EDITABLE(c->entry), start, pos); | 592 gtk_text_buffer_delete(c->entry_buffer, &word_start, &cursor); |
589 if (!matches->next) { | 593 if (!matches->next) { |
590 /* there was only one match. fill it in. */ | 594 /* there was only one match. fill it in. */ |
591 if (start == 0) { | 595 gtk_text_buffer_get_start_iter(c->entry_buffer, &start_buffer); |
596 gtk_text_buffer_get_iter_at_mark(c->entry_buffer, &cursor, | |
597 gtk_text_buffer_get_insert(c->entry_buffer)); | |
598 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
592 char *tmp = g_strdup_printf("%s: ", (char *)matches->data); | 599 char *tmp = g_strdup_printf("%s: ", (char *)matches->data); |
593 int t = start; | 600 gtk_text_buffer_insert_at_cursor(c->entry_buffer, tmp, -1); |
594 gtk_editable_insert_text(GTK_EDITABLE(c->entry), tmp, strlen(tmp), &start); | |
595 if (t == start) { | |
596 t = start + strlen(tmp); | |
597 gtk_editable_set_position(GTK_EDITABLE(c->entry), t); | |
598 } | |
599 g_free(tmp); | 601 g_free(tmp); |
600 } else { | 602 } else { |
601 gtk_editable_insert_text(GTK_EDITABLE(c->entry), matches->data, strlen(matches->data), &start); | 603 gtk_text_buffer_insert_at_cursor(c->entry_buffer, matches->data, -1); |
602 } | 604 } |
603 matches = g_list_remove(matches, matches->data); | 605 matches = g_list_remove(matches, matches->data); |
604 } else { | 606 } else { |
605 /* there were lots of matches, fill in as much as possible and display all of them */ | 607 /* there were lots of matches, fill in as much as possible and display all of them */ |
606 char *addthis = g_malloc0(1); | 608 char *addthis = g_malloc0(1); |
607 int t = start; | |
608 while (matches) { | 609 while (matches) { |
609 char *tmp = addthis; | 610 char *tmp = addthis; |
610 addthis = g_strconcat(tmp, matches->data, " ", NULL); | 611 addthis = g_strconcat(tmp, matches->data, " ", NULL); |
611 g_free(tmp); | 612 g_free(tmp); |
612 matches = g_list_remove(matches, matches->data); | 613 matches = g_list_remove(matches, matches->data); |
613 } | 614 } |
614 write_to_conv(c, addthis, WFLAG_NOLOG, NULL, time(NULL), -1); | 615 write_to_conv(c, addthis, WFLAG_NOLOG, NULL, time(NULL), -1); |
615 gtk_editable_insert_text(GTK_EDITABLE(c->entry), partial, strlen(partial), &start); | 616 gtk_text_buffer_insert_at_cursor(c->entry_buffer, partial, -1); |
616 if (t == start) { | |
617 t = start + strlen(partial); | |
618 gtk_editable_set_position(GTK_EDITABLE(c->entry), t); | |
619 } | |
620 g_free(addthis); | 617 g_free(addthis); |
621 } | 618 } |
622 | 619 |
623 g_free(text); | 620 g_free(entered); |
624 g_free(partial); | 621 g_free(partial); |
625 } | 622 } |
626 | 623 |
627 gboolean meify(char *message, int len) | 624 gboolean meify(char *message, int len) |
628 { | 625 { |
1178 void show_new_buddy_chat(struct conversation *b) | 1175 void show_new_buddy_chat(struct conversation *b) |
1179 { | 1176 { |
1180 GtkWidget *win; | 1177 GtkWidget *win; |
1181 GtkWidget *cont; | 1178 GtkWidget *cont; |
1182 GtkWidget *text; | 1179 GtkWidget *text; |
1180 /*GtkWidget *close;*/ | |
1181 GtkWidget *frame; | |
1183 GtkWidget *chatentry; | 1182 GtkWidget *chatentry; |
1184 GtkWidget *lbox; | 1183 GtkWidget *lbox; |
1185 GtkWidget *bbox; | 1184 GtkWidget *bbox; |
1186 GtkWidget *bbox2; | 1185 GtkWidget *bbox2; |
1187 GtkWidget *button; | 1186 GtkWidget *button; |
1381 | 1380 |
1382 vbox = gtk_vbox_new(FALSE, 5); | 1381 vbox = gtk_vbox_new(FALSE, 5); |
1383 gtk_paned_pack2(GTK_PANED(vpaned), vbox, TRUE, FALSE); | 1382 gtk_paned_pack2(GTK_PANED(vpaned), vbox, TRUE, FALSE); |
1384 gtk_widget_show(vbox); | 1383 gtk_widget_show(vbox); |
1385 | 1384 |
1386 chatentry = gtk_text_new(NULL, NULL); | 1385 toolbar = build_conv_toolbar(b); |
1386 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); | |
1387 | |
1388 frame = gtk_frame_new(NULL); | |
1389 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
1390 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(frame), TRUE, TRUE, 0); | |
1391 gtk_widget_show(frame); | |
1392 | |
1393 b->entry_buffer = gtk_text_buffer_new(NULL); | |
1394 g_object_set_data(G_OBJECT(b->entry_buffer), "user_data", b); | |
1395 chatentry = gtk_text_view_new_with_buffer(b->entry_buffer); | |
1387 b->entry = chatentry; | 1396 b->entry = chatentry; |
1388 if (!(chat_options & OPT_CHAT_ONE_WINDOW)) | 1397 if (!(chat_options & OPT_CHAT_ONE_WINDOW)) |
1389 gtk_window_set_focus(GTK_WINDOW(b->window), b->entry); | 1398 gtk_window_set_focus(GTK_WINDOW(b->window), b->entry); |
1390 | 1399 |
1391 | 1400 |
1392 b->makesound = 1; /* Need to do this until we get a menu */ | 1401 b->makesound = 1; /* Need to do this until we get a menu */ |
1393 | 1402 |
1394 toolbar = build_conv_toolbar(b); | 1403 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(b->entry), GTK_WRAP_WORD); |
1395 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); | 1404 g_signal_connect(G_OBJECT(b->entry), "key_press_event", G_CALLBACK(keypress_callback), b); |
1396 | 1405 g_signal_connect_after(G_OBJECT(b->entry), "button_press_event", |
1397 gtk_object_set_user_data(GTK_OBJECT(chatentry), b); | 1406 G_CALLBACK(stop_rclick_callback), NULL); |
1398 gtk_text_set_editable(GTK_TEXT(chatentry), TRUE); | 1407 g_signal_connect_swapped(G_OBJECT(chatentry), "key_press_event", |
1399 gtk_text_set_word_wrap(GTK_TEXT(chatentry), TRUE); | 1408 G_CALLBACK(entry_key_pressed), chatentry); |
1400 gtk_signal_connect(GTK_OBJECT(chatentry), "activate", GTK_SIGNAL_FUNC(send_callback), b); | 1409 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(chatentry)); |
1401 gtk_signal_connect(GTK_OBJECT(chatentry), "key_press_event", GTK_SIGNAL_FUNC(keypress_callback), | |
1402 b); | |
1403 gtk_signal_connect(GTK_OBJECT(chatentry), "key_press_event", GTK_SIGNAL_FUNC(entry_key_pressed), | |
1404 chatentry); | |
1405 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
1406 gtkspell_attach(GTK_TEXT(chatentry)); | |
1407 gtk_box_pack_start(GTK_BOX(vbox), chatentry, TRUE, TRUE, 0); | |
1408 gtk_widget_set_usize(chatentry, buddy_chat_size.width, MAX(buddy_chat_size.entry_height, 25)); | 1410 gtk_widget_set_usize(chatentry, buddy_chat_size.width, MAX(buddy_chat_size.entry_height, 25)); |
1409 gtk_window_set_focus(GTK_WINDOW(win), chatentry); | 1411 gtk_window_set_focus(GTK_WINDOW(win), chatentry); |
1410 gtk_widget_show(chatentry); | 1412 gtk_widget_show(chatentry); |
1413 /*if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
1414 gtkspell_attach(GTK_TEXT(chatentry));*/ | |
1411 | 1415 |
1412 bbox = gtk_hbox_new(FALSE, 5); | 1416 bbox = gtk_hbox_new(FALSE, 5); |
1413 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | 1417 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); |
1414 gtk_widget_show(bbox); | 1418 gtk_widget_show(bbox); |
1415 | 1419 |