diff -U10 -rN v4l2ucp-2.0.2/src/mainWindow.cpp v4l2ucp-2.0.2.new/src/mainWindow.cpp --- v4l2ucp-2.0.2/src/mainWindow.cpp 2010-01-23 14:52:12.000000000 +0000 +++ v4l2ucp-2.0.2.new/src/mainWindow.cpp 2012-11-22 19:32:56.389624284 +0000 @@ -256,25 +256,26 @@ break; case V4L2_CTRL_TYPE_MENU: w = new V4L2MenuControl(fd, ctrl, parent); break; case V4L2_CTRL_TYPE_BUTTON: w = new V4L2ButtonControl(fd, ctrl, parent); break; case V4L2_CTRL_TYPE_INTEGER64: case V4L2_CTRL_TYPE_CTRL_CLASS: default: + w = new V4L2UnknownControl(fd, ctrl, parent); break; } if(!w) { - new QLabel("Unknown control", parent); + new QLabel("Failed control", parent); new QLabel(parent); new QLabel(parent); return; } layout->addWidget(w); if(ctrl.flags & V4L2_CTRL_FLAG_GRABBED) { w->setEnabled(false); } diff -U10 -rN v4l2ucp-2.0.2/src/v4l2controls.cpp v4l2ucp-2.0.2.new/src/v4l2controls.cpp --- v4l2ucp-2.0.2/src/v4l2controls.cpp 2009-11-11 19:23:24.000000000 +0000 +++ v4l2ucp-2.0.2.new/src/v4l2controls.cpp 2012-11-22 21:13:20.969726087 +0000 @@ -66,21 +66,21 @@ setValue(c.value); } struct v4l2_queryctrl ctrl; ctrl.id = cid; if(v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &ctrl) == -1) { QString msg; msg.sprintf("Unable to get the status of %s\n%s", name, strerror(errno)); QMessageBox::warning(this, "Unable to get control status", msg, "OK"); } else { - setEnabled(ctrl.flags == 0); + setEnabled((ctrl.flags & (V4L2_CTRL_FLAG_DISABLED|V4L2_CTRL_FLAG_READ_ONLY)) == 0); } } void V4L2Control::resetToDefault() { if(isEnabled()) { setValue(default_value); updateHardware(); } } @@ -231,36 +231,47 @@ void V4L2MenuControl::menuActivated(int val) { setValue(val); updateHardware(); } /* * V4L2ButtonControl */ +V4L2UnknownControl::V4L2UnknownControl + (int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : + V4L2Control(fd, ctrl, parent) +{ + QLabel *l = new QLabel(parent); + this->layout.addWidget(l); +} + +/* + * V4L2ButtonControl + */ V4L2ButtonControl::V4L2ButtonControl (int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : V4L2Control(fd, ctrl, parent) { QPushButton *pb = new QPushButton((const char *)ctrl.name, this); this->layout.addWidget(pb); QObject::connect( pb, SIGNAL(clicked()), this, SLOT(updateHardware()) ); } void V4L2ButtonControl::updateStatus() { struct v4l2_queryctrl ctrl; ctrl.id = cid; if(v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &ctrl) == -1) { QString msg; msg.sprintf("Unable to get the status of %s\n%s", name, strerror(errno)); QMessageBox::warning(this, "Unable to get control status", msg, "OK"); } else { - setEnabled(ctrl.flags == 0); + setEnabled((ctrl.flags & (V4L2_CTRL_FLAG_DISABLED|V4L2_CTRL_FLAG_READ_ONLY)) == 0); } } void V4L2ButtonControl::resetToDefault() { } diff -U10 -rN v4l2ucp-2.0.2/src/v4l2controls.h v4l2ucp-2.0.2.new/src/v4l2controls.h --- v4l2ucp-2.0.2/src/v4l2controls.h 2009-06-20 12:28:12.000000000 +0000 +++ v4l2ucp-2.0.2.new/src/v4l2controls.h 2012-11-22 19:31:35.517622918 +0000 @@ -41,20 +41,32 @@ protected: V4L2Control(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); int fd; int cid; int default_value; char name[32]; QHBoxLayout layout; }; + +class V4L2UnknownControl : public V4L2Control +{ + Q_OBJECT +public: + V4L2UnknownControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); + +public slots: + void setValue(int) {}; + int getValue() { return 0; }; +}; + class V4L2IntegerControl : public V4L2Control { Q_OBJECT public: V4L2IntegerControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); public slots: void setValue(int val); public: