1 #include "gcin.h"
2 #include "win-sym.h"
3 #include "gtab.h"
4
5 static int current_gcin_inner_frame;
6 static int current_pho_in_row1;
7 extern gboolean test_mode;
8
9 GtkWidget *gwin_pho;
10 static GtkWidget *top_bin, *hbox_row2;
11 static GtkWidget *label_pho_sele;
12 static GtkWidget *label_pho;
13 static GtkWidget *label_full;
14 static GtkWidget *label_key_codes;
15 static GtkWidget *event_box_pho;
16
17 void change_pho_font_size(), toggle_win_sym();
18 void disp_pho_sub(GtkWidget *label, int index, char *pho);
19
disp_pho(int index,char * phochar)20 void disp_pho(int index, char *phochar)
21 {
22 // dbg("%d '", index); utf8_putchar(phochar); dbg("'\n");
23 disp_pho_sub(label_pho, index, phochar);
24 }
25
26 #if WIN32
27 static int timeout_handle_pho;
timeout_minimize_win_pho(gpointer data)28 gboolean timeout_minimize_win_pho(gpointer data)
29 {
30 if (!gwin_pho)
31 return FALSE;
32 gtk_window_resize(GTK_WINDOW(gwin_pho), 1, 1);
33 // gtk_window_present(GTK_WINDOW(gwin0));
34 timeout_handle_pho = 0;
35 return FALSE;
36 }
37 #endif
38
39
minimize_win_pho()40 void minimize_win_pho()
41 {
42 gtk_window_resize(GTK_WINDOW(gwin_pho), 1, 1);
43
44 #if WIN32
45 if (!timeout_handle_pho)
46 timeout_handle_pho = g_timeout_add(50, timeout_minimize_win_pho, NULL);
47 #endif
48 }
49
50
51 void move_win_pho(int x, int y);
52
get_win_size(GtkWidget * win,int * width,int * height)53 void get_win_size(GtkWidget *win, int *width, int *height)
54 {
55 GtkRequisition sz;
56 sz.width = sz.height = 0;
57 gtk_widget_get_preferred_size(GTK_WIDGET(win), NULL, &sz);
58 *width = sz.width;
59 *height = sz.height;
60 }
61
win_size_exceed(GtkWidget * win)62 gboolean win_size_exceed(GtkWidget *win)
63 {
64 int width, height;
65
66 get_win_size(win, &width, &height);
67
68 return (width + current_in_win_x > dpy_xl || height + current_in_win_y > dpy_yl);
69 }
70
71
disp_pho_sel(char * s)72 void disp_pho_sel(char *s)
73 {
74 gtk_label_set_markup(GTK_LABEL(label_pho_sele), s);
75
76 minimize_win_pho();
77
78 if (win_size_exceed(gwin_pho)) {
79 move_win_pho(current_in_win_x, current_in_win_y);
80 }
81 }
82
83
set_key_codes_label_pho(char * s)84 void set_key_codes_label_pho(char *s)
85 {
86 if (!label_key_codes)
87 return;
88
89 if (!s || !*s) {
90 gtk_widget_hide(label_key_codes);
91 return;
92 }
93
94 gtk_label_set_text(GTK_LABEL(label_key_codes), s);
95 gtk_widget_show(label_key_codes);
96 }
97
98
99 void show_win_sym();
100
move_win_pho(int x,int y)101 void move_win_pho(int x, int y)
102 {
103 int twin_xl, twin_yl;
104
105 win_x = x; win_y = y;
106
107 if (!gwin_pho)
108 return;
109
110 get_win_size(gwin_pho, &twin_xl, &twin_yl);
111
112 if (x + twin_xl > dpy_xl)
113 x = dpy_xl - twin_xl;
114 if (x < 0)
115 x = 0;
116
117 if (y + twin_yl > dpy_yl)
118 y = dpy_yl - twin_yl;
119 if (y < 0)
120 y = 0;
121
122 gtk_window_move(GTK_WINDOW(gwin_pho), x, y);
123 move_win_sym();
124 }
125
126
create_win_pho()127 void create_win_pho()
128 {
129 if (gwin_pho)
130 return;
131
132 gwin_pho = create_no_focus_win();
133
134 change_win_bg(gwin_pho);
135 }
136
137 void create_win_sym(), exec_gcin_setup();
138
mouse_button_callback(GtkWidget * widget,GdkEventButton * event,gpointer data)139 static void mouse_button_callback( GtkWidget *widget,GdkEventButton *event, gpointer data)
140 {
141 // dbg("mouse_button_callback %d\n", event->button);
142 switch (event->button) {
143 case 1:
144 toggle_win_sym();
145 break;
146 case 2:
147 inmd_switch_popup_handler(widget, (GdkEvent *)event);
148 break;
149 case 3:
150 exec_gcin_setup();
151 break;
152 }
153
154 }
155
create_win_pho_gui_simple()156 void create_win_pho_gui_simple()
157 {
158 // dbg("create_win_pho .....\n");
159
160 if (top_bin)
161 return;
162
163 GtkWidget *vbox_top = gtk_vbox_new (FALSE, 0);
164
165 // GtkWidget *event_box_pho;
166 if (gtab_in_area_button)
167 event_box_pho = gtk_button_new();
168 else {
169 event_box_pho = gtk_event_box_new();
170 gtk_event_box_set_visible_window (GTK_EVENT_BOX(event_box_pho), FALSE);
171 }
172
173 gtk_container_set_border_width (GTK_CONTAINER (event_box_pho), 0);
174
175 if (gcin_inner_frame) {
176 GtkWidget *frame = top_bin = gtk_frame_new(NULL);
177 gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
178 gtk_container_add (GTK_CONTAINER(gwin_pho), frame);
179 gtk_container_add (GTK_CONTAINER (frame), vbox_top);
180 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT);
181 } else {
182 gtk_container_add (GTK_CONTAINER(gwin_pho), vbox_top);
183 top_bin = vbox_top;
184 }
185
186
187 GtkWidget *align = gtk_alignment_new (0, 0, 0, 0);
188 label_pho_sele = gtk_label_new(NULL);
189
190 if (!pho_in_row1) {
191 gtk_box_pack_start (GTK_BOX (vbox_top), align, FALSE, FALSE, 0);
192 gtk_container_add (GTK_CONTAINER (align), label_pho_sele);
193 } else {
194 GtkWidget *hbox_row1 = gtk_hbox_new (FALSE, 0);
195 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_row1, FALSE, FALSE, 0);
196 gtk_box_pack_start (GTK_BOX (hbox_row1), event_box_pho, FALSE, FALSE, 0);
197
198 gtk_box_pack_start (GTK_BOX (hbox_row1), align, FALSE, FALSE, 0);
199 gtk_container_add (GTK_CONTAINER (align), label_pho_sele);
200 }
201
202
203 hbox_row2 = gtk_hbox_new (FALSE, 0);
204 /* This packs the button into the gwin_pho (a gtk container). */
205 gtk_container_add (GTK_CONTAINER (vbox_top), hbox_row2);
206 label_full = gtk_label_new(_(_L("全")));
207 gtk_container_add (GTK_CONTAINER (hbox_row2), label_full);
208
209
210 if (!pho_in_row1)
211 gtk_box_pack_start (GTK_BOX (hbox_row2), event_box_pho, FALSE, FALSE, 0);
212
213 g_signal_connect(G_OBJECT(event_box_pho),"button-press-event",
214 G_CALLBACK(mouse_button_callback), NULL);
215
216
217 label_pho = gtk_label_new(NULL);
218
219 GtkWidget *frame_pho;
220 if (gtab_in_area_button) {
221 gtk_container_add (GTK_CONTAINER (event_box_pho), label_pho);
222 }
223 else {
224 frame_pho = gtk_frame_new(NULL);
225 gtk_frame_set_shadow_type(GTK_FRAME(frame_pho), GTK_SHADOW_OUT);
226 gtk_container_add (GTK_CONTAINER (event_box_pho), frame_pho);
227 gtk_container_set_border_width (GTK_CONTAINER (frame_pho), 0);
228 gtk_container_add (GTK_CONTAINER (frame_pho), label_pho);
229 }
230
231 if (left_right_button_tips) {
232 #if GTK_CHECK_VERSION(2,12,0)
233 gtk_widget_set_tooltip_text (event_box_pho, _(_L("左鍵符號,右鍵設定")));
234 #else
235 GtkTooltips *button_gtab_tips = gtk_tooltips_new ();
236 gtk_tooltips_set_tip (GTK_TOOLTIPS (button_gtab_tips), event_box_pho, _(_L("左鍵符號,右鍵設定")),NULL);
237 #endif
238 }
239
240 label_key_codes = gtk_label_new(NULL);
241 gtk_label_set_selectable(GTK_LABEL(label_key_codes), TRUE);
242 gtk_box_pack_start (GTK_BOX (hbox_row2), label_key_codes, FALSE, FALSE, 2);
243
244 change_pho_font_size();
245
246 gtk_widget_show_all (gwin_pho);
247
248 gtk_widget_hide(label_key_codes);
249
250 gtk_widget_hide(label_full);
251 }
252
create_win_pho_gui()253 void create_win_pho_gui()
254 {
255 create_win_pho_gui_simple();
256
257 if (pho_hide_row2) {
258 gtk_widget_hide(hbox_row2);
259 gtk_window_resize(GTK_WINDOW(gwin_pho), 1, 1);
260 }
261
262 current_gcin_inner_frame = gcin_inner_frame;
263 current_pho_in_row1 = pho_in_row1;
264 }
265
266
267 gboolean pho_has_input();
268
show_win_pho()269 void show_win_pho()
270 {
271 if (test_mode)
272 return;
273 // dbg("show_win_pho\n");
274 create_win_pho();
275 create_win_pho_gui();
276
277 if (gcin_pop_up_win && !pho_has_input() &&
278 inmd[default_input_method].method_type==method_type_PHO)
279 return;
280
281 #if UNIX
282 if (!GTK_WIDGET_VISIBLE(gwin_pho))
283 #endif
284 {
285 gtk_widget_show(gwin_pho);
286 move_win_pho(win_x, win_y);
287 }
288
289 gtk_widget_show(gwin_pho);
290 #if UNIX
291 if (current_CS->b_raise_window)
292 #endif
293 gtk_window_present(GTK_WINDOW(gwin_pho));
294
295 show_win_sym();
296
297 if (pho_hide_row2)
298 gtk_widget_hide(hbox_row2);
299 else
300 gtk_widget_show(hbox_row2);
301 }
302
303
304 void hide_win_sym();
305
hide_win_pho()306 void hide_win_pho()
307 {
308 // dbg("hide_win_pho\n");
309 if (!gwin_pho)
310 return;
311
312 #if WIN32
313 if (timeout_handle_pho) {
314 g_source_remove(timeout_handle_pho);
315 timeout_handle_pho = 0;
316 }
317 #endif
318
319 gtk_widget_hide(gwin_pho);
320 hide_win_sym();
321 }
322
323
324 void init_tab_pho();
325 void get_win_gtab_geom();
326
init_gtab_pho_query_win()327 void init_gtab_pho_query_win()
328 {
329 init_tab_pho();
330 get_win_gtab_geom();
331 move_win_pho(win_x, win_y + win_yl);
332 }
333
334 char *get_full_str();
335
win_pho_disp_half_full()336 void win_pho_disp_half_full()
337 {
338 if (gcin_win_color_use)
339 gtk_label_set_markup(GTK_LABEL(label_pho), get_full_str());
340 else
341 gtk_label_set_text(GTK_LABEL(label_pho), get_full_str());
342
343 if (current_CS->im_state == GCIN_STATE_CHINESE && (!current_CS->b_half_full_char))
344 gtk_widget_hide(label_full);
345 else
346 gtk_widget_show(label_full);
347
348 minimize_win_pho();
349 }
350
get_win_pho_geom()351 void get_win_pho_geom()
352 {
353 if (!gwin_pho)
354 return;
355
356 gtk_window_get_position(GTK_WINDOW(gwin_pho), &win_x, &win_y);
357
358 get_win_size(gwin_pho, &win_xl, &win_yl);
359 }
360
361
change_pho_font_size()362 void change_pho_font_size()
363 {
364 if (!top_bin)
365 return;
366
367 set_label_font_size(label_pho, gcin_font_size_tsin_pho_in);
368
369 set_label_font_size(label_pho_sele, gcin_font_size);
370
371 change_win_fg_bg(gwin_pho, label_pho_sele);
372 }
373
hide_show_pho_in(gboolean show)374 void hide_show_pho_in(gboolean show) {
375 dbg("hide_show_pho_in %d\n", show);
376 if (show) {
377 gtk_widget_show(label_pho);
378 gtk_widget_show(event_box_pho);
379 } else {
380 gtk_widget_hide(label_pho);
381 gtk_widget_hide(event_box_pho);
382 }
383 }
384
385 #if 0
386 void recreate_win_pho()
387 {
388 gtk_widget_destroy(gwin_pho);
389 top_bin = NULL;
390 gwin_pho = NULL;
391 create_win_pho();
392 create_win_pho_gui_simple();
393 }
394 #endif
395