From b67e4bfc2a3383bc26b3eb39a0dbd932d082446d Mon Sep 17 00:00:00 2001 From: markmental Date: Sun, 29 Mar 2026 13:36:47 -0400 Subject: [PATCH] update guide mode to require pressing enter to tune to selected channels --- src/app.c | 27 ++++++++++++++++++++++++--- src/app.h | 1 + src/app.o | Bin 19336 -> 19664 bytes src/main.o | Bin 1824 -> 1824 bytes src/ui.c | 19 ++++++++++--------- src/ui.h | 1 + src/ui.o | Bin 39712 -> 39712 bytes 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/app.c b/src/app.c index 5644175..fcc9acc 100644 --- a/src/app.c +++ b/src/app.c @@ -328,7 +328,19 @@ static void handle_event(App *app, const SDL_Event *event) { } break; case SDLK_TAB: - app->mode = app->mode == MODE_FULLSCREEN ? MODE_GUIDE : MODE_FULLSCREEN; + if (app->mode == MODE_FULLSCREEN) { + app->mode = MODE_GUIDE; + app->guide_selected_index = app->player.current_index; + } else { + app->mode = MODE_FULLSCREEN; + } + break; + case SDLK_RETURN: + case SDLK_KP_ENTER: + if (app->mode == MODE_GUIDE) { + tune_to_channel(app, app->guide_selected_index); + app->mode = MODE_FULLSCREEN; + } break; case SDLK_f: toggle_fullscreen(app); @@ -349,10 +361,18 @@ static void handle_event(App *app, const SDL_Event *event) { app->about_modal_open = !app->about_modal_open; break; case SDLK_UP: - tune_relative(app, app->mode == MODE_GUIDE ? -1 : 1); + if (app->mode == MODE_GUIDE && app->channels.count > 0) { + app->guide_selected_index = (app->guide_selected_index - 1 + app->channels.count) % app->channels.count; + } else if (app->mode != MODE_GUIDE) { + tune_relative(app, 1); + } break; case SDLK_DOWN: - tune_relative(app, app->mode == MODE_GUIDE ? 1 : -1); + if (app->mode == MODE_GUIDE && app->channels.count > 0) { + app->guide_selected_index = (app->guide_selected_index + 1) % app->channels.count; + } else if (app->mode != MODE_GUIDE) { + tune_relative(app, -1); + } break; case SDLK_LEFT: browse_guide_time(app, -GUIDE_BROWSE_STEP_MINUTES); @@ -509,6 +529,7 @@ void app_run(App *app) { &app->ui_cache, &app->channels, app->player.current_index, + app->guide_selected_index, app->app_start_time, now_wall, app->guide_time_offset_minutes); diff --git a/src/app.h b/src/app.h index 8660600..f8d6912 100644 --- a/src/app.h +++ b/src/app.h @@ -29,6 +29,7 @@ typedef struct App { time_t app_start_time; Uint64 app_start_ticks; int guide_time_offset_minutes; + int guide_selected_index; char numeric_input_buffer[4]; int numeric_input_length; Uint32 numeric_input_timeout; diff --git a/src/app.o b/src/app.o index 0da551db89f08223492699ebb5b3a7779c562bf9..63e8672448ce35a9eb4a0fb2f6648b88b2c9bf01 100644 GIT binary patch delta 7627 zcmZ`;4RjRM72etWm<`EJejt-Alx&g(0|K%khJ=uiNp?50n95H=OhrRNVj66Opc~Yd zlMU=HvR$?WA643_g`S>*J+uc7R;jf#(H5xM8qoGo>}kdRu|>pajj^?C?|t(oxvqzI z&fGWi-Fv@x?|b*XnQV4HA&q`p8Y(eoX~*ZcNHy!iAA~=04mWAx|7y|OOwhEzyJ?ZV zCzIeVQjNgnNl{hb_`rY``Fd7L>r9g=T;Iqll3VZgp+04IE+U#1_*L5adtUCA3tUK$ zi8{nymKtF!q(wLMu*alo|G*Y+ z#N~L{`PP+Ooj35Zq@}b2S>+qPrmB+uYvEY$s3i^EBM+VrY^g@RxOADXT zLc?dTR>yFNGZ`hNsJA&a)(%pHU<**Ey?nt)_0}cHs8Mr`YnO2^%trhQF({7R4 zSl_hi{>KMl1b4W*)*U)82TRScLV*FhBnOW{c51}qb4ND!dZTSUFfIBZZs&Qm%AL%uk!@M7NS7mDZC2McscYjt$6~c9a<^l36Wq4nxf)_mGcrws zQeVvq<8lGaK-=QbTfT$UYfPqEIhX>J^4_InAJjOa);i6OkjKKsfJDg8F-0dzZCr;)`%V`6p1_1(he)U z+8t@@;`M}8lkbi0!j#;RpJ1)=0z=%6)r6IX)#Ht<+m@x57M54?%XqNz`mx`sHeuDM z>!5-(xLVa_y=vSM&tlYI8M$G`Ln|?pNJ|B7gp&Wo<1hfrkPBdDV{tzJE=&kEejy}; zMQz0E9H)VbcJI7OzDIlxL`w3E99A21ILJvJBU^#!i-xa6Jo2AF)Dcbrh@AquF^ zQobU!xJB8ka?!??vRLCMxJVo-i>|g@`JGsEIG*I-&%p`GRSwMsD@ffADfg!VogJ4G zSg>mO0S5hIj)gsCv55&j4=~X!Y*khX%tc%51Pnc->h&CgQa%ng(PK|TU17bl51?M2 z1}HFLkwf2t8<+_g?XCWMjpM=?H0}EKp;_CeZNrBL>`w0l)XL7-7=( z_dtQRZ-V9&tO(zXvzDUqONOx=dY<2IZl8_opk`0^d)j0Br_^D7>uH~T1rE9A29a`H z4n7EIv~Ls#Zyf`^PI&f4YT$JM8NfZ%Rmmv{UIB0>`^?U9UJS5YGu)9oN}R)P2y6c^ z95f}dd0@@8;`2dcuV-i9cN3ss^Ue4;&aI~_Ff4uh<4@FZOIPe&fKc@}p^CbsxS<;b ztn#!RJp`K+V|)8Oh;2Xa*vNK=e(b{BIv@#C?66*IC*s*>&1_X(3OhO@gZ0fg%+5@I z>cp(P!Sqdd0`{OSv^P+w)~sFT25WvG=?<&iyf59F4~S|_YnXPsHUD;NmS#;`0A^33 zEwpPW>a1CN%%I+tq+0EPWb+Z-s}8+DjbpsV&e@lkO%h8jESD-+bzznDEWi(A;XpfT zVY>mT*0nZY6a{`_x@a_a0&kvYY zc6d&hBLVJ=_e@(q-> zi@=ftl{}cNGc}0*uiWNcET(0G^m&=`8eviv% zxjfC~MJ}&$nab2#6e$nntx`SS+tx$Yd=_%_2zKb5=_}lF8Uwslw7qGuWQe3@OTXz*B{II?11UN;7O_#N&^G4 zqNPeE{&{S~{~_l)3qF{Mf#!-LMxR`EwN#lywM(d$c-_GcEm8a%h?d6DC2*W68o?%l z=aYg zR7B-Mff?hg#E7(-I8dS{R(PA@zl(U$ur}Sm>j1%RWE9-S*b?XaUpKHH)A5|oImFpm znIg?%Yi?7dW-h;r(mx{Jvgk+Cc$MJzel^m5Q{agK;V%x@5_zr>d?x4(9v+~{H2-sf zT9FwVcC=!aF|}Or8b@g2Fsp?Z;`k|I46}}~(RF}hv|Q=<2JxbM`U3GPC2X-9;GYm4 zdag)pWT_&}D*#w+kFe>8Www4e+gmr-1N0LhSKJ zE`xu!j=ozt}sh~Ycn2QL*FW4bqILFRaD(qxszB5Kx zRua1j;_o21#Kx8>ek=Tbgbm}<;4m2mk1p5%qDmhv8R=!-2iXXaee<%hx=J! z75@TRrbt2d$7RLUbogfoT_YL(n7}bCy1SoeJE|1#2=Stu;}XFs+vOXuU1OK36#pm0 zi?T`Lt&3Ah+0q1_7@JJ+5|WFJ@KF9@9nbmP(No5@E?1;VrY={Ub%c~oL=(a1lfhci z%hpA-)T^IK)r#~r&b;deHct?I0bz!Z9Ej%#(NgB05qu%>I)z@6gN?wreJGvB#RnZu zE8V#-5_}b5ILpSW72BIai<5pU(OzPOHH!B-@rB>>CabCVR#AEDt=996Vq-cUhBcrVEZ+}+X$YD z-^b8!lnrnh_B8@e1!29bCpR`v~4i@b9qfI@r8KOSi+X2!1c|8f9voV*4}EeuZeS zu&s59|9zs}M6@zy1Pvpsgv*Fz-aJc0S-SFB&CJYq@zER-fywM8@mCJ-eY=KFK z9D!%Cj(UaV*Js(v#A%U_ywD8l3Z~X8w&g-==ej9vE!$eJSUwW#Uc%P66m|sI_6P)b z3pRsoh@Atr{X&c10oV-f0VcT=+mk|D%XL%QgUku+Z`Y+|YYCbotiz>9M^8NBx>@oc zOi_ znWbDdzoFc$m9mWuHD)!JT~hMkH??H;VuQo%%4P2W3SE&_W46y=8=?C_KKnj&qxI|^ ztwx$)h29nBV{W$5TO*xihrBDK3+xg|P^?^GnXqG2u;JLIl}jxLJ^IryduCh7wVe7vw62KwX`?rPtUN9qFe|ob`S1O{ z^ZL(!?!R~U-#Sycp|9td>Q8G$tmdCuD2^7juC6mMY`ds5Jg9~Kia^cl+Pwof8|E(Op%g{& zn{{}nMBW6|R(Oq3>v1+|_Y5NvFz<5arLCTbsu2YJ;drNhnp6YFJ#R$bS_icdXDfXK7@T*;(w9~lM<4Z)C z$dXO|buUD{DO}GY^xWAF`%;Q+FMS6?DetHq(4YFY`U>2g zHc1^g_)yx;l*zX_{n3!Ko1$WU(!JqxTF8Y_0+D!Av=fYsQuRw%m*J|}T#ftF;thYS zg{qM68J*af)-&4Hb=WxWt44FBDe|SrI6T<(r?H}#tJ>k&j76#sQZijAXJwYm4(8D= zl=;n&b069TYJB$2>x60GxKD10PwYs*48rZ1rA}X-KXTkpd*AdE+Uta&`&=O6vnLEu z@kpk3g74DsU}uik-01O!-`B#wNk#WaIkKwKZd*-PEm+qVJ+XL95Se8T(ulrS_*5_Ylu3cf6JE`jo?Y?I`W|Q+$ z_c;$%r`j-=UmS=YZAio3@i?7xT<^3SEyk5AjVt1v&T?a=d9AZ$C0@3!T7kKzTPscX_dL5o++dn;b#_@W6J2V% zZ^z#08LiQF_lo_QtL^?LuD@qA19wbZOw_`E{x%+$>(tPQx3AAhdBp%Vv|Hp3xjFyzbk0bsQ6^G$OuP*bC*t%jM{0gI4Up z5}Uib5lU40gcf=NZ)67fP?=LU-?vG-=N3xK^tIC#x8ZeDBz}6**?2tGBC-jQPxQ38 zNiO>V*p=hNb{fc;9t@__4g{iqS&a)aTb$Knb&CD;ds<638AtmD;_;(BUl(dSo4<+2 z{ZaAE`PUWg@vASy-|MTpLM-#&xWKyA;_^5e$EKpLSO%_4oDIUcKk{kxKp(0ak=ueE z0eQ{eQ5;ljz)A6j-@=u|tzw6dpfj}cM<)@xEV_AnBFpGb%GztLYQ-I1LCs>PW?2?} zl$r>gQk#huqy8CdGP*sR3e2YT+u>@|w#_yx|jF>FBNmmrY)%NyUMMbGg7GzRFlSYE$L0Ft9n# zg~hlob__%J8HxT4W9tr$#^ccgzr{YH{`~#t*dI?JgayVRgDi-A3Mdc-i1nhDVXiH4 z4`N%~KZs9CNvxAFI&qF*IpSSu;^a5Xqupo_jyGzd7F3`(hbfM4Oq(2by)KN-3@09> z@N~iYS|^{$lZY;m&8?HEYyqj;WDRSN4VUBbZm;HxMB~IV=ORcro`^W8z@PiR1({S zSAP8ZO&naP;1mk0zfL?-2ags!Z-e>?55ukt4<7v2gmC8kS*XxXN;pJ47U$;evNh(~ zf1YCGmh_~iT%%^@+Kt@2#kuL8EJdNSW-t7sw8HkH0$-O_sj1+eQky%7u!rh|3bO%2hZM-YxO>Bz`l_s*)=2l(DP3q0Q-Ym;z5z3dZ=v zMIQ_~^^9Lib_NVJ7Q$I)5%e{tUZ^N|JS2@rpmeJ4cwC?tByo!J6f{rOg9jyhAc;RD z@zEsw?-CbpE{r=S@djCDi#j3k14;NR2^>D0n(sIzb?o?+!pB>XKTUVME1)!`pHq1K zAsEy2;K!1EEs6a?;-4hpUrD?r38$Azs^NwtJWb@CrudTZtOO4KnwIa#7uOdkgGu@8 zpkAUoCP@#8%AI#p25w}hOI8!}d3G+eAv<4sw#)vp_*&S5tRdJeCEbGM?1Ld>mr2{| zB-@oRa*3|~6iQvX+A8E7LhcYUB4nSC4-0uf$ipNZ$Ixd1c5a7kU7ws^6gsDbd|SwO zh5Ss&b3(?2%!4h{b+t@Lw~$MOTrT7qA=e9evyfX!Lir54qZg}7u?OXHzmapF(EF{B ze-iSfkpC6(dz5x4ovEucg{&3wN+E9+vR6o4E9(4F$YVmjCgi6=V(!RZ2*#|r4iBzb z|#9ZE`&eKzNesCnbWkShJ@QK zWI5E&8MsXXQ7FZ$_KIwAcSzjrt;o)) zKrJiNH=r4Hp0CJuR5CR2u+mXU{ywhI9dz_rHie>*6KnxYs?>v=t>7%Px=P|yllcr^ z!}NJ(+ZbNN^zUGPWX>Bz(Id=&J37p8JeJ3nLC+2iN{BE1Bc{*&{14Rmy5s9{tm4pL zsRzoaVmQd>0{mDdyNcoTYGdIyNSr1f>sDyPSlgHt&u}|5SLyDjnJr(}&^T7F2&?y) z6_5A@!|6NK%5W6=m*{FX?5NUJkB}zG;D9{E$c+2>8^ayU&$ALwuJ-FppZj@-;TJJK zpC$0%kGAc57J!$221Ud{6EFP&i6<|hf#DO;#wvuD`KeTb=ZU3^sA2|pFh~3Wf1c^n z!)^t5V;nrj{EQtkL2UVvaSXELn+MT6fPEa?C2^|6#Vnx(Ouv@lmmy9KCyodDxn!+i z1-Pqq^=guiHs*9P)437$AiJHpu462I=hf(r#1HVqmen)%K4`Ad)x$7St-FVq2ZQOn z#_+`q{}u*n^nfN`yJ)E;jMXJhCG#+RKEu5XUkUjObu|daLfsK!I(+{hgLiQ)PcoL? zS*%(O!Ip)3&I!i);mL(%>S^dl&m%CrP!E33SZ+H3|6`#++4}Kg`7Dz-t&V?b%w+n! zA*#p0FHhiCivZkU4GZ98fj2ToOBvqDa38}X@J4MJWY=Z~_A!tA@qd)zQ<>!e^T?0H zVNh%J!0XJ4dwYlB)0nr|INnCcTX2+Fac^;kU&6d)$kzed7M@$7#A#c&A1A|I%+K@$ z4v*I5JLWMRZo34GI$iZcf1U1b8As;^hR5fB^rRvRQ?6WX}>@c%k&e%_&v|d*W zpt)Xmd+0B19F$Kpeyn^pG93S08pHR&j(Xj(pRp~BJp}{kbA++&mj)3PywOILg>;#-4-x23<{oEvR#r2pqJQtMOxbP+=H#=93I;q;Clv z$^CXK!{;Jz*>*`hxo__Tx1p;KK|jWQhS^e@mhD#}VivvL;vf&#;>TjEB~F>}6&XyQ zui_EdW9aS=7<(P_CSH^AKG|CvlrGkT<#giVpd8lX$I4-KKA{P`6=w_YVR$3Meg{28In#eIf&ci0WIqeQ8)%r}*E2_NGJGAwPcxjq*rdw8BWS_vm9q0I%VWe1%+X{p zmgtU|jNQoCa@ev&4^}buM#kc$7*rMdyv?djgoS@Dad|+D;g3jMw(l5zO5$?L93x7= z@aPVwe7xz6l!g_?1zS9N#w^K}fZL( zy(H4GVr>UEvUf?gL2&2UZfNuB86nB~VF)wX>&;Vl9emt-i5h$;N!|KG>SPjb{UMdk zetb{@)(?As5^nwI&L$-sR;nZ3L`*C_-hmUaDw-{zDU8GjSjZ5oo-5%JFH|Y>tTCdt+dSkt< zx`ezyccUw#xr|2rmEt delta 23 dcmZ3$w}5X#DWk;1G8G^(yNhwdW;MoNtN>l$2mb&7 diff --git a/src/ui.c b/src/ui.c index aed51aa..fe1b6cf 100644 --- a/src/ui.c +++ b/src/ui.c @@ -875,6 +875,7 @@ void ui_render_guide(SDL_Renderer *renderer, UiCache *cache, const ChannelList *channels, int active_channel, + int selected_channel, time_t app_start_time, time_t now_wall, int guide_time_offset_minutes) { @@ -894,8 +895,8 @@ void ui_render_guide(SDL_Renderer *renderer, SDL_Rect grid = {0, grid_y, window_width, window_height - grid_y - (int) (GUIDE_FOOTER_HEIGHT * scale_y)}; int row_height = grid.h / GUIDE_VISIBLE_ROWS; int timeline_w = window_width - guide_x_start - (int) (20 * scale_x); - int start_index = active_channel - 2; - const Channel *selected_channel = NULL; + int start_index = selected_channel - 2; + const Channel *selected_channel_ptr = NULL; double pixels_per_minute = timeline_w / 90.0; time_t guide_view_start_time = now_wall - (30 * 60) + (guide_time_offset_minutes * 60); time_t guide_focus_time = guide_view_start_time + (30 * 60); @@ -903,8 +904,8 @@ void ui_render_guide(SDL_Renderer *renderer, double guide_view_end_seconds = guide_view_start_seconds + TIMELINE_VISIBLE_SECONDS; double guide_focus_seconds = channel_schedule_elapsed_seconds(app_start_time, guide_focus_time); - if (channels && channels->count > 0 && active_channel >= 0 && active_channel < channels->count) { - selected_channel = &channels->items[active_channel]; + if (channels && channels->count > 0 && selected_channel >= 0 && selected_channel < channels->count) { + selected_channel_ptr = &channels->items[selected_channel]; } fill_three_stop_gradient(renderer, @@ -912,11 +913,11 @@ void ui_render_guide(SDL_Renderer *renderer, theme->background_top, theme->background_mid, theme->background_bottom); - draw_info_panel(renderer, fonts, theme, selected_channel, &info_panel, app_start_time, guide_focus_time); + draw_info_panel(renderer, fonts, theme, selected_channel_ptr, &info_panel, app_start_time, guide_focus_time); draw_panel_shadow(renderer, &preview); fill_rect(renderer, &preview, COLOR_BLACK); draw_video(renderer, video_texture, texture_width, texture_height, preview); - draw_mini_status_bar(renderer, fonts->small, theme, selected_channel, &mini_status_bar, now_wall); + draw_mini_status_bar(renderer, fonts->small, theme, selected_channel_ptr, &mini_status_bar, now_wall); if (cache->timeline_label_slot != guide_view_start_time / 60 || cache->timeline_theme != theme) { char label[32]; @@ -951,7 +952,7 @@ void ui_render_guide(SDL_Renderer *renderer, SDL_Rect sidebar = {0, row_rect.y, sidebar_width, row_height}; SDL_Rect timeline_rect = {guide_x_start, row_rect.y + (int) (6 * scale_y), timeline_w, row_height - (int) (12 * scale_y)}; SDL_Rect clip = timeline_rect; - int is_selected = channel_index == active_channel; + int is_selected = channel_index == selected_channel; SDL_Rect inset = {row_rect.x + 4, row_rect.y + 3, row_rect.w - 8, row_rect.h - 6}; draw_beveled_bar(renderer, @@ -1095,8 +1096,8 @@ void ui_render_guide(SDL_Renderer *renderer, } } - if (selected_channel && active_channel >= 0 && start_index <= active_channel && active_channel < start_index + GUIDE_VISIBLE_ROWS) { - SDL_Rect highlight = {0, grid.y + (active_channel - start_index) * row_height, window_width, row_height}; + if (selected_channel_ptr && selected_channel >= 0 && start_index <= selected_channel && selected_channel < start_index + GUIDE_VISIBLE_ROWS) { + SDL_Rect highlight = {0, grid.y + (selected_channel - start_index) * row_height, window_width, row_height}; draw_selection_glow(renderer, &highlight, theme->selection_edge); draw_selection_glow(renderer, &(SDL_Rect){guide_x_start, highlight.y + (int) (6 * scale_y), timeline_w, row_height - (int) (12 * scale_y)}, theme->selection_edge); } diff --git a/src/ui.h b/src/ui.h index e54039c..fd765c1 100644 --- a/src/ui.h +++ b/src/ui.h @@ -74,6 +74,7 @@ void ui_render_guide(SDL_Renderer *renderer, UiCache *cache, const ChannelList *channels, int active_channel, + int selected_channel, time_t app_start_time, time_t now_wall, int guide_time_offset_minutes); diff --git a/src/ui.o b/src/ui.o index ddb19a94939796b88ce1ce25c341f07fbb3519a8..688ca61d75fc38ef5727fc5e2c4d8b61ffe80c1e 100644 GIT binary patch delta 171 zcmZ3mjcLI)rVVilj1rUM6?7CdSQr>Q4*pQo{Nd5PM@0e1>vU1E_{6VsNb^v3i;BVI z)e3fu3X@+cc=AdBCA$kazF)H5q9U=`K{1DkQDgI3<+bdL5}Tv7Wf*}}g$@r3kZLt3 z2J$BVH2e!BzZ)e1g`$jEK?)K~R6$gmX(AgR$UOd@6+i#~@1CO~G5M?YYM{(Qn_5Oj Kh0XGIjIjVaKsGY~ delta 171 zcmZ3mjcLI)rVVili~^J66?7C7SQr>Q4*pQo{Nd5PM@0h2>vU1E_{6VsNb^v3i;BkN z)e3fu5|dvkc=8GWCA$kazF)H5q9U-_K{1DkQDO61<+bdL0-K|?Wf*}}g$@r3kZLt3 z2J$BVH2e!BzZ)e1g`$jEK?)K~R6$gmX(AgR$UOd@6+i#~@1CO~F!`(XYM{(Qn_5Oj KiOuqMjIjU;7&Vgs