From 05b4b85a50fa1a478f168bc73080aff56fbc8330 Mon Sep 17 00:00:00 2001 From: Jesse Smith Date: Sat, 6 Sep 2014 17:26:40 -0300 Subject: Added volume control and initial screen brightness control code to Linux. Updated dependencies and added template file for future operating system support. --- libLumina/LuminaOS-template.cpp | 87 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 libLumina/LuminaOS-template.cpp diff --git a/libLumina/LuminaOS-template.cpp b/libLumina/LuminaOS-template.cpp new file mode 100644 index 00000000..be70e1a5 --- /dev/null +++ b/libLumina/LuminaOS-template.cpp @@ -0,0 +1,87 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifdef __OSNAME__ +#include "LuminaOS.h" +#include +#include // Needed for BUFSIZ + +// ==== ExternalDevicePaths() ==== +QStringList LOS::ExternalDevicePaths(){ + //Returns: QStringList[::::::::] + //Note: = [USB, HDRIVE, DVD, SDCARD, UNKNOWN] + + //Not implemented yet for Linux + return QStringList(); +} + +//Read screen brightness information +int LOS::ScreenBrightness(){ + //Returns: Screen Brightness as a percentage (0-100, with -1 for errors) + return -1; //not implemented yet for Linux +} + +//Set screen brightness +void LOS::setScreenBrightness(int percent){ + //not implemented yet for Linux +} + +//Read the current volume +int LOS::audioVolume(){ //Returns: audio volume as a percentage (0-100, with -1 for errors) + return -1; //Not implemented yet for Linux +} + +//Set the current volume +void LOS::setAudioVolume(int percent){ + //not implemented yet for Linux +} + +//Change the current volume a set amount (+ or -) +void LOS::changeAudioVolume(int percentdiff){ + //not implemented yet for Linux +} + +//Check if a graphical audio mixer is installed +bool LOS::hasMixerUtility(){ + return false; //not implemented yet for Linux +} + +//Launch the graphical audio mixer utility +void LOS::startMixerUtility(){ + //not implemented yet for Linux +} + +//System Shutdown +void LOS::systemShutdown(){ //start poweroff sequence + QProcess::startDetached("shutdown -h now"); +} + +//System Restart +void LOS::systemRestart(){ //start reboot sequence + QProcess::startDetached("shutdown -r now"); +} + +//Battery Availability +bool LOS::hasBattery(){ + return false; //not implemented yet for Linux +} + +//Battery Charge Level +int LOS::batteryCharge(){ //Returns: percent charge (0-100), anything outside that range is counted as an error + return -1; //not implemented yet for Linux +} + +//Battery Charging State +bool LOS::batteryIsCharging(){ + return false; //not implemented yet for Linux +} + +//Battery Time Remaining +int LOS::batterySecondsLeft(){ //Returns: estimated number of seconds remaining + return 0; //not implemented yet for Linux +} + +#endif -- cgit From 31a2df51b78736da677fc61f9a09a93579cbdb7a Mon Sep 17 00:00:00 2001 From: Jesse Smith Date: Sat, 6 Sep 2014 17:28:06 -0300 Subject: Added audio volume control to Linux. Added initial code for changing screen brightness on Linux and updated dependnecy list. Added template file for future operating system support. --- DEPENDENCIES | 3 +++ libLumina/LuminaOS-Linux.cpp | 62 +++++++++++++++++++++++++++++++++++++++----- libLumina/libLumina.pro | 1 + 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/DEPENDENCIES b/DEPENDENCIES index 540831ee..0b3c7cf2 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -24,6 +24,9 @@ numlockx (x11/numlockx) libqt4-svg libxcomposite-dev + Optional Debian/Ubuntu/Mint packages + xbacklight (required for changing screen brightness) + === BUILD & RUN === Qt 4.8+ (modules: core, gui, network, linguist, svg) also includes: (qt4-qmake, qt4-uic, qt4-moc, qt4-rcc) diff --git a/libLumina/LuminaOS-Linux.cpp b/libLumina/LuminaOS-Linux.cpp index 9d891461..ce5b8240 100644 --- a/libLumina/LuminaOS-Linux.cpp +++ b/libLumina/LuminaOS-Linux.cpp @@ -5,10 +5,14 @@ // See the LICENSE file for full details //=========================================== #ifdef __linux__ +#include #include "LuminaOS.h" #include #include // Needed for BUFSIZ +//can't read xbrightness settings - assume invalid until set +static int screenbrightness = -1; + // ==== ExternalDevicePaths() ==== QStringList LOS::ExternalDevicePaths(){ //Returns: QStringList[::::::::] @@ -20,28 +24,74 @@ QStringList LOS::ExternalDevicePaths(){ //Read screen brightness information int LOS::ScreenBrightness(){ - //Returns: Screen Brightness as a percentage (0-100, with -1 for errors) - return -1; //not implemented yet for Linux + //Returns: Screen Brightness as a percentage (0-100, with -1 for errors) + if(screenbrightness==-1){ + if(QFile::exists("/tmp/.lumina-currentxbrightness")){ + int val = LUtils::readFile("/tmp/.lumina-currentxbrightness").join("").simplified().toInt(); + screenbrightness = val; + } + } + return screenbrightness; + } //Set screen brightness void LOS::setScreenBrightness(int percent){ - //not implemented yet for Linux + //ensure bounds + if(percent<0){percent=0;} + else if(percent>100){ percent=100; } + // float pf = percent/100.0; //convert to a decimel + //Run the command + QString cmd = "xbacklight -set %1"; + // cmd = cmd.arg( QString::number( int(65535*pf) ) ); + cmd = cmd.arg( QString::number( percent ) ); + int ret = LUtils::runCmd(cmd); + //Save the result for later + if(ret!=0){ screenbrightness = -1; } + else{ screenbrightness = percent; } + LUtils::writeFile("/tmp/.lumina-currentxbrightness", QStringList() << QString::number(screenbrightness), true); + } //Read the current volume int LOS::audioVolume(){ //Returns: audio volume as a percentage (0-100, with -1 for errors) - return -1; //Not implemented yet for Linux +QString info = LUtils::getCmdOutput("amixer get Master").join("").simplified();; + int out = -1; + int start_position, end_position; + QString current_volume; + if(!info.isEmpty()){ + start_position = info.indexOf("["); + end_position = info.indexOf("%"); + current_volume = info.mid(start_position + 1, (end_position - start_position) - 1); + out = current_volume.toInt(); + } + return out; + + } //Set the current volume void LOS::setAudioVolume(int percent){ - //not implemented yet for Linux + if(percent<0){percent=0;} + else if(percent>100){percent=100;} + QString info = "amixer -c 0 sset Master,0 " + QString::number(percent) + "%"; + if(!info.isEmpty()){ + //Run Command + LUtils::runCmd(info); + } + } //Change the current volume a set amount (+ or -) void LOS::changeAudioVolume(int percentdiff){ - //not implemented yet for Linux + int old_volume = audioVolume(); + int new_volume = old_volume + percentdiff; + if (new_volume < 0) + new_volume = 0; + if (new_volume > 100) + new_volume = 100; + qDebug() << "Setting new volume to: " << new_volume; + setAudioVolume(new_volume); } //Check if a graphical audio mixer is installed diff --git a/libLumina/libLumina.pro b/libLumina/libLumina.pro index fcf84980..9de16637 100644 --- a/libLumina/libLumina.pro +++ b/libLumina/libLumina.pro @@ -20,6 +20,7 @@ SOURCES += LuminaXDG.cpp \ LuminaX11.cpp \ LuminaOS-FreeBSD.cpp \ LuminaOS-Linux.cpp +# new OS support can be added here INCLUDEPATH += /usr/local/include -- cgit From 664d066d07b262205f860b039b78371718e4c6bb Mon Sep 17 00:00:00 2001 From: Jesse Smith Date: Sun, 7 Sep 2014 22:42:55 -0300 Subject: The following features have been added to the Linux port: Added battery level detection and AC/battery detection. Added detached audio mixer. Confirmed screen brightness adjustment works. Also cleaned up DEPENDENIES file, separating FreeBSD and Linux requirements. Both sections of the file now include full package/port names of dependencies on both operating systems to make it easy to get all build requirements, runtime requirements and optional components. --- DEPENDENCIES | 73 +++++++++++++++++++++++++++++++------------- libLumina/LuminaOS-Linux.cpp | 36 +++++++++++++++++----- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/DEPENDENCIES b/DEPENDENCIES index 0b3c7cf2..867b129a 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,36 +1,67 @@ -#List of known dependencies for the Lumina Desktop (and associated utilities) -# FreeBSD port is listed in parentheses after the dependency whenever possible +# List of known dependencies for the Lumina Desktop (and associated utilities) +# FreeBSD port is listed in parentheses after the dependency whenever possible +# Linux packages are listed by name as they appear in Debian, Ubuntu and Mint + +=== FreeBSD Requirements === + +Runtime dependencies: -=== RUNTIME ONLY === fluxbox (x11-wm/fluxbox) fluxbox styles pack? (x11-themes/fluxbox-tenr-styles-pack) oxygen icon theme (x11-themes/kde4-icons-oxygen) xscreensaver & xscreensaver-demo (x11/xscreensaver) numlockx (x11/numlockx) - == FreeBSD (libLumina/LuminaOS-FreeBSD.cpp) == - shutdown (/sbin/shutdown - built in) (System restart/poweroff) - mount (/sbin/mount - built in) (Device Availability) - apm (/usr/sbin/apm - built in) (Advanced Power Management utility) - mixer (/usr/sbin/mixer - built in) (Audio System Mixer) - xbrightness (x11/xbrightness) (Screen Brightness Control) +shutdown (/sbin/shutdown - built in) (System restart/poweroff) +mount (/sbin/mount - built in) (Device Availability) +apm (/usr/sbin/apm - built in) (Advanced Power Management utility) +mixer (/usr/sbin/mixer - built in) (Audio System Mixer) +xbrightness (x11/xbrightness) (Screen Brightness Control) + + +Build time dependencies: +Qt 4.8+ + qt4-core (devel/qt4-corelib)) + qt4-gui (x11-toolkits/qt4-gui) + qmake-qt4 (devel/qmake4) + qt4-network (net/qt4-network) + qt4-linguist (devel/qt4-linguist) + qt4-svg (graphics/qt4-svg) + qt4-uiv (devel/qt4-uic) + qt4-moc (devel/qt4-moc) + qt4-rcc (devel/qt4-rcc) + devel/qt4-qtsolutions-singleapplication - == Linux == - (Debian/Ubuntu/Mint packages required) +X.org and XLib with extensions: + Xrender (x11/libXrender) + Xcomposite (x11/libXcomposite) + Xdamage (x11/libXdamage) + + + +=== Linux Requirements === + These packages are required for building Lumina on Linux + g++ (or clang, either compiler should work) qt4-qmake libqt4-core + libqt4-dev + libqt4-dev-bin libqt4-gui libqt4-network libqt4-svg + libphonon-dev libxcomposite-dev + libxdamage-dev + libxrender-dev + + These packages are required for running Lumina on Linux + fluxbox + kde-style-oxygen + xscreensaver - Optional Debian/Ubuntu/Mint packages - xbacklight (required for changing screen brightness) - -=== BUILD & RUN === -Qt 4.8+ (modules: core, gui, network, linguist, svg) - also includes: (qt4-qmake, qt4-uic, qt4-moc, qt4-rcc) - + devel/qt4-qtsolutions-singleapplication - -X.org and XLib - With extensions: Xrender, Xcomposite, Xdamage + Optional packages + xbacklight (required for changing screen brightness) + alsa-utils (required for adjusting audio volume) + acpi (required for monitoring battery life) + numlockx (required for changign state of numlock at login) + pavucontrol (required for detatched audio mixer) diff --git a/libLumina/LuminaOS-Linux.cpp b/libLumina/LuminaOS-Linux.cpp index ce5b8240..60fb35fe 100644 --- a/libLumina/LuminaOS-Linux.cpp +++ b/libLumina/LuminaOS-Linux.cpp @@ -42,7 +42,7 @@ void LOS::setScreenBrightness(int percent){ else if(percent>100){ percent=100; } // float pf = percent/100.0; //convert to a decimel //Run the command - QString cmd = "xbacklight -set %1"; + QString cmd = "xbacklight -set %1"; // cmd = cmd.arg( QString::number( int(65535*pf) ) ); cmd = cmd.arg( QString::number( percent ) ); int ret = LUtils::runCmd(cmd); @@ -61,8 +61,9 @@ QString info = LUtils::getCmdOutput("amixer get Master").join("").simplified();; QString current_volume; if(!info.isEmpty()){ start_position = info.indexOf("["); + start_position++; end_position = info.indexOf("%"); - current_volume = info.mid(start_position + 1, (end_position - start_position) - 1); + current_volume = info.mid(start_position, end_position - start_position); out = current_volume.toInt(); } return out; @@ -96,12 +97,12 @@ void LOS::changeAudioVolume(int percentdiff){ //Check if a graphical audio mixer is installed bool LOS::hasMixerUtility(){ - return false; //not implemented yet for Linux + return QFile::exists("/usr/bin/pavucontrol"); } //Launch the graphical audio mixer utility void LOS::startMixerUtility(){ - //not implemented yet for Linux + QProcess::startDetached("/usr/bin/pavucontrol"); } //System Shutdown @@ -116,17 +117,38 @@ void LOS::systemRestart(){ //start reboot sequence //Battery Availability bool LOS::hasBattery(){ - return false; //not implemented yet for Linux + QString my_status = LUtils::getCmdOutput("acpi -b").join(""); + bool no_battery = my_status.contains("No support"); + if (no_battery) return false; + return true; } //Battery Charge Level int LOS::batteryCharge(){ //Returns: percent charge (0-100), anything outside that range is counted as an error - return -1; //not implemented yet for Linux + QString my_status = LUtils::getCmdOutput("acpi -b").join(""); + int my_start = my_status.indexOf("%"); + // get the number right before the % sign + int my_end = my_start; + my_start--; + while ( (my_status[my_start] != ' ') && (my_start > 0) ) + my_start--; + my_start++; + int my_charge = my_status.mid(my_start, my_end - my_start).toInt(); + if ( (my_charge < 0) || (my_charge > 100) ) return -1; + return my_charge; } //Battery Charging State +// Many possible values are returned if the laptop is plugged in +// these include "Unknown, Full and No support. +// However, it seems just one status is returned when running +// on battery and that is "Discharging". So if the value we get +// is NOT Discharging then we assume the batter yis charging. bool LOS::batteryIsCharging(){ - return false; //not implemented yet for Linux + QString my_status = LUtils::getCmdOutput("acpi -b").join(""); + bool discharging = my_status.contains("Discharging"); + if (discharging) return false; + return true; } //Battery Time Remaining -- cgit