diff options
| -rw-r--r-- | sb.cpp | 54 | ||||
| -rw-r--r-- | webengine.hpp | 23 |
2 files changed, 57 insertions, 20 deletions
@@ -19,7 +19,6 @@ #include <QShortcut> #include <QVBoxLayout> -#include "webengine.hpp" bool is_valid_url(const std::string & url); void open_url(const std::string & url); @@ -31,6 +30,8 @@ void history_move(bool back); void reload(); uint32_t parent_id = 0; +#include "webengine.hpp" + #include "config.hpp" bool is_valid_url(const std::string & url) { @@ -65,27 +66,30 @@ std::string read_from_dmenu() { return output; } -void open_url(const std::string & url) { +inline void __web_load(const std::string &url) { web->load(QString::fromStdString(url)); } -void search() { - auto url = read_from_dmenu(); - +void open_url(const std::string & url) { if (url.empty()) return; if (is_valid_url(url)) { - open_url(url); + __web_load(url); return; } if (is_valid_url("https://" + url)) { - open_url("https://" + url); + __web_load("https://" + url); return; } - open_url(search_engine + url); + __web_load(search_engine + url); +} + +void search() { + auto url = read_from_dmenu(); + open_url(url); } void page_scroll(int scroll) { @@ -112,8 +116,9 @@ void reload() { } void help(char *arg0) { - std::cout << arg0 << '\n'; - std::cout << "-e [xid] - embed in other X window\n"; + std::cout << arg0; + std::cout << " [url] [-e <xid>]\n"; + exit(-1); } int @@ -125,11 +130,13 @@ main(int argc, char **argv) { QLabel url_label; QWidget *main = new QWidget; QVBoxLayout layout(main); + std::string url = getenv("WWW_HOME"); + bool url_set_by_arg = false; + view = new QMainWindow(); web = new QWebEngineView(); web->setPage(&page); - web->load(QUrl(getenv("WWW_HOME"))); page.setBackgroundColor(QColor(40, 40, 40)); progressbar.setMaximum(100); progressbar.setMinimum(0); @@ -140,15 +147,26 @@ main(int argc, char **argv) { url_label.setMargin(5); url_label.setStyleSheet("QLabel { background: #1d2021; color: #ebdbb2 }"); - if (argc == 3 && argv[1] == std::string("-e")) { - dpy = XOpenDisplay(NULL); - parent_id = std::stoi(argv[2]); - XReparentWindow(dpy, view->winId(), parent_id, 0, 0); - XFlush(dpy); - } else if (argc != 1) { - help(argv[0]); + + for (int i = 1; i < argc; ++i) { + if (argv[i] == std::string("-e")) { + if (++i == argc || (argv[i][0] < '0' || argv[i][0] > '9')) + help(argv[0]); + + dpy = XOpenDisplay(NULL); + parent_id = std::stoi(argv[i]); + XReparentWindow(dpy, view->winId(), parent_id, 0, 0); + XFlush(dpy); + + } else if (!url_set_by_arg) { + url = argv[i]; + url_set_by_arg = true; + } else { + help(argv[0]); + } } + open_url(url); layout.setContentsMargins(0, 0, 0, 0); layout.setSpacing(0); diff --git a/webengine.hpp b/webengine.hpp index dc73d97..38bacf4 100644 --- a/webengine.hpp +++ b/webengine.hpp @@ -17,6 +17,8 @@ #error "(The moc has changed too much.)" #endif +#include <unistd.h> + class WebEnginePage: public QWebEnginePage { Q_OBJECT public: @@ -24,7 +26,7 @@ public: virtual ~WebEnginePage() = default; protected: - QWebEnginePage *createWindow(WebWindowType){ + QWebEnginePage *createWindow(WebWindowType type){ WebEnginePage *page = new WebEnginePage(this->profile()); connect(page, &QWebEnginePage::urlChanged, this, &WebEnginePage::onUrlChanged); return page; @@ -33,7 +35,24 @@ protected: private: void onUrlChanged(const QUrl & url){ if(WebEnginePage *page = qobject_cast<WebEnginePage *>(sender())){ - setUrl(url); + if (fork() == 0) { + std::string surl = url.toString().toStdString(); + std::string parent_id_str = std::to_string(parent_id); + const char *exec[5] = { 0 }; + exec[0] = "sb"; + exec[1] = surl.c_str(); + + if (parent_id != 0) { + exec[2] = "-e"; + exec[3] = parent_id_str.c_str(); + } + + fprintf(stderr, "spawn url: %s", exec[1]); + execvp((char*)exec[0], (char**)exec); + fprintf(stderr, "failed to open new sb instance\n"); + perror(" failed"); + exit(-1); + } page->deleteLater(); } } |