| Line | Revision | Contents |
| 1 | 1 | #include "EeeCamTray.h" |
| 2 | #include <QApplication> |
|
| 3 | #include <QtDebug> |
|
| 4 | #include <QFile> |
|
| 5 | #include <QTimer> |
|
| 6 | #include <QMenu> |
|
| 7 | ||
| 8 | EeeCamTray::EeeCamTray() |
|
| 9 | : QSystemTrayIcon() |
|
| 10 | { |
|
| 11 | enableAct = new QAction(QIcon(":/CameraOn.png"), tr("Enable camera"), this); |
|
| 12 | connect(enableAct, SIGNAL(triggered()), this, SLOT(enableCamera())); |
|
| 13 | disableAct = new QAction(QIcon(":/CameraOff.png"), tr("Disable camera"), this); |
|
| 14 | connect(disableAct, SIGNAL(triggered()), this, SLOT(disableCamera())); |
|
| 15 | quitAct = new QAction(QIcon(":/Quit.png"), tr("Quit"), this); |
|
| 16 | quitAct->setShortcut(tr("Ctrl+Q")); |
|
| 17 | connect(quitAct, SIGNAL(triggered()), qApp, SLOT(quit())); |
|
| 18 | setContextMenu(new QMenu()); // checkStatus() will fill it in. |
|
| 19 | ||
| 20 | checkStatus(); |
|
| 21 | QTimer *timer = new QTimer(this); |
|
| 22 | connect(timer, SIGNAL(timeout()), this, SLOT(checkStatus())); |
|
| 23 | timer->start(60*1000); // 60 seconds |
|
| 24 | } |
|
| 25 | ||
| 26 | /* once-a-minute slot */ |
|
| 27 | void EeeCamTray::checkStatus() |
|
| 28 | { |
|
| 29 | if (cameraIsEnabled()) |
|
| 30 | { |
|
| 31 | setIcon(QIcon(":/CameraOn.png")); |
|
| 32 | setToolTip(tr("Eee camera is enabled.")); |
|
| 33 | QMenu *menu = contextMenu(); |
|
| 34 | menu->clear(); |
|
| 35 | menu->addAction(disableAct); |
|
| 36 | menu->addSeparator(); |
|
| 37 | menu->addAction(quitAct); |
|
| 38 | } |
|
| 39 | else |
|
| 40 | { |
|
| 41 | setIcon(QIcon(":/CameraOff.png")); |
|
| 42 | setToolTip(tr("Eee camera is disabled.")); |
|
| 43 | QMenu *menu = contextMenu(); |
|
| 44 | menu->clear(); |
|
| 45 | menu->addAction(enableAct); |
|
| 46 | menu->addSeparator(); |
|
| 47 | menu->addAction(quitAct); |
|
| 48 | } |
|
| 49 | } |
|
| 50 | ||
| 51 | bool EeeCamTray::cameraIsEnabled() |
|
| 52 | { |
|
| 53 | qDebug() << "Trying to read camera status."; |
|
| 54 | QFile ioctl("/proc/acpi/asus/camera"); |
|
| 55 | if (ioctl.open(QIODevice::ReadOnly|QIODevice::Text|QIODevice::Unbuffered)) |
|
| 56 | { |
|
| 57 | char c; |
|
| 58 | if (ioctl.getChar(&c)) |
|
| 59 | return c == '1' ? true : false; |
|
| 60 | else |
|
| 61 | qDebug() << "** enabling write failed."; |
|
| 62 | ioctl.close(); |
|
| 63 | } |
|
| 64 | else |
|
| 65 | qDebug() << "** failed to open control file."; |
|
| 66 | return false; // Can't tell, assume worst. |
|
| 67 | } |
|
| 68 | ||
| 69 | void EeeCamTray::enableCamera() |
|
| 70 | { |
|
| 71 | qDebug() << "Trying to enable camera input."; |
|
| 72 | QFile ioctl("/proc/acpi/asus/camera"); |
|
| 73 | if (ioctl.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Unbuffered)) |
|
| 74 | { |
|
| 75 | if (ioctl.putChar('1')) |
|
| 76 | qDebug() << "** enabling write successful."; |
|
| 77 | else |
|
| 78 | qDebug() << "** enabling write failed."; |
|
| 79 | ioctl.close(); |
|
| 80 | } |
|
| 81 | else |
|
| 82 | qDebug() << "** failed to open control file."; |
|
| 83 | ||
| 84 | checkStatus(); |
|
| 85 | } |
|
| 86 | ||
| 87 | void EeeCamTray::disableCamera() |
|
| 88 | { |
|
| 89 | qDebug() << "Trying to disable camera input."; |
|
| 90 | QFile ioctl("/proc/acpi/asus/camera"); |
|
| 91 | if (ioctl.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Unbuffered)) |
|
| 92 | { |
|
| 93 | if (ioctl.putChar('0')) |
|
| 94 | qDebug() << "** disabling write successful."; |
|
| 95 | else |
|
| 96 | qDebug() << "** disabling write failed."; |
|
| 97 | ioctl.close(); |
|
| 98 | } |
|
| 99 | else |
|
| 100 | qDebug() << "** failed to open control file."; |
|
| 101 | ||
| 102 | checkStatus(); |
|
| 103 | } |
Loggerhead 1.17 is a web-based interface for Bazaar branches