static void selection_received(GtkClipboard *pclip, const char *text, gpointer data) { if (!text) { dbg("empty\n"); return; } char *out; if (b_trad2sim) trad2sim((char *)text, strlen(text), &out); else sim2trad((char *)text, strlen(text), &out); gtk_text_buffer_set_text (buffer, out, -1); free(out); all_wrap(); }
static void selection_received(GtkClipboard *pclip, const gchar *text, gpointer data) { if (!text) return; char *outtext = NULL; int outlen = 0; while (*text) { char tt[CH_SZ * 5 * MAX_SAME_PHO + 1]; int len = u8cpy(tt, (char *)text); tt[len]=0; phokey_t phokeys[MAX_SAME_PHO]; int phokeysN = utf8_pho_keys((char *)text, phokeys); int i; for(i=0; i <phokeysN ;i++) { char *phostr; if (b_pinyin) phostr = phokey2pinyin(phokeys[i]); else phostr = phokey_to_str(phokeys[i]); strcat(tt, phostr); } int ttlen = strlen(tt); outtext = (char *)realloc(outtext, outlen + ttlen + 1); memcpy(outtext + outlen, tt, ttlen); outlen+=ttlen; text += len; } outtext[outlen]=0; gtk_text_buffer_set_text (buffer, outtext, -1); free(outtext); all_wrap(); }
int main(int argc, char **argv) { init_TableDir(); set_is_chs(); gtk_init (&argc, &argv); load_setttings(); load_gtab_list(TRUE); b_pinyin = is_pinyin_kbm(); #if GCIN_i18n_message bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #endif pinmd = &inmd[default_input_method]; if (pinmd->method_type == method_type_TSIN) { dbg("is tsin\n"); pho_load(); load_tsin_db(); ph_key_sz = 2; } else if (pinmd->filename) { dbg("gtab filename %s\n", pinmd->filename); init_gtab(default_input_method); is_gtab = TRUE; init_tsin_table_fname(pinmd, gtab_tsin_fname); load_tsin_db0(gtab_tsin_fname, TRUE); } else p_err("Your default input method %s doesn't use phrase database", pinmd->cname); dbg("ph_key_sz: %d\n", ph_key_sz); #if UNIX dpy = GDK_DISPLAY(); #endif mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_has_resize_grip(GTK_WINDOW(mainwin), FALSE); gtk_window_set_default_size(GTK_WINDOW (mainwin), 640, 520); set_window_gcin_icon(mainwin); GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GtkWidget *vbox_top = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER(mainwin), vbox_top); GtkWidget *view = gtk_text_view_new (); gtk_widget_set_hexpand (view, TRUE); gtk_widget_set_vexpand (view, TRUE); gtk_container_add (GTK_CONTAINER(sw), view); gtk_box_pack_start (GTK_BOX (vbox_top), sw, TRUE, TRUE, 0); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); #if UNIX char *text = _(_L("按滑鼠中鍵, 貼上你要 tslearn 學習的文章。")); #else char *text = _(_L("按 ctrl-V, 貼上你要 tslearn 學習的文章。")); #endif gtk_text_buffer_set_text (buffer, text, -1); gtk_text_buffer_create_tag (buffer, "blue_background", "background", "blue", "foreground", "white", NULL); gtk_text_buffer_create_tag (buffer, "char_wrap", "wrap_mode", GTK_WRAP_CHAR, NULL); hbox_buttons = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox_top), hbox_buttons, FALSE, FALSE, 0); GtkWidget *button_parse = gtk_button_new_with_label(_(_L("標示已知詞"))); gtk_box_pack_start (GTK_BOX (hbox_buttons), button_parse, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (button_parse), "clicked", G_CALLBACK (cb_button_parse), NULL); GtkWidget *button_add = gtk_button_new_with_label(_(_L("新增詞"))); gtk_box_pack_start (GTK_BOX (hbox_buttons), button_add, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (button_add), "clicked", G_CALLBACK (cb_button_add), NULL); GtkWidget *button_quit = gtk_button_new_from_stock (GTK_STOCK_QUIT); gtk_box_pack_start (GTK_BOX (hbox_buttons), button_quit, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (button_quit), "clicked", G_CALLBACK (do_exit), NULL); g_signal_connect (G_OBJECT (mainwin), "delete_event", G_CALLBACK (do_exit), NULL); all_wrap(); gtk_widget_show_all(mainwin); #if WIN32 gtk_window_present(GTK_WINDOW(mainwin)); #endif gtk_main(); return 0; }
static void cb_button_parse(GtkButton *button, gpointer user_data) { int char_count = gtk_text_buffer_get_char_count (buffer); int i; load_ts_phrase(); char_count = gtk_text_buffer_get_char_count (buffer); all_wrap(); dbg("parse char_count:%d\n", char_count); for(i=0; i < char_count; ) { int len; for(len=MAX_PHRASE_LEN; len>=2 ; len--) { u_char txt[MAX_PHRASE_LEN*CH_SZ + 1]; int txtN=0, u8chN=0; gboolean b_ignore = FALSE; int k; for(k=0; k<len && i+k < char_count; k++) { GtkTextIter start,end; gtk_text_buffer_get_iter_at_offset (buffer, &start, i+k); gtk_text_buffer_get_iter_at_offset (buffer, &end, i+k+1); char *utf8 = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); if (!(utf8[0] & 128)) b_ignore = TRUE; int wn = strlen(utf8); memcpy(&txt[txtN], utf8, wn); txtN+= wn; u8chN++; } if (b_ignore || txtN < 2) continue; txt[txtN] = 0; // dbg("try len:%d txtN:%d %s\n", len, txtN, txt); if (!pharse_search((char *)txt)) continue; // dbg("match .... %d %d\n", i, len); GtkTextIter mstart,mend; gtk_text_buffer_get_iter_at_offset (buffer, &mstart, i); gtk_text_buffer_get_iter_at_offset (buffer, &mend, i+len); gtk_text_buffer_apply_tag_by_name (buffer, "blue_background", &mstart, &mend); #if 1 // why do I have to repeat this gtk_text_buffer_get_iter_at_offset (buffer, &mstart, i); gtk_text_buffer_get_iter_at_offset (buffer, &mend, i+len); gtk_text_buffer_apply_tag_by_name (buffer, "blue_background", &mstart, &mend); #endif gdk_flush(); } i+=len; } }