📄 gdkim.c
字号:
newattr |= GDK_IC_PREEDIT_AREA_NEEDED; } } if (mask & GDK_IC_PREEDIT_FOREGROUND) { pattr->preedit_foreground = attr->preedit_foreground; newattr |= GDK_IC_PREEDIT_FOREGROUND; } if (mask & GDK_IC_PREEDIT_BACKGROUND) { pattr->preedit_background = attr->preedit_background; newattr |= GDK_IC_PREEDIT_BACKGROUND; } if (mask & GDK_IC_PREEDIT_PIXMAP) { if (attr->preedit_pixmap != NULL && ((GdkPixmapPrivate *)attr->preedit_pixmap)->destroyed) { g_warning ("Preedit pixmap is already destroyed.\n"); error |= GDK_IC_PREEDIT_PIXMAP; } else { if (pattr->preedit_pixmap != attr->preedit_pixmap) { if (pattr->preedit_pixmap != NULL) gdk_pixmap_unref (pattr->preedit_pixmap); if (attr->preedit_pixmap) gdk_pixmap_ref (attr->preedit_pixmap); pattr->preedit_pixmap = attr->preedit_pixmap; newattr |= GDK_IC_PREEDIT_PIXMAP; } } } if (mask & GDK_IC_PREEDIT_COLORMAP) { if (pattr->preedit_colormap != attr->preedit_colormap) { if (pattr->preedit_colormap != NULL) gdk_colormap_unref (pattr->preedit_colormap); if (attr->preedit_colormap != NULL) gdk_colormap_ref (attr->preedit_colormap); pattr->preedit_colormap = attr->preedit_colormap; newattr |= GDK_IC_PREEDIT_COLORMAP; } } if (mask & GDK_IC_STATUS_FONTSET) { if (attr->status_fontset == NULL || attr->status_fontset->type != GDK_FONT_FONTSET) { g_warning ("gdk_font is NULL or not a fontset.\n"); error |= GDK_IC_STATUS_FONTSET; } else if (pattr->status_fontset != attr->status_fontset) { if (pattr->status_fontset != NULL) gdk_font_unref (pattr->status_fontset); if (attr->status_fontset != NULL) gdk_font_ref (attr->status_fontset); pattr->status_fontset = attr->status_fontset; newattr |= GDK_IC_STATUS_FONTSET; } } if (mask & GDK_IC_STATUS_AREA) { pattr->status_area = attr->status_area; newattr |= GDK_IC_STATUS_AREA; } if (mask & GDK_IC_STATUS_AREA_NEEDED) { if (attr->status_area_needed.width == 0 || attr->status_area_needed.height == 0) { g_warning ("width and height of status_area_needed must be non 0.\n"); error |= GDK_IC_STATUS_AREA_NEEDED; } else { pattr->status_area_needed = attr->status_area_needed; newattr |= GDK_IC_STATUS_AREA_NEEDED; } } if (mask & GDK_IC_STATUS_FOREGROUND) { pattr->status_foreground = attr->status_foreground; newattr |= GDK_IC_STATUS_FOREGROUND; } if (mask & GDK_IC_STATUS_BACKGROUND) { pattr->status_background = attr->status_background; newattr |= GDK_IC_STATUS_BACKGROUND; } if (mask & GDK_IC_STATUS_PIXMAP) { if (attr->status_pixmap != NULL && ((GdkPixmapPrivate *)attr->status_pixmap)->destroyed) { g_warning ("Preedit pixmap is already destroyed.\n"); error |= GDK_IC_STATUS_PIXMAP; } else { if (pattr->status_pixmap != attr->status_pixmap) { if (pattr->status_pixmap != NULL) gdk_pixmap_unref (pattr->status_pixmap); if (attr->status_pixmap) gdk_pixmap_ref (attr->status_pixmap); pattr->status_pixmap = attr->status_pixmap; newattr |= GDK_IC_STATUS_PIXMAP; } } } if (mask & GDK_IC_STATUS_COLORMAP) { if (pattr->status_colormap != attr->status_colormap) { if (pattr->status_colormap != NULL) gdk_colormap_unref (pattr->status_colormap); if (attr->status_colormap != NULL) gdk_colormap_ref (attr->status_colormap); pattr->status_colormap = attr->status_colormap; newattr |= GDK_IC_STATUS_COLORMAP; } } if (private->xic == NULL) return error; error |= gdk_ic_real_set_attr (ic, pattr, newattr); return error;}GdkICAttributesTypegdk_ic_get_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask){ GdkICPrivate *private; GdkICAttr *pattr; GdkICAttributesType known, unknown = 0; g_return_val_if_fail (ic != NULL, -1); g_return_val_if_fail (attr != NULL, -1); private = (GdkICPrivate *) ic; pattr = private->attr; known = mask & private->mask; if (known & GDK_IC_STYLE) attr->style = pattr->style; if (known & GDK_IC_CLIENT_WINDOW) attr->client_window = pattr->client_window; if (known & GDK_IC_FOCUS_WINDOW) attr->focus_window = pattr->focus_window; if (known & GDK_IC_FILTER_EVENTS) attr->filter_events = pattr->filter_events; if (known & GDK_IC_LINE_SPACING) attr->line_spacing = pattr->line_spacing; if (known & GDK_IC_CURSOR) attr->cursor = pattr->cursor; if (known & GDK_IC_PREEDIT_FONTSET) attr->preedit_fontset = pattr->preedit_fontset; if (known & GDK_IC_PREEDIT_AREA) attr->preedit_area = pattr->preedit_area; if (known & GDK_IC_PREEDIT_AREA_NEEDED) attr->preedit_area_needed = pattr->preedit_area_needed; if (known & GDK_IC_PREEDIT_FOREGROUND) attr->preedit_foreground = pattr->preedit_foreground; if (known & GDK_IC_PREEDIT_BACKGROUND) attr->preedit_background = pattr->preedit_background; if (known & GDK_IC_PREEDIT_PIXMAP) attr->preedit_pixmap = pattr->preedit_pixmap; if (known & GDK_IC_PREEDIT_COLORMAP) attr->preedit_colormap = pattr->preedit_colormap; if (known & GDK_IC_STATUS_FONTSET) attr->status_fontset = pattr->status_fontset; if (known & GDK_IC_STATUS_AREA) attr->status_area = pattr->status_area; if (known & GDK_IC_STATUS_AREA_NEEDED) attr->status_area_needed = pattr->status_area_needed; if (known & GDK_IC_STATUS_FOREGROUND) attr->status_foreground = pattr->status_foreground; if (known & GDK_IC_STATUS_BACKGROUND) attr->status_background = pattr->status_background; if (known & GDK_IC_STATUS_PIXMAP) attr->status_pixmap = pattr->status_pixmap; if (known & GDK_IC_STATUS_COLORMAP) attr->status_colormap = pattr->status_colormap; if (private->xic) { unknown = mask & ~(private->mask); if (unknown & GDK_IC_FOCUS_WINDOW) attr->focus_window = pattr->client_window; if (unknown & GDK_IC_FILTER_EVENTS) { gdk_ic_get_events (ic); attr->filter_events = pattr->filter_events; } if (mask & GDK_IC_SPOT_LOCATION) { XPoint point; XVaNestedList *list; list = XVaCreateNestedList (0, XNSpotLocation, &point, NULL); if (XGetICValues (private->xic, XNPreeditAttributes, list, NULL)) unknown &= ~GDK_IC_SPOT_LOCATION; else { pattr->spot_location.x = point.x; pattr->spot_location.y = point.y; private->mask |= GDK_IC_SPOT_LOCATION; attr->spot_location = pattr->spot_location; } XFree (list); } if (unknown & GDK_IC_PREEDIT_AREA_NEEDED) { XRectangle rect; XVaNestedList *list; list = XVaCreateNestedList (0, XNAreaNeeded, &rect, NULL); if (XGetICValues (private->xic, XNPreeditAttributes, list, NULL)) unknown &= ~GDK_IC_PREEDIT_AREA_NEEDED; else { pattr->preedit_area_needed.x = rect.x; pattr->preedit_area_needed.y = rect.y; pattr->preedit_area_needed.width = rect.width; pattr->preedit_area_needed.height = rect.height; private->mask |= GDK_IC_PREEDIT_AREA_NEEDED; attr->preedit_area = pattr->preedit_area; } XFree (list); } if (unknown & GDK_IC_STATUS_AREA_NEEDED) { XRectangle rect; XVaNestedList *list; list = XVaCreateNestedList (0, XNAreaNeeded, &rect, NULL); if (XGetICValues (private->xic, XNStatusAttributes, list, NULL)) unknown &= ~GDK_IC_STATUS_AREA_NEEDED; else { pattr->status_area_needed.x = rect.x; pattr->status_area_needed.y = rect.y; pattr->status_area_needed.width = rect.width; pattr->status_area_needed.height = rect.height; private->mask |= GDK_IC_STATUS_AREA_NEEDED; attr->status_area = pattr->status_area; } XFree (list); } } return mask & ~known & ~unknown;}GdkEventMask gdk_ic_get_events (GdkIC *ic){ GdkEventMask mask; glong xmask; glong bit; GdkICPrivate *private; gint i; /* From gdkwindow.c */ g_return_val_if_fail (ic != NULL, 0); private = (GdkICPrivate *) ic; if (private->mask & GDK_IC_FILTER_EVENTS) return private->attr->filter_events; if (XGetICValues (private->xic, XNFilterEvents, &xmask, NULL) != NULL) { GDK_NOTE (XIM, g_warning ("Call to XGetICValues: %s failed", XNFilterEvents)); return 0; } mask = 0; for (i=0, bit=2; i < gdk_nevent_masks; i++, bit <<= 1) if (xmask & gdk_event_mask_table [i]) { mask |= bit; xmask &= ~ gdk_event_mask_table [i]; } if (xmask) g_warning ("ic requires events not supported by the application (%#04lx)", xmask); private->attr->filter_events = mask; private->mask |= GDK_IC_FILTER_EVENTS; return mask;}void gdk_ic_cleanup (void){ gint destroyed; destroyed = 0; while (xim_ic_list != NULL) { gdk_ic_destroy ((GdkIC *) xim_ic_list->data); destroyed ++; }#ifdef G_ENABLE_DEBUG if ((gdk_debug_flags & GDK_DEBUG_XIM) && destroyed > 0) { g_warning ("Cleaned up %i IC(s)\n", destroyed); }#endif /* G_ENABLE_DEBUG */}#else /* !USE_XIM */void gdk_im_begin (GdkIC *ic, GdkWindow* window){}void gdk_im_end (void){}GdkIMStylegdk_im_decide_style (GdkIMStyle supported_style){ return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;}GdkIMStylegdk_im_set_best_style (GdkIMStyle style){ return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;}gint gdk_im_ready (void){ return FALSE;}GdkIC * gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask){ return NULL;}void gdk_ic_destroy (GdkIC *ic){}GdkIMStylegdk_ic_get_style (GdkIC *ic){ return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;}void gdk_ic_set_values (GdkIC *ic, ...){}void gdk_ic_get_values (GdkIC *ic, ...){}GdkICAttributesType gdk_ic_set_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask){ return 0;}GdkICAttributesType gdk_ic_get_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask){ return 0;}GdkEventMask gdk_ic_get_events (GdkIC *ic){ return 0;}#endif /* USE_XIM *//* * gdk_wcstombs * * Returns a multi-byte string converted from the specified array * of wide characters. The string is newly allocated. The array of * wide characters must be null-terminated. If the conversion is * failed, it returns NULL. */gchar *gdk_wcstombs (const GdkWChar *src){ gchar *mbstr; if (gdk_use_mb) { XTextProperty tpr; if (sizeof(wchar_t) != sizeof(GdkWChar)) { gint i; wchar_t *src_alt; for (i=0; src[i]; i++); src_alt = g_new (wchar_t, i+1); for (; i>=0; i--) src_alt[i] = src[i]; if (XwcTextListToTextProperty (gdk_display, &src_alt, 1, XTextStyle, &tpr) != Success) { g_free (src_alt); return NULL; } g_free (src_alt); } else { if (XwcTextListToTextProperty (gdk_display, (wchar_t**)&src, 1, XTextStyle, &tpr) != Success) { return NULL; } } /* * We must copy the string into an area allocated by glib, because * the string 'tpr.value' must be freed by XFree(). */ mbstr = g_strdup(tpr.value); XFree (tpr.value); } else { gint length = 0; gint i; while (src[length] != 0) length++; mbstr = g_new (gchar, length + 1); for (i=0; i<length+1; i++) mbstr[i] = src[i]; } return mbstr;} /* * gdk_mbstowcs * * Converts the specified string into wide characters, and, returns the * number of wide characters written. The string 'src' must be * null-terminated. If the conversion is failed, it returns -1. */gintgdk_mbstowcs (GdkWChar *dest, const gchar *src, gint dest_max){ if (gdk_use_mb) { XTextProperty tpr; wchar_t **wstrs, *wstr_src; gint num_wstrs; gint len_cpy; if (XmbTextListToTextProperty (gdk_display, (char **)&src, 1, XTextStyle, &tpr) != Success) { /* NoMem or LocaleNotSupp */ return -1; } if (XwcTextPropertyToTextList (gdk_display, &tpr, &wstrs, &num_wstrs) != Success) { /* InvalidChar */ XFree(tpr.value); return -1; } XFree(tpr.value); if (num_wstrs == 0) return 0; wstr_src = wstrs[0]; for (len_cpy=0; len_cpy<dest_max && wstr_src[len_cpy]; len_cpy++) dest[len_cpy] = wstr_src[len_cpy]; XwcFreeStringList (wstrs); return len_cpy; } else { gint i; for (i=0; i<dest_max && src[i]; i++) dest[i] = src[i]; return i; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -