📄 keywidget.c
字号:
/* Widget*/static KeyWidget *key_widget_new(GtkWidget *drawing_area, int keys)/* Unlike CellWidget, KeyWidget can be instantiated more than once */{ KeyWidget *key_widget; key_widget = g_malloc0(sizeof (*key_widget) + sizeof (Key) * keys); key_widget->active = -1; key_widget->drawing_area = drawing_area; key_widget->max_len = keys; /* Get background color */ style_set(drawing_area, NULL, NULL); /* Create Pango font description FIXME font characteristics, not family */ key_widget->pango_font_desc = pango_font_description_new(); pango_font_description_set_family(key_widget->pango_font_desc, "Sans"); pango_font_description_set_weight(key_widget->pango_font_desc, PANGO_WEIGHT_BOLD); return key_widget;}KeyWidget *key_widget_new_small(GtkWidget *drawing_area)/* Creates a small on-screen keyboard slaved to another drawing area */{ KeyWidget *key_widget; Key *key; key_widget = key_widget_new(drawing_area, 16); key_widget->slaved = TRUE; /* 1st row */ key = add_key(key_widget, XK_BackSpace, "BkSp", 1, 0, 2, 1); set_flags(key, KEY_ARROW, 180); add_key(key_widget, XK_Tab, "Tab", 0, 0, 1, 1); add_key(key_widget, XK_Delete, "Del", 3, 0, 1, 1); /* 2nd row */ add_key(key_widget, XK_Home, "Hme", 0, 1, 1, 1); key = add_key(key_widget, XK_Up, "", 1, 1, 1, 1); set_flags(key, KEY_ARROW, 90); add_key(key_widget, XK_End, "End", 2, 1, 1, 1); add_key(key_widget, XK_Page_Up, "PUp", 3, 1, 1, 1); /* 3rd row */ key = add_key(key_widget, XK_Left, "", 0, 2, 1, 1); set_flags(key, KEY_ARROW, 180); key = add_key(key_widget, XK_Down, "", 1, 2, 1, 1); set_flags(key, KEY_ARROW, 270); key = add_key(key_widget, XK_Right, "", 2, 2, 1, 1); set_flags(key, KEY_ARROW, 0); add_key(key_widget, XK_Page_Down, "PDn", 3, 2, 1, 1); /* Add some event hooks */ g_signal_connect(G_OBJECT(drawing_area), "style-set", G_CALLBACK(style_set), key_widget); return key_widget;}KeyWidget *key_widget_new_full(void)/* Creates the QWERTY on-screen keyboard FIXME The Num Pad shifts are backwards, a shifted num lockable will be used when Num Lock is OFF. */{ GtkWidget *drawing_area; KeyWidget *key_widget; Key *key; /* Create drawing area */ drawing_area = gtk_drawing_area_new(); /* Create key widget */ key_widget = key_widget_new(drawing_area, 104); key_widget_resize(key_widget); /* 1st row */ add_key(key_widget, XK_Escape, "Esc", 0, 0, 3, 2); add_key(key_widget, XK_F1, "F1", 4, 0, 2, 2); add_key(key_widget, XK_F2, "F2", 6, 0, 2, 2); add_key(key_widget, XK_F3, "F3", 8, 0, 2, 2); add_key(key_widget, XK_F4, "F4", 10, 0, 2, 2); add_key(key_widget, XK_F5, "F5", 13, 0, 2, 2); add_key(key_widget, XK_F6, "F6", 15, 0, 2, 2); add_key(key_widget, XK_F7, "F7", 17, 0, 2, 2); add_key(key_widget, XK_F8, "F8", 19, 0, 2, 2); add_key(key_widget, XK_F9, "F9", 22, 0, 2, 2); add_key(key_widget, XK_F10, "F10", 24, 0, 2, 2); add_key(key_widget, XK_F11, "F11", 26, 0, 2, 2); add_key(key_widget, XK_F12, "F12", 28, 0, 2, 2); add_key(key_widget, XK_Print, "PSc", 31, 0, 2, 2); add_key(key_widget, XK_Scroll_Lock, "SLk", 33, 0, 2, 2); add_key(key_widget, XK_Pause, "Brk", 35, 0, 2, 2); /* 2nd row */ key = add_key(key_widget, XK_grave, "`", 0, 3, 2, 2); set_shifted(key, XK_asciitilde, "~"); key = add_key(key_widget, XK_1, "1", 2, 3, 2, 2); set_shifted(key, XK_exclam, "!"); key = add_key(key_widget, XK_2, "2", 4, 3, 2, 2); set_shifted(key, XK_at, "@"); key = add_key(key_widget, XK_3, "3", 6, 3, 2, 2); set_shifted(key, XK_numbersign, "#"); key = add_key(key_widget, XK_4, "4", 8, 3, 2, 2); set_shifted(key, XK_dollar, "$"); key = add_key(key_widget, XK_5, "5", 10, 3, 2, 2); set_shifted(key, XK_percent, "%"); key = add_key(key_widget, XK_6, "6", 12, 3, 2, 2); set_shifted(key, XK_asciicircum, "^"); key = add_key(key_widget, XK_7, "7", 14, 3, 2, 2); set_shifted(key, XK_ampersand, "&"); key = add_key(key_widget, XK_8, "8", 16, 3, 2, 2); set_shifted(key, XK_asterisk, "*"); key = add_key(key_widget, XK_9, "9", 18, 3, 2, 2); set_shifted(key, XK_parenleft, "("); key = add_key(key_widget, XK_0, "0", 20, 3, 2, 2); set_shifted(key, XK_parenright, ")"); key = add_key(key_widget, XK_minus, "-", 22, 3, 2, 2); set_shifted(key, XK_underscore, "_"); key = add_key(key_widget, XK_equal, "=", 24, 3, 2, 2); set_shifted(key, XK_plus, "+"); key = add_key(key_widget, XK_BackSpace, "BkSp", 26, 3, 4, 2); set_flags(key, KEY_ARROW, 180); add_key(key_widget, XK_Insert, "Ins", 31, 3, 2, 2); add_key(key_widget, XK_Home, "Hm", 33, 3, 2, 2); add_key(key_widget, XK_Page_Up, "PU", 35, 3, 2, 2); key = add_key(key_widget, XK_Num_Lock, "NL", 38, 3, 2, 2); set_flags(key, KEY_NUM_LOCK, 0); add_key(key_widget, XK_KP_Divide, "/", 40, 3, 2, 2); add_key(key_widget, XK_KP_Multiply, "*", 42, 3, 2, 2); add_key(key_widget, XK_KP_Subtract, "-", 44, 3, 2, 2); /* 3rd row */ add_key(key_widget, XK_Tab, "Tab", 0, 5, 3, 2); key = add_key(key_widget, XK_q, "q", 3, 5, 2, 2); set_shifted(key, XK_Q, "Q"); key = add_key(key_widget, XK_w, "w", 5, 5, 2, 2); set_shifted(key, XK_W, "W"); key = add_key(key_widget, XK_e, "e", 7, 5, 2, 2); set_shifted(key, XK_E, "E"); key = add_key(key_widget, XK_r, "r", 9, 5, 2, 2); set_shifted(key, XK_R, "R"); key = add_key(key_widget, XK_t, "t", 11, 5, 2, 2); set_shifted(key, XK_T, "T"); key = add_key(key_widget, XK_y, "y", 13, 5, 2, 2); set_shifted(key, XK_Y, "Y"); key = add_key(key_widget, XK_u, "u", 15, 5, 2, 2); set_shifted(key, XK_U, "U"); key = add_key(key_widget, XK_i, "i", 17, 5, 2, 2); set_shifted(key, XK_I, "I"); key = add_key(key_widget, XK_o, "o", 19, 5, 2, 2); set_shifted(key, XK_O, "O"); key = add_key(key_widget, XK_p, "p", 21, 5, 2, 2); set_shifted(key, XK_P, "P"); key = add_key(key_widget, XK_bracketleft, "[", 23, 5, 2, 2); set_shifted(key, XK_braceleft, "{"); key = add_key(key_widget, XK_bracketright, "]", 25, 5, 2, 2); set_shifted(key, XK_braceright, "}"); key = add_key(key_widget, XK_backslash, "\\", 27, 5, 3, 2); set_shifted(key, XK_bar, "|"); add_key(key_widget, XK_Delete, "Del", 31, 5, 2, 2); add_key(key_widget, XK_End, "End", 33, 5, 2, 2); add_key(key_widget, XK_Page_Down, "PD", 35, 5, 2, 2); key = add_key(key_widget, XK_KP_7, "7", 38, 5, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_Home, "Hm"); key = add_key(key_widget, XK_KP_8, "8", 40, 5, 2, 2); set_flags(key, KEY_NUM_LOCKABLE | KEY_ICON_SHIFT | KEY_ARROW, 90); set_shifted(key, XK_KP_Up, ""); key = add_key(key_widget, XK_KP_9, "9", 42, 5, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_Page_Up, "PU"); add_key(key_widget, XK_KP_Add, "+", 44, 5, 2, 4); /* 4th row */ key = add_key(key_widget, XK_Caps_Lock, "CpLk", 0, 7, 4, 2); set_flags(key, KEY_CAPS_LOCK, 0); key = add_key(key_widget, XK_a, "a", 4, 7, 2, 2); set_shifted(key, XK_A, "A"); key = add_key(key_widget, XK_s, "s", 6, 7, 2, 2); set_shifted(key, XK_S, "S"); key = add_key(key_widget, XK_d, "d", 8, 7, 2, 2); set_shifted(key, XK_D, "D"); key = add_key(key_widget, XK_f, "f", 10, 7, 2, 2); set_shifted(key, XK_F, "F"); key = add_key(key_widget, XK_g, "g", 12, 7, 2, 2); set_shifted(key, XK_G, "G"); key = add_key(key_widget, XK_h, "h", 14, 7, 2, 2); set_shifted(key, XK_H, "H"); key = add_key(key_widget, XK_j, "j", 16, 7, 2, 2); set_shifted(key, XK_J, "J"); key = add_key(key_widget, XK_k, "k", 18, 7, 2, 2); set_shifted(key, XK_K, "K"); key = add_key(key_widget, XK_l, "l", 20, 7, 2, 2); set_shifted(key, XK_L, "L"); key = add_key(key_widget, XK_semicolon, ";", 22, 7, 2, 2); set_shifted(key, XK_colon, ":"); key = add_key(key_widget, XK_apostrophe, "'", 24, 7, 2, 2); set_shifted(key, XK_quotedbl, "\""); add_key(key_widget, XK_Return, "Enter", 26, 7, 4, 2); key = add_key(key_widget, XK_KP_4, "4", 38, 7, 2, 2); set_flags(key, KEY_NUM_LOCKABLE | KEY_ICON_SHIFT | KEY_ARROW, 180); set_shifted(key, XK_KP_Left, ""); key = add_key(key_widget, XK_KP_5, "5", 40, 7, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, 0, ""); key = add_key(key_widget, XK_KP_6, "6", 42, 7, 2, 2); set_flags(key, KEY_NUM_LOCKABLE | KEY_ICON_SHIFT | KEY_ARROW, 0); set_shifted(key, XK_KP_Right, ""); /* 5th row */ key = add_key(key_widget, XK_Shift_L, "Shift", 0, 9, 5, 2); set_flags(key, KEY_STICKY|KEY_SHIFT, 0); key = add_key(key_widget, XK_z, "z", 5, 9, 2, 2); set_shifted(key, XK_Z, "Z"); key = add_key(key_widget, XK_x, "x", 7, 9, 2, 2); set_shifted(key, XK_X, "X"); key = add_key(key_widget, XK_c, "c", 9, 9, 2, 2); set_shifted(key, XK_C, "C"); key = add_key(key_widget, XK_v, "v", 11, 9, 2, 2); set_shifted(key, XK_V, "V"); key = add_key(key_widget, XK_b, "b", 13, 9, 2, 2); set_shifted(key, XK_B, "B"); key = add_key(key_widget, XK_n, "n", 15, 9, 2, 2); set_shifted(key, XK_N, "N"); key = add_key(key_widget, XK_m, "m", 17, 9, 2, 2); set_shifted(key, XK_M, "M"); key = add_key(key_widget, XK_comma, ",", 19, 9, 2, 2); set_shifted(key, XK_less, "<"); key = add_key(key_widget, XK_period, ".", 21, 9, 2, 2); set_shifted(key, XK_greater, ">"); key = add_key(key_widget, XK_slash, "/", 23, 9, 2, 2); set_shifted(key, XK_question, "?"); key = add_key(key_widget, XK_Shift_R, "Shift", 25, 9, 5, 2); set_flags(key, KEY_STICKY|KEY_SHIFT, 0); key = add_key(key_widget, XK_Up, "", 33, 9, 2, 2); set_flags(key, KEY_ARROW, 90); key = add_key(key_widget, XK_KP_1, "1", 38, 9, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_End, "End"); key = add_key(key_widget, XK_KP_2, "2", 40, 9, 2, 2); set_flags(key, KEY_NUM_LOCKABLE | KEY_ICON_SHIFT | KEY_ARROW, 270); set_shifted(key, XK_KP_Down, ""); key = add_key(key_widget, XK_KP_3, "3", 42, 9, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_Page_Down, "PD"); add_key(key_widget, XK_KP_Enter, "Ent", 44, 9, 2, 4); /* 6th row */ key = add_key(key_widget, XK_Control_L, "Ctrl", 0, 11, 4, 2); set_flags(key, KEY_STICKY, 0); key = add_key(key_widget, XK_Super_L, "Su", 4, 11, 2, 2); set_flags(key, KEY_STICKY, 0); key = add_key(key_widget, XK_Alt_L, "Alt", 6, 11, 2, 2); set_flags(key, KEY_STICKY, 0); add_key(key_widget, XK_space, "", 8, 11, 14, 2); key = add_key(key_widget, XK_Alt_R, "Alt", 22, 11, 2, 2); set_flags(key, KEY_STICKY, 0); add_key(key_widget, XK_Menu, "Mn", 24, 11, 2, 2); key = add_key(key_widget, XK_Control_R, "Ctrl", 26, 11, 4, 2); set_flags(key, KEY_STICKY, 0); key = add_key(key_widget, XK_Left, "", 31, 11, 2, 2); set_flags(key, KEY_ARROW, 180); key = add_key(key_widget, XK_Down, "", 33, 11, 2, 2); set_flags(key, KEY_ARROW, 270); key = add_key(key_widget, XK_Right, "", 35, 11, 2, 2); set_flags(key, KEY_ARROW, 0); key = add_key(key_widget, XK_KP_0, "0", 38, 11, 4, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_Insert, "Ins"); key = add_key(key_widget, XK_KP_Decimal, ".", 42, 11, 2, 2); set_flags(key, KEY_NUM_LOCKABLE, 0); set_shifted(key, XK_KP_Delete, "Del"); /* Setup drawing area events */ g_signal_connect(G_OBJECT(drawing_area), "expose_event", G_CALLBACK(expose_event), key_widget); g_signal_connect(G_OBJECT(drawing_area), "configure_event", G_CALLBACK(configure_event), key_widget); g_signal_connect(G_OBJECT(drawing_area), "button_press_event", G_CALLBACK(key_widget_button_press), key_widget); g_signal_connect(G_OBJECT(drawing_area), "button_release_event", G_CALLBACK(key_widget_button_release), key_widget); g_signal_connect(G_OBJECT(drawing_area), "style-set", G_CALLBACK(style_set), key_widget); gtk_widget_set_events(drawing_area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); return key_widget;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -