aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.hpp16
-rw-r--r--sb.cpp94
-rw-r--r--webengine.hpp94
3 files changed, 178 insertions, 26 deletions
diff --git a/config.hpp b/config.hpp
index e9c9fa1..f3337a1 100644
--- a/config.hpp
+++ b/config.hpp
@@ -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(); });
+}
diff --git a/sb.cpp b/sb.cpp
index 617c3b7..01993c8 100644
--- a/sb.cpp
+++ b/sb.cpp
@@ -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