📄 gdkim.c
字号:
XNPreeditAttributes, preedit_attr, XNStatusAttributes, status_attr, NULL); else if (preedit_attr != NULL) private->xic = XCreateIC (xim_im, XNInputStyle, attr->style, XNClientWindow, GDK_WINDOW_XWINDOW(attr->client_window), XNPreeditAttributes, preedit_attr, NULL); else if (status_attr != NULL) private->xic = XCreateIC (xim_im, XNInputStyle, attr->style, XNClientWindow, GDK_WINDOW_XWINDOW(attr->client_window), XNStatusAttributes, status_attr, NULL); else private->xic = XCreateIC (xim_im, XNInputStyle, attr->style, XNClientWindow, GDK_WINDOW_XWINDOW(attr->client_window), NULL); if (preedit_attr) XFree (preedit_attr); if (status_attr) XFree (status_attr); if (private->xic == NULL) g_warning ("can not create input context with specified input style."); else gdk_ic_real_set_attr (ic, private->attr, private->mask & ~mask);}GdkIC *gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask){ GdkICPrivate *private; gboolean error = 0; GdkICAttributesType invalid_mask; GdkICAttr *pattr; g_return_val_if_fail (attr != NULL, NULL); g_return_val_if_fail ((mask & GDK_IC_ALL_REQ) == GDK_IC_ALL_REQ, NULL); switch (attr->style & GDK_IM_PREEDIT_MASK) { case 0: g_warning ("preedit style is not specified.\n"); error = 1; break; case GDK_IM_PREEDIT_AREA: if ((mask & GDK_IC_PREEDIT_AREA_REQ) != GDK_IC_PREEDIT_AREA_REQ) error = 4; break; case GDK_IM_PREEDIT_POSITION: if ((mask & GDK_IC_PREEDIT_POSITION_REQ) != GDK_IC_PREEDIT_POSITION_REQ) error = 4; break; } switch (attr->style & GDK_IM_STATUS_MASK) { case 0: g_warning ("status style is not specified.\n"); error = 2; break; case GDK_IM_STATUS_AREA: if ((mask & GDK_IC_STATUS_AREA_REQ) != GDK_IC_STATUS_AREA_REQ) error = 8; break; } if (error) { if (error & 12) g_warning ("IC attribute is not enough to required input style.\n"); return NULL; } if (attr->client_window == NULL || ((GdkWindowPrivate *)attr->client_window)->destroyed) { g_warning ("Client_window is null or already destroyed.\n"); return NULL; } private = g_new0 (GdkICPrivate, 1); private->attr = pattr = gdk_ic_attr_new (); gdk_window_ref (attr->client_window); pattr->client_window = attr->client_window; pattr->style = attr->style; private->mask = GDK_IC_STYLE | GDK_IC_CLIENT_WINDOW; /* XIC is still not created, so following call only copies attributes */ invalid_mask = gdk_ic_set_attr ((GdkIC *)private, attr, mask & ~GDK_IC_ALL_REQ); switch (attr->style & GDK_IM_PREEDIT_MASK) { case GDK_IM_PREEDIT_AREA: if (invalid_mask & GDK_IC_PREEDIT_AREA_REQ) error = TRUE; break; case GDK_IM_PREEDIT_POSITION: if (invalid_mask & GDK_IC_PREEDIT_POSITION_REQ) error = TRUE; break; } switch (attr->style & GDK_IM_STATUS_MASK) { case GDK_IM_STATUS_AREA: if (invalid_mask & GDK_IC_STATUS_AREA_REQ) error = TRUE; break; } if (error == TRUE) { g_warning ("Essential attributes for required style are invalid.\n"); gdk_ic_destroy ((GdkIC *)private); return NULL; } if (gdk_im_ready ()) gdk_ic_real_new ((GdkIC *)private); xim_ic_list = g_list_append (xim_ic_list, private); return (GdkIC *)private;}void gdk_ic_destroy (GdkIC *ic){ GdkICPrivate *private; g_return_if_fail (ic != NULL); private = (GdkICPrivate *) ic; if (gdk_xim_ic == private) gdk_im_end (); GDK_NOTE (XIM, g_message ("ic_destroy %p\n", private->xic)); if (private->xic != NULL) XDestroyIC (private->xic); if (private->mask & GDK_IC_CLIENT_WINDOW) gdk_window_unref (private->attr->client_window); if (private->mask & GDK_IC_FOCUS_WINDOW) gdk_window_unref (private->attr->focus_window); if (private->mask & GDK_IC_PREEDIT_FONTSET) gdk_font_unref (private->attr->preedit_fontset); if (private->mask & GDK_IC_PREEDIT_PIXMAP) gdk_pixmap_unref (private->attr->preedit_pixmap); if (private->mask & GDK_IC_PREEDIT_COLORMAP) gdk_colormap_unref (private->attr->preedit_colormap); if (private->mask & GDK_IC_STATUS_FONTSET) gdk_font_unref (private->attr->status_fontset); if (private->mask & GDK_IC_STATUS_PIXMAP) gdk_pixmap_unref (private->attr->status_pixmap); if (private->mask & GDK_IC_STATUS_COLORMAP) gdk_colormap_unref (private->attr->status_colormap); xim_ic_list = g_list_remove (xim_ic_list, private); gdk_ic_attr_destroy (private->attr); g_free (private);}GdkIMStylegdk_ic_get_style (GdkIC *ic){ GdkICPrivate *private; g_return_val_if_fail (ic != NULL, 0); private = (GdkICPrivate *) ic; return private->attr->style;}/* * for keeping binary compatibility if member of ic attributes is added. */GdkICAttr *gdk_ic_attr_new (void){ return g_new0 (GdkICAttr, 1);}voidgdk_ic_attr_destroy (GdkICAttr *attr){ g_return_if_fail (attr != NULL); g_free (attr);}static GdkICAttributesTypegdk_ic_real_set_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask){ GdkICPrivate *private = (GdkICPrivate *)ic; XIC xic = private->xic; GdkICAttributesType error = 0; GdkImArg arg[2] = {{NULL, NULL}, {NULL, NULL}}; if (mask & GDK_IC_FOCUS_WINDOW) { if (XSetICValues (xic, XNFocusWindow, GDK_WINDOW_XWINDOW(attr->focus_window), NULL) != NULL) error |= GDK_IC_FOCUS_WINDOW; } if (mask & GDK_IC_SPOT_LOCATION) { XPoint point; point.x = attr->spot_location.x; point.y = attr->spot_location.y; arg->name = XNSpotLocation; arg->value = (gpointer) &point; if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_SPOT_LOCATION; } if (mask & GDK_IC_LINE_SPACING) { arg->name = XNLineSpace; arg->value = GINT_TO_POINTER( attr->line_spacing ); if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_LINE_SPACING; } if (mask & GDK_IC_CURSOR) { GdkCursorPrivate *cursor = (GdkCursorPrivate *) attr->cursor; if (XSetICValues (xic, XNCursor, cursor->xcursor, NULL)) error |= GDK_IC_CURSOR; } if (mask & GDK_IC_PREEDIT_FONTSET) { arg->name = XNFontSet; arg->value = (gpointer) GDK_FONT_XFONT(attr->preedit_fontset); if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_FONTSET; } if (mask & GDK_IC_PREEDIT_AREA) { XRectangle rect; rect.x = attr->preedit_area.x; rect.y = attr->preedit_area.y; rect.width = attr->preedit_area.width; rect.height = attr->preedit_area.height; arg->name = XNArea; arg->value = (gpointer) ▭ if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_AREA; } if (mask & GDK_IC_PREEDIT_AREA_NEEDED) { XRectangle rect; rect.x = attr->preedit_area_needed.x; rect.y = attr->preedit_area_needed.y; rect.width = attr->preedit_area_needed.width; rect.height = attr->preedit_area_needed.height; arg->name = XNArea; arg->value = (gpointer) ▭ if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_AREA_NEEDED; else private->mask &= ~GDK_IC_PREEDIT_AREA_NEEDED; } if (mask & GDK_IC_PREEDIT_FOREGROUND) { arg->name = XNForeground; arg->value = (gpointer) attr->preedit_foreground.pixel; if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_FOREGROUND; } if (mask & GDK_IC_PREEDIT_BACKGROUND) { arg->name = XNBackground; arg->value = (gpointer) attr->preedit_background.pixel; if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_BACKGROUND; } if (mask & GDK_IC_PREEDIT_PIXMAP) { arg->name = XNBackgroundPixmap; arg->value = (gpointer) GDK_WINDOW_XWINDOW(attr->preedit_pixmap); if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_PIXMAP; } if (mask & GDK_IC_PREEDIT_COLORMAP) { arg->name = XNColormap; arg->value = (gpointer) GDK_COLORMAP_XCOLORMAP(attr->preedit_colormap); if (XSetICValues (xic, XNPreeditAttributes, arg, NULL)) error |= GDK_IC_PREEDIT_COLORMAP; } if (mask & GDK_IC_STATUS_FONTSET) { arg->name = XNFontSet; arg->value = (gpointer) GDK_FONT_XFONT(attr->status_fontset); if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_FONTSET; } if (mask & GDK_IC_STATUS_AREA) { XRectangle rect; rect.x = attr->status_area.x; rect.y = attr->status_area.y; rect.width = attr->status_area.width; rect.height = attr->status_area.height; arg->name = XNArea; arg->value = (gpointer) ▭ if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_AREA; } if (mask & GDK_IC_STATUS_AREA_NEEDED) { XRectangle rect; rect.x = attr->status_area_needed.x; rect.y = attr->status_area_needed.y; rect.width = attr->status_area_needed.width; rect.height = attr->status_area_needed.height; arg->name = XNArea; arg->value = (gpointer) ▭ if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_AREA_NEEDED; else private->mask &= ~GDK_IC_STATUS_AREA_NEEDED; } if (mask & GDK_IC_STATUS_FOREGROUND) { arg->name = XNForeground; arg->value = (gpointer) attr->status_foreground.pixel; if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_FOREGROUND; } if (mask & GDK_IC_STATUS_BACKGROUND) { arg->name = XNBackground; arg->value = (gpointer) attr->status_background.pixel; if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_BACKGROUND; } if (mask & GDK_IC_STATUS_PIXMAP) { arg->name = XNBackgroundPixmap; arg->value = (gpointer) GDK_WINDOW_XWINDOW(attr->status_pixmap); if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_PIXMAP; } if (mask & GDK_IC_STATUS_COLORMAP) { arg->name = XNColormap; arg->value = (gpointer) GDK_COLORMAP_XCOLORMAP(attr->status_colormap); if (XSetICValues (xic, XNStatusAttributes, arg, NULL)) error |= GDK_IC_STATUS_COLORMAP; } return error;}GdkICAttributesTypegdk_ic_set_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask){ GdkICPrivate *private; GdkICAttr *pattr; GdkICAttributesType error = 0; GdkICAttributesType newattr = 0; g_return_val_if_fail (ic != NULL, 0); g_return_val_if_fail (attr != NULL, 0); private = (GdkICPrivate *) ic; pattr = private->attr; /* Check and copy new attributes */ if (mask & GDK_IC_STYLE) { g_warning ("input style can be specified only when creating new ic.\n"); error |= GDK_IC_STYLE; } if (mask & GDK_IC_FILTER_EVENTS) { g_warning ("filter events is read only attributes.\n"); error |= GDK_IC_FILTER_EVENTS; } if (mask & GDK_IC_CLIENT_WINDOW) { g_warning ("client window can be specified only when creating new ic.\n"); error |= GDK_IC_CLIENT_WINDOW; } if (mask & GDK_IC_FOCUS_WINDOW) { if (attr->focus_window == NULL) { g_warning ("specified focus_window is invalid.\n"); error |= GDK_IC_FOCUS_WINDOW; } else if (pattr->focus_window != attr->focus_window) { if (pattr->focus_window != NULL) gdk_window_unref (pattr->focus_window); if (attr->focus_window != NULL) gdk_window_ref (attr->focus_window); pattr->focus_window = attr->focus_window; newattr |= GDK_IC_FOCUS_WINDOW; } } if (mask & GDK_IC_SPOT_LOCATION) { pattr->spot_location = attr->spot_location; newattr |= GDK_IC_SPOT_LOCATION; } if (mask & GDK_IC_LINE_SPACING) { pattr->line_spacing = attr->line_spacing; newattr |= GDK_IC_LINE_SPACING; } if (mask & GDK_IC_CURSOR) { pattr->cursor = attr->cursor; newattr |= GDK_IC_CURSOR; } if (mask & GDK_IC_PREEDIT_FONTSET) { if (attr->preedit_fontset == NULL || attr->preedit_fontset->type != GDK_FONT_FONTSET) { g_warning ("gdk_font is NULL or not a fontset.\n"); error |= GDK_IC_PREEDIT_FONTSET; } else if (pattr->preedit_fontset != attr->preedit_fontset) { if (pattr->preedit_fontset != NULL) gdk_font_unref (pattr->preedit_fontset); if (attr->preedit_fontset != NULL) gdk_font_ref (attr->preedit_fontset); pattr->preedit_fontset = attr->preedit_fontset; newattr |= GDK_IC_PREEDIT_FONTSET; } } if (mask & GDK_IC_PREEDIT_AREA) { pattr->preedit_area = attr->preedit_area; newattr |= GDK_IC_PREEDIT_AREA; } if (mask & GDK_IC_PREEDIT_AREA_NEEDED) { if (attr->preedit_area_needed.width == 0 || attr->preedit_area_needed.height == 0) { g_warning ("width and height of preedit_area_needed must be non 0.\n"); error |= GDK_IC_PREEDIT_AREA_NEEDED; } else { pattr->preedit_area_needed = attr->preedit_area_needed;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -