亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? keywidget.c

?? Linux環境下手寫輸入程序。手寫輸入
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*cellwriter -- a character recognition input methodCopyright (C) 2007 Michael Levin <risujin@risujin.org>This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*/#include "config.h"#include "common.h"#include "recognize.h"#include "keys.h"#include <string.h>#include <X11/X.h>#include <X11/Xlib.h>#include <X11/keysym.h>#include <X11/extensions/XTest.h>#include <gdk/gdkx.h>/*        Keys*/GdkColor custom_key_color = RGB_TO_GDKCOLOR(103, 107, 120);static GdkColor color_text, color_bg, color_keys_dark, color_keys,                color_keys_on;static void key_coord(KeyWidget *key_widget, int x, int y,                      int *x_out, int *y_out){        *x_out = (x * key_widget->width + key_widget->x_range / 2) /                 key_widget->x_range + key_widget->x;        *y_out = (y * key_widget->height + key_widget->y_range / 2) /                 key_widget->y_range + key_widget->y;}static void key_coords(KeyWidget *key_widget, Key *key, int *x, int *y,                       int *width, int *height){        int x2, y2;        key_coord(key_widget, key->x, key->y, x, y);        key_coord(key_widget, key->x + key->width, key->y + key->height,                  &x2, &y2);        *width = x2 - *x;        *height = y2 - *y;}static void render_icon(cairo_t *cairo, double x, double y, double size,                        int icon, int rotate, GdkColor *color){        cairo_save(cairo);        cairo_new_path(cairo);        cairo_translate(cairo, x + size / 2., y + size / 2.);        cairo_scale(cairo, size, size);        cairo_rotate(cairo, rotate * M_PI / -180);        cairo_set_source_gdk_color(cairo, color, 1.);        cairo_set_line_width(cairo, 1 / size);        switch (icon) {        default:                cairo_identity_matrix(cairo);                return;        case KEY_ARROW:                cairo_move_to(cairo,  0.50,  0.00);                cairo_line_to(cairo,  0.00, -0.50);                cairo_line_to(cairo,  0.00, -0.15);                cairo_line_to(cairo, -0.50, -0.15);                cairo_line_to(cairo, -0.50,  0.15);                cairo_line_to(cairo,  0.00,  0.15);                cairo_line_to(cairo,  0.00,  0.50);                cairo_line_to(cairo,  0.50,  0.00);                cairo_fill(cairo);                break;        case KEY_TOGGLE_ON:                cairo_rectangle(cairo, -0.25, -0.15, 0.5, 0.5);                cairo_fill(cairo);                break;        case KEY_TOGGLE_OFF:                cairo_rectangle(cairo, -0.25, -0.15, 0.5, 0.5);                cairo_stroke(cairo);                break;        }        cairo_restore(cairo);}static int is_shifted(const Key *key)/* Determine if the key is in a shifted state */{        int shifted = key_shifted;        if (!(key->flags & KEY_SHIFTABLE))                return FALSE;        if (g_ascii_isalpha(key->string[0]) && key_caps_locked)                shifted = !shifted;        if (key->flags & KEY_NUM_LOCKABLE && !key_num_locked)                shifted = !shifted;        return shifted;}static void render_key(KeyWidget *key_widget, int n, int dirty){        Key *key;        PangoLayout *layout;        PangoRectangle ink_ext, log_ext;        cairo_pattern_t *pattern;        double icon_size;        int x, y, w, h;        key = key_widget->keys + n;        if (key->width < 1 || key->height < 1)                return;        key_coords(key_widget, key, &x, &y, &w, &h);        /* Cairo clip region */        cairo_reset_clip(key_widget->cairo);        cairo_rectangle(key_widget->cairo, x, y, w, h);        cairo_clip(key_widget->cairo);        /* Render background */        if (!key->active &&            (((key->flags & KEY_CAPS_LOCK) && key_caps_locked) ||             ((key->flags & KEY_NUM_LOCK) && key_num_locked))) {                GdkColor new_bg;                new_bg.red = (color_keys_on.red + color_keys.red) / 2;                new_bg.green = (color_keys_on.green + color_keys.green) / 2;                new_bg.blue = (color_keys_on.blue + color_keys.blue) / 2;                gdk_gc_set_rgb_fg_color(key_widget->pixmap_gc, &new_bg);        } else                gdk_gc_set_rgb_fg_color(key_widget->pixmap_gc,                                        key->active ? &color_keys_on :                                                      &color_keys);        gdk_draw_rectangle(key_widget->pixmap, key_widget->pixmap_gc, TRUE,                           x, y, w, h);        /* Draw text */        log_ext.width = 0;        icon_size = 0;        if ((key->flags & KEY_ICON_MASK) &&            (!(key->flags & KEY_ICON_SHIFT) || is_shifted(key)))                icon_size = h * 3 / 7;        if (key->string[0]) {                const char *string = key->string;                if (is_shifted(key))                        string = key->string_shift;                layout = pango_layout_new(key_widget->pango);                cairo_move_to(key_widget->cairo, x, y + h / 2);                pango_layout_set_text(layout, string, -1);                pango_layout_set_font_description(layout,                                                  key_widget->pango_font_desc);                pango_layout_get_pixel_extents(layout, &ink_ext, &log_ext);                cairo_rel_move_to(key_widget->cairo, w / 2 -                                  log_ext.width / 2 + icon_size / 2 + 1,                                  log_ext.height / -2 + (key->active ? 2 : 1));                /* Draw text shadow */                cairo_set_source_gdk_color(key_widget->cairo,                                           &color_keys_dark, 1.);                pango_cairo_show_layout(key_widget->cairo, layout);                /* Draw the normal text */                cairo_rel_move_to(key_widget->cairo, -1, -1);                cairo_set_source_gdk_color(key_widget->cairo, &color_text, 1.);                pango_cairo_show_layout(key_widget->cairo, layout);                g_object_unref(layout);        }        /* Render icon */        if (icon_size) {                int icon_x, icon_y;                icon_x = x + w / 2. - log_ext.width / 2. - icon_size / 2.;                icon_y = y + h / 2. - icon_size / 2. + (key->active ? 1 : 0);                render_icon(key_widget->cairo, icon_x + 1, icon_y + 1,                            icon_size, key->flags & KEY_ICON_MASK,                            key->rotate, &color_keys_dark);                render_icon(key_widget->cairo, icon_x, icon_y, icon_size,                            key->flags & KEY_ICON_MASK, key->rotate,                            &color_text);        }        /* Render border */        if (!key->active) {                cairo_new_path(key_widget->cairo);                cairo_set_line_width(key_widget->cairo, 1.);                /* Top border */                cairo_set_source_rgba(key_widget->cairo, 1., 1., 1., 0.5);                cairo_move_to(key_widget->cairo, x + 0.5, y + 0.5);                cairo_line_to(key_widget->cairo, x + w - 0.5, y + 0.5);                cairo_stroke(key_widget->cairo);                /* Left border */                pattern = cairo_pattern_create_linear(x, y, x, y + h);                cairo_pattern_add_color_stop_rgba(pattern, 0., 1., 1., 1., 0.5);                cairo_pattern_add_color_stop_rgba(pattern, 1., 1., 1., 1., 0.);                cairo_set_source(key_widget->cairo, pattern);                cairo_move_to(key_widget->cairo, x + 0.5, y + 0.5);                cairo_line_to(key_widget->cairo, x + 0.5, y + h - 0.5);                cairo_stroke(key_widget->cairo);                cairo_pattern_destroy(pattern);                /* Right border */                pattern = cairo_pattern_create_linear(x, y, x, y + h);                cairo_pattern_add_color_stop_rgba(pattern, 0., 0., 0., 0., 0.);                cairo_pattern_add_color_stop_rgba(pattern, 1., 0., 0., 0., 0.5);                cairo_set_source(key_widget->cairo, pattern);                cairo_move_to(key_widget->cairo, x + w - 0.5, y + 0.5);                cairo_line_to(key_widget->cairo, x + w - 0.5, y + h - 0.5);                cairo_stroke(key_widget->cairo);                cairo_pattern_destroy(pattern);                /* Bottom border */                cairo_set_source_rgba(key_widget->cairo, 0., 0., 0., 0.5);                cairo_move_to(key_widget->cairo, x + 0.5, y + h - 0.5);                cairo_line_to(key_widget->cairo, x + w - 0.5, y + h - 0.5);                cairo_stroke(key_widget->cairo);        }        /* Mark key area as dirty */        if (dirty)                gtk_widget_queue_draw_area(key_widget->drawing_area,                                           x, y, w, h);}void key_widget_render(KeyWidget *key_widget){        int i;        if (!key_widget->pixmap_gc || !key_widget->pixmap)                return;        /* Render background */        if (!key_widget->slaved) {                gdk_gc_set_rgb_fg_color(key_widget->pixmap_gc, &color_bg);                gdk_draw_rectangle(key_widget->pixmap, key_widget->pixmap_gc,                                   TRUE, 0, 0,                                   key_widget->drawing_area->allocation.width,                                   key_widget->drawing_area->allocation.height);        }        /* Render keys */        for (i = 0; i < key_widget->len; i++)                render_key(key_widget, i, FALSE);        /* Dirty the drawing area if we aren't slaved */        if (!key_widget->slaved)                gtk_widget_queue_draw(key_widget->drawing_area);}static Key *add_key(KeyWidget *key_widget, int keysym, const char *string,                    int x, int y, int width, int height)/* Adds a key to a key widget and resizes it if necessary */{        Key *key;        if (key_widget->len >= key_widget->max_len) {                g_warning("Not enough room on keyboard for key '%s'",                          string);                return NULL;        }        key = key_widget->keys + key_widget->len++;        key->keysym = keysym;        key->string = !string ? XKeysymToString(keysym) : string;        key->x = x;        key->y = y;        key->width = width;        key->height = height;        if (key->x + key->width > key_widget->x_range)                key_widget->x_range = key->x + key->width;        if (key->y + key->height > key_widget->y_range)                key_widget->y_range = key->y + key->height;        if (key->height < key_widget->min_height || !key_widget->min_height)                key_widget->min_height = key->height;        return key;}static void set_flags(Key *key, int flags, int rotate){        if (!key)                return;        key->flags = flags;        key->rotate = rotate;}static void set_shifted(Key *key, unsigned int keysym, const char *string){        if (!key)                return;        key->keysym_shift = keysym;        key->string_shift = !string ? XKeysymToString(keysym) : string;        key->flags |= KEY_SHIFTABLE;}int key_widget_update_colors(void){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青娱乐精品在线视频| 国产精品三级在线观看| 国产精品久久久久久久蜜臀| 日韩黄色一级片| 成人精品免费网站| 91黄色激情网站| 久久久www免费人成精品| 日韩精品乱码免费| 欧美伊人久久久久久久久影院 | 艳妇臀荡乳欲伦亚洲一区| 蜜桃av一区二区三区| 99久久久无码国产精品| 久久亚洲精品国产精品紫薇| 欧美精品高清视频| 亚洲综合一区二区| 高清成人在线观看| 欧美一级日韩不卡播放免费| 亚洲免费av高清| 成人免费黄色大片| 日韩一级片网址| 亚洲综合色丁香婷婷六月图片| 性欧美疯狂xxxxbbbb| 国产精品一区不卡| 亚洲线精品一区二区三区八戒| 一区二区三区在线高清| 国产麻豆成人精品| 在线成人小视频| 亚洲电影一区二区三区| 欧美国产一区在线| 久久精品国产精品亚洲综合| 欧美久久高跟鞋激| 亚洲一区二区视频在线观看| 91久久精品国产91性色tv| 一区二区中文视频| 成人爽a毛片一区二区免费| 久久久久久夜精品精品免费| 麻豆久久一区二区| 欧美r级在线观看| 免费成人性网站| 日韩一区二区影院| 麻豆精品国产91久久久久久| 337p亚洲精品色噜噜噜| 国产精品伦理在线| 91亚洲男人天堂| 亚洲美女视频一区| 欧美性大战xxxxx久久久| 一区二区欧美精品| 在线观看www91| 日韩激情视频网站| 69久久夜色精品国产69蝌蚪网| 日韩电影免费在线| 欧美一区二区日韩| 美女一区二区三区在线观看| 久久―日本道色综合久久| 国内精品国产三级国产a久久| 欧美久久久久久久久久| 日韩精品电影一区亚洲| 91精品在线免费观看| 日韩电影在线一区| 日韩免费高清电影| 国产一区二区福利视频| 国产清纯美女被跳蛋高潮一区二区久久w| 国产伦精品一区二区三区在线观看| 久久亚洲捆绑美女| caoporm超碰国产精品| 亚洲天天做日日做天天谢日日欢| 国产成人综合自拍| 亚洲免费观看高清在线观看| 色噜噜狠狠一区二区三区果冻| 亚洲成av人片在线观看| 欧美日本高清视频在线观看| 午夜视频在线观看一区二区 | 精品美女一区二区| 国产精品一区免费在线观看| 中文字幕在线播放不卡一区| 成人午夜视频免费看| 精品一区二区精品| 自拍偷拍国产亚洲| 国产精品美女视频| 欧美日韩国产高清一区二区三区 | 岛国精品在线播放| 在线精品视频一区二区| 午夜国产精品影院在线观看| 欧美激情在线看| 国产成人欧美日韩在线电影| 亚洲美女一区二区三区| 欧美剧在线免费观看网站| 国模冰冰炮一区二区| 国产精品高潮呻吟久久| 欧美美女黄视频| 国产在线一区二区| 亚洲日本欧美天堂| 日韩欧美国产小视频| 国产超碰在线一区| 午夜伦理一区二区| 久久亚洲一区二区三区明星换脸| 日本丶国产丶欧美色综合| 秋霞国产午夜精品免费视频 | 99精品视频一区| 亚洲一区欧美一区| 精品乱码亚洲一区二区不卡| 国产99精品视频| 一区二区三区四区在线播放| 欧美电视剧在线看免费| 福利电影一区二区| 青青草国产精品亚洲专区无| 国产精品美日韩| 欧美大胆人体bbbb| 99视频国产精品| 亚洲成人午夜影院| 中文字幕av一区二区三区免费看 | 国产九色精品成人porny| 中文字幕字幕中文在线中不卡视频| 日韩欧美黄色影院| 色婷婷av一区二区三区大白胸| 另类人妖一区二区av| 亚洲一区欧美一区| 国产亚洲成av人在线观看导航| 欧美精品tushy高清| 国产.欧美.日韩| 日本一不卡视频| 亚洲香肠在线观看| 中文无字幕一区二区三区| 日韩欧美你懂的| 欧美亚洲国产怡红院影院| 99久久综合国产精品| 久久www免费人成看片高清| 一区二区三区四区乱视频| 国产精品高潮呻吟| 亚洲精品在线一区二区| 911精品产国品一二三产区| 不卡的av电影在线观看| 国产亚洲欧美激情| 亚洲成人免费电影| 在线亚洲免费视频| 亚洲综合色网站| 韩国精品免费视频| 91精品在线免费| 亚洲摸摸操操av| 91亚洲永久精品| 久久久久国产一区二区三区四区 | 成人综合在线视频| 欧美视频一区二区在线观看| 国产区在线观看成人精品| 成人一区二区三区| 蓝色福利精品导航| 色菇凉天天综合网| 国产白丝网站精品污在线入口| 韩国一区二区三区| 美女在线一区二区| 日本视频一区二区| 婷婷亚洲久悠悠色悠在线播放| 亚洲不卡一区二区三区| 午夜一区二区三区在线观看| 亚洲成人av福利| 日韩中文字幕91| 久久久蜜臀国产一区二区| 91精品国产综合久久久久久漫画| 一本大道av一区二区在线播放| 91婷婷韩国欧美一区二区| 99久久精品免费看| 色八戒一区二区三区| 色综合久久久久久久久| 99久久综合国产精品| 99这里都是精品| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产在线精品一区二区夜色 | 午夜激情久久久| 午夜av电影一区| 日本亚洲视频在线| 日韩一区欧美二区| 免费美女久久99| 麻豆国产一区二区| 国产精品1区二区.| 国产高清不卡一区| 91色视频在线| 色天使色偷偷av一区二区| 欧美日精品一区视频| 欧美久久一区二区| 日韩一区二区三| www一区二区| 精品国产免费久久 | 欧美一级搡bbbb搡bbbb| 精品成a人在线观看| 国产精品九色蝌蚪自拍| 一区二区在线看| 日韩av在线播放中文字幕| 日本网站在线观看一区二区三区| 免费高清在线一区| 国产丶欧美丶日本不卡视频| k8久久久一区二区三区| 欧美在线影院一区二区| 56国语精品自产拍在线观看| 久久久久久久性| 亚洲欧美综合色| 亚洲综合色区另类av| 久久福利视频一区二区| 成人一区二区在线观看| 欧美午夜影院一区| 日韩欧美国产小视频|