レポジトリ種類: Mercurial
#include <FL/fl_draw.H>
#include <fstream>
#include "clickablebox.hh"
#include "../fe/background.hh"
fe::ClickableBox *fe::ClickableBox::lastSelected = nullptr;
namespace fe {
int ClickableBox::handle(int event) {
switch (event) {
case FL_PUSH:
if (!imagePath.empty()) {
if (lastSelected && lastSelected != this) {
lastSelected->isSelected = false;
lastSelected->redraw();
}
isSelected = true;
lastSelected = this;
redraw();
background = std::make_unique<uw::Background>(imagePath);
background->setWallpaper(fe::Background().getMode());
alterXinitrc(getImagePath());
}
return 1;
default:
return Fl_Box::handle(event);
}
}
void ClickableBox::draw() {
Fl_Box::draw();
if (isSelected) {
fl_color(234, 121, 216);
fl_line_style(FL_SOLID, 9);
fl_rect(x(), y(), w(), h());
fl_line_style(0);
}
}
void ClickableBox::alterXinitrc(const std::string &npath) {
const std::string xinitrc = std::string(getenv("HOME")) + "/.xinitrc";
std::ifstream in(xinitrc);
std::vector<std::string> lines;
std::string line;
bool founduw = false;
bool addeduw = false;
std::string modeFlag;
switch(fe::Background().getMode()) {
case uw::Mode::TILE: modeFlag = "-t"; break;
case uw::Mode::CENTER: modeFlag = "-c"; break;
case uw::Mode::FILL: modeFlag = "-f"; break;
default: modeFlag = "-t"; break;
}
while (std::getline(in, line)) {
if (line.rfind("uw -", 0) == 0) {
line = "uw " + modeFlag + " " + npath + " &";
founduw = true;
}
lines.push_back(line);
if (line.rfind("exec ", 0) == 0 && !founduw && !addeduw) {
lines.insert(lines.end() - 1, "uw " + modeFlag + " " + npath + " &");
addeduw = true;
}
}
in.close();
if (!founduw && !addeduw) {
lines.push_back("uw " + modeFlag + " " + npath + " &");
}
std::ofstream out(xinitrc);
for (const auto &eline : lines) {
out << eline << std::endl;
}
out.close();
}
}