/* main.cpp (C) Copyright 2015, Brad Parker All rights reserved. License: 3-clause BSD. See COPYING */ #include #include #include #include "keyboard.h" enum CommandLineParseResult { CommandLineOk, CommandLineError, CommandLineVersionRequested, CommandLineHelpRequested }; struct ColorPresetOption { ColorPresetOption() : region(REGION_LEFT) ,color(COLOR_RED) ,intensity(INTENSITY_HIGH) {} Region region; Color color; Intensity intensity; }; struct ColorOption { ColorOption() : region(TOUCHPAD) ,rgb{0,0,0} {} Region region; char rgb[3]; }; struct KeyboardOptions { KeyboardOptions() : modeOption(MODE_NORMAL) ,colorOptions() ,modeSet(false) ,colorSet(false) ,presetSet(false) {} Mode modeOption; QList presetOptions; QList colorOptions; bool modeSet; bool colorSet; bool presetSet; void setMode(QString mode) { if(mode == "normal") { modeOption = MODE_NORMAL; } if(mode == "gaming") { modeOption = MODE_GAMING; } if(mode == "breathe") { modeOption = MODE_BREATHE; } if(mode == "demo") { modeOption = MODE_DEMO; } if(mode == "wave") { modeOption = MODE_WAVE; } modeSet = true; } void setColorPreset(QString colorString) { QStringList fields = colorString.split(','); if(fields.count() != 3) { std::cerr << "invalid color selection" << std::endl; qApp->quit(); return; } QString region = fields.at(0); QString color = fields.at(1); QString intensity = fields.at(2); ColorPresetOption *presetOption = new ColorPresetOption; if(region == "left") presetOption->region = REGION_LEFT; else if(region == "middle") presetOption->region = REGION_MIDDLE; else if(region == "right") presetOption->region = REGION_RIGHT; else{ std::cerr << "invalid region selection" << std::endl; qApp->quit(); return; } if(color == "off") presetOption->color = COLOR_OFF; if(color == "red") presetOption->color = COLOR_RED; if(color == "orange") presetOption->color = COLOR_ORANGE; if(color == "yellow") presetOption->color = COLOR_YELLOW; if(color == "green") presetOption->color = COLOR_GREEN; if(color == "sky") presetOption->color = COLOR_SKY; if(color == "blue") presetOption->color = COLOR_BLUE; if(color == "purple") presetOption->color = COLOR_PURPLE; if(color == "white") presetOption->color = COLOR_WHITE; if(intensity == "high") presetOption->intensity = INTENSITY_HIGH; if(intensity == "medium") presetOption->intensity = INTENSITY_MEDIUM; if(intensity == "low") presetOption->intensity = INTENSITY_LOW; if(intensity == "light") presetOption->intensity = INTENSITY_LIGHT; presetSet = true; presetOptions.append(presetOption); } void setColor(QString colorString) { QStringList fields = colorString.split(','); if(fields.count() != 4) { std::cerr << "invalid color selection" << std::endl; qApp->quit(); return; } QString region = fields.at(0); ColorOption *colorOption = new ColorOption; if(region == "left") colorOption->region = REGION_LEFT; if(region == "middle") colorOption->region = REGION_MIDDLE; if(region == "right") colorOption->region = REGION_RIGHT; if(region == "logo") colorOption->region = LOGO; if(region == "front-left") colorOption->region = FRL_LEFT; if(region == "front-right") colorOption->region = FRL_RIGHT; if(region == "touchpad") colorOption->region = TOUCHPAD; bool ok=false; for (uint k=0;k<3;k++){ colorOption->rgb[k]=fields.at(k+1).toInt(&ok); if (!ok){ std::cerr << "invalid color selection" << std::endl; qApp->quit(); return; } } colorSet = true; colorOptions.append(colorOption); } }; CommandLineParseResult parseCommandLine(QCommandLineParser &parser, KeyboardOptions *keyboardOptions, QString *errorMessage) { QCommandLineOption helpOption = parser.addHelpOption(); QCommandLineOption versionOption = parser.addVersionOption(); QCommandLineOption mode(QStringList() << "m" << "mode", "set color : normal, gaming, breathe, demo, wave", "mode"); QCommandLineOption color(QStringList() << "r" << "rgb", "set an color using the format: region,red,green,blue with rgb values between 0 and 255", "rgb"); QCommandLineOption colorPreset(QStringList() << "c" << "color", "set a preset using the format: region,color,intensity (only valid for left/middle/right regions). When using this option, a mode must be specified with -m", "color"); parser.addOption(mode); parser.addOption(color); parser.addOption(colorPreset); if(!parser.parse(QCoreApplication::arguments())) { *errorMessage = parser.errorText(); return CommandLineError; } if(parser.isSet(versionOption)) return CommandLineVersionRequested; if(parser.isSet(helpOption)) return CommandLineHelpRequested; if(parser.isSet(mode)) { keyboardOptions->setMode(parser.value(mode)); } if(parser.isSet(colorPreset)) { foreach(const QString &presetValue, parser.values(colorPreset)) { keyboardOptions->setColorPreset(presetValue); } } if(parser.isSet(color)) { foreach(const QString &colorValue, parser.values(color)) { keyboardOptions->setColor(colorValue); } } return CommandLineOk; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); app.setApplicationName("msi-keyboard"); app.setApplicationVersion("1.1"); QCommandLineParser parser; parser.setApplicationDescription("Keyboard color changer for MSI steelseries keyboards"); QString errorMessage; KeyboardOptions keyboardOptions; switch(parseCommandLine(parser, &keyboardOptions, &errorMessage)) { case CommandLineOk: break; case CommandLineError: fputs(qPrintable(errorMessage), stderr); fputs("\n\n", stderr); fputs(qPrintable(parser.helpText()), stderr); return 1; case CommandLineVersionRequested: printf("%s %s\n", qPrintable(QCoreApplication::applicationName()), qPrintable(QCoreApplication::applicationVersion())); return 0; case CommandLineHelpRequested: { std::cout << qPrintable(parser.helpText()) << std::endl; QStringList regions = QStringList() << "left" << "middle" << "right"<<"logo"<<"front-left"<<"front-right"<<"touchpad"; QStringList colors = QStringList() << "off" << "red" << "orange" << "yellow" << "green" << "sky" << "blue" << "purple" << "white"; QStringList intensities = QStringList() << "high" << "medium" << "low" << "light"; QString colorHelp = QString(R"(Available regions: %1 Available color presets (only for left/middle/right regions): %2 Available preset intensities (only for left/middle/right regions): %3 Example: %4 )").arg(regions.join('\n')).arg(colors.join('\n')).arg(intensities.join('\n')).arg(QString(argv[0]) + " -m normal -c left,red,high -c middle,purple,high -c right,sky,high -r touchpad,255,0,0 -r logo,255,255,255"); std::cout << qPrintable(colorHelp) << std::endl; return 0; } } if((!keyboardOptions.modeSet || !keyboardOptions.presetSet) && !keyboardOptions.colorSet ) { std::cerr << "Please set either a mode together with at least one region to change a color preset, or a color region to change rgb color." << std::endl; return 1; }else{ Keyboard k; if(keyboardOptions.presetSet) { for(int i = 0; i < keyboardOptions.presetOptions.count(); ++i) { ColorPresetOption *presetOption = keyboardOptions.presetOptions.at(i); k.setColorPreset(presetOption->region, presetOption->color, presetOption->intensity); } } if(keyboardOptions.colorSet) { for(int i = 0; i < keyboardOptions.colorOptions.count(); ++i) { ColorOption *colorOption = keyboardOptions.colorOptions.at(i); k.setColor(colorOption->region, colorOption->rgb); } } if(keyboardOptions.modeSet) { k.setMode(keyboardOptions.modeOption); } } return 0; }