@@ -185,6 +185,19 @@ static gboolean on_webview_timeout(gpointer data)
185185 return G_SOURCE_REMOVE ;
186186}
187187
188+ static gboolean on_key_press (GtkWidget * widget , GdkEventKey * event ,
189+ gpointer data )
190+ {
191+ (void )widget ;
192+ (void )data ;
193+
194+ if (event -> keyval == GDK_KEY_Escape ) {
195+ gtk_main_quit ();
196+ return TRUE;
197+ }
198+ return FALSE;
199+ }
200+
188201static gboolean on_button_press (GtkWidget * widget , GdkEventButton * event ,
189202 gpointer data )
190203{
@@ -277,24 +290,54 @@ static GtkWidget *create_web_view(void)
277290/* Argument parsing */
278291/* ------------------------------------------------------------------ */
279292
293+ static void usage (const char * name )
294+ {
295+ printf ("Usage: %s [OPTIONS]\n"
296+ "\n"
297+ "Options:\n"
298+ " -f, --fullscreen Run in fullscreen mode\n"
299+ " -l, --location LOCATION City or Country,City (e.g., \"Stockholm\"\n"
300+ " or \"Sweden,Stockholm\"), geocoded via Open-Meteo\n"
301+ " --lat LATITUDE Latitude for weather (default: 59.3293)\n"
302+ " --lon LONGITUDE Longitude for weather (default: 18.0686)\n"
303+ " --url URL Web page URL shown on touch/click\n"
304+ " -h, --help Show this help message\n"
305+ "\n"
306+ "Environment variables LATITUDE, LONGITUDE, LOCATION, and WEB_URL\n"
307+ "are used as fallbacks when options are not given.\n"
308+ "\n"
309+ "Press Escape to exit.\n" , name );
310+ }
311+
280312static void parse_args (int argc , char * argv [])
281313{
282314 /* Defaults from environment, then fallback */
283315 const char * env ;
316+ const char * location = NULL ;
284317
285318 env = getenv ("LATITUDE" );
286319 app .latitude = env ? atof (env ) : 59.3293 ; /* Stockholm */
287320
288321 env = getenv ("LONGITUDE" );
289322 app .longitude = env ? atof (env ) : 18.0686 ;
290323
324+ env = getenv ("LOCATION" );
325+ if (env ) location = env ;
326+
291327 env = getenv ("WEB_URL" );
292328 app .web_url = env ? strdup (env ) : NULL ;
293329
294330 app .fullscreen = FALSE;
295331
296332 for (int i = 1 ; i < argc ; i ++ ) {
297- if ((strcmp (argv [i ], "--lat" ) == 0 ) && i + 1 < argc ) {
333+ if (strcmp (argv [i ], "-h" ) == 0 ||
334+ strcmp (argv [i ], "--help" ) == 0 ) {
335+ usage (argv [0 ]);
336+ exit (0 );
337+ } else if ((strcmp (argv [i ], "-l" ) == 0 ||
338+ strcmp (argv [i ], "--location" ) == 0 ) && i + 1 < argc ) {
339+ location = argv [++ i ];
340+ } else if ((strcmp (argv [i ], "--lat" ) == 0 ) && i + 1 < argc ) {
298341 app .latitude = atof (argv [++ i ]);
299342 } else if ((strcmp (argv [i ], "--lon" ) == 0 ) && i + 1 < argc ) {
300343 app .longitude = atof (argv [++ i ]);
@@ -306,6 +349,20 @@ static void parse_args(int argc, char *argv[])
306349 app .fullscreen = TRUE;
307350 }
308351 }
352+
353+ if (location ) {
354+ double lat , lon ;
355+
356+ if (weather_geocode (location , & lat , & lon )) {
357+ app .latitude = lat ;
358+ app .longitude = lon ;
359+ fprintf (stderr , "Location \"%s\" -> %.4f, %.4f\n" ,
360+ location , lat , lon );
361+ } else {
362+ fprintf (stderr , "Could not geocode \"%s\", using default coordinates\n" ,
363+ location );
364+ }
365+ }
309366}
310367
311368/* ------------------------------------------------------------------ */
@@ -343,10 +400,12 @@ int main(int argc, char *argv[])
343400 if (app .fullscreen )
344401 gtk_window_fullscreen (GTK_WINDOW (app .window ));
345402
346- /* Enable button press events on the window */
347- gtk_widget_add_events (app .window , GDK_BUTTON_PRESS_MASK );
403+ /* Enable input events on the window */
404+ gtk_widget_add_events (app .window , GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK );
348405 g_signal_connect (app .window , "button-press-event" ,
349406 G_CALLBACK (on_button_press ), NULL );
407+ g_signal_connect (app .window , "key-press-event" ,
408+ G_CALLBACK (on_key_press ), NULL );
350409
351410 /* Stack with two children */
352411 app .stack = gtk_stack_new ();
0 commit comments