1 /*
2  * Copyright (C) 2020 The HIME team, Taiwan
3  * Copyright (C) 2011 Edward Der-Hua Liu, Hsin-Chu, Taiwan
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation version 2.1
8  * of the License.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 
20 #include "hime.h"
21 
22 #include "pho.h"
23 
24 GtkWidget *hbox_buttons;
25 char current_str[MAX_PHRASE_LEN * CH_SZ + 1];
26 
27 static GtkClipboard *pclipboard;
28 
29 GtkWidget *mainwin;
30 GtkTextBuffer *buffer;
31 
do_exit()32 void do_exit () {
33     exit (0);
34 }
35 
all_wrap()36 void all_wrap () {
37     GtkTextIter mstart, mend;
38 
39     gtk_text_buffer_get_bounds (buffer, &mstart, &mend);
40     gtk_text_buffer_apply_tag_by_name (buffer, "char_wrap", &mstart, &mend);
41 }
42 
43 gboolean b_trad2sim = FALSE;
44 
45 int trad2sim (char *str, int strN, char **out);
46 int sim2trad (char *str, int strN, char **out);
selection_received(GtkClipboard * pclip,const char * text,gpointer data)47 static void selection_received (GtkClipboard *pclip, const char *text, gpointer data) {
48     if (!text) {
49         dbg ("empty\n");
50         return;
51     }
52 
53     char *out;
54     if (b_trad2sim)
55         trad2sim ((char *) text, strlen (text), &out);
56     else
57         sim2trad ((char *) text, strlen (text), &out);
58 
59     gtk_text_buffer_set_text (buffer, out, -1);
60     free (out);
61 
62     all_wrap ();
63 }
64 
req_clipboard()65 void req_clipboard () {
66     gtk_clipboard_request_text (pclipboard, selection_received, mainwin);
67 }
68 
cb_button_fetch()69 gboolean cb_button_fetch () {
70     req_clipboard ();
71     return TRUE;
72 }
73 
74 void set_window_hime_icon (GtkWidget *window);
75 
main(int argc,char ** argv)76 int main (int argc, char **argv) {
77     init_TableDir ();
78 
79     gtk_init (&argc, &argv);
80 
81 #if HIME_I18N_MESSAGE
82     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
83     textdomain (GETTEXT_PACKAGE);
84 #endif
85 
86     if (strstr (argv[0], "hime-trad2sim")) {
87         b_trad2sim = TRUE;
88         dbg ("hime-trad2sim\n");
89     }
90 
91     mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
92     gtk_window_set_has_resize_grip (GTK_WINDOW (mainwin), FALSE);
93     gtk_window_set_default_size (GTK_WINDOW (mainwin), 320, 100);
94     set_window_hime_icon (mainwin);
95 
96     GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
97     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
98                                     GTK_POLICY_AUTOMATIC,
99                                     GTK_POLICY_AUTOMATIC);
100 
101     GtkWidget *vbox_top = gtk_vbox_new (FALSE, 0);
102     gtk_orientable_set_orientation (GTK_ORIENTABLE (vbox_top), GTK_ORIENTATION_VERTICAL);
103     gtk_container_add (GTK_CONTAINER (mainwin), vbox_top);
104 
105     GtkWidget *view = gtk_text_view_new ();
106     gtk_widget_set_hexpand (view, TRUE);
107     gtk_widget_set_vexpand (view, TRUE);
108     gtk_container_add (GTK_CONTAINER (sw), view);
109 
110     gtk_box_pack_start (GTK_BOX (vbox_top), sw, TRUE, TRUE, 0);
111 
112     buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
113 
114     gtk_text_buffer_create_tag (buffer,
115                                 "blue_background", "background", "blue", "foreground", "white", NULL);
116 
117     gtk_text_buffer_create_tag (buffer, "char_wrap",
118                                 "wrap_mode", GTK_WRAP_CHAR, NULL);
119 
120     hbox_buttons = gtk_hbox_new (FALSE, 0);
121     gtk_box_pack_start (GTK_BOX (vbox_top), hbox_buttons, FALSE, FALSE, 0);
122 
123     GtkWidget *button_fetch = gtk_button_new_with_label (_ ("Update data from clipboard"));
124     gtk_box_pack_start (GTK_BOX (hbox_buttons), button_fetch, FALSE, FALSE, 0);
125     g_signal_connect (G_OBJECT (button_fetch), "clicked",
126                       G_CALLBACK (cb_button_fetch), NULL);
127 
128     GtkWidget *button_exit = gtk_button_new_with_label (_ ("Exit"));
129     gtk_box_pack_start (GTK_BOX (hbox_buttons), button_exit, FALSE, FALSE, 0);
130     g_signal_connect (G_OBJECT (button_exit), "clicked",
131                       G_CALLBACK (do_exit), NULL);
132 
133     g_signal_connect (G_OBJECT (mainwin), "delete-event",
134                       G_CALLBACK (do_exit), NULL);
135 
136     gtk_widget_show_all (mainwin);
137 
138     pclipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
139 
140     req_clipboard ();
141 
142     gtk_main ();
143     return 0;
144 }
145