From e68296aa2d7e3338231e3d9e0ec3102cfda4f0f3 Mon Sep 17 00:00:00 2001 From: Grannik Date: Fri, 4 Apr 2025 18:16:52 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bAcpi.sh | 248 ++++++++++++++++++++++++++++++ bAcpiDescription.txt | 64 ++++++++ mAcpi | Bin 0 -> 33904 bytes mAcpi.c | 352 +++++++++++++++++++++++++++++++++++++++++++ mAcpiDescription.txt | 65 ++++++++ 5 files changed, 729 insertions(+) create mode 100644 bAcpi.sh create mode 100644 bAcpiDescription.txt create mode 100644 mAcpi create mode 100644 mAcpi.c create mode 100644 mAcpiDescription.txt diff --git a/bAcpi.sh b/bAcpi.sh new file mode 100644 index 0000000..7e01c4a --- /dev/null +++ b/bAcpi.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +clear_box() { + echo -en "\e[?25l" + clear +} + +double_line_box() { +# Получаем уровень заряда батареи + battery_level=$(acpi -b | grep -oP '\d+%' | tr -d '%') + + # Задаём цвет фона в зависимости от процента + if [ "$battery_level" -eq 100 ]; then + bf=43 # Жёлтый фон для 100% + elif [ "$battery_level" -ge 96 ]; then + bf=44 # Синий фон для 96% и выше (но меньше 100%) + elif [ "$battery_level" -ge 92 ]; then + bf=45 # Фиолетовый фон для 92% и выше (но меньше 96%) + elif [ "$battery_level" -ge 88 ]; then + bf=41 # Красный фон для 88% и выше (но меньше 92%) + else + bf=43 # По умолчанию жёлтый фон для всех значений ниже 88% + fi +# bf=44 + echo -en "\e[1;1H\e[${bf};33m╔═════════════════════════════════════════════════════════════════════════════════╗\e[0m" + for (( a=2; a<=41; a++ )); do + echo -en "\e[${a};1H\e[${bf};33m║\e[0m \e[${bf};33m║\e[0m" + done + echo -en "\e[42;1H\e[${bf};33m╚═════════════════════════════════════════════════════════════════════════════════╝\e[0m" + echo -en "\e[5;0H\e[${bf};33m╠\e[0m\e[33m═════════════════════════════════════════════════════════════════════════════════\e[${bf};33m╣\e[0m" + echo -en "\e[7;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[9;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[11;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[13;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[15;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[17;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[29;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[35;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" + echo -en "\e[39;0H\e[${bf};33m╟\e[0m\e[33m─────────────────────────────────────────────────────────────────────────────────\e[${bf};33m╢\e[0m" +} + +ifo_box() { + echo -en "\e[3;5H\e[1;33m Linux OS acpi The state of the battery\e[0m" + echo -en "\e[40;6H\e[33m Нажмите 'ctrl+c' для выхода\e[0m" +} + +acpi_box() { + if command -v acpi &> /dev/null; then + ACPI_VERSION=$(acpi -v | grep "acpi" | awk '{print $2}') # Берем версию из строки с "acpi" + echo -en "\e[6;5H \e[32macpi \e[0m \e[90mACPI version: \e[97m${ACPI_VERSION}\e[0m \e[0m" + else + echo -en "\e[6;5H \e[31macpi \e[0m \e[90mUtility not found, install: \e[97msudo apt install acpi\e[0m \e[0m" + fi +} + +bat_box() { + if acpi -b &> /dev/null && [ -n "$(acpi -b)" ]; then + echo -en "\e[8;5H \e[32mBattery:\e[0m\e[90m\e[97m Detected\e[0m" + else + echo -en "\e[8;5H \e[31mBattery:\e[0m\e[90m\e[97m Undetected\e[0m" + fi +} + +line_box() { + BATTERY_STATE=$(acpi -b | awk '{print $3}' | tr -d ',') + case "$BATTERY_STATE" in + "Charging") + echo -en "\e[8;28H\e[32m Battery State \e[0m Charging\e[0m" + ;; + "Discharging") + echo -en "\e[8;20H\e[32m Battery State \e[31m Discharging\e[0m" + ;; + "Full") + echo -en "\e[8;20H\e[32m Battery State \e[0m Running on AC power / Plugged in\e[0m" + ;; + *) + echo -en "\e[8;20H\e[31m Battery State \e[0m Unknown state\e[0m" + ;; + esac +} + +time_box() { + BATTERY_TIME=$(acpi -b | grep -o '[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' || echo "N/A") + echo -en "\e[10;5H \e[32mBattery Time \e[0m \e[90mОставшееся время: \e[97m${BATTERY_TIME}\e[0m \e[0m" +} + +battery_progress_bar() { + battery_level=$(acpi -b | grep -oP '\d+%' | tr -d '%') # Получаем уровень заряда + # Округляем вверх до ближайшего целого + rounded_level=$(( (battery_level + 1) )) + if [ $rounded_level -gt 100 ]; then + rounded_level=100 + fi + # Вычисляем количество заполненных символов (полоса из 50 символов) + filled=$(( (rounded_level * 50) / 100 )) + empty=$(( 50 - filled )) + # Создаём строку прогресс-бара + progress="" + for ((i=0; iJSrA`$eHD}m0RhE|hDRV#UJ|fctK*Ov$dn|LCKCc%AHj$p zbco_st$rVEvFod~k4T}$7f`FltzA3$)@`xXF0ww7sx4-Tb&N=_*@BGi>-g_>cdv*D|IfVrUmZU+}ITl-&AE7B_hS70_sh}vc&a{T%@A1}g z*1>2Wq-dI7rVDU&+Fh7i4mR{bD5*D^l>y3QG})3;5VE9RzO-wo=16H3>o)a5teUpJ zyz*o%C#CQme`T8Qbj-9jjn{N3y?Ttz?pn>?ZQ>{8nWo(v-M{&Kcfv!tXCrmB}xu}|V}k3FxK>2N||R9Y7@(*PM%O33)d#!E1@u5#-|I|5VY5Lr<=_^a8-ANhZrVeG8 zXwM9}(>@M0%IJ8k9b~myHfc68(?tt^b!>P1>AGi6+bGLNGdzDgQ9s<%mg@XG^xN{# zhXBYxc8JeL_NOHv3?%<-9{P!S?APUy59g6zo=5(vJoF8D=*Q%-|Lr{T$AWGn`_o5CvpC*E^#n!8{quj(RPxtoy6k&aq;kppNG#qMUy*1^#T%E*pH-Wzk1vTXtBqTc z$cnmTeWWQBZA?WXT693cmS`+iU1QZJ#`yBacvFqlQe7L5Hd-xp$yITyWfiuaxRt0+q#_N` zM5C%TRX181lQL$t)F`2q@ih(67&tKsR5v#^MVjI%t9n^uJi5|~RyRfJq74>EwaMzJ z>Rt8fXk>Y!K3bdj2X+=)UA5_KT@>J&5-Y&78k$qUyE>7A2;5e$j8xaGj4Y2PYAtBg z(^0&sgko!Vit!oQrEnQqyUNtqcq;kQWg^?*Gr6m)mO`A5cbkgb8+#cg5m3#~g0U+x2BK9=#~fV9V4?}e@|8lVquB^RYG zoc3-mXe1a{{ZbA5+2f(hEe3f#9=cp3N#Ez8k0HUNeh>Y4A)=J^N87yiNV3g3Bi$Av z%3@>Z5Y$Zw6nC_TZkDp5+a9`HQ^^?Xp|j7DNL7;k3D7_w`P6+T5u7djH;ObA#^d9pSXO zG57TrIBjmoeZ6mdApPZq6a9DE+?dgSr_Bu+{dd~jh|zzi%?%j+ciP-|(SN7S4Hx}) z+T3W-f2Yk27X6ntMklOBXSSur2kj|%J}NriZHImBlYQ-DeeIFH_Ap;NbnwIBDjAMv%f``SP7weR$`zv*k=>}$9C+UtDnD}C)|Z+qhF zl^eP*tJtu&qV2_fiWSp~^AmzNYBe=V9=fbG-QfKt&OYGg63 zKQ$6db1Lgtnulih6dm76xu2O5@|8+{%1jpHKB(BRui~eFIJe@b{evnBo~Y>lAax`R zgp7f~**(kEybyh^-`45JV)|Ikr!B2$o4%I^GZhjCG39)pI3$cXE5_JsOL!=QxU_Ln{D7B-2K+%8`5n%eQ9?OB7bhNFz!9A|$ z9B?1x?zRKj+DWCJFO$aR4l;HsxeFZ{d%u&6o|z7fB0IS!_LMj@Zh1SoFZPUaXi8Uw z?_kh?C3`Bdth*fHM{C@8)vD30s<3J`=+>1bsRo#N>`YEb<531Xzs%i(Sd(TkSPE?DgsVYbN?6Xw$NmLV`SJe!vx16o2 zyHWkwbXDDh>b`SSwFlK>%T#q=Cwgx6Odp0;yY3&x;(hG17@x#S%5?SI_+B=tRhZ3Mo|9`{Yo|N{3E^rM8}e4WScINr#TX-*vmz z4DaNAt>{DO$^~!*0Q9yi)qP)v$S$b9f=W8{0{%WowP~3vhIECVMw7{-TSnarpxd?X zB7jxgbm*H9WM8(UFX-C!runOPv)OcLBU)|!hc^$=6YzH2_ohQFAYze>MX<(}QTb7K z?&+vagDvfZ6Du7mS7r*DzX%6m)b-@#(;_{;_l}x8LkG6?I)Fg!PYJ);HZZ(S_CTVo zzp!}@aAnRN5ZCRr)gBt+^+bdkb(>?5t0Nt{K^YuWv~CNUP@7dYpwW5S=yosHHCm#% zU0yEDYnR2Ed(;e%WiCU_?bCs&_Hwx(HTM~Cb^o~_)1f^z?EgVU>%NC3BK8>Cxq<%2 ze%1Xez4i(md)LxiI@BIeJ6|(W0me*iZ>rax+w;j4~e$^gB{?D z0~)q=ROWT$0zX_kIy#`H`kM|F1{j$?sX)Bro!&0+N9ipcdTO~p5bUoP_;yIN^&jE@ zzb&A#LOa^xb>srSSUXx4P*eR)hbjY%QQF?cUVAR^L$$rb18VHA7x+ABNzAp8(bhkt zXx+=$D6k2>tS*{?9e=J46JFiA*8|tvIPGmxz?-E(4)vCk)C{!Txj8G8ea zj{j6aeB2B2AOP1p=6AH(y#ciZ7`oFT2&Y3gL!zz!FlV&Z1T^MqN3~u@?r2TZj%Ehb zRDaWRaXy1pDh9t>+-o)<4t%zAK<{y>|3VbsH2I##ZfU zLqJXSHyvsSFwW8T)_d(0IuS3`_NE2Y*k3R36Cu&oKgJ?-cS)L@j7xN-bEPc zP$ue+km_$bbbo-cPTPA$-5LfKc8j*x8c<_@y}-W=iMIaX4)6s5jbpTTf#q!R7uQ{bHXA#B8rUH{v_!Egk9#sIk9Z;P*kIt-r_tese&hT044O-A4ze z%2Ms`e-nZ>4tY{zkGA!+|kT!JbJ@8xXOFDFSKr^lx z*MmVrzk(siU2U3oqp1y?24kLwidV6{ZtCq(vv_HLtm3pI)iZZ0)DwfsKmW{mC{Kq@ zH@42#o=yrt=zCrD{(NumiCsH>Q6qZ&Qh%TC)r@BXjPKAM?*AMHCjmRR28_1;Z0eZw zu&cm?%r_`=EZ7^Kra-^eTubUgP@RYIb6w5ZTJzFe%^g~EE~!vN@Xg4CG|G|y_^6E)zN4ZMFwbB`m(sZqK3YC;6QF`%J2j26S zD0qdA(qOIh2I#p_{gLkMZkK`OLI`)k8hW^s3=X?G3L)c4;|62DT)X){lvw~7J@&QQ zv{C8O>k*-kGVLTJv=j z9<)2O=C4VG4(6K)z|ESm!)1hQ6`74Ni9P0Nb!hUadqkw?+f`caf4OQ0YqfICsCOB7 zbIpLBt?jjY?YZ|{C0gx_fZAJBONWjNFkb6b`0Bj&4nxm0zTauJS1xw?Yhc`|8BeUaNg0pte*qt^$L-d;(TBUFvRUZI889Y`Aj0?~t*pe9OTw-Bo_a zA*#4%uqwXK*8^SU9XNYIu?=TRC^~WUhvMNPRqW!4epmTpJjm}Vf0F0-UFE;vc}`b( zhNtyi<sU&*r3e;uux*9HWZO_-pmO z`MXdCx~*SuB4N-qfYJMPEYr3tH(N#PZqU8>nk$F3&xl?0N^ZnnQ|FNM^*m}hK&NY8 zb6guH>PNx`*4=icYOcl|q@_bg1%!VMM(?|rHUL)O0DI#?rvnDq&X;q6RXMZLts%2tk3~=kt=6_o#F%bpgP25#O_5cCt`Ch`nok$qrJHhCE66*~S!6iibs4HiHZGutnlnTsZ^m?H6)^MU-^{y8^F= za^~1`+Sf}L_=E6c*uYS3_5xd|g*yYntH9{J4P8RSaJprHZF1!du*-bF>K$PJF~J9H zmi9HzwP7MQMg#j-FR-7GmJS^s5PlwvUhW+Lh7%|Q?CnKPZw;`=_vA+Gn+~w^{J_4a zef`+AVSufL4Mc3O7uc~{__~1bYyw+>=K=s5>HxdUl{3J``+#k8fZc~zfH^}sLi-xy z+AzR+{#^lk#|!LQf=!2BU+6@_2;U1v@6)(z0Wh2(nTS2^${Ao^hf(k3f64(i+7E2C z_O;fvVSFvr!0f4>4fa*i(xD{*;ll}RiUx)gA_Hu^D`$Yc`@39VeGagz@d`C3V*jpv z_26+O_bT%f*uYRGy}%Z0;fDgkYryE;jC&wN3@1Pa*w- zYoTkyMC@1%>_RWF2S`hYP6!C^0i&01Q2`7mJR5QSg510Fo!%N?Pd=X;u~G-vd_S-s zXkR~ZZ5UwJ!UiJN?geIR;SB-dxnR6n2Q2jg*4cvPBkxP^!`VsBXpYeC#sqBchRwF} z%?0W`FmJFop01CS|2R+Ike&g7O}LfjiHrVM4mfe?doJh1rR}xi4OjlT=QW7#RCfYf zQPclENBw&%=U-Tnc_1B#z<~%Hh`@me9EiYy2povOfe0Lkz<*B!`2UMzIs&<|IkI?Z z$t5S^O{OFBNM=W7D@dJo<{?zUL#YnDa^#`- zNT##3m-^pz6Zp}QbL?L8DW4oQ%39H-iA9+6kZz~LJ@4m){ z_EuIh9R{I|@i)tSiCkjZBZCnBGL%sORB|7**P6<#!{xZ!xf!hwj2A7e?LjV#GV zb;`^^ z=Db{hOgZwordekxc35(KbN>GSGKa&!xD1(CS(kPc^_0nRl#R%1kZoj1HY%T0+!(9L z$Sk=Ja2yyji64E-{y-k(I6fSQg~;UZ@66aRF0?DLV!PV3S&t#JY(QrGBz89Hl5AA= zcid=GV#ImL*hst>8}eo$d*er)|L)AVF)s8gF=V?2Sz=X(I%8OiY$HpuQQ6;dlXc29 zTaNsBWX5YMGUp#-DD#SQix~c2WX6i~jJ_pqY$r`-tP;re$oNO~pD1p;Ztz+wdlTo2 z-1BkXFh;y@5gO$gtMSI4ch1oUB!#eyx5U__M^su z@ww1ol2~zWtwNSL#=T7D-KUKk=Lh>j{EP?Z6fw)b#Op#Ovh-;Je2Wg{dCj3L`HU%f z=Oh26<6y(?r^$>}ld&OjW1DM}^Q;A#bjGj_S@yV3dR^d{%ht9U&R+?{?g3&a6VB_Vi-f6G2?uTB9qVc zDzQdYB^!S~&i*E``KW!K{h>|HDV8Upe+V{c3{#F1^rj`NKBp6qcp>XK|!K1tkUy~teR zUM0`7+}pS>aO}8e$TjQ3;>dV2rj%jHIVmxwJ+2e(F|uB4)c0p*%!rvbC4K|-0c@3Q z{N+03`tr^v?&IXmK%RxX2)Pp3MjneiP;5wxA~R0($#JrgIgh-1mp=|{Q-|YAea41) z9J2ixWX2_C>`IK-CSF;m#KX0jG_+58U66Gw*Hg|5##Z(-8}|PvXU32F8T%lyl>Lq4 zDRU83m2CX|IM)TniTf1eCVP=QlhVfjq|CT*-y-HKOewMQ-p6sya}ILO@j786OR`Zp zkn_i2F5<)34Rk#{5VwKjR*rbB&KI}LKjGB8lgIQtJ;w<Oh<`j zN2?nW_9e-NR3cg5bg5;}n6;= z1L_sQRvhR*V0W*Dd%i;0o_V-C4X73cfytiGw5DmiO=x(VKvDHl;X!KbP#QbBZ{W)W zz8ts@ZxJAzJYW&Iln*+bnMSyG-a7Frd;8|?0O z*wcu+uYm$zdEiAxciM(Xn}Wz5ZBx+jasr?bk%w5J)t&67QUc-I5ae5uhwThrcEF>K z)i#nWyJ2;zEEZpuh}M@R8&}wP=kXB07)s~KOrW>A#G-n25_ z?Tk0Bk#cwk z0P|Lj!RO>hlvMncx>?L>0yzOnIOt;W6n^y6LA%^xERWVS#_Mb1_=!*xhm}$ZuZ-8O z!f%NhdV^HL4UI`BSTTnhOEku-Q%QFeY8+Ngyw=fPU6V>RG@UhJ!iq$y zrg>ROb+T>(x321_DQpu@k!xvbDZy{E#%q;mbrRM3)C5o`G&fC%*H4IHoNAK|@x}?M zB+P_U_-WUA{C4Y#H4{Ls7vuPm*2YzdcuPr5s;<_y?D7Rm$`{+y?fLitReOHCzS;QQ zd(+0fH?{uF{BM(vwq@88J#PGfj)wN5?tR6W;GK@h62qMK~9wb=Oi+*EUu9j%Yq zN$wo_YRVtX#U{clEZ(!@I&l{k{jK(=N(&b)sa&|A3i0Qpv-e(iqrJ4j_6`MTU$I+p3Cr=S)Px156)*7o_)!)a~-}Uw$c71m_Gt;I0~fh{eYbpC$Y%$GUF(*;|Zh`J{*6z8ocN)o_Hm8Y|B|Y`NZy( zW1V9{9me4-WJx~!ZZn)fPh$Gc)y_Ykh>142P6vu}Gw7Tvl(CVCm1D&E9AskSdKVe; zWc^EAK(bt51JuIHfz`d4wkeOye;dLWiSP4GopF%y6)b{_^3o?_&u0MLncWcHhJ zpstNf`-}Q#>Y8Z`&bAIoOg^j{Yu?N-Md#4H}Nx0{`oF(XZ++^ zOM8C#{m`HAD!@0-oiZJ&GIbx+PkvZJ5b()l0VCE(mmNMV>s-) z+3YhYztfq`zKQZHk7Tn)7T~)QKhI_-vjmN);2#!S1*?k-jvji*;7x{p4CtMAXS1hJ zVD=%!EKWk6jC?u#Zh@RNym-#=(dQK%)-t%&I(N)jr=EV&37{&wUqZS2&TLjGl88iq zDdY_3^dpJBHX=_1?wgBHDIZ>ZUE!=@2M^j<1W4+8T;B)zuKTmuUmoP;KXH)oe*yB+ zhqKv#8tUc$@1f+62I)2A-A`t-{GA=gKI{82l}SKNDP80@Ihdr)Z-98){N@J}p{rzq zHq0~|rs&F1rY+y`;BT5RaV{|N7eSchdmfA{lkngAAj|1&bqwNP^KCMe{RgY2`kn`C zdkmjHX2bN5!FQN$s(7+G(zK;8YF7VMno?*O7nzEL2R}fd(kN5b7)L^1eW+##?tMni zkRAVOEWr~w{06P+AK)s|2d3R`1hS?rIPue4N`9N+$$}OhsFy$^&W=y%ql>1DHj}oa=Y)addrKaT11v4!&<>jVqFlDPL zH<@yaDLYK5wLkvf!L3?$?yOm7*<+V3Ypzc<+Y=|2OfD%6Pi$7riC0aUR8l&5oFRX> zZBEmJtT*ugc+E|mH~c=&Ml-OsVIP5VAbHNKLaW%?L;+8-Q73(ukAAwLI~%IesYF?T zRXO$=O)$$y-D4G4f9I@IBd*@-(Y~{f7{+>KXQU7a=SXW~typl& zf$Th@)qRZ>@*tshY{i!_k=km}$0KFJ~i+z4Wz;k%v2ut>JL3J4E((sh0fIiT7 z$IiI3&b%hr27e4vI`wbz^E`NfO_hi!Mt;RR4bZ9El^m6Q%F!7tw>BGJai=$Z&# z{os|;^2TUgJQ8cJt6KvVPb;FnzvmULn}K&r02GPLSv+HYd8B;7YnKR}^7S5SdRlX#$WX8;S=w5$wQAGTn^j8vvJD>smJ;e_dk&iZtklzcYCi96o7iN3R{i39Z z`k`~m<2#c1*pbMxCVXF#U&eGlDVftZ^$E%OGcLkBE1zFw@vD~g%?<7sFY{T}U$e}| zjWtGFB6WDL>U>-?pCrFnnFA;i!N)yirShwvAMz>Bd`8vxJeB`QA{DP|GGFV=C$7Kp znU5QZct60IirmvvEvjfqW^8zVn8ezdNa#Hd*gl7@b zmh%WHTa7;P6Q|%eWUCz&j)~~Y`G}PJjG*`zed+%^t{S=6*`fp&+7?fBtL+)vIqCJt?>N0&dujo4bAbyUclmlp?RaySI5l@9^nojJ}lK zvq;(yJt-gX>0fT1|D_y$0=3*EdP3oEae4bM&wo(0m{Rn8(??;Y2r)CU z^tn* +#include +#include +#include +#include +#include + +void draw_menu(); +void print_menu_items(const wchar_t *items[]); +void cleanup(int sig); + +int selected = 0; +const int MAX_ITEMS = 19; + +int main() { + setlocale(LC_ALL, "ru_RU.UTF-8"); + if (!setlocale(LC_ALL, "")) { + printf("Ошибка установки локали\n"); + return 1; + } + + initscr(); + if (stdscr == NULL) { printf("Ошибка инициализации ncurses\n"); return 1; } + if (has_colors() == FALSE) { + endwin(); + printf("Терминал не поддерживает цвета\n"); + return 1; + } + start_color(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + signal(SIGINT, cleanup); + + init_pair(1, COLOR_BLACK, COLOR_YELLOW); // Чёрный на жёлтом (рамки и выделение) + init_pair(2, COLOR_YELLOW, COLOR_BLACK); // Жёлтый текст (заголовки, линии) + init_pair(3, COLOR_CYAN, COLOR_BLACK); // "Git" + init_pair(4, COLOR_GREEN, COLOR_BLACK); // Пункты меню + init_pair(5, COLOR_WHITE, COLOR_BLACK); + init_pair(6, COLOR_WHITE - 1, COLOR_BLACK); + + const wchar_t *items[] = { + L" Установка INSTALL ", + L" Краткий обзор SYNOPSIS ", + L" Описание DESCRIPTION ", + L" Автор AUTHOR ", + L" Показать нформацию об батарее -b --battery ", + L" Показать нформацию об адаптере питания -a --ac-adapter ", + L" Показать нформацию о температуре -t --thermal ", + L" Показать нформацию об охлаждении -c --cooling ", + L" Показать все устройства, переопределяет другие опции -V --everything ", + L" Показать неработающие/неактивные устройства -s --show-empty ", + L" Показать дополнительные детали, если они доступны -i --details ", + L" Показать температуру в Фаренгейтах -f --fahrenheit ", + L" Использовать Кельвины вместо Цельсия -k --kelvin ", + L" Использовать старый /proc вместо нового /sys -p --proc ", + L" Путь к ACPI (/proc/acpi или /sys/class) -d --directory ", + L" Показать справку -h --help ", + L" Показать версию -v | --version ", + L" Git ", + L" Exit " + }; + + draw_menu(); + print_menu_items(items); + + while (1) { + int ch = getch(); + + switch (ch) { + case KEY_UP: + selected--; + if (selected < 0) selected = MAX_ITEMS - 1; + print_menu_items(items); + break; + + case KEY_DOWN: + selected++; + if (selected >= MAX_ITEMS) selected = 0; + print_menu_items(items); + break; + + case 10: // Enter + int last_line = 0; + + clear(); + refresh(); + + if (selected == 18) { // Exit + cleanup(0); + } + + // Специальная обработка для "Установка" + if (selected == 0) { + mvprintw(1, 0, " Утилита предустановлена."); + last_line = 2; + } + + // SYNOPSIS + if (selected == 1) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi [options]");attroff(COLOR_PAIR(4)); // Выключаем и выключаем зеленый цвет + last_line = 2; + } + + // DESCRIPTION + if (selected == 2) { + mvprintw(1, 0, " ACPI показывает информацию из файловой системы"); + mvprintw(2, 0, " или /sys, такой как состояние батареи или тепловая информация."); + last_line = 3; + } + + // AUTHOR + if (selected == 3) { + mvprintw(1, 0, " Оригинальная версия этой страницы руководства была написана Полом Телфордом"); + mvprintw(2, 0, " pxt@debian.org для системы Debian."); + mvprintw(3, 0, " Новые дополнения были сделаны Майклом Месксом meskes@debian.org"); + mvprintw(4, 0, " Разрешение предоставляется копировать, распространять"); + mvprintw(5, 0, " и изменять этот документ в соответствии с условиями GNU GPL."); + last_line = 6; + } + + // acpi -b --battery + if (selected == 4) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -b");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --battery");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -a --ac-adapter + if (selected == 5) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -a");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --ac-adapter");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -t acpi --thermal + if (selected == 6) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -t");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --thermal");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -c --cooling + if (selected == 7) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -c");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --cooling");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -V --everything + if (selected == 8) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -V");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --everything");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -s --show-empty + if (selected == 9) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -s");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --show-empty");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -i --details + if (selected == 10) { + mvprintw(1, 0, " Информация о ёмкости батареи."); + mvprintw(2, 0, " Температурные пороги срабатывания."); + attron(COLOR_PAIR(4));mvprintw(3, 0, " acpi -i");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(4, 0, " acpi --details");attroff(COLOR_PAIR(4)); + last_line = 5; + } + + // acpi -f --fahrenheit + if (selected == 11) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -f");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --fahrenheit");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -k | --kelvin + if (selected == 12) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -k");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --kelvin");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -p | --proc + if (selected == 13) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -p");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --proc");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -d --directory + if (selected == 14) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -d");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --directory");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi acpi -h --help + if (selected == 15) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -h");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --help");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // acpi -v --version + if (selected == 16) { + attron(COLOR_PAIR(4));mvprintw(1, 0, " acpi -v");attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4));mvprintw(2, 0, " acpi --version");attroff(COLOR_PAIR(4)); + last_line = 3; + } + + // Git + if (selected == 17) { + mvprintw(1, 0, " https://github.com/acpica/acpica "); + mvprintw(2, 0, " https://www.intel.com/content/www/us/en/developer/topic-technology/open/acpica/overview.html "); + last_line = 3; + } + + attron(COLOR_PAIR(1)); + mvprintw(last_line + 2, 0, " ENTER = Main Menu "); + attroff(COLOR_PAIR(1)); + refresh(); + getch(); + draw_menu(); + print_menu_items(items); + break; + } + } + + cleanup(0); + return 0; +} + +void draw_menu() { + clear(); + + // Верхняя линия с жёлтым фоном + attron(COLOR_PAIR(1));mvprintw(0, 0, "┌──────────────────────────────────────────────────────────────────────────────┐");attroff(COLOR_PAIR(1)); + + // Вертикальные линии рамки (жёлтый фон только для символов) + attron(COLOR_PAIR(1));mvvline(1, 0, ACS_VLINE, 29);mvvline(1, 79, ACS_VLINE, 29);attroff(COLOR_PAIR(1)); + + // Нижняя линия с жёлтым фоном + attron(COLOR_PAIR(1));mvprintw(30, 0, "└──────────────────────────────────────────────────────────────────────────────┘");attroff(COLOR_PAIR(1)); + + // Разделители (жёлтый фон только для соединителей) + attron(COLOR_PAIR(1)); + mvaddch(3, 0, ACS_LTEE); + mvaddch(3, 79, ACS_RTEE); + mvaddch(5, 0, ACS_LTEE); + mvaddch(5, 79, ACS_RTEE); +// mvaddch(30, 0, ACS_LTEE); +// mvaddch(31, 79, ACS_RTEE); + attroff(COLOR_PAIR(1)); + + // Горизонтальные линии разделителей (жёлтый текст без фона) + attron(COLOR_PAIR(2)); + mvhline(3, 1, ACS_HLINE, 78); + mvhline(5, 1, ACS_HLINE, 78); + mvhline(10, 1, ACS_HLINE, 78); + mvhline(25, 1, ACS_HLINE, 78); + attroff(COLOR_PAIR(2)); + + // Текст +// attron(A_BOLD | hunting(COLOR_PAIR(5));mvprintw(2, 3, "*** acpi ***");attroff(A_BOLD | COLOR_PAIR(6)); + attron(A_BOLD | COLOR_PAIR(5)); mvprintw(2, 3, "*** acpi ***"); attroff(A_BOLD | COLOR_PAIR(6)); + attron(A_DIM); mvprintw(4, 3, "Shows battery status and other ACPI information"); attroff(A_DIM); + attron(A_DIM); mvprintw(11, 3, "ОПЦИИ OPTIONS"); attroff(A_DIM); + attron(COLOR_PAIR(2));mvprintw(27, 1, "── ↑ Up ──── ↓ Down ──── ↵ Select Enter ──────────────────────────────────────");attroff(COLOR_PAIR(2)); + refresh(); +} + +void print_menu_items(const wchar_t *items[]) { + int y_positions[] = { 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28 }; + + for (int i = 0; i < MAX_ITEMS; i++) { + attron(COLOR_PAIR(4)); mvprintw(y_positions[i], 2, "%-77ls", L" "); attroff(COLOR_PAIR(4)); + + if (i == selected) { + attron(COLOR_PAIR(1)); + if (items[i][0] == L'\0') { + mvprintw(y_positions[i], 2, "%-77ls", L" "); + } else { + mvprintw(y_positions[i], 2, "%ls", items[i]); + } + attroff(COLOR_PAIR(1)); + } else if (i == 0) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L""); + attron(COLOR_PAIR(4)); printw(" INSTALL "); attroff(COLOR_PAIR(4)); + } else if (i == 1) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L""); + attron(COLOR_PAIR(4)); printw(" SYNOPSIS "); attroff(COLOR_PAIR(4)); + } else if (i == 2) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L""); + attron(COLOR_PAIR(4)); printw(" DESCRIPTION "); attroff(COLOR_PAIR(4)); + } else if (i == 3) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L""); + attron(COLOR_PAIR(4)); printw(" AUTHOR "); attroff(COLOR_PAIR(4)); + } else if (i == 4) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show battery information "); + attron(COLOR_PAIR(4)); printw(" -b --battery "); attroff(COLOR_PAIR(4)); + } else if (i == 5) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show ac adapter information "); + attron(COLOR_PAIR(4)); printw(" -a --ac-adapter "); attroff(COLOR_PAIR(4)); + } else if (i == 6) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show thermal information "); + attron(COLOR_PAIR(4)); printw(" -t --thermal "); attroff(COLOR_PAIR(4)); + } else if (i == 7) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show cooling device information "); + attron(COLOR_PAIR(4)); printw(" -c --cooling "); attroff(COLOR_PAIR(4)); + } else if (i == 8) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show every device, overrides above options "); + attron(COLOR_PAIR(4)); printw(" -V --everything "); attroff(COLOR_PAIR(4)); + } else if (i == 9) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show non-operational devices"); + attron(COLOR_PAIR(4)); printw(" -s --show-empty "); attroff(COLOR_PAIR(4)); + } else if (i == 10) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show additional details if available:"); + attron(COLOR_PAIR(4)); printw(" -i --details "); attroff(COLOR_PAIR(4)); + } else if (i == 11) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Show temperature in Fahrenheit"); + attron(COLOR_PAIR(4)); printw(" -f --fahrenheit "); attroff(COLOR_PAIR(4)); + } else if (i == 12) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Use Kelvin instead of Celsius"); + attron(COLOR_PAIR(4)); printw(" -k --kelvin "); attroff(COLOR_PAIR(4)); + } else if (i == 13) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Use old /proc instead of new /sys"); + attron(COLOR_PAIR(4)); printw(" -p --proc "); attroff(COLOR_PAIR(4)); + } else if (i == 14) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Path to ACPI info (/proc/acpi or /sys/class)"); + attron(COLOR_PAIR(4)); printw(" -d --directory "); attroff(COLOR_PAIR(4)); + } else if (i == 15) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Display help and exit"); + attron(COLOR_PAIR(4)); printw(" -h --help "); attroff(COLOR_PAIR(4)); + } else if (i == 16) { + attron(COLOR_PAIR(5)); mvprintw(y_positions[i], 2, "%ls", L" Output version information and exit"); + attron(COLOR_PAIR(4)); printw(" -v --version "); attroff(COLOR_PAIR(4)); + } else { + attron(COLOR_PAIR(4)); mvprintw(y_positions[i], 2, "%ls", items[i]); attroff(COLOR_PAIR(4)); + } + } + refresh(); +} + +void cleanup(int sig) { + endwin(); + exit(0); +} diff --git a/mAcpiDescription.txt b/mAcpiDescription.txt new file mode 100644 index 0000000..7de4a81 --- /dev/null +++ b/mAcpiDescription.txt @@ -0,0 +1,65 @@ + +Техническое описание программы acpi_menu + +Команда для компиляции: gcc -o mAcpi mAcpi.c -lncursesw + +Эта программа на языке C использует библиотеку ncurses для создания интерактивного меню в терминале, предоставляющего информацию о утилите `acpi` в Linux. Она отображает список опций и описаний, связанных с `acpi`, с поддержкой навигации и выбора пунктов. Ниже приведено подробное описание её функциональности: + +1. **Компиляция и зависимости**: + - Для компиляции требуется библиотека `ncursesw` (широкие символы для поддержки UTF-8). + - Команда: `gcc -o acpi_menu acpi_menu.c -lncursesw`. + +2. **Инициализация**: + - Устанавливает локаль `ru_RU.UTF-8` для поддержки русского языка. + - Инициализирует ncurses (`initscr`), проверяет поддержку цветов и отключает эхо ввода, активирует клавиши управления (стрелки). + - Скрывает курсор и устанавливает обработчик SIGINT для корректного завершения (`cleanup`). + +3. **Цветовые пары**: + - Определяет 6 цветовых пар: + - 1: Чёрный текст на жёлтом фоне (рамки, выделение). + - 2: Жёлтый текст на чёрном фоне (заголовки, линии). + - 3: Голубой текст (для "Git"). + - 4: Зелёный текст (пункты меню). + - 5: Белый текст (основной текст). + - 6: Тёмно-белый текст (дополнительный). + +4. **Меню**: + - Содержит 19 пунктов, включая "Установка", "Краткий обзор", "Описание", "Автор", опции `acpi` (например, `-b --battery`, `-t --thermal`), "Git" и "Exit". + - Пункты хранятся в массиве `items` как широкие строки (`wchar_t`) для поддержки UTF-8. + +5. **Интерфейс (`draw_menu`)**: + - Рисует рамку с одинарными линиями (80 столбцов, 31 строка) с жёлтыми краями. + - Добавляет горизонтальные разделители на строках 3, 5, 10, 25. + - Заголовок "*** acpi ***" (жирный белый), подзаголовок "Shows battery status and other ACPI information" (тусклый). + - Подсказка навигации ("↑ Up ─ ↓ Down ─ ↵ Select Enter") внизу жёлтым цветом. + +6. **Отображение пунктов (`print_menu_items`)**: + - Пункты меню выводятся на заданных строках (6–9, 12–24, 26, 28). + - Выбранный пункт выделяется чёрным текстом на жёлтом фоне. + - Остальные пункты — зелёным текстом, с выравниванием описания и опции. + +7. **Навигация и выбор**: + - Стрелки вверх/вниз изменяют `selected` (циклически от 0 до 18). + - Enter (код 10) очищает экран и показывает информацию о выбранном пункте: + - "Установка": "Утилита предустановлена." + - "Краткий обзор": "acpi [options]". + - "Описание": Информация о выводе ACPI из файловой системы. + - "Автор": Сведения об авторах и лицензии GNU GPL. + - Опции `acpi`: Краткие описания и команды (например, `acpi -b`, `acpi --battery`). + - "Git": Пустой список репозиториев (заглушка). + - "Exit": Завершает программу. + - После вывода появляется кнопка "ENTER = Main Menu" для возврата. + +8. **Завершение (`cleanup`)**: + - Вызывается при SIGINT или выборе "Exit", завершает ncurses (`endwin`) и выходит. + +9. **Особенности**: + - Поддержка русского языка через UTF-8 и `ncursesw`. + - Цветовое выделение для улучшения читаемости. + - Интерактивная навигация с помощью стрелок и Enter. + +10. **Использование**: + - После компиляции запустите: `./acpi_menu`. + - Навигация: стрелки вверх/вниз, выбор — Enter, выход — выбор "Exit" или `Ctrl+C`. + +Программа предназначена для пользователей Linux, желающих изучить возможности `acpi` через удобный текстовый интерфейс с поддержкой русского языка.