diff --git a/CMakeLists.txt b/CMakeLists.txt index d73f19f4e8..f3f15e0b16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -433,7 +433,7 @@ if(LINUX) src/detection/wm/wm_nosupport.c src/detection/de/de_linux.c src/detection/wmtheme/wmtheme_linux.c - src/detection/camera/camera_nosupport.c + src/detection/camera/camera_linux.c src/util/platform/FFPlatform_unix.c ) elseif(ANDROID) diff --git a/src/detection/camera/camera_linux.c b/src/detection/camera/camera_linux.c new file mode 100644 index 0000000000..99a2b85b6a --- /dev/null +++ b/src/detection/camera/camera_linux.c @@ -0,0 +1,46 @@ +#include "camera.h" +#include "common/io/io.h" + +#include +#include +#include + +#if __has_include() + #include +#endif + +const char* ffDetectCamera(FFlist* result) +{ +#if __has_include() + char path[] = "/dev/videoN"; + + for (uint32_t i = 0; i <= 9; ++i) + { + path[sizeof(path) - 2] = (char) (i + '0'); + FF_AUTO_CLOSE_FD int fd = open(path, O_RDONLY); + if (fd < 0) + break; + + struct v4l2_capability cap = {}; + if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0 || !(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) + continue; + + struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE }; + if (ioctl(fd, VIDIOC_G_FMT, &fmt) < 0) + continue; + + FFCameraResult* camera = (FFCameraResult*) ffListAdd(result); + ffStrbufInitS(&camera->name, (const char*) cap.card); + ffStrbufInit(&camera->vendor); + ffStrbufInitS(&camera->id, (const char*) cap.bus_info); + camera->width = camera->height = 0; + + camera->width = fmt.fmt.pix.width; + camera->height = fmt.fmt.pix.height; + } + + return NULL; +#else + return "Fastfetch was compiled without "; +#endif +}