Skip to content

Commit

Permalink
feat: global shortcuts to next/previous subtitle (X11 only)
Browse files Browse the repository at this point in the history
  • Loading branch information
neopostmodern committed Jan 20, 2023
1 parent e54f0c1 commit 3424b29
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 3 deletions.
9 changes: 6 additions & 3 deletions PenguinSubtitlePlayer.pro
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
#
#-------------------------------------------------

QT += core gui
QT += core gui x11extras
LIBS += -lX11

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

Expand Down Expand Up @@ -104,7 +105,8 @@ SOURCES += \
src/parsers/webvttparser.cpp \
src/parser.cpp \
src/engine.cpp \
src/nccdialog.cpp
src/nccdialog.cpp \
src/eventfilter.cpp

HEADERS += \
src/configdialog.h \
Expand All @@ -120,7 +122,8 @@ HEADERS += \
src/parserinterface.h \
src/parser.h \
src/engine.h \
src/nccdialog.h
src/nccdialog.h \
src/eventfilter.h

FORMS += \
resource/ui/mainwindow.ui
Expand Down
42 changes: 42 additions & 0 deletions src/eventfilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include "eventfilter.h"
#include "mainwindow.h"
#include <xcb/xcb.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

#include <QtX11Extras/QX11Info>


void EventFilter::setup(QWidget *target)
{
this->target = target;

Display * display = QX11Info::display();
keycodePrevious = XKeysymToKeycode(display, XK_A);
keycodeNext = XKeysymToKeycode(display, XK_S);
XGrabKey(display, keycodePrevious, AnyModifier, DefaultRootWindow(display), 1, GrabModeAsync, GrabModeAsync);
XGrabKey(display, keycodeNext, AnyModifier, DefaultRootWindow(display), 1, GrabModeAsync, GrabModeAsync);
}

bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *)
{
if (eventType == "xcb_generic_event_t")
{
xcb_generic_event_t* xcbevent = static_cast<xcb_generic_event_t *>(message);

switch(xcbevent->response_type)
{
case XCB_KEY_PRESS:
xcb_key_press_event_t * keypress_event = static_cast<xcb_key_press_event_t *>(message);
if(keypress_event->detail == keycodePrevious)
{
qobject_cast<MainWindow*>(target->topLevelWidget())->previous();
}
if(keypress_event->detail == keycodeNext)
{
qobject_cast<MainWindow*>(target->topLevelWidget())->next();
}
}
}
return false;
}
18 changes: 18 additions & 0 deletions src/eventfilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef EVENTFILTER_H
#define EVENTFILTER_H

#include <QAbstractNativeEventFilter>
#include <QWidget>

class EventFilter : public QAbstractNativeEventFilter
{
public:
void setup(QWidget *target);
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
private:
int keycodeNext;
int keycodePrevious;
QWidget * target;
};

#endif // EVENTFILTER_H
6 changes: 6 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "QObject"
#include "QPushButton"
#include "mainwindow.h"
#include "eventfilter.h"
#include <QApplication>

int main(int argc, char *argv[]) {
Expand Down Expand Up @@ -29,6 +30,11 @@ int main(int argc, char *argv[]) {
w.load(path);
}
w.show();

EventFilter filter;
a.installNativeEventFilter(&filter);
filter.setup(&w);

a.setQuitOnLastWindowClosed(false);
return a.exec();
}

0 comments on commit 3424b29

Please sign in to comment.