void load_IC(IC *rec) { ClientState *cs = &rec->cs; Window win = cs->client_win; if (win == focus_win && !current_CS) { current_CS = cs; save_CS_temp_to_current(); } if (win == focus_win) { if (cs->im_state == HIME_STATE_DISABLED) hide_in_win(cs); else if (cs->im_state != HIME_STATE_DISABLED) show_in_win(cs); } if (cs->input_style & InputStyleOnSpot) { if (cs->im_state != HIME_STATE_DISABLED) move_IC_in_win(cs); } else if (cs->input_style & InputStyleOverSpot) { if (cs->im_state != HIME_STATE_DISABLED) move_IC_in_win(cs); } else if (cs->input_style & InputStyleRoot) { move_IC_in_win(cs); } }
void update_in_win_pos() { check_CS(); // dbg("update_in_win_pos %x %d\n", current_CS, current_CS->input_style); if (current_CS->input_style == InputStyleRoot) { Window r_root, r_child; int winx, winy, rootx, rooty; u_int mask; XQueryPointer(dpy, root, &r_root, &r_child, &rootx, &rooty, &winx, &winy, &mask); winx++; winy++; Window inpwin = current_CS->client_win; #if 0 dbg("update_in_win_pos\n"); #endif if (inpwin) { int tx, ty; Window ow; XTranslateCoordinates(dpy, root, inpwin, winx, winy, &tx, &ty, &ow); current_CS->spot_location.x = tx; current_CS->spot_location.y = ty; } move_in_win(current_CS, winx, winy); } else { move_IC_in_win(current_CS); } }
int hime_FocusIn(ClientState *cs) { // dbg("hime_FocusIn\n"); Window win = cs->client_win; #if UNIX && 0 if (skip_window(win)) return FALSE; #endif reset_current_in_win_xy(); if (cs) { Window win = cs->client_win; if (focus_win != win) { #if 1 hime_reset(); #endif hide_in_win(current_CS); focus_win = win; } } current_CS = cs; save_CS_temp_to_current(); // dbg("current_CS %x %d %d\n", cs, cs->im_state, current_CS->im_state); if (win == focus_win) { if (cs->im_state != HIME_STATE_DISABLED) { show_in_win(cs); move_IC_in_win(cs); } else hide_in_win(cs); } if (inmd[cs->in_method].selkey) set_wselkey(inmd[cs->in_method].selkey); else { set_wselkey(pho_selkey); gtab_set_win1_cb(); tsin_set_win1_cb(); } update_win_kbm(); #if TRAY_ENABLED disp_tray_icon(); #endif #if 0 dbg_time("hime_FocusIn %x %x\n",cs, current_CS); #endif return True; }
int gcin_FocusIn(ClientState *cs) { Window win = cs->client_win; gcin_reset(); #if UNIX if (skip_window(win)) return FALSE; #endif reset_current_in_win_xy(); if (cs) { Window win = cs->client_win; if (focus_win != win) { hide_in_win(current_CS); focus_win = win; } } current_CS = cs; // dbg("current_CS %x %d %d\n", cs, cs->im_state, current_CS->im_state); if (win == focus_win) { if (cs->im_state != GCIN_STATE_DISABLED) { show_in_win(cs); move_IC_in_win(cs); #if 0 set_win_status_inmd(inmd[cs->in_method].cname); #endif } else hide_in_win(cs); } update_win_kbm(); #if TRAY_ENABLED disp_tray_icon(); #endif #if 0 dbg_time("gcin_FocusIn %x %x\n",cs, current_CS); #endif return True; }
static void StoreIC(IC *rec, IMChangeICStruct *call_data) { ClientState *cs = &rec->cs; XICAttribute *ic_attr = call_data->ic_attr; XICAttribute *pre_attr = call_data->preedit_attr; XICAttribute *sts_attr = call_data->status_attr; register int i; if (!current_CS) { current_CS = cs; save_CS_temp_to_current(); } #if DEBUG && 0 dbg(".... StoreIC\n"); #endif for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { if (Is (XNInputStyle, ic_attr)) { INT32 input_style = *(INT32*)ic_attr->value; if (input_style & XIMPreeditCallbacks) { cs->input_style = InputStyleOnSpot; } else if (input_style & XIMPreeditPosition) { cs->input_style = InputStyleOverSpot; } else if (input_style & XIMPreeditNothing) { cs->input_style = InputStyleRoot; } } else if (Is (XNClientWindow, ic_attr)) { rec->cs.client_win = *(Window*)ic_attr->value; #if DEBUG dbg("rec->client_win %x\n", cs->client_win); #endif } else if (Is (XNFocusWindow, ic_attr)) { rec->focus_win = *(Window*)ic_attr->value; } else fprintf(stderr, "Unknown attr: %s a\n", ic_attr->name); } for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { if (Is (XNArea, pre_attr)) { rec->pre_attr.area = *(XRectangle*)pre_attr->value; #if DEBUG dbg("pre_attr->value: %d %d\n", rec->pre_attr.area.x, rec->pre_attr.area.y); #endif } else if (Is (XNAreaNeeded, pre_attr)) rec->pre_attr.area_needed = *(XRectangle*)pre_attr->value; else if (Is (XNSpotLocation, pre_attr)) { cs->spot_location = *(XPoint*)pre_attr->value; move_IC_in_win(cs); } else if (Is (XNColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNStdColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNForeground, pre_attr)) rec->pre_attr.foreground = *(CARD32*)pre_attr->value; else if (Is (XNBackground, pre_attr)) rec->pre_attr.background = *(CARD32*)pre_attr->value; else if (Is (XNBackgroundPixmap, pre_attr)) rec->pre_attr.bg_pixmap = *(Pixmap*)pre_attr->value; else if (Is (XNFontSet, pre_attr)) { int str_length = strlen((char *)pre_attr->value); if (rec->pre_attr.base_font != NULL) { if (Is (rec->pre_attr.base_font, pre_attr)) continue; XFree(rec->pre_attr.base_font); } rec->pre_attr.base_font = (char *)malloc(str_length + 1); strcpy(rec->pre_attr.base_font, (char *)pre_attr->value); } else if (Is (XNLineSpace, pre_attr)) rec->pre_attr.line_space = *(CARD32*)pre_attr->value; else if (Is (XNCursor, pre_attr)) rec->pre_attr.cursor = *(Cursor*)pre_attr->value; else fprintf(stderr, "Unknown attr: %s b\n", pre_attr->name); } for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { if (Is (XNArea, sts_attr)) { rec->sts_attr.area = *(XRectangle*)sts_attr->value; } else if (Is (XNAreaNeeded, sts_attr)) { rec->sts_attr.area_needed = *(XRectangle*)sts_attr->value; } else if (Is (XNColormap, sts_attr)) { rec->sts_attr.cmap = *(Colormap*)sts_attr->value; } else if (Is (XNStdColormap, sts_attr)) { rec->sts_attr.cmap = *(Colormap*)sts_attr->value; } else if (Is (XNForeground, sts_attr)) { rec->sts_attr.foreground = *(CARD32*)sts_attr->value; } else if (Is (XNBackground, sts_attr)) rec->sts_attr.background = *(CARD32*)sts_attr->value; else if (Is (XNBackgroundPixmap, sts_attr)) rec->sts_attr.bg_pixmap = *(Pixmap*)sts_attr->value; else if (Is (XNFontSet, sts_attr)) { int str_length = strlen((char *)sts_attr->value); if (rec->sts_attr.base_font != NULL) { if (Is (rec->sts_attr.base_font, sts_attr)) continue; XFree(rec->sts_attr.base_font); } rec->sts_attr.base_font = (char *)malloc(str_length + 1); strcpy(rec->sts_attr.base_font, (char *)sts_attr->value); } else if (Is (XNLineSpace, sts_attr)) { rec->sts_attr.line_space= *(CARD32*)sts_attr->value; } else if (Is (XNCursor, sts_attr)) rec->sts_attr.cursor = *(Cursor*)sts_attr->value; else fprintf(stderr, "Unknown attr: %s c\n", ic_attr->name); } load_IC(rec); #if DEBUG && 0 dbg("exit StoreIC\n"); #endif }