📄 matchbox-keyboard.h
字号:
/* * Matchbox Keyboard - A lightweight software keyboard. * * Authored By Matthew Allum <mallum@o-hand.com> * * Copyright (c) 2005 OpenedHand Ltd - http://o-hand.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, 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 of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */#ifndef HAVE_MB_KEYBOARD_H#define HAVE_MB_KEYBOARD_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <strings.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <time.h>#include <locale.h>#include <expat.h>#include <X11/Xlib.h>#include <X11/Xutil.h>#include <X11/Xatom.h>#include <X11/Xresource.h>#include <X11/keysym.h>#include <fakekey/fakekey.h>#if HAVE_CONFIG_H#include "config.h"#endif#if (WANT_DEBUG)#define DBG(x, a...) \ fprintf (stderr, __FILE__ ":%d,%s() " x "\n", __LINE__, __func__, ##a)#else#define DBG(x, a...) do {} while (0)#endif#define MARK() DBG("mark")typedef void* pointer;typedef unsigned char uchar ;typedef Bool boolean ;typedef struct Pixbuf Pixbuf;typedef struct List List;typedef void (*ListForEachCB) (void *data, void *userdata);struct List { List *next, *prev; void *data;};typedef struct MBKeyboard MBKeyboard;typedef struct MBKeyboardLayout MBKeyboardLayout;typedef struct MBKeyboardRow MBKeyboardRow;typedef struct MBKeyboardKey MBKeyboardKey;typedef struct MBKeyboardUI MBKeyboardUI;typedef struct MBKeyboardUIBackend MBKeyboardUIBackend;typedef enum { MBKeyboardKeyActionNone = 0, MBKeyboardKeyActionGlyph, MBKeyboardKeyActionXKeySym, /* 'specials' be converted into this */ MBKeyboardKeyActionModifier,} MBKeyboardKeyActionType;typedef enum { MBKeyboardKeyModUnknown, MBKeyboardKeyModShift, MBKeyboardKeyModMod1, MBKeyboardKeyModMod2, MBKeyboardKeyModMod3, MBKeyboardKeyModCaps, MBKeyboardKeyModControl, MBKeyboardKeyModAlt, MBKeyboardKeyModLayout} MBKeyboardKeyModType;typedef enum { MBKeyboardKeyFaceNone = 0, MBKeyboardKeyFaceGlyph = 1, MBKeyboardKeyFaceImage,} MBKeyboardKeyFaceType;typedef enum { MBKeyboardKeyStateNormal = 0, MBKeyboardKeyStateShifted, MBKeyboardKeyStateMod1, MBKeyboardKeyStateMod2, MBKeyboardKeyStateMod3, N_MBKeyboardKeyStateTypes} MBKeyboardKeyStateType;typedef enum { MBKeyboardStateNormal = 0, MBKeyboardStateShifted = (1<<1), MBKeyboardStateMod1 = (1<<2), MBKeyboardStateMod2 = (1<<3), MBKeyboardStateMod3 = (1<<4), MBKeyboardStateCaps = (1<<5), MBKeyboardStateControl = (1<<6), MBKeyboardStateAlt = (1<<7), N_MBKeyboardStateTypes} MBKeyboardStateType;struct MBKeyboard{ MBKeyboardUI *ui; char *font_family; int font_pt_size; char *font_variant; char *config_file; List *layouts; MBKeyboardLayout *selected_layout; int key_border, key_pad, key_margin; int row_spacing, col_spacing; boolean extended; /* are we showing extended keys ? */ MBKeyboardKey *held_key; MBKeyboardStateType keys_state;};/**** UI ***********/struct MBKeyboardUIBackend{ MBKeyboardUIBackend* (*init) (MBKeyboardUI *ui); int (*font_load) (MBKeyboardUI *ui); void (*redraw_key) (MBKeyboardUI *ui, MBKeyboardKey *key); void (*pre_redraw) (MBKeyboardUI *ui); int (*resources_create) (MBKeyboardUI *ui); int (*resize) (MBKeyboardUI *ui, int width, int height); void (*text_extents) (MBKeyboardUI *ui, const char *str, int *width, int *height);};intmb_kbd_ui_init(MBKeyboard *kbd);intmb_kbd_ui_realize(MBKeyboardUI *ui);voidmb_kbd_ui_show(MBKeyboardUI *ui);voidmb_kbd_ui_redraw_key(MBKeyboardUI *ui, MBKeyboardKey *key);voidmb_kbd_ui_redraw(MBKeyboardUI *ui);voidmb_kbd_ui_swap_buffers(MBKeyboardUI *ui);voidmb_kbd_ui_send_press(MBKeyboardUI *ui, const char *utf8_char_in, int modifiers);voidmb_kbd_ui_send_keysym_press(MBKeyboardUI *ui, KeySym ks, int modifiers);voidmb_kbd_ui_send_release(MBKeyboardUI *ui);intmb_kbd_ui_display_width(MBKeyboardUI *ui);intmb_kbd_ui_display_height(MBKeyboardUI *ui);MBKeyboardUIBackend*mb_kbd_ui_backend(MBKeyboardUI *ui);Display*mb_kbd_ui_x_display(MBKeyboardUI *ui);intmb_kbd_ui_x_screen(MBKeyboardUI *ui);Windowmb_kbd_ui_x_win(MBKeyboardUI *ui);intmb_kbd_ui_x_win_height(MBKeyboardUI *ui);intmb_kbd_ui_x_win_width(MBKeyboardUI *ui);Windowmb_kbd_ui_x_win_root(MBKeyboardUI *ui);Pixmapmb_kbd_ui_backbuffer(MBKeyboardUI *ui);MBKeyboard*mb_kbd_ui_kbd(MBKeyboardUI *ui);voidmb_kbd_ui_event_loop(MBKeyboardUI *ui);voidmb_kbd_ui_set_embeded (MBKeyboardUI *ui, int embed); intmb_kbd_ui_embeded (MBKeyboardUI *ui);voidmb_kbd_ui_print_window (MBKeyboardUI *ui);/*** XEmbed ***/voidmb_kbd_xembed_init (MBKeyboardUI *ui);voidmb_kbd_xembed_process_xevents (MBKeyboardUI *ui, XEvent *xevent);/**** Keyboard ****/intmb_kbd_row_spacing(MBKeyboard *kb);intmb_kbd_col_spacing(MBKeyboard *kb);intmb_kbd_keys_border(MBKeyboard *kb);intmb_kbd_keys_pad(MBKeyboard *kb);intmb_kbd_keys_margin(MBKeyboard *kb);voidmb_kbd_add_state(MBKeyboard *kbd, MBKeyboardStateType state);voidmb_kbd_toggle_state(MBKeyboard *kbd, MBKeyboardStateType state);booleanmb_kbd_has_state(MBKeyboard *kbd, MBKeyboardStateType state);booleanmb_kbd_has_any_state(MBKeyboard *kbd);voidmb_kbd_remove_state(MBKeyboard *kbd, MBKeyboardStateType state);MBKeyboardKeyStateTypemb_kbd_keys_current_state(MBKeyboard *kbd);voidmb_kbd_set_extended(MBKeyboard *kb, boolean extend);booleanmb_kbd_is_extended(MBKeyboard *kb);voidmb_kbd_add_layout(MBKeyboard *kb, MBKeyboardLayout *layout);MBKeyboardLayout*mb_kbd_get_selected_layout(MBKeyboard *kb);MBKeyboardKey*mb_kbd_locate_key(MBKeyboard *kb, int x, int y);voidmb_kbd_set_held_key(MBKeyboard *kb, MBKeyboardKey *key);MBKeyboardKey *mb_kbd_get_held_key(MBKeyboard *kb);voidmb_kbd_redraw(MBKeyboard *kb);voidmb_kbd_redraw_key(MBKeyboard *kb, MBKeyboardKey *key);/**** Layout ****/MBKeyboardLayout*mb_kbd_layout_new(MBKeyboard *kbd, const char *id);voidmb_kbd_layout_append_row(MBKeyboardLayout *layout, MBKeyboardRow *row);List*mb_kbd_layout_rows(MBKeyboardLayout *layout);/**** Rows ******/MBKeyboardRow*mb_kbd_row_new(MBKeyboard *kbd);voidmb_kbd_row_set_x(MBKeyboardRow *row, int x);voidmb_kbd_row_set_y(MBKeyboardRow *row, int y);int mb_kbd_row_x (MBKeyboardRow *row) ;int mb_kbd_row_y(MBKeyboardRow *row) ;int mb_kbd_row_height(MBKeyboardRow *row);int mb_kbd_row_width(MBKeyboardRow *row);int mb_kbd_row_base_width(MBKeyboardRow *row);voidmb_kbd_row_append_key(MBKeyboardRow *row, MBKeyboardKey *key);List*mb_kdb_row_keys(MBKeyboardRow *row);#define mb_kbd_row_for_each_key(r,k) \ for ((k) = mb_kdb_row_keys((r)); \ (k) != NULL; \ (k) = util_list_next((k))) /**** Keys ******/MBKeyboardKey*mb_kbd_key_new(MBKeyboard *kbd);voidmb_kbd_key_set_obey_caps(MBKeyboardKey *key, boolean obey);booleanmb_kbd_key_get_obey_caps(MBKeyboardKey *key);voidmb_kbd_key_set_req_uwidth(MBKeyboardKey *key, int uwidth);intmb_kbd_key_get_req_uwidth(MBKeyboardKey *key);voidmb_kbd_key_set_fill(MBKeyboardKey *key, boolean fill);booleanmb_kbd_key_get_fill(MBKeyboardKey *key);voidmb_kbd_key_set_blank(MBKeyboardKey *key, boolean blank);booleanmb_kbd_key_is_blank(MBKeyboardKey *key);void mb_kbd_key_set_row(MBKeyboardKey *key, MBKeyboardRow *row);voidmb_kbd_key_set_geometry(MBKeyboardKey *key, int x, int y, int width, int height);int mb_kbd_key_abs_x(MBKeyboardKey *key) ;int mb_kbd_key_abs_y(MBKeyboardKey *key) ;int mb_kbd_key_x(MBKeyboardKey *key) ;int mb_kbd_key_y(MBKeyboardKey *key);int mb_kbd_key_width(MBKeyboardKey *key) ;int mb_kbd_key_height(MBKeyboardKey *key);voidmb_kbd_key_set_extended(MBKeyboardKey *key, boolean extend);booleanmb_kbd_key_get_extended(MBKeyboardKey *key);voidmb_kbd_key_set_extra_width_pad(MBKeyboardKey *key, int pad);voidmb_kbd_key_set_extra_height_pad(MBKeyboardKey *key, int pad);intmb_kbd_key_get_extra_height_pad(MBKeyboardKey *key);intmb_kbd_key_get_extra_width_pad(MBKeyboardKey *key);Boolmb_kdb_key_has_state(MBKeyboardKey *key, MBKeyboardKeyStateType state);voidmb_kbd_key_set_glyph_face(MBKeyboardKey *key, MBKeyboardKeyStateType state, const char *glyph);const char*mb_kbd_key_get_glyph_face(MBKeyboardKey *key, MBKeyboardKeyStateType state);voidmb_kbd_key_set_image_face(MBKeyboardKey *key, MBKeyboardKeyStateType state, void *image);MBKeyboardKeyFaceTypemb_kbd_key_get_face_type(MBKeyboardKey *key, MBKeyboardKeyStateType state);voidmb_kbd_key_set_char_action(MBKeyboardKey *key, MBKeyboardKeyStateType state, const char *glyphs);voidmb_kbd_key_set_keysym_action(MBKeyboardKey *key, MBKeyboardKeyStateType state, KeySym keysym);KeySymmb_kbd_key_get_keysym_action(MBKeyboardKey *key, MBKeyboardKeyStateType state);voidmb_kbd_key_set_modifer_action(MBKeyboardKey *key, MBKeyboardKeyStateType state, MBKeyboardKeyModType type);MBKeyboardKeyModType mb_kbd_key_get_modifer_action(MBKeyboardKey *key, MBKeyboardKeyStateType state);boolean mb_kbd_key_is_held(MBKeyboard *kbd, MBKeyboardKey *key);voidmb_kbd_key_press(MBKeyboardKey *key);voidmb_kbd_key_release(MBKeyboard *kbd);voidmb_kbd_key_dump_key(MBKeyboardKey *key);#define mb_kdb_key_foreach_state(k,s) \ for((s)=0; (s) < N_MBKeyboardKeyStateTypes; (s)++) \ if (mb_kdb_key_has_state((k), (s)))/*** Config *****/intmb_kbd_config_load(MBKeyboard *kbd, char *varient);/**** Util *****/#define streq(a,b) (strcmp(a,b) == 0)#define strcaseeq(a,b) (strcasecmp(a,b) == 0)#define unless(x) if (!(x))#define util_abs(x) ((x) > 0) ? (x) : -1*(x)voidutil_trap_x_errors(void);intutil_untrap_x_errors(void);void*util_malloc0(int size);voidutil_fatal_error(char *msg);intutil_utf8_char_cnt(const char *str);boolean util_file_readable(char *path);/* Util list */#define util_list_next(l) (l)->next#define util_list_previous(l) (l)->prevList*util_list_alloc_item(void);intutil_list_length(List *list);List*util_list_get_last(List *list);List*util_list_get_first(List *list);void*util_list_get_nth_data(List *list, int n);List*util_list_append(List *list, void *data);voidutil_list_foreach(List *list, ListForEachCB func, void *userdata);/* Backends */#if WANT_CAIRO#include "matchbox-keyboard-ui-cairo-backend.h"#else#include "matchbox-keyboard-ui-xft-backend.h"#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -