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