From c840dc01345658bcbe59f1b7caedd281ee27a4cc Mon Sep 17 00:00:00 2001 From: markmental Date: Sat, 28 Mar 2026 00:45:10 -0400 Subject: [PATCH] Implement full screen --- src/app.c | 33 +++++++++++++++++++++++++++++++-- src/app.h | 1 + src/app.o | Bin 10904 -> 11424 bytes src/ui.c | 53 ++++++++++++++++++++++++++++++++--------------------- src/ui.h | 11 +++++++++-- src/ui.o | Bin 25328 -> 26712 bytes 6 files changed, 73 insertions(+), 25 deletions(-) diff --git a/src/app.c b/src/app.c index 6ac3aef..b355fdd 100644 --- a/src/app.c +++ b/src/app.c @@ -137,6 +137,21 @@ static void tune_relative(App *app, int delta) { player_tune(&app->player, next_index); } +static void toggle_fullscreen(App *app) { + Uint32 flags; + + if (!app || !app->window) { + return; + } + + flags = app->is_fullscreen ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP; + if (SDL_SetWindowFullscreen(app->window, flags) == 0) { + app->is_fullscreen = !app->is_fullscreen; + } else { + fprintf(stderr, "Fullscreen toggle failed: %s\n", SDL_GetError()); + } +} + static void handle_event(App *app, const SDL_Event *event) { if (event->type == SDL_QUIT) { app->running = 0; @@ -158,6 +173,9 @@ static void handle_event(App *app, const SDL_Event *event) { case SDLK_TAB: app->mode = app->mode == MODE_FULLSCREEN ? MODE_GUIDE : MODE_FULLSCREEN; break; + case SDLK_f: + toggle_fullscreen(app); + break; case SDLK_UP: tune_relative(app, -1); break; @@ -243,6 +261,8 @@ void app_run(App *app) { while (app->running) { int in_blackout; + int output_width = WINDOW_WIDTH; + int output_height = WINDOW_HEIGHT; Uint64 now_ticks; time_t now_wall; @@ -255,6 +275,11 @@ void app_run(App *app) { break; } + if (SDL_GetRendererOutputSize(app->renderer, &output_width, &output_height) != 0) { + output_width = WINDOW_WIDTH; + output_height = WINDOW_HEIGHT; + } + in_blackout = player_is_in_blackout(&app->player); now_ticks = SDL_GetTicks64(); now_wall = time(NULL); @@ -266,7 +291,7 @@ void app_run(App *app) { app->last_blackout_state = in_blackout; if (app->channels.count == 0) { - ui_render_no_media(app->renderer, &app->ui_cache); + ui_render_no_media(app->renderer, &app->ui_cache, output_width, output_height); } else if (app->mode == MODE_GUIDE) { if (!in_blackout) { player_resume_audio(&app->player); @@ -275,6 +300,8 @@ void app_run(App *app) { in_blackout ? NULL : app->video_texture, app->texture_width, app->texture_height, + output_width, + output_height, &app->fonts, &app->ui_cache, &app->channels, @@ -289,7 +316,9 @@ void app_run(App *app) { ui_render_fullscreen(app->renderer, in_blackout ? NULL : app->video_texture, app->texture_width, - app->texture_height); + app->texture_height, + output_width, + output_height); } SDL_RenderPresent(app->renderer); diff --git a/src/app.h b/src/app.h index 1a70c95..9f0e269 100644 --- a/src/app.h +++ b/src/app.h @@ -16,6 +16,7 @@ typedef struct App { int texture_height; AppMode mode; int running; + int is_fullscreen; int startup_handoff_active; int last_blackout_state; Uint32 startup_handoff_until; diff --git a/src/app.o b/src/app.o index b89b50093f19c96a73c19646f94943cc9dfc1349..c3becbd4e2de00fb6fbf49e86865312562a12b62 100644 GIT binary patch delta 3607 zcmZWsdu&tJ8TWM_IK;j-g>db}ucSA`2?>t7(C}`qeY4ysrX++AQlNzmhcN|cu%oq0 zCnt-&;ayyko>l^lP4GuIwop0mp?9oqqMym!n&s3fcmohXnr&Qh>oR|h;B9-$m<&DXJ$bn2r z+?fp2j(x&6P2605s@63_Gd?6EjNUJ$#kb{_204EhZ4@8slm5Mt(^&T-_L-HOGDjR50;( zP}Y2#W0!$a)P9Q+Pe&eC)QoFob-)^V7Il=#fQ5R3-HN-~Z#YZac)q!-W2+1XF*vA4 z!~xhc7KwmGNlYrVspp_xa2iFaZ&pbJtQj4M2&OcB-)w98Cn%S}%L!nDS{86T21iBR zBEEoDFgM&~b$hkcB|Xy^zY#IXYM_n|FwSGFeuI+SBHEQ?M9hSO!C0b?PA%I3N$Z&} ztt4d8fZo;q+UCS$JZ+BMgy`6}i%_uI(kdsyweid5SO*-nfx#qYH7MF;7_rqitG3wH zb}RHV<0|{|iovks%zQen3|>49KDY0bc1Sy=XQk&ZbgwYGXajY+^=&#`gE{t7`ns9E z#=ip=5S2!Z($}HGP@(TC)T;bCDRb%LbZ-B?Cnc_vHiJEims?K2?Vf?#OvvpqgwgVN1#a3f;!5H_X&qMHR3xewQ1}I)h_A3v%p{1)Nhb)k_tP(m5m~~JMTa=;O2B|Y05u;YA zUE179$G$a~m~F+7%FxAz)WlmXQ}_$?0qUn>?GB_q1d2@MI*L;!(7%xV4QZd5)H+CPY}LYdIoB8a zdV0cNJ`@Taa7PaA-P;p#ckkZU6WX)JT^?Sj(~bSDP|yqX_j#JShowLxbenj~QN5p( z@Ws(-E+@?Kx40($Q|=(_etw$M|8gO}O5$rJ-s9)pe%|WmEq>n6QkZj{s`^1y=I3A^ z(EItrdWj#_H}c2yGJjIvOwCX7h70dqdH=T`NN^fj@U8qKdCASEQ$brMoujfxbuh~BYr~BHUqN9;CtPm>DT9GEIvh@dx$!+`!Rvb zLtKLBKwN<+A#Ot4jkq7NAMx9WFC)H&cmnZt#CIs#egUy*4g<8Au&}AHPoT~Rh&K^A zA}tX(2VyOvAMqK)gNRYYaEBAY`8_Jj_F4sGg- zJl_{--}iO$mi4QP+e4AgeFyd&{Mv(SN0!)baV|1%^8(fsQ{0J|EEYI7dA;~3S4viv zcp>jl$qzwlvI~IacCXC^nZiBCbwisb9j1%yN1eFcOR614GHw@bZbr8X?h##7*G=Z_ zUap+fI0Ul8VKlWdvI?@(A#fhj=kStWf$aN?tcsii*>Z9XWOk>~^dCl6LmWA%-FeSRQ+FZ2$ zxXVjEcNtA}+U=!VEqUK1n0)Y-_1Z%k~Wb3 znUStzr1@kJr0W&{1&ijh0iJ9=G8qMFFC%SWq)D;48M%Ay3O!@hQG`3 z0fzsQ0S>TeZfoJm=B8$NKMK5z;4EVxGkjeE9AHsLjqqe0Z6_a!Li1rp+QdkYGrYp^ z=NO)iQb>H|LbO-=6wz3$w^taR{+*M};kd@*C1d!L4DV$4A2WW+82;xOz6y(ciV^&Q zF=%1<88QOt-esh0j~5k!DlA&YMtHL6IvDR zU^BT{-o7ZPeHv+p=rcu{m)+5~6_Pa-PZqS600ZkZd9k8iKT=5kxNIqz;&aKB3Xwe; zJz~L#=DLNf_SEaAjpUGLL!O%lYxqZVF}dXN6x7laEH|0p7ZYQpsBh)(y9`!}1+ALG zF7je!y?(BOyi>WM=xuYx>XLSm>HlI}B(G|D!3#o0a*eF6sxR2)$(&;7{Yr)Lf7=#s A5C8xG delta 3169 zcmZ8je{36f6~A-R&S~sBr=_{1No=P%w-+a=ooOr`YpPuAlnZs%v`MUAboC_vJ?bZr`4I}l=ZKL&H$vI)AAj}mi-ZQ>8 zA5le&8QGijk@ozr#BYdhjfl>r7*XN;(Tb=eVeU{fugK}$m4cu@XyiU>=)3h1eK?le z|Io;gk^R6(UO&aERH{bqpz4Vs433X)l6`5barWjly2)IO?>D2Wr(3`t@&0b1LJ+3@ zIDJ%Y5~kk3fZDxN5PIbFtV0mwnYU4tx?Lrw51z&6)a{0;^Qj|#QBHpo)41xgPrzwV zeVm5fXX#`;L))iQSqJ?Ooa9#t1rur&c!HeMIZa z6y@|~WMbLBq0}xbr+R z|G2(ae?))u#qkr}yJ$}{uP+yi=Jr84N0;IA&L;7<5UO66n2)gY7R}y4w|L+%+uEPP zXE8zcO%q`bS*{l2hb%`8=!iUL?kg6HrD<9g4Rg{{2qKNg!tU2Wty9PF)O0SQRpV#5 zs3;a5Ax)yxz~6Z>vnbDA%tri$JO3^g$7NrX?X=U#zN&vV|yhY6AI-#?SLekCS~$&+$84(89uR~+!%>JN$M;oNFPTx9q=!uq#Rwi;harMxb( zj^i&(^B%+Z85S8zps!Ixg`vjqeun)FM;Y#CIK?o@@EF4xhF@j)Erw?Z>+|TDJWS(` z(_qVopFd`rR~Y`D;Rg&AXkM#`L55ox4m11&!zUQdF#Ha~=NVpRcok}DLt+ISu2t&S z;Hjg&!YbC*S~I-$QB>T-Fv4({;XZ~>Ff0LkRI{ zhOak->b+PJPZk@7)k&aL_CZtQjOd56jUllat~NeXru;7YqCrY8oNl6;uQn-Vnrmg6 zWz@7lhc_hpV6Rs}obraC-Rp82csOWKtpHr`D)19z_i*e+xPjX1UKeOS7c}}@?n_)W z2m`(l#4vIUucH{P!=$5{x#?Y2n)69G=~uw;tFXoIg2(-? z`Vbd=jjI%f(|$HjfB8HmYJ#e-=WwC+vl=r#y3hvfd)`#lv!D^-1y<4WdipqPy-9pMhOS$r1`*>Sk z4z-Z-G*kYdC3J|ddC68%>3g|eZTR1X#{cs>IDP}hOWyWyd>6;>gPp3F&G8YAzrpcQj=y8^y{vH` z7tpHk0S6i48+?-Ew_&VgXbv9Rpd{YrqWr>0_M3^S8C;ga@%^y9RC2vPjdVYxUq4lCThQ?=%CRhz)tO^J8A2P5b(EU4UDzc zRb8oP&q5s}Te}={tKghm3k$7U>DCj}s^;v>4$y;Lj$766WN_<>F#U&RWfp>(qsI;J z2e&%L+$?{vO{*GX|8WK3AxO4iQUG3P+q(9=WObXi4;g8^;BIfL+FWZzPJ`awRW-Q5 KdP>7wtM5P7LBv`B diff --git a/src/ui.c b/src/ui.c index d9d9bc3..ea9d2de 100644 --- a/src/ui.c +++ b/src/ui.c @@ -481,16 +481,21 @@ static void draw_scanline_overlay(SDL_Renderer *renderer, int width, int height) SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); } -void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache) { - SDL_Rect full = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; +void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache, int window_width, int window_height) { + SDL_Rect full = {0, 0, window_width, window_height}; fill_rect(renderer, &full, COLOR_NAVY_DARK); draw_cached_text(renderer, &cache->no_media_title, 58, 80); draw_cached_text(renderer, &cache->no_media_body, 58, 136); draw_cached_text(renderer, &cache->no_media_hint, 58, 176); } -void ui_render_fullscreen(SDL_Renderer *renderer, SDL_Texture *video_texture, int texture_width, int texture_height) { - SDL_Rect window = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; +void ui_render_fullscreen(SDL_Renderer *renderer, + SDL_Texture *video_texture, + int texture_width, + int texture_height, + int window_width, + int window_height) { + SDL_Rect window = {0, 0, window_width, window_height}; fill_rect(renderer, &window, COLOR_BLACK); draw_video(renderer, video_texture, texture_width, texture_height, window); } @@ -499,6 +504,8 @@ void ui_render_guide(SDL_Renderer *renderer, SDL_Texture *video_texture, int texture_width, int texture_height, + int window_width, + int window_height, const UiFonts *fonts, UiCache *cache, const ChannelList *channels, @@ -506,14 +513,18 @@ void ui_render_guide(SDL_Renderer *renderer, Uint64 app_start_ticks, Uint64 now_ticks, time_t now_wall) { - SDL_Rect full = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; - SDL_Rect info_panel = {0, 0, GUIDE_INFO_WIDTH, GUIDE_INFO_HEIGHT}; - SDL_Rect preview = {WINDOW_WIDTH - GUIDE_PREVIEW_WIDTH, 0, GUIDE_PREVIEW_WIDTH, GUIDE_PREVIEW_HEIGHT}; - SDL_Rect status_bar = {GUIDE_INFO_WIDTH, 0, WINDOW_WIDTH - GUIDE_INFO_WIDTH, GUIDE_STATUS_HEIGHT}; - SDL_Rect header_row = {0, GUIDE_GRID_TOP - GUIDE_STATUS_HEIGHT, WINDOW_WIDTH, GUIDE_STATUS_HEIGHT}; - SDL_Rect grid = {0, GUIDE_GRID_TOP, WINDOW_WIDTH, WINDOW_HEIGHT - GUIDE_GRID_TOP - GUIDE_FOOTER_HEIGHT}; + double scale_x = (double) window_width / WINDOW_WIDTH; + double scale_y = (double) window_height / WINDOW_HEIGHT; + int guide_x_start = (int) (GUIDE_X_START * scale_x); + int sidebar_width = (int) (GUIDE_SIDEBAR_WIDTH * scale_x); + SDL_Rect full = {0, 0, window_width, window_height}; + SDL_Rect info_panel = {0, 0, (int) (GUIDE_INFO_WIDTH * scale_x), (int) (GUIDE_INFO_HEIGHT * scale_y)}; + SDL_Rect preview = {window_width - (int) (GUIDE_PREVIEW_WIDTH * scale_x), 0, (int) (GUIDE_PREVIEW_WIDTH * scale_x), (int) (GUIDE_PREVIEW_HEIGHT * scale_y)}; + SDL_Rect status_bar = {info_panel.w, 0, window_width - info_panel.w, (int) (GUIDE_STATUS_HEIGHT * scale_y)}; + SDL_Rect header_row = {0, (int) ((GUIDE_GRID_TOP - GUIDE_STATUS_HEIGHT) * scale_y), window_width, (int) (GUIDE_STATUS_HEIGHT * scale_y)}; + SDL_Rect grid = {0, (int) (GUIDE_GRID_TOP * scale_y), window_width, window_height - (int) (GUIDE_GRID_TOP * scale_y) - (int) (GUIDE_FOOTER_HEIGHT * scale_y)}; int row_height = grid.h / GUIDE_VISIBLE_ROWS; - int timeline_w = WINDOW_WIDTH - GUIDE_X_START - 20; + int timeline_w = window_width - guide_x_start - (int) (20 * scale_x); int start_index = active_channel - 2; const Channel *selected_channel = NULL; double pixels_per_minute = timeline_w / 90.0; @@ -554,9 +565,9 @@ void ui_render_guide(SDL_Renderer *renderer, for (int row = 0; row < GUIDE_VISIBLE_ROWS; ++row) { int channel_index = start_index + row; - SDL_Rect row_rect = {0, grid.y + row * row_height, WINDOW_WIDTH, row_height}; - SDL_Rect sidebar = {0, row_rect.y, GUIDE_SIDEBAR_WIDTH, row_height}; - SDL_Rect timeline_rect = {GUIDE_X_START, row_rect.y + 6, timeline_w, row_height - 12}; + SDL_Rect row_rect = {0, grid.y + row * row_height, window_width, row_height}; + 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; SDL_Rect inset = {row_rect.x + 4, row_rect.y + 3, row_rect.w - 8, row_rect.h - 6}; @@ -588,9 +599,9 @@ void ui_render_guide(SDL_Renderer *renderer, const ProgramEntry *program = channel_resolve_program(channel, app_start_ticks, now_ticks, &program_seek, NULL); time_t guide_view_start_time = now_wall - (30 * 60); time_t program_start_time = now_wall - (time_t) live_position; - int block_x = GUIDE_X_START; + int block_x = guide_x_start; int block_w = 48; - SDL_Rect block = {GUIDE_X_START, timeline_rect.y + 4, 48, timeline_rect.h - 8}; + SDL_Rect block = {guide_x_start, timeline_rect.y + 4, 48, timeline_rect.h - 8}; SDL_Rect title_rect = {block.x + 8, block.y + 8, block.w - 16, block.h - 16}; char title[128]; @@ -599,7 +610,7 @@ void ui_render_guide(SDL_Renderer *renderer, } live_position = channel_live_position_precise(channel, app_start_ticks, now_ticks); program_start_time = now_wall - (time_t) program_seek; - block_x = GUIDE_X_START + (int) (((double) (program_start_time - guide_view_start_time)) / 60.0 * pixels_per_minute); + block_x = guide_x_start + (int) (((double) (program_start_time - guide_view_start_time)) / 60.0 * pixels_per_minute); block_w = (int) ((program->duration_seconds / 60.0) * pixels_per_minute); block = (SDL_Rect){block_x, timeline_rect.y + 4, SDL_max(block_w, 48), timeline_rect.h - 8}; title_rect = (SDL_Rect){block.x + 8, block.y + 8, block.w - 16, block.h - 16}; @@ -642,13 +653,13 @@ 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}; + SDL_Rect highlight = {0, grid.y + (active_channel - start_index) * row_height, window_width, row_height}; draw_selection_glow(renderer, &highlight); - draw_selection_glow(renderer, &(SDL_Rect){GUIDE_X_START, highlight.y + 6, timeline_w, row_height - 12}); + draw_selection_glow(renderer, &(SDL_Rect){guide_x_start, highlight.y + (int) (6 * scale_y), timeline_w, row_height - (int) (12 * scale_y)}); } - draw_footer_legend(renderer, cache, WINDOW_WIDTH, WINDOW_HEIGHT); - draw_scanline_overlay(renderer, WINDOW_WIDTH, WINDOW_HEIGHT); + draw_footer_legend(renderer, cache, window_width, window_height); + draw_scanline_overlay(renderer, window_width, window_height); } int ui_cache_init(UiCache *cache, SDL_Renderer *renderer, const UiFonts *fonts, const ChannelList *channels) { diff --git a/src/ui.h b/src/ui.h index 3b3208b..02fc9ac 100644 --- a/src/ui.h +++ b/src/ui.h @@ -46,11 +46,18 @@ typedef struct UiCache { int channel_count; } UiCache; -void ui_render_fullscreen(SDL_Renderer *renderer, SDL_Texture *video_texture, int texture_width, int texture_height); +void ui_render_fullscreen(SDL_Renderer *renderer, + SDL_Texture *video_texture, + int texture_width, + int texture_height, + int window_width, + int window_height); void ui_render_guide(SDL_Renderer *renderer, SDL_Texture *video_texture, int texture_width, int texture_height, + int window_width, + int window_height, const UiFonts *fonts, UiCache *cache, const ChannelList *channels, @@ -58,7 +65,7 @@ void ui_render_guide(SDL_Renderer *renderer, Uint64 app_start_ticks, Uint64 now_ticks, time_t now_wall); -void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache); +void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache, int window_width, int window_height); int ui_load_fonts(UiFonts *fonts); void ui_destroy_fonts(UiFonts *fonts); int ui_cache_init(UiCache *cache, SDL_Renderer *renderer, const UiFonts *fonts, const ChannelList *channels); diff --git a/src/ui.o b/src/ui.o index b930071afba05a510e6072a9f8d7e429ae711475..a98777df2f47967ac3f560b48735a2fc36715ee2 100644 GIT binary patch literal 26712 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

2?+UK+|EX}5saWOn zsDdw59D`;3}V(f~$PKD9+t9p7fW5ay*L^JV(J73!LOs<*!k2wcU_{tL=sr zT;;Pv!Bsy0rQoWbjHkdqBaZ4Mr%HcK3cO3f)%6lhf&W_y{0}Mcr&Hjsq`=Rn!1XM2 z2!Z;g%9)!2U!4M9ui%y7CFi|g!Bzf8Qs9mYNScqz<4%E>r@$Li;J;CDRnE(VU!A;O z<|??VZ`TQ&^!$I}k^Q|zp*Iygq|nn@UebRv1^xd~=;<$#CH-S5=uauQs^>V8vq1e) z7R`5S5_-qCD{R=V(B9|EZcuPl|7#Uo<+CFNeni1l{>Kzt)${ihT;*TwV&b#; znunyEuUiG4tPj7SO$&i=mCut3uFCU_f~)epsNgD}#g{SmOdeXYQl5ywll5e?f~)-h zL*Y}P@c9&Nq6o=+E?00>-~0-G6Y5EMzOCTue)MyJr-4@8PoGfemn(dpRdAKhNd;Hw z&nfsV3LpND&+&CfSA$Yc-Hi+a^>-y6iGNzbRX$fJxJrM$z^PyJ6+V>;uIkTi3Ln*; zbSv}=6h7Z0X9XbxkE##b6kOG-9SW|_`_l@p@+l*y2Z7{Yh)0e?mB6W8RnGrZaMiv& zNRx^{^r}3ME4V7pAq7|IPbj!bpGnRK0?BzL9w}$Jz?0jpQE-({SmAS(!e^U8ugbGu z!Bsx5D15%8@R?1{4MMU!^A%j>vsA&=cJEMd)gFF71->%{emn(!DLE5DPL=<%6!>ox zT-Bfb3a-k3Si#l)zNX+RpOY!@DPK&;sq+7Xf~)*5QE-+2&jg-qf6B-yL7@4%6_3=b z7J(DJa21i#v~>zzguJAGP{D~li--|^r{KlNOZvkKPW041g*O!ZYUCyTg>zXk(|@9u z_+<)yje;*yaFu?Af?uo9->cw6FT=ko_;mnfyZs8T^53Q4*DLg63a;``C#MI2#`(*5 zB>&45T;*S?;2wqkdje0M$D;~8@sZ=~orerU^8DVNgiCq$DL74$#E&Srq2R{^PVK4o zGm|!51lg|S^Hl{`?eJX!Pv-M`gMBARUcwK`tDPSDf%PsJnK zm*amMFlt{cJEV9xA=*!#Zz;E=YeRyt3nd_9a>5Zj>^Jcv`N{Y$6irs&BkB((sT<(KidQ7+Resf(QdNkTI1!=NE7dHiI3_OD$ke5BkGdJu`p z=5Jjcr;zrU#>aJ+u^0a(yaJ);+4>^3gB;9d}`OdG4cQ VMSLf#e`F1>@mpC@#L46L{{To{q7VQ8 literal 25328 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