diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-01-25 01:09:36 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-01-25 01:09:36 +0100 |
| commit | 0321da112a7ea32f89849a0abc532fecafa3ee14 (patch) | |
| tree | 9b83ef292f953a5f52a4cf3e2139efd0f4810aca | |
| parent | bbd6d152e7f22013d10572985784ea4f5fb7d013 (diff) | |
open link even if it is tagged as open in new window
| -rw-r--r-- | config.hpp | 16 | ||||
| -rw-r--r-- | sb.cpp | 94 | ||||
| -rw-r--r-- | webengine.hpp | 94 |
3 files changed, 178 insertions, 26 deletions
@@ -1,4 +1,18 @@ + const bool enable_smooth_scrollig = true; -const char search_engine[] = "https://searx.org/?q="; +const char search_engine[] = "https://duckduckgo.com/?q="; const char dmenu_args[] = "-s 0"; const unsigned scroll_speed = 100; + +#define MODIFIER Qt::ALT + +void register_shortcuts(QWidget *view) { + new QShortcut(QKeySequence(MODIFIER + Qt::Key_O), view, [=]() { search(); }); + new QShortcut(QKeySequence(MODIFIER + Qt::Key_J), view, [=]() { page_scroll(scroll_speed); }); + new QShortcut(QKeySequence(MODIFIER + Qt::Key_K), view, [=]() { page_scroll(-scroll_speed); }); + new QShortcut(QKeySequence(MODIFIER + Qt::Key_G), view, [=]() { goto_end(false); }); + new QShortcut(QKeySequence(MODIFIER + Qt::SHIFT + Qt::Key_G), view, [=]() { goto_end(true); }); + new QShortcut(QKeySequence(MODIFIER + Qt::SHIFT + Qt::Key_H), view, [=]() { history_move(true); }); + new QShortcut(QKeySequence(MODIFIER + Qt::SHIFT + Qt::Key_L), view, [=]() { history_move(false); }); + new QShortcut(QKeySequence(MODIFIER + Qt::Key_R), view, [=]() { reload(); }); +} @@ -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(); } diff --git a/webengine.hpp b/webengine.hpp new file mode 100644 index 0000000..08cdbe5 --- /dev/null +++ b/webengine.hpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'sb.cpp' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.8) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include <memory> +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'sb.cpp' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.8. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_WebEnginePage_t { + QByteArrayData data[1]; + char stringdata0[14]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_WebEnginePage_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_WebEnginePage_t qt_meta_stringdata_WebEnginePage = { + { +QT_MOC_LITERAL(0, 0, 13) // "WebEnginePage" + + }, + "WebEnginePage" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_WebEnginePage[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void WebEnginePage::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + (void)_o; + (void)_id; + (void)_c; + (void)_a; +} + +QT_INIT_METAOBJECT const QMetaObject WebEnginePage::staticMetaObject = { { + QMetaObject::SuperData::link<QWebEnginePage::staticMetaObject>(), + qt_meta_stringdata_WebEnginePage.data, + qt_meta_data_WebEnginePage, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *WebEnginePage::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *WebEnginePage::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_WebEnginePage.stringdata0)) + return static_cast<void*>(this); + return QWebEnginePage::qt_metacast(_clname); +} + +int WebEnginePage::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QWebEnginePage::qt_metacall(_c, _id, _a); + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE |