diff options
Diffstat (limited to 'sb.cpp')
| -rw-r--r-- | sb.cpp | 94 |
1 files changed, 69 insertions, 25 deletions
@@ -2,6 +2,7 @@ #include <regex> #include <QtWidgets/QApplication> +#include <QAction> #include <QtGui/QWindow> #include <QtWidgets/QMainWindow> #include <QtWebEngineWidgets/QWebEngineView> @@ -12,10 +13,13 @@ #include <QtWidgets/QLabel> #include <QtWidgets/QMenu> #include <QtGui/QKeyEvent> +#include <QProgressBar> #include <QtX11Extras/QX11Info> #include <X11/Xlib.h> +#include <QShortcut> +#include <QVBoxLayout> + -#include "config.hpp" bool is_valid_url(const std::string & url); void open_url(const std::string & url); @@ -23,9 +27,12 @@ void search(); void page_scroll(int scroll); void goto_end(bool end); void get_window_id(); -class Main; +void history_move(bool back); +void reload(); uint32_t parent_id = 0; +#include "config.hpp" + bool is_valid_url(const std::string & url) { std::regex r(".*://.*\\..*"); std::smatch m; @@ -34,31 +41,33 @@ bool is_valid_url(const std::string & url) { } QWebEngineView * web; -Main * view; +QMainWindow * view; Display * dpy; -class Main : public QMainWindow { - protected: - void keyPressEvent(QKeyEvent * event) { - if (event->text() == "o") - search(); - else if (event->text() == "j") - page_scroll(scroll_speed); - else if (event->text() == "k") - page_scroll(-scroll_speed); - else if (event->text() == "H") - web->back(); - else if (event->text() == "L") - web->forward(); - else if (event->text() == "r") - web->reload(); - else if (event->text() == "g") - goto_end(false); - else if (event->text() == "G") - goto_end(true); +class WebEnginePage: public QWebEnginePage { +Q_OBJECT +public: + WebEnginePage(QWebEngineProfile *profile) : QWebEnginePage(profile) {}; + virtual ~WebEnginePage() = default; + +protected: + QWebEnginePage *createWindow(WebWindowType){ + WebEnginePage *page = new WebEnginePage(this->profile()); + connect(page, &QWebEnginePage::urlChanged, this, &WebEnginePage::onUrlChanged); + return page; + } + +private: + void onUrlChanged(const QUrl & url){ + if(WebEnginePage *page = qobject_cast<WebEnginePage *>(sender())){ + setUrl(url); + page->deleteLater(); } + } }; +#include "webengine.hpp" + std::string read_from_dmenu() { std::string output; @@ -114,6 +123,17 @@ void goto_end(bool end) { web->page()->runJavaScript(QString::fromStdString(js)); } +void history_move(bool back) { + if (back) + web->back(); + else + web->forward(); +} + +void reload() { + web->reload(); +} + void help(char *arg0) { std::cout << arg0 << '\n'; std::cout << "-e [xid] - embed in other X window\n"; @@ -130,12 +150,20 @@ main(int argc, char **argv) { QApplication app(size, arg.data()); QWebEngineProfile profile; - QWebEnginePage page(&profile); + WebEnginePage page(&profile); + QProgressBar progressbar; + QWidget *main = new QWidget; + QVBoxLayout layout(main); - view = new Main(); + view = new QMainWindow(); web = new QWebEngineView(); web->setPage(&page); web->load(QUrl(getenv("WWW_HOME"))); + progressbar.setMaximum(100); + progressbar.setMinimum(0); + progressbar.setTextVisible(false); + progressbar.setMaximumHeight(10); + progressbar.setStyleSheet("QProgressBar::chunk { background: #b16286; border-radius: 0px }"); if (argc == 3 && argv[1] == std::string("-e")) { dpy = XOpenDisplay(NULL); @@ -147,8 +175,12 @@ main(int argc, char **argv) { } + layout.setContentsMargins(0, 0, 0, 0); + layout.setSpacing(0); + layout.addWidget(web); + layout.addWidget(&progressbar); + view->setCentralWidget(main); view->show(); - view->setCentralWidget(web); web->connect(web, &QWebEngineView::titleChanged, [&](const QString & title) { view->setWindowTitle(title); @@ -164,5 +196,17 @@ main(int argc, char **argv) { }); } + web->connect(web, &QWebEngineView::loadProgress, [&](int progress) { + progressbar.show(); + progressbar.setValue(progress); + }); + + + web->connect(web, &QWebEngineView::loadFinished, [&](bool ok) { + progressbar.hide(); + }); + + register_shortcuts(view); + return app.exec(); } |