aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sb.cpp54
-rw-r--r--webengine.hpp23
2 files changed, 57 insertions, 20 deletions
diff --git a/sb.cpp b/sb.cpp
index 2de8c55..163876a 100644
--- a/sb.cpp
+++ b/sb.cpp
@@ -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();
}
}