/* * 显示菜单上面的文字信息,只需要指定窗口,窗口宽度,需要显示文字的上边界,字体,显示的字符串和是否选择(选择后反色) * 其他都固定,如背景和文字反色不反色的颜色,反色框和字的位置等 */ void DisplayText(XlibMenu * menu, int shellindex, int line_y, int fontHeight) { FcitxSkin *sc = &menu->owner->skin; int marginLeft = sc->skinMenu.marginLeft; int marginRight = sc->skinMenu.marginRight; cairo_t * cr; cr = cairo_create(menu->menu_cs); int dpi = sc->skinFont.respectDPI? menu->owner->dpi: 0; FCITX_UNUSED(dpi); SetFontContext(cr, menu->owner->menuFont, sc->skinFont.menuFontSize, dpi); if (GetMenuItem(menu->menushell, shellindex)->isselect == 0) { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_INACTIVE]); OutputStringWithContext(cr, dpi, GetMenuItem(menu->menushell, shellindex)->tipstr, 15 + marginLeft , line_y); } else { cairo_set_operator(cr, CAIRO_OPERATOR_OVER); fcitx_cairo_set_color(cr, &sc->skinMenu.activeColor); cairo_rectangle(cr, marginLeft , line_y, menu->width - marginRight - marginLeft, fontHeight + 4); cairo_fill(cr); fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_ACTIVE]); OutputStringWithContext(cr, dpi, GetMenuItem(menu->menushell, shellindex)->tipstr , 15 + marginLeft , line_y); } ResetFontContext(); cairo_destroy(cr); }
void XlibMenuPaintMark(XlibMenu * menu, cairo_t* cr, int y, int i) { FcitxXlibWindow* window = (FcitxXlibWindow*) menu; FcitxSkin* sc = &window->owner->skin; double size = (sc->skinFont.menuFontSize * 0.7) / 2; cairo_save(cr); if (GetMenuItem(menu->menushell, i)->isselect == 0) { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_INACTIVE]); } else { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_ACTIVE]); } cairo_translate(cr, 7, y + (sc->skinFont.menuFontSize / 2.0)); cairo_arc(cr, 0, 0, size , 0., 2 * M_PI); cairo_fill(cr); cairo_restore(cr); }
void MenuMark(XlibMenu * menu, int y, int i) { FcitxSkin *sc = &menu->owner->skin; int marginLeft = sc->skinMenu.marginLeft; double size = (sc->skinFont.menuFontSize * 0.7) / 2; cairo_t *cr; cr = cairo_create(menu->menu_cs); if (GetMenuItem(menu->menushell, i)->isselect == 0) { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_INACTIVE]); } else { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_ACTIVE]); } cairo_translate(cr, marginLeft + 7, y + (sc->skinFont.menuFontSize / 2.0)); cairo_arc(cr, 0, 0, size , 0., 2 * M_PI); cairo_fill(cr); cairo_destroy(cr); }
/** *输入条的绘制非常注重效率,画笔在绘图过程中不释放 */ void LoadInputMessage(FcitxSkin* sc, InputWindow* inputWindow, const char* font) { int i = 0; FcitxConfigColor cursorColor = sc->skinInputBar.cursorColor; if (inputWindow->c_back) { cairo_destroy(inputWindow->c_back); inputWindow->c_back = NULL; } for (i = 0; i < 7 ; i ++) { if (inputWindow->c_font[i]) { cairo_destroy(inputWindow->c_font[i]); inputWindow->c_font[i] = NULL; } } inputWindow->c_font[7] = NULL; if (inputWindow->c_cursor) { cairo_destroy(inputWindow->c_cursor); inputWindow->c_cursor = NULL; } //输入条背景图画笔 inputWindow->c_back = cairo_create(inputWindow->cs_input_bar); for (i = 0; i < 7 ; i ++) { inputWindow->c_font[i] = cairo_create(inputWindow->cs_input_bar); fcitx_cairo_set_color(inputWindow->c_font[i], &sc->skinFont.fontColor[i]); #ifndef _ENABLE_PANGO SetFontContext(inputWindow->c_font[i], font, inputWindow->owner->fontSize > 0 ? inputWindow->owner->fontSize : sc->skinFont.fontSize, dpi); #endif } inputWindow->c_font[7] = inputWindow->c_font[0]; //光标画笔 inputWindow->c_cursor = cairo_create(inputWindow->cs_input_bar); fcitx_cairo_set_color(inputWindow->c_cursor, &cursorColor); cairo_set_line_width(inputWindow->c_cursor, 1); }
void XlibMenuPaintArrow(XlibMenu* menu, cairo_t* cr, int line_y, int i) { FcitxXlibWindow* window = (FcitxXlibWindow*) menu; FcitxClassicUI* classicui = window->owner; FcitxSkin *sc = &classicui->skin; double size = sc->skinFont.menuFontSize * 0.4; double offset = (sc->skinFont.menuFontSize - size) / 2; cairo_save(cr); if (GetMenuItem(menu->menushell, i)->isselect == 0) { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_INACTIVE]); } else { fcitx_cairo_set_color(cr, &sc->skinFont.menuFontColor[MENU_ACTIVE]); } cairo_move_to(cr, window->contentWidth - 1 - size, line_y + offset); cairo_line_to(cr, window->contentWidth - 1 - size, line_y + size * 2 + offset); cairo_line_to(cr, window->contentWidth - 1, line_y + size + offset); cairo_line_to(cr, window->contentWidth - 1 - size , line_y + offset); cairo_fill(cr); cairo_restore(cr); }
void XlibMenunPaintDivLine(XlibMenu * menu, cairo_t* cr, int line_y) { FcitxXlibWindow* window = (FcitxXlibWindow*) menu; FcitxClassicUI* classicui = window->owner; FcitxSkin *sc = &classicui->skin; cairo_save(cr); fcitx_cairo_set_color(cr, &sc->skinMenu.lineColor); cairo_set_line_width(cr, 1); cairo_move_to(cr, 3, line_y + 2.5); cairo_line_to(cr, window->contentWidth - 3, line_y + 2.5); cairo_stroke(cr); cairo_restore(cr); }
void DrawDivLine(XlibMenu * menu, int line_y) { FcitxSkin *sc = &menu->owner->skin; int marginLeft = sc->skinMenu.marginLeft; int marginRight = sc->skinMenu.marginRight; cairo_t * cr; cr = cairo_create(menu->menu_cs); fcitx_cairo_set_color(cr, &sc->skinMenu.lineColor); cairo_set_line_width(cr, 2); cairo_move_to(cr, marginLeft + 3, line_y + 3); cairo_line_to(cr, menu->width - marginRight - 3, line_y + 3); cairo_stroke(cr); cairo_destroy(cr); }
/* * 显示菜单上面的文字信息,只需要指定窗口,窗口宽度,需要显示文字的上边界,字体,显示的字符串和是否选择(选择后反色) * 其他都固定,如背景和文字反色不反色的颜色,反色框和字的位置等 */ void XlibMenuPaintText(XlibMenu * menu, cairo_t* c, FcitxCairoTextContext* ctc, int shellindex, int line_y, int fontHeight) { FcitxXlibWindow* window = (FcitxXlibWindow*) menu; FcitxClassicUI* classicui = window->owner; FcitxSkin *sc = &classicui->skin; cairo_save(c); if (GetMenuItem(menu->menushell, shellindex)->isselect == 0) { FcitxCairoTextContextOutputString(ctc, GetMenuItem(menu->menushell, shellindex)->tipstr, 15 , line_y, &sc->skinFont.menuFontColor[MENU_INACTIVE]); } else { cairo_set_operator(c, CAIRO_OPERATOR_OVER); fcitx_cairo_set_color(c, &sc->skinMenu.activeColor); cairo_rectangle(c, 0 , line_y, window->contentWidth, fontHeight + 4); cairo_fill(c); FcitxCairoTextContextOutputString(ctc, GetMenuItem(menu->menushell, shellindex)->tipstr, 15 , line_y, &sc->skinFont.menuFontColor[MENU_ACTIVE]); } cairo_restore(c); }
void InputWindowPaint(FcitxXlibWindow* window, cairo_t* c) { InputWindow* inputWindow = (InputWindow*) window; FcitxClassicUI* classicui = window->owner; FcitxInstance* instance = classicui->owner; FcitxInputState* input = FcitxInstanceGetInputState(instance); FcitxCandidateWordList* candList = FcitxInputStateGetCandidateList(input); FcitxSkin* sc = &window->owner->skin; FcitxMessages* msgup = inputWindow->msgUp; FcitxMessages* msgdown = inputWindow->msgDown; char **strUp = inputWindow->strUp; char **strDown = inputWindow->strDown; int *posUpX = inputWindow->posUpX, *posUpY = inputWindow->posUpY; int *posDownX = inputWindow->posDownX, *posDownY = inputWindow->posDownY; cairo_save(c); cairo_set_operator(c, CAIRO_OPERATOR_OVER); SkinImage* prev = LoadImage(sc, sc->skinInputBar.backArrow, false); SkinImage* next = LoadImage(sc, sc->skinInputBar.forwardArrow, false); inputWindow->prevRect.x1 = inputWindow->prevRect.y1 = inputWindow->prevRect.x2 = inputWindow->prevRect.y2 = 0; inputWindow->nextRect.x1 = inputWindow->nextRect.y1 = inputWindow->nextRect.x2 = inputWindow->nextRect.y2 = 0; if (FcitxCandidateWordHasPrev(candList) || FcitxCandidateWordHasNext(candList) ) { if (prev && next) { int x, y; x = window->contentWidth - sc->skinInputBar.iBackArrowX + window->background->marginRight - window->background->marginLeft; y = sc->skinInputBar.iBackArrowY - window->background->marginTop; cairo_set_source_surface(c, prev->image, x, y); if (FcitxCandidateWordHasPrev(candList)) { inputWindow->prevRect.x1 = x; inputWindow->prevRect.y1 = y; inputWindow->prevRect.x2 = x + cairo_image_surface_get_width(prev->image); inputWindow->prevRect.y2 = y + cairo_image_surface_get_height(prev->image); if (inputWindow->highlight == PREVNEXT_HIGHLIGHT(true)) { cairo_paint_with_alpha(c, 0.7); } else { cairo_paint(c); } } else { cairo_paint_with_alpha(c, 0.3); } x = window->contentWidth - sc->skinInputBar.iForwardArrowX + window->background->marginRight - window->background->marginLeft; y = sc->skinInputBar.iForwardArrowY - window->background->marginTop; cairo_set_source_surface(c, next->image, x, y); if (FcitxCandidateWordHasNext(candList)) { inputWindow->nextRect.x1 = x; inputWindow->nextRect.y1 = y; inputWindow->nextRect.x2 = x + cairo_image_surface_get_width(prev->image); inputWindow->nextRect.y2 = y + cairo_image_surface_get_height(prev->image); if (inputWindow->highlight == PREVNEXT_HIGHLIGHT(false)) { cairo_paint_with_alpha(c, 0.7); } else { cairo_paint(c); } } else { cairo_paint_with_alpha(c, 0.3); } } } cairo_restore(c); cairo_save(c); /* draw text */ FcitxCairoTextContext* ctc = FcitxCairoTextContextCreate(c); int dpi = sc->skinFont.respectDPI? classicui->dpi : 0; FcitxCairoTextContextSet(ctc, window->owner->font, window->owner->fontSize > 0 ? window->owner->fontSize : sc->skinFont.fontSize, dpi); int i; for (i = 0; i < FcitxMessagesGetMessageCount(msgup) ; i++) { FcitxCairoTextContextOutputString(ctc, strUp[i], posUpX[i], posUpY[i], &sc->skinFont.fontColor[FcitxMessagesGetMessageType(msgup, i) % 7]); if (strUp[i] != FcitxMessagesGetMessageString(msgup, i)) free(strUp[i]); } int candidateIndex = -1; for (i = 0; i < FcitxMessagesGetMessageCount(msgdown) ; i++) { if (FcitxMessagesGetMessageType(msgdown, i) == MSG_INDEX) { candidateIndex ++; } FcitxConfigColor color = sc->skinFont.fontColor[FcitxMessagesGetMessageType(msgdown, i) % 7]; double alpha = 1.0; if (CANDIDATE_HIGHLIGHT(candidateIndex) == inputWindow->highlight) { /* cal highlight color */ color.r = (color.r + 0.5) / 2; color.g = (color.g + 0.5) / 2; color.b = (color.b + 0.5) / 2; alpha = 0.8; } cairo_set_source_rgba(c, color.r, color.g, color.b, alpha); FcitxCairoTextContextOutputString(ctc, strDown[i], posDownX[i], posDownY[i], NULL); if (strDown[i] != FcitxMessagesGetMessageString(msgdown, i)) free(strDown[i]); } FcitxCairoTextContextFree(ctc); cairo_restore(c); // draw cursor if (FcitxMessagesGetMessageCount(msgup) && FcitxInputStateGetShowCursor(input)) { cairo_save(c); int cursorY1, cursorY2; if (sc->skinFont.respectDPI) { cursorY1 = sc->skinInputBar.iInputPos; cursorY2 = sc->skinInputBar.iInputPos + inputWindow->fontHeight; } else { cursorY1 = sc->skinInputBar.iInputPos - inputWindow->fontHeight; cursorY2 = sc->skinInputBar.iInputPos; } fcitx_cairo_set_color(c, &sc->skinInputBar.cursorColor); cairo_set_line_width(c, 1); cairo_move_to(c, inputWindow->pixelCursorPos + 0.5, cursorY1); cairo_line_to(c, inputWindow->pixelCursorPos + 0.5, cursorY2); cairo_stroke(c); cairo_restore(c); } FcitxMessagesSetMessageChanged(msgup, false); FcitxMessagesSetMessageChanged(msgdown, false); }