From 85a94516f75f7c898d6c2cfd456c2aee97668175 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 27 Mar 2025 16:31:32 +0600 Subject: [PATCH 1/5] Caps/Num/Scroll LED states are now displayed --- src/device/keyboard.c | 15 +++++++++------ src/device/keyboard_at.c | 3 +++ src/qt/qt_mainwindow.cpp | 33 +++++++++++++++++++++++++++++++++ src/qt/qt_mainwindow.hpp | 3 +++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/device/keyboard.c b/src/device/keyboard.c index a00968cf7..aa9aba3c6 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -72,9 +72,9 @@ static int keydelay[512]; #endif static scancode *scan_table; /* scancode table for keyboard */ -static uint8_t caps_lock = 0; -static uint8_t num_lock = 0; -static uint8_t scroll_lock = 0; +static volatile uint8_t caps_lock = 0; +static volatile uint8_t num_lock = 0; +static volatile uint8_t scroll_lock = 0; static uint8_t shift = 0; static int key5576mode = 0; @@ -318,13 +318,16 @@ keyboard_input(int down, uint16_t scan) shift &= ~0x80; break; case 0x03a: /* Caps Lock */ - caps_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + caps_lock ^= 1; break; case 0x045: - num_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + num_lock ^= 1; break; case 0x046: - scroll_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + scroll_lock ^= 1; break; default: diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index e61b8547a..c5f73459b 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3476,6 +3476,7 @@ keyboard_at_bat(void *priv) keyboard_scan = 1; + keyboard_update_states(0, 0, 0); kbc_at_dev_queue_add(dev, 0xaa, 0); } else { bat_counter--; @@ -3510,6 +3511,7 @@ keyboard_at_write(void *priv) switch (dev->command) { case 0xed: /* Set/reset LEDs */ kbc_at_dev_queue_add(dev, 0xfa, 0); + keyboard_update_states(!!(val & 0x4), !!(val & 0x2), val & 0x1); keyboard_at_log("%s: Set/reset LEDs [%02X]\n", dev->name, val); break; @@ -3762,6 +3764,7 @@ keyboard_at_init(const device_t *info) if (dev->port != NULL) { kbc_at_dev_reset(dev, 0); + keyboard_update_states(0, 0, 0); bat_counter = 0x0000; } diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index b3d0d9fa9..9f63bf297 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -184,6 +184,32 @@ MainWindow::MainWindow(QWidget *parent) ui->menuEGA_S_VGA_settings->menuAction()->setMenuRole(QAction::NoRole); ui->stackedWidget->setMouseTracking(true); statusBar()->setVisible(!hide_status_bar); + + num_label = new QLabel; + num_label->setText(" NUM "); + statusBar()->addPermanentWidget(num_label); + + scroll_label = new QLabel; + scroll_label->setText(" SCRL "); + statusBar()->addPermanentWidget(scroll_label); + + caps_label = new QLabel; + caps_label->setText(" CAPS "); + statusBar()->addPermanentWidget(caps_label); + + QTimer* ledKeyboardTimer = new QTimer(this); + ledKeyboardTimer->setTimerType(Qt::CoarseTimer); + ledKeyboardTimer->setInterval(1); + connect(ledKeyboardTimer, &QTimer::timeout, this, [this] () { + uint8_t caps, num, scroll; + keyboard_get_states(&caps, &num, &scroll); + + num_label->setStyleSheet(num ? "QLabel { background: green; }" : ""); + caps_label->setStyleSheet(caps ? "QLabel { background: green; }" : ""); + scroll_label->setStyleSheet(scroll ? "QLabel { background: green; }" : ""); + }); + ledKeyboardTimer->start(); + #ifdef Q_OS_WINDOWS util::setWin11RoundedCorners(this->winId(), (hide_status_bar ? false : true)); #endif @@ -211,6 +237,9 @@ MainWindow::MainWindow(QWidget *parent) connect(this, &MainWindow::hardResetCompleted, this, [this]() { ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); + num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); #ifdef USE_WACOM @@ -1306,6 +1335,10 @@ MainWindow::refreshMediaMenu() status->refresh(ui->statusbar); ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); + + num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index f1c6cadf6..06a739dd8 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -184,6 +185,8 @@ private: friend class RendererStack; // For UI variable access by non-primary renderer windows. friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. + QLabel *caps_label, *scroll_label, *num_label; + bool isShowMessage = false; }; From 81e6b2a40a292474a03a2e1df38f774f53277f5d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 27 Mar 2025 16:58:42 +0600 Subject: [PATCH 2/5] Correct the order --- src/qt/qt_mainwindow.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 9f63bf297..3ee8d61b4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -189,14 +189,14 @@ MainWindow::MainWindow(QWidget *parent) num_label->setText(" NUM "); statusBar()->addPermanentWidget(num_label); - scroll_label = new QLabel; - scroll_label->setText(" SCRL "); - statusBar()->addPermanentWidget(scroll_label); - caps_label = new QLabel; caps_label->setText(" CAPS "); statusBar()->addPermanentWidget(caps_label); + scroll_label = new QLabel; + scroll_label->setText(" SCRL "); + statusBar()->addPermanentWidget(scroll_label); + QTimer* ledKeyboardTimer = new QTimer(this); ledKeyboardTimer->setTimerType(Qt::CoarseTimer); ledKeyboardTimer->setInterval(1); From 8861741945404350589613bbe2ab4157c0f30c8c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 28 Mar 2025 00:10:16 +0600 Subject: [PATCH 3/5] Some needed changes for hard resets --- src/86box.c | 3 +++ src/device/keyboard.c | 2 +- src/device/keyboard_at.c | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/86box.c b/src/86box.c index 2b6e1ba9f..57faa89c1 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1301,6 +1301,9 @@ pc_reset_hard_init(void) /* Mark ACPI as unavailable */ acpi_enabled = 0; + /* Reset all keyboard indicators */ + keyboard_update_states(0, 0, 0); + /* Reset the general machine support modules. */ io_init(); diff --git a/src/device/keyboard.c b/src/device/keyboard.c index aa9aba3c6..7666b0e70 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -75,7 +75,7 @@ static scancode *scan_table; /* scancode table for keyboard */ static volatile uint8_t caps_lock = 0; static volatile uint8_t num_lock = 0; static volatile uint8_t scroll_lock = 0; -static uint8_t shift = 0; +static uint8_t shift = 0; static int key5576mode = 0; diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index c5f73459b..605f51e90 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3764,12 +3764,12 @@ keyboard_at_init(const device_t *info) if (dev->port != NULL) { kbc_at_dev_reset(dev, 0); - keyboard_update_states(0, 0, 0); bat_counter = 0x0000; } keyboard_send = add_data_kbd; SavedKbd = dev; + keyboard_update_states(0, 0, 0); inv_cmd_response = (dev->type & FLAG_PS2) ? 0xfe : 0xfa; @@ -3788,6 +3788,8 @@ keyboard_at_close(void *priv) /* Disable the scancode maps. */ keyboard_set_table(NULL); + keyboard_update_states(0, 0, 0); + SavedKbd = NULL; free(dev); From 7e3cf32dcacc9b6af1b709c78323cbb3e6fd9cf0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 28 Mar 2025 00:15:06 +0600 Subject: [PATCH 4/5] Remove some no-more-needed changes --- src/86box.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/86box.c b/src/86box.c index 57faa89c1..2b6e1ba9f 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1301,9 +1301,6 @@ pc_reset_hard_init(void) /* Mark ACPI as unavailable */ acpi_enabled = 0; - /* Reset all keyboard indicators */ - keyboard_update_states(0, 0, 0); - /* Reset the general machine support modules. */ io_init(); From 3d233fc4b44b9881df2b03f9289862a57707d3f3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 6 May 2025 13:06:44 +0600 Subject: [PATCH 5/5] Use icons for the indicators --- src/qt/icons/caps_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/caps_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/kana_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/kana_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/num_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/num_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/scroll_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/scroll_lock_on.ico | Bin 0 -> 9622 bytes src/qt/qt_mainwindow.cpp | 37 ++++++++++++++++++++----------- src/qt/qt_mainwindow.hpp | 3 +++ src/qt_resources.qrc | 8 +++++++ 11 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 src/qt/icons/caps_lock_off.ico create mode 100644 src/qt/icons/caps_lock_on.ico create mode 100644 src/qt/icons/kana_lock_off.ico create mode 100644 src/qt/icons/kana_lock_on.ico create mode 100644 src/qt/icons/num_lock_off.ico create mode 100644 src/qt/icons/num_lock_on.ico create mode 100644 src/qt/icons/scroll_lock_off.ico create mode 100644 src/qt/icons/scroll_lock_on.ico diff --git a/src/qt/icons/caps_lock_off.ico b/src/qt/icons/caps_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..6895c735cf1d2d0cdc497f20bd810e9d2ef22892 GIT binary patch literal 9622 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 literal 0 HcmV?d00001 diff --git a/src/qt/icons/kana_lock_off.ico b/src/qt/icons/kana_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..27c9b88c25d39dde2f48fe5fbf5283fec9dd1541 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkEXtBnQGEaS#Tv zK^VjaVGtXHap?!yRbOBK9|k~r(D@)W`1FJ1L4E<50n(3+k550ypCAmg7i0!98)P0X z{UE=AFh~yw!`y((#-|@72eS*L7afDl0ja@dKS&OQL1rL_0f-O6AUTlxaOns68-_t@ zL3%)Tg2X_4kX{f?jDCaQ^sJ^gHrB* z;*%1L91oyy1z~EL2Z}2@JG=iN3^EslL1u$!WDF7mVVD?*4a3Op1DOZHpmYes$Y~Q< z3?vRp^B@c|mymfNbs!9~4`dFA4Z|QY5Qg!IF%M)0$gQAq0Hhb>9*`I)UxLIy7$go7 zgSibvgTz4T6Qmc0L26(aB!;XPB#tfyG6#kUnFn$gx_)#%%q$R%%RG=dFbwk}NG(VV znGbR=$Q&33sX_NIESy1dFbwlEI-eNxKx$xa0GWdegUkl0g}DtxgT&C?2T}vVpl|}2 z3!*`0g4DwJAR43w^d+4B~?@D8GZk4unB=qK6+Syhyr zP+CLApm+dIZvjEzo%XH5EeM0e(cK9W2Vs~$ zKxTpTfy{+rkQhGmLF%!Y0rLYkIhffXni%szc7QOtJ7IR9`we6+4C68%zAiF?%V0@4m2!r?_vqAnQCjEoL6&-`jfSC`H1DOY+VHjjK2oqyIx?YeOAa@cn zAEb|1^FeBnF|zr{;^=Hb=7Zdd4TH=9g%K$HLGmCzh=yShAB4#@AK4rj8<_@~4Z@)M z17G?9g##rRWIoIfAitugPfE;&=>?e&!n86UWDm@IP-_L`2N1^Ah9XA{WEKd6%x+*{ zq((ajs~I4(LG3Wm7^MSJJFEdTa0#*;6Js?86wWlpG;OEB(mO61AYc4InXOvytUt?nGBZuKghYf^c139mr@f289E<`MBHwQU}81+7Hr8$bOJK z2xD_2NIwWuVn0YfF7sjWKuDg}_TzISNRCqbL1qy0BQAN6UTWA6G6y-G5lV+Jd5}I* z?Fab<8%9rKAT=QKK{N=X%Y)=Vm=ybAX$s_iY#5vg|AXdNu+Og|%Y*C&VN&b|sYecH zn0chqAh(0e0^y-%KPWCiVStQ5aSOt*Z~*xa#79%j4pc<9}>s!NLIK4p97q)WE_R#Kwh* zwI5_Yu^40*A+;biAUx3a!`k+Q+Ml2{C@nC^eh?lg`$2vJ*$;{bkQ+d02iE@r$<8h2vLED6nEjxxI4BH2n4B>Ma`b@g0%4Hd4WMOAAjSY-klg@Xm{xlL literal 0 HcmV?d00001 diff --git a/src/qt/icons/kana_lock_on.ico b/src/qt/icons/kana_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec171b52bdab0120f9dbd1f7b9fedc2ec7e9eceb GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJ9$dVSa&`ip0mNAIbiPx`zKS0J5jPt{%n(yBp+J zkT}G01_lO@{Yd&jE@`NTm;qMzpW%N)1AI7#Jq7QQ#obwZhT@xirE?63Zb_IRL|;G>xlVf~g^u2AK&; z`)~(>(giFXA*E+fnkIx{c4L?aN{b*f(ai&;Pi$gPalGb%%tX=)%7dV^0=63}4ikfk zlVTpouQ2^6W+IiDq?!jd6G=aqk5uN8V;*w(3o;M63?|w* z=E1@ZtPuwRGMiZQK>h-m3C2j_1@b$n4g-mU)j;cZkl85d8I)E)7@96XYGD|p7vw~+ z9yEDU+=px)$V_UP2QwENjn#diavM}nfH260}S^68yMs%!XPt1W`XK02?hoR1EltG0w-0SOsZkvd<>0W zYOoRZQ&6vg(i}1d)k)N@=a9_@u|ak~!vW$4P&$L9ZM1R#Ti(Mb1~MOnG0X?$2ap}u z%m?KWY~mm>kQ@ku*r0YgiRB!qJOZUhuzR3pz}yd$LzV}*9fZN^A)$llKY;vzW(LSC zm^olQX!0;Qm>nRqK^Ux-Nb?EV0jdiIyZInLAiER9hhb1XMydNjX5lg)SsWDhAWT&F zgVG%uhPe}}A6|~Y#6f0*FjO8A!=U^HN;@D7O&`eV0;HE13^EgBHVA{*5W|uBw@BuL z!UJRn7}q!a2ZaGjAGfalKPcS6xUS(pNF7)YiTMkp2Zlj*fcyb=8`PgLIT#IcI|zf- zz&wB@d|>L4X^=@rG(;iBYd)wB zpajF*2FaH&ACTX!0;N4<3h=F(eE?`2d49@&lPYN%m9viZ2;0hb%8VL!-^ zxXcI1fiNyNQp-O@Sp(s42b6oGwP9{h+V~g#ic; zg#SVIlZvSs|D@UtQcuu+P#YN31_ZT1X@p^J0LK}m^$+PogX{)jko`2qAU6!8{opk% skop1^0+28O_5VSAAzEUP9UzRbc|cj9GV}lg19Jld10y{#$WD;m0BH0!vH$=8 literal 0 HcmV?d00001 diff --git a/src/qt/icons/num_lock_off.ico b/src/qt/icons/num_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..5b14da1d4c3490e38cbda89bc89a53fc493b890f GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk**hC$*92?_r}7-T-k&FK0;axe^155gcdAQ~nP zqH*a5sYAvfH~s(r9~`d8;^gQD*$Xp+82uoB*VosBtOwgqjDClI zD+Z@UkiRL!DCG_)J}JQ`ss!$e57(K>E=!NI%G(AR2^0@*o<7$uSS4AA~{rK{N=1*dPqb z@A&c?$Zw=zka;jSg3LhGxKzczKWL5)% z{C@@peyU)QS)h7Lf`Ng-0I7YPzzMPmE2dVxg>DX2>oHh*gVD(G3W^sHhRIQbMm8T5 z_nE=7ZuDWIhNZ`vWA7jtS*2 zkQw+e$UKlgKs2&C5Fdo8VLr0CFgD0+5C+vB_{wLH|0%&B^I?7frD;(6f)ewv=>?e& z!n86UWGBpgP-_L`2N1^Ah9XA{WEKd6%x+*{L~pZDjSn&#)D8oUQ92;C!x}&XmmteA zG1cq_#SICVrtLIXddEeB+zE;gSiFPc9+z5Lh$Gt%aswz2fiTD&w7}?oK)0XPZXm{f zkQ+ed6*V!at_5LOn8MtF&Htp>4=ZDlX>9HW*$u*!+7B`VgwgE)`2&Pu;vh934CBLS zO6`Z4gG|@e)q$#IFowASo82Hi^spb7-PE=p7U$Uf53&mzrndh zWj+QZkBq79e~{Uu_Cw~PKyd)ef1q%|hKED=gVH<TI16y_j|>~E0WAWRSYL4E_-55nkfpqKr)+(1wJk=+1F z4KcFj$RmKKL`(${UCqB><4wlL16&G;?eIpy}KI literal 0 HcmV?d00001 diff --git a/src/qt/icons/num_lock_on.ico b/src/qt/icons/num_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..0dd08d7ae4594ca8f076a41145181800c344c140 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJAQ+gZzbLI#&HS>~E-V_zwbL`=DmfQ-6J3J;-`U zc# $lnYMWb1FJgZLd}0NMVBnnA99P^^O70it0TBm5~%KOp@FplJ}4j*u}ZU4Sr5 z48#UuNZ3NsABY5*0m7iPh!2C*fG|i86)-4n4lw`!-@r&32I&Fm1(h=*43P4M5nS3Z zFic>hg2RY60+O~N;Ykh~VH1hv5GWnNFsS^(RW8BQkV=Eh1gCqL3qk1umX4r#8J4CA z(J;F)%mbxGkeT?*1BES`JYMraW}>Nwxer@;2$CBt=3y%@2Zj4UalpXvzrG%`JSWF} zpfVAZe?jR1MuW_OVRGUFW+t`F1GxoeCdi#2J`9uNKDgex28`56iFq({k!h^vfy!-A zJpsa?JVGJ{nF$UDSb2bK9w-l!f?;+;(iO}^1_qFsAPg#NNWmaIAdE1Hsw_~NI>2E6 zzkxxXA`CJEWEQC2l3-w9FhFV_CvZ~L$)p-aPThr155j&5>NQZBL&l&wiQ4rXviTr3 z$PScr4oZixw2hH-k#ikkHpqMs#xNh0A3$~xYd$F7U{MP)8-%f%53&P`9&}gZsv|+_ zKxTvRU^X9D9XeFpKh(pYChiBNcM$&1@V}t}(ys%jLA3M?N}C`ImV=c*p!^F;`yh;_ z9+W0P7`dLu)y4sk z1r|Oa8srBM2IU1xFvtuL2AN3*3`)lb7?}SzFfdXTgUke(4Qhvh#wZ<-+F=c#flE60 zjZ7=>wYg{^hj1oRI}X%FqBW*f z=>fUt|NsBsFa_~J`am=Y6VhK_Uk}m>$1rz*^nx%U{UCqC%z)`7#ePcl!|aB60OSUc znIN}=Fd_GY)Q}T?AUlvT$Q>X)$UGPgV&k$Oqy`;>)WgI;Y!C*e9S{cj3zmLC?j;t3 z^nx(C`a$-<^n-FU$PFMYFE9U}7z|Pi!XUj3jG#119tPEeIT{iFi0=5IEW9zp!|+6zk&Qm3I>@6b0a8?!pbXB z%s^KQG7p5QWgf_Un0cVmALK?5CZL2(aCqaX~j2O9?2iA@|?45S8z z(ai_h0m@srFeo45k^_}RAPlmLRP#alK<0wn1EOJk5F3U;VjxVa`5-rgFsN(-m7nqKgiu6J}53h zcB5l*+z&DXly+g}gZQ}cU^5>S79dQ^@If~p6gJcfe~`OD7!>v}4B~_08Jj)igg?kU znAsp2m)RiuNHrf6HXsbM1E1N%m=7`w7Y5k@k^`9oqLDF341@`}A6XAJHpmQI;vhLt z{eiE12IV74FvxtEA3$LVYF|)d9yYxo^Ff$a=7a2nnGb5MfcyZ$*xFF!h=I%kVUXDk z42-JrN30n@ad221a_XplQW@d1l>P~78E zOAB#i`$291;_?K+YfR-2!regnGd4zVQSeA@;As{P@N3IAT~&hkQ*qqA7lpz*VWa5tVO}ZxPemp zL17E3%TX*w;(*)$QiCfTD77D--7sh1a|5OJgZu`{AE59DVPrc&e2^SS4K7Tn{h+vq zVUT^u_JhQ6*$We=)P9gTAbUU&_(?S?f}_|%?*^=4>A{@8}Qi; z(o3oR*y0}Me~{fEd2Id$*$u*!+7B`VWCsXiOMm$62I-}S{UCEd_Jc4eE28k2G z#M%!sj}#2D7oU2NJP6auetdR=H!o!t4ii#X(^J!sLu8kfR4=7YKvwZU8M~0x<>vgX{(Xr%WZ^ literal 0 HcmV?d00001 diff --git a/src/qt/icons/scroll_lock_on.ico b/src/qt/icons/scroll_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..33476406a5a559008e9628c0772333e9fd7b08e3 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJ846gZzYMGFJUq>~E-R_zwbLyO7KvMn6n1NIwW8 zn?a0zkZOoo|VMU_-l2_%KKf2!r%c0fQ3A0p|bz8yHE$AUzqjvc|I?Eg0~$Ww$tW`N8B)mst_3=9TH?c)Sa8aSMI zBVlQoS~S9D3hFgbnnT8*I*Ho#9J2W!HpmW?bPh^~u(XX0IW z?EOKQ+d(wQ?I28!`)O_dPz`@jT7u zL3IEn80I!mJpl_J5DoGJ2!qOMN-)R_5C)k^2MkKj2N;D{}sMS6r)*OU0k=k*fHWIBdt=oB^e25Q&{D)EwfbtDAZ{pKOEjg_A zgUTSN8wizUQYS@p@Zjk*TjLQwwupgA3L2dxyy1F`$bzls# z6C?)0AT`)9wd{wPjokJG*$)%PMN`{;Sib-i0HgNf3U!3|a0~wdOMkF3AHDpAiQ_1T zsS*C5{0&O)_%N=#Kn?prsR^GOaM=yk2OZnSTK~i9UJ#8V{6J>FFg7>fvm2z3TK)%_ z1;WT~AY?aKJr(^AG7p47ZUA8rn-He9{|VWLEHV-HZRE{5DU|?=wU|^&t J2H6R+8vt4;^acO` literal 0 HcmV?d00001 diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index aee23b18d..905a100f4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -187,16 +187,24 @@ MainWindow::MainWindow(QWidget *parent) ui->stackedWidget->setMouseTracking(true); statusBar()->setVisible(!hide_status_bar); + num_icon = QIcon(":/settings/qt/icons/num_lock_on.ico"); + num_icon_off = QIcon(":/settings/qt/icons/num_lock_off.ico"); + scroll_icon = QIcon(":/settings/qt/icons/scroll_lock_on.ico"); + scroll_icon_off = QIcon(":/settings/qt/icons/scroll_lock_off.ico"); + caps_icon = QIcon(":/settings/qt/icons/caps_lock_on.ico"); + caps_icon_off = QIcon(":/settings/qt/icons/caps_lock_off.ico"); + /* TODO: Add Kana indicator here after the keyboard type work is done. */ + num_label = new QLabel; - num_label->setText(" NUM "); + num_label->setPixmap(num_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(num_label); caps_label = new QLabel; - caps_label->setText(" CAPS "); + caps_label->setPixmap(caps_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(caps_label); scroll_label = new QLabel; - scroll_label->setText(" SCRL "); + scroll_label->setPixmap(scroll_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(scroll_label); QTimer* ledKeyboardTimer = new QTimer(this); @@ -205,10 +213,13 @@ MainWindow::MainWindow(QWidget *parent) connect(ledKeyboardTimer, &QTimer::timeout, this, [this] () { uint8_t caps, num, scroll; keyboard_get_states(&caps, &num, &scroll); - - num_label->setStyleSheet(num ? "QLabel { background: green; }" : ""); - caps_label->setStyleSheet(caps ? "QLabel { background: green; }" : ""); - scroll_label->setStyleSheet(scroll ? "QLabel { background: green; }" : ""); + + if (num_label->isVisible()) + num_label->setPixmap(num ? this->num_icon.pixmap(QSize(16, 16)) : this->num_icon_off.pixmap(QSize(16, 16))); + if (caps_label->isVisible()) + caps_label->setPixmap(caps ? this->caps_icon.pixmap(QSize(16, 16)) : this->caps_icon_off.pixmap(QSize(16, 16))); + if (scroll_label->isVisible()) + scroll_label->setPixmap(scroll ? this->scroll_icon.pixmap(QSize(16, 16)) : this->scroll_icon_off.pixmap(QSize(16, 16))); }); ledKeyboardTimer->start(); @@ -239,9 +250,9 @@ MainWindow::MainWindow(QWidget *parent) connect(this, &MainWindow::hardResetCompleted, this, [this]() { ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); - num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + num_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + caps_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); #ifdef USE_WACOM @@ -1485,9 +1496,9 @@ MainWindow::refreshMediaMenu() ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); - num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + num_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + caps_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 2ba29c128..421b9ce15 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -191,6 +192,8 @@ private: friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. QLabel *caps_label, *scroll_label, *num_label; + QIcon caps_icon, scroll_icon, num_icon; + QIcon caps_icon_off, scroll_icon_off, num_icon_off; bool isShowMessage = false; }; diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index bc553ac61..a5963c152 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -34,6 +34,14 @@ qt/icons/86Box-green.ico qt/icons/86Box-red.ico qt/icons/86Box-yellow.ico + qt/icons/caps_lock_off.ico + qt/icons/caps_lock_on.ico + qt/icons/kana_lock_off.ico + qt/icons/kana_lock_on.ico + qt/icons/num_lock_off.ico + qt/icons/num_lock_on.ico + qt/icons/scroll_lock_off.ico + qt/icons/scroll_lock_on.ico qt/icons/acpi_shutdown.ico