From 3c73123a81a7aeb1032680a2f33496c1396bb2b9 Mon Sep 17 00:00:00 2001 From: Nikolay Minaylov Date: Fri, 9 Feb 2024 12:33:47 +0300 Subject: [PATCH 1/3] HID app: keyboard modifiers fix (#3378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HID App: Modifier keys fix * Toggled keys indication * New enter and backspace button icons Co-authored-by: あく --- .../hid_app/assets/Alt_pressed_17x10.png | Bin 0 -> 4227 bytes .../system/hid_app/assets/Backspace_9x7.png | Bin 0 -> 6628 bytes .../hid_app/assets/Cmd_pressed_17x10.png | Bin 0 -> 4234 bytes .../hid_app/assets/Ctrl_pressed_17x10.png | Bin 0 -> 4227 bytes .../system/hid_app/assets/Return_10x7.png | Bin 0 -> 6630 bytes .../hid_app/assets/Shift_pressed_7x10.png | Bin 0 -> 6626 bytes .../system/hid_app/views/hid_keyboard.c | 212 ++++++++++-------- 7 files changed, 115 insertions(+), 97 deletions(-) create mode 100644 applications/system/hid_app/assets/Alt_pressed_17x10.png create mode 100644 applications/system/hid_app/assets/Backspace_9x7.png create mode 100644 applications/system/hid_app/assets/Cmd_pressed_17x10.png create mode 100644 applications/system/hid_app/assets/Ctrl_pressed_17x10.png create mode 100644 applications/system/hid_app/assets/Return_10x7.png create mode 100644 applications/system/hid_app/assets/Shift_pressed_7x10.png diff --git a/applications/system/hid_app/assets/Alt_pressed_17x10.png b/applications/system/hid_app/assets/Alt_pressed_17x10.png new file mode 100644 index 0000000000000000000000000000000000000000..e7421c8c0bf7d189200b2b953219f24b287f093d GIT binary patch literal 4227 zcmeHKYitx%6rSawWdYGr&_JS_sX(R7&dl!4?9QZHEZsg<9VoCswK4JT%-wcmU(QUs z+m@h$ii!~mY7_ybJbVI*f%pOy9~GlPFvK6cOf%D;wK(7YC*nbWCrscG>BKq{k_D??BJotWF9o|^bwv3t^{`l<5ldrUW`Od1=(%)N83kO@BZx^Z+ z+!w94e)ViidQ#`ARnPxEyY$GKr^jD7^~A(S_!4eZ`?~Fik8U}(_3)-y7Y=-I;?Bp% z+TVWlp+yCf_u-C*%ZoQe&ODP`yXf;6#QY1L&x{)P zTkDQ96L#IUiF~W_##MOPI_6Y9H(}qg{E_V)c-^l3moD$0Q@H2w$4#$AhECl*|Ge<-!p~oww{P5!KTcV+a&z6q0ecoUjQ+;vc0r1z)ljWb zE8QW=iI@{9i7(Oijz#0TnD&zvt_ZTJrb&loV$AiEwU9F92@N|uPLGqJ zD$;6`i!8M}N;D-R&InXyAz1!k!R{obyjMYEf%DicI4uj)AETtFpb8G%r`q z!=#{IjU_EFAiI~Pp+>sN>J^(gV{NBrAmEx)W4 zRu$0_ImI18OxQZjt>jsL;*n|RbrwTYcQuv4$ z@f4$k70Tm94CP}LFNNH^hvRr3gWcgC5YsdjvJypmMrA@N02TJ|ir`Z?N=B^DgkmYg zARmQUA>#HSA*^^<3rdm2%7hj}aGYuk)nhstueT;l!o{+hpr3R(nQl!@6d4h4@RN6_ z@y2xbL`aR{nFcc1WW5aMcC(zD=Y3wE&(&=-8*4gbqKRphNo&SD77;cB#3D0K0l?D3 zUc_<@BO{@O5{amv%oW(&v;@~lK?VvS0|RKT6%oaXt^vUV*MBB1Q^nxU3#{1g;=Gtsf&t zk#$hF^o}LffX!0?!YGENSnf)~=N|CU7&_8yHe$uf8$fxr5tJ&f?zD{pQotnI&C+@Y>R0&g5F|NZwt4bO0C;te6_uH07QJe*x!(u95%% literal 0 HcmV?d00001 diff --git a/applications/system/hid_app/assets/Backspace_9x7.png b/applications/system/hid_app/assets/Backspace_9x7.png new file mode 100644 index 0000000000000000000000000000000000000000..e098cf676167cdd78687b61cc1b61caf6e6b5666 GIT binary patch literal 6628 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 literal 0 HcmV?d00001 diff --git a/applications/system/hid_app/assets/Cmd_pressed_17x10.png b/applications/system/hid_app/assets/Cmd_pressed_17x10.png new file mode 100644 index 0000000000000000000000000000000000000000..274c3e070ae42bccbb0b463aa3396a12486704f6 GIT binary patch literal 4234 zcmeHKd2AF_7@y^kvRttTF*Lz(Do`o2bL`IU&ZG;L-O{eIP@qDwiE(!3Z9A}+JJasA zMMRK8G;#^bQPF~;7!DyAP!7QZF`9COK*G^*$Pr0U&WI5FW_G)@N@AMGf8EL3_r33Z z-|v0z_rCY-&YNXpO8S@wm@y3N<1O`!hyHPB=8P`zeQF?a6S^&^!W-~!D?WtlQ{qfT_FD&j2|$CC>vnKV_r)Fs3e8ALtiCV?oY_ z{sUL^aeeb3D5W(w;+g+xP zFByq@i`{mHx7$f@!?47vnnle8o^jdxM_A|e9+%%sIlNgsU*ZeCyQpl5ZPcIJme*aF zyTWn3{;F?9aOsAo?|#_S{WVi1+K|0yF*()$?Tu9zKU?(kj>d-Jw;QhVry4BV^OR!l zr-o;LdA~j}>{4Un%G(o%pZRF%;5(P!9y-Tf$mKMx-PLk-%eieW8(+9{a?gdy^K;GH z*S|40+vk|Qf3~~elfd<5(KU+YW1Ki%sqv|7n8d^@|(qNQ$suzU0Kx?MtL7qIDfE-lL$bgg0c z^&tnI+emC3HLwvaUQ1uj!D#oRy~Z?8zr}ww>&Nxejt;tVW#rsdn=0>iIW()f{}Gdwg%nFDmCIkQoAx*>+pi6mnwTKNYMu^} z#PA?hiYZY|iG*<-Q}jn_G#5d@Jl+~#DC+a2;lpZ*1>l29h*65M&{QZywe?W7;#vSn z1@ur4wY)BhsPRaR)WjrIT#Le5URwxRO8ZA^VnJg&vP7XE3W2E#t1|7D)Gt@sL#Loh z2}KPrAiJHVrUV|4)h;%D#@J5VK)^kX+s?Xm?}jm0`Fw&WBGu^Oc|9&dUtf?Tk|GO+ z$S_VMvl2t{D8P_5&dQRaHQ*%eh-XBZ;bkPTZJ@kiRTIM!(xCv{q5zJAlMpN0{ba!E zL;%4e(k})?QetVw$@w{lO}4dx7#mX{E5%^jsB|b9plF*_lKe7D(z4_yZM@S@`kg#S zav~BD?{sji-)=z3k}xU~3yE-?N=U3iR5V;=Oz4CQMP*(W!CL4CnzEp%1;D{Yj8?)m zi3bzqN(fERM4e5>L336s!`ZEjgJ+z{m<_y%D5gRt>X=5EG~D%L5nwYwtf=QH02q4M zi{OqSQH#XNBaxtsNEg`jv=6S6ENY@h)DVECOKy2<$t|F*0-X$Bhx0{bB~bTY*81ha z3&9?ayi`$P{W?RHyipU-E6GuE7*vd_gyY7g5JV}t1y!s?vJod>C8wlnF0uV;h49Rf+B#cUJn9^%T>y8Vle{oW17_=!e;Fr`v@q$`NrHf&T zGl=(5eo|-gD3`$T&P6)JZzo-ybajY<4jFf5S0`N^VxU9Do!Rxj(Pe({I)%dUFDMQ# zOF3ld3cPAP=6}A#gWcDk4|lCw0-B!D(#a}@^~%zl30tx12~hUXyuRWdmrVWo^)9Gb z`qyz#m3loz<@wEx3-+2ZJi}di#{bR4m1}XD=la~3z(RV!Z literal 0 HcmV?d00001 diff --git a/applications/system/hid_app/assets/Ctrl_pressed_17x10.png b/applications/system/hid_app/assets/Ctrl_pressed_17x10.png new file mode 100644 index 0000000000000000000000000000000000000000..978a1090c2ee9f38e07c66adc5f4a3250885a048 GIT binary patch literal 4227 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 W(tV}+OFw`b5Nq>|)W6JpWB(JHjv}J~ literal 0 HcmV?d00001 diff --git a/applications/system/hid_app/views/hid_keyboard.c b/applications/system/hid_app/views/hid_keyboard.c index 9060c1d6a..1ee2c01c9 100644 --- a/applications/system/hid_app/views/hid_keyboard.c +++ b/applications/system/hid_app/views/hid_keyboard.c @@ -20,19 +20,18 @@ typedef struct { uint8_t x; uint8_t y; uint8_t last_key_code; - uint16_t modifier_code; bool ok_pressed; bool back_pressed; bool connected; - char key_string[5]; HidTransport transport; } HidKeyboardModel; typedef struct { uint8_t width; - char* key; + char key; + char shift_key; const Icon* icon; - char* shift_key; + const Icon* icon_toggled; uint8_t value; } HidKeyboardKey; @@ -66,85 +65,97 @@ const HidKeyboardKey hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { {.width = 1, .icon = &I_ButtonF12_5x8, .value = HID_KEYBOARD_F12}, }, { - {.width = 1, .icon = NULL, .key = "1", .shift_key = "!", .value = HID_KEYBOARD_1}, - {.width = 1, .icon = NULL, .key = "2", .shift_key = "@", .value = HID_KEYBOARD_2}, - {.width = 1, .icon = NULL, .key = "3", .shift_key = "#", .value = HID_KEYBOARD_3}, - {.width = 1, .icon = NULL, .key = "4", .shift_key = "$", .value = HID_KEYBOARD_4}, - {.width = 1, .icon = NULL, .key = "5", .shift_key = "%", .value = HID_KEYBOARD_5}, - {.width = 1, .icon = NULL, .key = "6", .shift_key = "^", .value = HID_KEYBOARD_6}, - {.width = 1, .icon = NULL, .key = "7", .shift_key = "&", .value = HID_KEYBOARD_7}, - {.width = 1, .icon = NULL, .key = "8", .shift_key = "*", .value = HID_KEYBOARD_8}, - {.width = 1, .icon = NULL, .key = "9", .shift_key = "(", .value = HID_KEYBOARD_9}, - {.width = 1, .icon = NULL, .key = "0", .shift_key = ")", .value = HID_KEYBOARD_0}, - {.width = 2, .icon = &I_Pin_arrow_left_9x7, .value = HID_KEYBOARD_DELETE}, + {.width = 1, .icon = NULL, .key = '1', .shift_key = '!', .value = HID_KEYBOARD_1}, + {.width = 1, .icon = NULL, .key = '2', .shift_key = '@', .value = HID_KEYBOARD_2}, + {.width = 1, .icon = NULL, .key = '3', .shift_key = '#', .value = HID_KEYBOARD_3}, + {.width = 1, .icon = NULL, .key = '4', .shift_key = '$', .value = HID_KEYBOARD_4}, + {.width = 1, .icon = NULL, .key = '5', .shift_key = '%', .value = HID_KEYBOARD_5}, + {.width = 1, .icon = NULL, .key = '6', .shift_key = '^', .value = HID_KEYBOARD_6}, + {.width = 1, .icon = NULL, .key = '7', .shift_key = '&', .value = HID_KEYBOARD_7}, + {.width = 1, .icon = NULL, .key = '8', .shift_key = '*', .value = HID_KEYBOARD_8}, + {.width = 1, .icon = NULL, .key = '9', .shift_key = '(', .value = HID_KEYBOARD_9}, + {.width = 1, .icon = NULL, .key = '0', .shift_key = ')', .value = HID_KEYBOARD_0}, + {.width = 2, .icon = &I_Backspace_9x7, .value = HID_KEYBOARD_DELETE}, {.width = 0, .value = HID_KEYBOARD_DELETE}, }, { - {.width = 1, .icon = NULL, .key = "q", .shift_key = "Q", .value = HID_KEYBOARD_Q}, - {.width = 1, .icon = NULL, .key = "w", .shift_key = "W", .value = HID_KEYBOARD_W}, - {.width = 1, .icon = NULL, .key = "e", .shift_key = "E", .value = HID_KEYBOARD_E}, - {.width = 1, .icon = NULL, .key = "r", .shift_key = "R", .value = HID_KEYBOARD_R}, - {.width = 1, .icon = NULL, .key = "t", .shift_key = "T", .value = HID_KEYBOARD_T}, - {.width = 1, .icon = NULL, .key = "y", .shift_key = "Y", .value = HID_KEYBOARD_Y}, - {.width = 1, .icon = NULL, .key = "u", .shift_key = "U", .value = HID_KEYBOARD_U}, - {.width = 1, .icon = NULL, .key = "i", .shift_key = "I", .value = HID_KEYBOARD_I}, - {.width = 1, .icon = NULL, .key = "o", .shift_key = "O", .value = HID_KEYBOARD_O}, - {.width = 1, .icon = NULL, .key = "p", .shift_key = "P", .value = HID_KEYBOARD_P}, - {.width = 1, .icon = NULL, .key = "[", .shift_key = "{", .value = HID_KEYBOARD_OPEN_BRACKET}, + {.width = 1, .icon = NULL, .key = 'q', .shift_key = 'Q', .value = HID_KEYBOARD_Q}, + {.width = 1, .icon = NULL, .key = 'w', .shift_key = 'W', .value = HID_KEYBOARD_W}, + {.width = 1, .icon = NULL, .key = 'e', .shift_key = 'E', .value = HID_KEYBOARD_E}, + {.width = 1, .icon = NULL, .key = 'r', .shift_key = 'R', .value = HID_KEYBOARD_R}, + {.width = 1, .icon = NULL, .key = 't', .shift_key = 'T', .value = HID_KEYBOARD_T}, + {.width = 1, .icon = NULL, .key = 'y', .shift_key = 'Y', .value = HID_KEYBOARD_Y}, + {.width = 1, .icon = NULL, .key = 'u', .shift_key = 'U', .value = HID_KEYBOARD_U}, + {.width = 1, .icon = NULL, .key = 'i', .shift_key = 'I', .value = HID_KEYBOARD_I}, + {.width = 1, .icon = NULL, .key = 'o', .shift_key = 'O', .value = HID_KEYBOARD_O}, + {.width = 1, .icon = NULL, .key = 'p', .shift_key = 'P', .value = HID_KEYBOARD_P}, + {.width = 1, .icon = NULL, .key = '[', .shift_key = '{', .value = HID_KEYBOARD_OPEN_BRACKET}, {.width = 1, .icon = NULL, - .key = "]", - .shift_key = "}", + .key = ']', + .shift_key = '}', .value = HID_KEYBOARD_CLOSE_BRACKET}, }, { - {.width = 1, .icon = NULL, .key = "a", .shift_key = "A", .value = HID_KEYBOARD_A}, - {.width = 1, .icon = NULL, .key = "s", .shift_key = "S", .value = HID_KEYBOARD_S}, - {.width = 1, .icon = NULL, .key = "d", .shift_key = "D", .value = HID_KEYBOARD_D}, - {.width = 1, .icon = NULL, .key = "f", .shift_key = "F", .value = HID_KEYBOARD_F}, - {.width = 1, .icon = NULL, .key = "g", .shift_key = "G", .value = HID_KEYBOARD_G}, - {.width = 1, .icon = NULL, .key = "h", .shift_key = "H", .value = HID_KEYBOARD_H}, - {.width = 1, .icon = NULL, .key = "j", .shift_key = "J", .value = HID_KEYBOARD_J}, - {.width = 1, .icon = NULL, .key = "k", .shift_key = "K", .value = HID_KEYBOARD_K}, - {.width = 1, .icon = NULL, .key = "l", .shift_key = "L", .value = HID_KEYBOARD_L}, - {.width = 1, .icon = NULL, .key = ";", .shift_key = ":", .value = HID_KEYBOARD_SEMICOLON}, - {.width = 2, .icon = &I_Pin_arrow_right_9x7, .value = HID_KEYBOARD_RETURN}, + {.width = 1, .icon = NULL, .key = 'a', .shift_key = 'A', .value = HID_KEYBOARD_A}, + {.width = 1, .icon = NULL, .key = 's', .shift_key = 'S', .value = HID_KEYBOARD_S}, + {.width = 1, .icon = NULL, .key = 'd', .shift_key = 'D', .value = HID_KEYBOARD_D}, + {.width = 1, .icon = NULL, .key = 'f', .shift_key = 'F', .value = HID_KEYBOARD_F}, + {.width = 1, .icon = NULL, .key = 'g', .shift_key = 'G', .value = HID_KEYBOARD_G}, + {.width = 1, .icon = NULL, .key = 'h', .shift_key = 'H', .value = HID_KEYBOARD_H}, + {.width = 1, .icon = NULL, .key = 'j', .shift_key = 'J', .value = HID_KEYBOARD_J}, + {.width = 1, .icon = NULL, .key = 'k', .shift_key = 'K', .value = HID_KEYBOARD_K}, + {.width = 1, .icon = NULL, .key = 'l', .shift_key = 'L', .value = HID_KEYBOARD_L}, + {.width = 1, .icon = NULL, .key = ';', .shift_key = ':', .value = HID_KEYBOARD_SEMICOLON}, + {.width = 2, .icon = &I_Return_10x7, .value = HID_KEYBOARD_RETURN}, {.width = 0, .value = HID_KEYBOARD_RETURN}, }, { - {.width = 1, .icon = NULL, .key = "z", .shift_key = "Z", .value = HID_KEYBOARD_Z}, - {.width = 1, .icon = NULL, .key = "x", .shift_key = "X", .value = HID_KEYBOARD_X}, - {.width = 1, .icon = NULL, .key = "c", .shift_key = "C", .value = HID_KEYBOARD_C}, - {.width = 1, .icon = NULL, .key = "v", .shift_key = "V", .value = HID_KEYBOARD_V}, - {.width = 1, .icon = NULL, .key = "b", .shift_key = "B", .value = HID_KEYBOARD_B}, - {.width = 1, .icon = NULL, .key = "n", .shift_key = "N", .value = HID_KEYBOARD_N}, - {.width = 1, .icon = NULL, .key = "m", .shift_key = "M", .value = HID_KEYBOARD_M}, - {.width = 1, .icon = NULL, .key = "/", .shift_key = "?", .value = HID_KEYBOARD_SLASH}, - {.width = 1, .icon = NULL, .key = "\\", .shift_key = "|", .value = HID_KEYBOARD_BACKSLASH}, - {.width = 1, .icon = NULL, .key = "`", .shift_key = "~", .value = HID_KEYBOARD_GRAVE_ACCENT}, + {.width = 1, .icon = NULL, .key = 'z', .shift_key = 'Z', .value = HID_KEYBOARD_Z}, + {.width = 1, .icon = NULL, .key = 'x', .shift_key = 'X', .value = HID_KEYBOARD_X}, + {.width = 1, .icon = NULL, .key = 'c', .shift_key = 'C', .value = HID_KEYBOARD_C}, + {.width = 1, .icon = NULL, .key = 'v', .shift_key = 'V', .value = HID_KEYBOARD_V}, + {.width = 1, .icon = NULL, .key = 'b', .shift_key = 'B', .value = HID_KEYBOARD_B}, + {.width = 1, .icon = NULL, .key = 'n', .shift_key = 'N', .value = HID_KEYBOARD_N}, + {.width = 1, .icon = NULL, .key = 'm', .shift_key = 'M', .value = HID_KEYBOARD_M}, + {.width = 1, .icon = NULL, .key = '/', .shift_key = '?', .value = HID_KEYBOARD_SLASH}, + {.width = 1, .icon = NULL, .key = '\\', .shift_key = '|', .value = HID_KEYBOARD_BACKSLASH}, + {.width = 1, .icon = NULL, .key = '`', .shift_key = '~', .value = HID_KEYBOARD_GRAVE_ACCENT}, {.width = 1, .icon = &I_ButtonUp_7x4, .value = HID_KEYBOARD_UP_ARROW}, - {.width = 1, .icon = NULL, .key = "-", .shift_key = "_", .value = HID_KEYBOARD_MINUS}, + {.width = 1, .icon = NULL, .key = '-', .shift_key = '_', .value = HID_KEYBOARD_MINUS}, }, { - {.width = 1, .icon = &I_Pin_arrow_up_7x9, .value = HID_KEYBOARD_L_SHIFT}, - {.width = 1, .icon = NULL, .key = ",", .shift_key = "<", .value = HID_KEYBOARD_COMMA}, - {.width = 1, .icon = NULL, .key = ".", .shift_key = ">", .value = HID_KEYBOARD_DOT}, - {.width = 4, .icon = NULL, .key = " ", .value = HID_KEYBOARD_SPACEBAR}, + {.width = 1, + .icon = &I_Pin_arrow_up_7x9, + .icon_toggled = &I_Shift_pressed_7x10, + .value = HID_KEYBOARD_L_SHIFT}, + {.width = 1, .icon = NULL, .key = ',', .shift_key = '<', .value = HID_KEYBOARD_COMMA}, + {.width = 1, .icon = NULL, .key = '.', .shift_key = '>', .value = HID_KEYBOARD_DOT}, + {.width = 4, .icon = NULL, .key = ' ', .value = HID_KEYBOARD_SPACEBAR}, {.width = 0, .value = HID_KEYBOARD_SPACEBAR}, {.width = 0, .value = HID_KEYBOARD_SPACEBAR}, {.width = 0, .value = HID_KEYBOARD_SPACEBAR}, - {.width = 1, .icon = NULL, .key = "'", .shift_key = "\"", .value = HID_KEYBOARD_APOSTROPHE}, - {.width = 1, .icon = NULL, .key = "=", .shift_key = "+", .value = HID_KEYBOARD_EQUAL_SIGN}, + {.width = 1, .icon = NULL, .key = '\'', .shift_key = '\"', .value = HID_KEYBOARD_APOSTROPHE}, + {.width = 1, .icon = NULL, .key = '=', .shift_key = '+', .value = HID_KEYBOARD_EQUAL_SIGN}, {.width = 1, .icon = &I_ButtonLeft_4x7, .value = HID_KEYBOARD_LEFT_ARROW}, {.width = 1, .icon = &I_ButtonDown_7x4, .value = HID_KEYBOARD_DOWN_ARROW}, {.width = 1, .icon = &I_ButtonRight_4x7, .value = HID_KEYBOARD_RIGHT_ARROW}, }, { - {.width = 2, .icon = &I_Ctrl_17x10, .value = HID_KEYBOARD_L_CTRL}, + {.width = 2, + .icon = &I_Ctrl_17x10, + .icon_toggled = &I_Ctrl_pressed_17x10, + .value = HID_KEYBOARD_L_CTRL}, {.width = 0, .value = HID_KEYBOARD_L_CTRL}, - {.width = 2, .icon = &I_Alt_17x10, .value = HID_KEYBOARD_L_ALT}, + {.width = 2, + .icon = &I_Alt_17x10, + .icon_toggled = &I_Alt_pressed_17x10, + .value = HID_KEYBOARD_L_ALT}, {.width = 0, .value = HID_KEYBOARD_L_ALT}, - {.width = 2, .icon = &I_Cmd_17x10, .value = HID_KEYBOARD_L_GUI}, + {.width = 2, + .icon = &I_Cmd_17x10, + .icon_toggled = &I_Cmd_pressed_17x10, + .value = HID_KEYBOARD_L_GUI}, {.width = 0, .value = HID_KEYBOARD_L_GUI}, {.width = 2, .icon = &I_Tab_17x10, .value = HID_KEYBOARD_TAB}, {.width = 0, .value = HID_KEYBOARD_TAB}, @@ -155,13 +166,6 @@ const HidKeyboardKey hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { }, }; -static void hid_keyboard_to_upper(char* str) { - while(*str) { - *str = toupper((unsigned char)*str); - str++; - } -} - static void hid_keyboard_draw_key( Canvas* canvas, HidKeyboardModel* model, @@ -192,28 +196,32 @@ static void hid_keyboard_draw_key( KEY_HEIGHT); } if(key.icon != NULL) { + const Icon* key_icon = key.icon; + if((model->ctrl && key.value == HID_KEYBOARD_L_CTRL) || + (model->alt && key.value == HID_KEYBOARD_L_ALT) || + (model->shift && key.value == HID_KEYBOARD_L_SHIFT) || + (model->gui && key.value == HID_KEYBOARD_L_GUI)) { + if(key.icon_toggled) { + key_icon = key.icon_toggled; + } + } // Draw the icon centered on the button canvas_draw_icon( canvas, - MARGIN_LEFT + x * (KEY_WIDTH + KEY_PADDING) + keyWidth / 2 - key.icon->width / 2, - MARGIN_TOP + y * (KEY_HEIGHT + KEY_PADDING) + KEY_HEIGHT / 2 - key.icon->height / 2, - key.icon); + MARGIN_LEFT + x * (KEY_WIDTH + KEY_PADDING) + keyWidth / 2 - key_icon->width / 2, + MARGIN_TOP + y * (KEY_HEIGHT + KEY_PADDING) + KEY_HEIGHT / 2 - key_icon->height / 2, + key_icon); } else { + char key_str[2] = "\0\0"; // If shift is toggled use the shift key when available - strcpy(model->key_string, (model->shift && key.shift_key != 0) ? key.shift_key : key.key); - // Upper case if ctrl or alt was toggled true - if((model->ctrl && key.value == HID_KEYBOARD_L_CTRL) || - (model->alt && key.value == HID_KEYBOARD_L_ALT) || - (model->gui && key.value == HID_KEYBOARD_L_GUI)) { - hid_keyboard_to_upper(model->key_string); - } + key_str[0] = (model->shift && key.shift_key != 0) ? key.shift_key : key.key; canvas_draw_str_aligned( canvas, MARGIN_LEFT + x * (KEY_WIDTH + KEY_PADDING) + keyWidth / 2 + 1, MARGIN_TOP + y * (KEY_HEIGHT + KEY_PADDING) + KEY_HEIGHT / 2, AlignCenter, AlignCenter, - model->key_string); + key_str); } } @@ -244,6 +252,8 @@ static void hid_keyboard_draw_callback(Canvas* canvas, void* context) { initY = model->y - 4; } + elements_scrollbar(canvas, initY, 3); + for(uint8_t y = initY; y < ROW_COUNT; y++) { const HidKeyboardKey* keyboardKeyRow = hid_keyboard_keyset[y]; uint8_t x = 0; @@ -286,6 +296,14 @@ static void hid_keyboard_get_select_key(HidKeyboardModel* model, HidKeyboardPoin 0); // Skip zero width keys, pretend they are one key } +static void hid_keyboard_modifier_set(Hid* hid, uint16_t keycode, bool is_pressed) { + if(is_pressed) { + hid_hal_keyboard_press(hid, keycode); + } else { + hid_hal_keyboard_release(hid, keycode); + } +} + static void hid_keyboard_process(HidKeyboard* hid_keyboard, InputEvent* event) { with_view_model( hid_keyboard->view, @@ -300,35 +318,25 @@ static void hid_keyboard_process(HidKeyboard* hid_keyboard, InputEvent* event) { // Toggle the modifier key when clicked, and click the key if(model->last_key_code == HID_KEYBOARD_L_SHIFT) { model->shift = !model->shift; - if(model->shift) - model->modifier_code |= KEY_MOD_LEFT_SHIFT; - else - model->modifier_code &= ~KEY_MOD_LEFT_SHIFT; + hid_keyboard_modifier_set( + hid_keyboard->hid, KEY_MOD_LEFT_SHIFT, model->shift); } else if(model->last_key_code == HID_KEYBOARD_L_ALT) { model->alt = !model->alt; - if(model->alt) - model->modifier_code |= KEY_MOD_LEFT_ALT; - else - model->modifier_code &= ~KEY_MOD_LEFT_ALT; + hid_keyboard_modifier_set(hid_keyboard->hid, KEY_MOD_LEFT_ALT, model->alt); } else if(model->last_key_code == HID_KEYBOARD_L_CTRL) { model->ctrl = !model->ctrl; - if(model->ctrl) - model->modifier_code |= KEY_MOD_LEFT_CTRL; - else - model->modifier_code &= ~KEY_MOD_LEFT_CTRL; + hid_keyboard_modifier_set( + hid_keyboard->hid, KEY_MOD_LEFT_CTRL, model->ctrl); } else if(model->last_key_code == HID_KEYBOARD_L_GUI) { model->gui = !model->gui; - if(model->gui) - model->modifier_code |= KEY_MOD_LEFT_GUI; - else - model->modifier_code &= ~KEY_MOD_LEFT_GUI; + hid_keyboard_modifier_set(hid_keyboard->hid, KEY_MOD_LEFT_GUI, model->gui); + } else { + hid_hal_keyboard_press(hid_keyboard->hid, model->last_key_code); } - hid_hal_keyboard_press( - hid_keyboard->hid, model->modifier_code | model->last_key_code); + } else if(event->type == InputTypeRelease) { // Release happens after short and long presses - hid_hal_keyboard_release( - hid_keyboard->hid, model->modifier_code | model->last_key_code); + hid_hal_keyboard_release(hid_keyboard->hid, model->last_key_code); model->ok_pressed = false; } } else if(event->key == InputKeyBack) { @@ -364,6 +372,16 @@ static bool hid_keyboard_input_callback(InputEvent* event, void* context) { if(event->type == InputTypeLong && event->key == InputKeyBack) { hid_hal_keyboard_release_all(hid_keyboard->hid); + with_view_model( + hid_keyboard->view, + HidKeyboardModel * model, + { + model->shift = false; + model->alt = false; + model->ctrl = false; + model->gui = false; + }, + true); } else { hid_keyboard_process(hid_keyboard, event); consumed = true; From 962d809ad7b2dde665ef431be90d07b1ad1be4dc Mon Sep 17 00:00:00 2001 From: tomellens <156447023+tomellens@users.noreply.github.com> Date: Fri, 9 Feb 2024 09:39:35 +0000 Subject: [PATCH 2/3] Update tv.ir (#3399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- .../infrared/resources/infrared/assets/tv.ir | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/applications/main/infrared/resources/infrared/assets/tv.ir b/applications/main/infrared/resources/infrared/assets/tv.ir index d10e14df2..8a646ae51 100644 --- a/applications/main/infrared/resources/infrared/assets/tv.ir +++ b/applications/main/infrared/resources/infrared/assets/tv.ir @@ -1724,3 +1724,41 @@ type: parsed protocol: RC6 address: 00 00 00 00 command: 21 00 00 00 +# +# Sony KD-55AG8 Smart TV +# +name: Power +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 15 00 00 00 +# +name: Mute +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 14 00 00 00 +# +name: Vol_up +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 12 00 00 00 +# +name: Vol_dn +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 13 00 00 00 +# +name: Ch_next +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 10 00 00 00 +# +name: Ch_prev +type: parsed +protocol: Sony SIRC +address: 01 00 00 00 +command: 11 00 00 00 From bcdb9cb13cbcea9d487e9f6f18d8f50c95ec3609 Mon Sep 17 00:00:00 2001 From: JuicyPigWalker <34217507+JuicyPigWalker@users.noreply.github.com> Date: Fri, 9 Feb 2024 11:12:46 +0100 Subject: [PATCH 3/3] Update tv.ir (#3421) * Update tv.ir: Added tv "TCL 50P715X1" recorded remote signals. Hope everything is okay, this is my first GitHub contribution. * Update tv.ir: Fixed my own mistakes when uploading the signals. * Infrared: revert 962d809ad7b2dde665ef431be90d07b1ad1be4dc Co-authored-by: Yoel <34217507+yoelci@users.noreply.github.com> Co-authored-by: Aleksandr Kutuzov --- .../infrared/resources/infrared/assets/tv.ir | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/applications/main/infrared/resources/infrared/assets/tv.ir b/applications/main/infrared/resources/infrared/assets/tv.ir index 8a646ae51..ff8101b90 100644 --- a/applications/main/infrared/resources/infrared/assets/tv.ir +++ b/applications/main/infrared/resources/infrared/assets/tv.ir @@ -1724,41 +1724,41 @@ type: parsed protocol: RC6 address: 00 00 00 00 command: 21 00 00 00 -# -# Sony KD-55AG8 Smart TV -# +# +# Model TCL 50P715X1 +# name: Power type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 15 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: 54 00 00 00 # name: Mute type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 14 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: FC 00 00 00 # name: Vol_up type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 12 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: F4 00 00 00 # name: Vol_dn type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 13 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: 74 00 00 00 # name: Ch_next type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 10 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: B4 00 00 00 # name: Ch_prev type: parsed -protocol: Sony SIRC -address: 01 00 00 00 -command: 11 00 00 00 +protocol: RCA +address: 0F 00 00 00 +command: 34 00 00 00