$ 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();