$ git clone https://librecgm.ion.nu/librecgm.git
commit db7c1762df9b7cf8fb13875643f96c157fc3c617
Author: Alicia <...>
Date:   Sun Sep 26 15:12:14 2021 +0200

    Handle not finding any video devices better in the GUI.

diff --git a/cam.c b/cam.c
index a161938..4aec760 100644
--- a/cam.c
+++ b/cam.c
@@ -28,6 +28,17 @@
 struct cam* cam_init(const char* dev)
 {
   struct cam* cam=malloc(sizeof(struct cam));
+#ifndef ENABLE_V4L2
+  dev=0;
+#endif
+  if(!dev)
+  {
+    // Bogus values to prevent division by 0
+    cam->w=16;
+    cam->h=16;
+    cam->fd=-1;
+    return cam;
+  }
 #ifdef ENABLE_V4L2
   int fd=v4l2_open(dev, O_RDWR);
   struct v4l2_format fmt;
@@ -43,29 +54,31 @@ struct cam* cam_init(const char* dev)
   cam->fd=fd;
   cam->w=fmt.fmt.pix.width;
   cam->h=fmt.fmt.pix.height;
-#else
-  // Bogus values to prevent division by 0
-  cam->w=16;
-  cam->h=16;
 #endif
   return cam;
 }
 
 void cam_read(struct cam* cam, void* pixels)
 {
+  if(cam->fd>-1)
+  {
 #ifdef ENABLE_V4L2
-  v4l2_read(cam->fd, pixels, cam->w*cam->h*3);
-#else
-  memset(pixels, 128, 16*16*3);
+    v4l2_read(cam->fd, pixels, cam->w*cam->h*3);
 #endif
+  }else{
+    memset(pixels, 128, 16*16*3);
+  }
 }
 
 void cam_free(struct cam* cam)
 {
 #ifdef ENABLE_V4L2
-  v4l2_close(cam->fd);
-  free(cam);
+  if(cam->fd>-1)
+  {
+    v4l2_close(cam->fd);
+  }
 #endif
+  free(cam);
 }
 
 void cam_grab(struct img* img, const char* dev)
diff --git a/gui.c b/gui.c
index 8e59e17..9ab4664 100644
--- a/gui.c
+++ b/gui.c
@@ -248,7 +248,6 @@ void gui_run(int** onlygrab, int unitmax)
     char* path=strdup(devname);
     if(!viewlist)
     {
-      cam=cam_init(path);
       currentcam=path;
     }
     GtkWidget* item=gtk_radio_menu_item_new_with_label(viewlist, devname);
@@ -256,6 +255,7 @@ void gui_run(int** onlygrab, int unitmax)
     g_signal_connect_swapped(item, "activate", G_CALLBACK(switchcam), path);
     gtk_container_add(GTK_CONTAINER(viewmenu), item);
   }
+  cam=cam_init(currentcam);
   gtk_widget_show_all(window);
   g_timeout_add_full(G_PRIORITY_LOW, 1000/10, G_SOURCE_FUNC(updatecam), onlygrab, 0);
   gtk_main();