srctree

Gregory Mullen parent 5570595e 3d83e7dd
add poc for qtdock & cpp support

README.md added: 178, removed: 8, total 170
@@ -1,3 +1,8 @@
`zig build test`
 
`zig build -p ~/.config/obs-studio/plugins/`
 
you may have to manually run
`/usr/lib/qt6/moc src/cpp/qtdockwidget.h -o src/cpp/qtdockwidget.moc`
### TODO
- [ ] add moc generation to build.zig
 
build.zig added: 178, removed: 8, total 170
@@ -7,12 +7,29 @@ pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
 
const shim = b.addStaticLibrary(.{
.name = "qt_shim",
.target = target,
.optimize = optimize,
});
shim.linkLibCpp();
shim.addCSourceFile(.{
.file = .{ .path = "src/cpp/qtdockwidget.cpp" },
.flags = &.{
"-I",
"/usr/include/qt6/",
"-I",
"/usr/include/qt6/QtWidgets/",
},
});
 
const lib = b.addSharedLibrary(.{
.name = "obs-sway-focus",
.root_source_file = .{ .path = "src/root.zig" },
.target = target,
.optimize = optimize,
});
lib.linkLibrary(shim);
lib.linkLibC();
// b.installArtifact(lib);
b.getInstallStep().dependOn(
 
filename was Deleted added: 178, removed: 8, total 170
@@ -0,0 +1,22 @@
#include <QtWidgets>
 
//#include "qtdockwidget.h"
#include "qtdockwidget.moc"
 
 
QDockWidget* ZigQt::createDock(QWidget *parent) {
QDockWidget *dock = new QDockWidget(tr("Sway-Focus"), parent);
return dock;
}
 
extern "C" {
 
QDockWidget* createDock(QWidget *parent) {
auto zqt = new ZigQt();
 
QDockWidget *dock = zqt->createDock(parent);
return dock;
}
 
}
 
 
filename was Deleted added: 178, removed: 8, total 170
@@ -0,0 +1,12 @@
#include <QtWidgets>
 
class ZigQt : public QObject {
Q_OBJECT
 
public:
void ZigQT() {}
~ZigQt() {}
QDockWidget* createDock(QWidget *parent = nullptr);
 
};
 
 
filename was Deleted added: 178, removed: 8, total 170
@@ -0,0 +1,100 @@
/****************************************************************************
** Meta object code from reading C++ file 'qtdockwidget.h'
**
** Created by: The Qt Meta Object Compiler version 68 (Qt 6.7.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
 
#include "qtdockwidget.h"
#include <QtCore/qmetatype.h>
 
#include <QtCore/qtmochelpers.h>
 
#include <memory>
 
 
#include <QtCore/qxptype_traits.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'qtdockwidget.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 68
#error "This file was generated using the moc from 6.7.0. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
 
#ifndef Q_CONSTINIT
#define Q_CONSTINIT
#endif
 
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
QT_WARNING_DISABLE_GCC("-Wuseless-cast")
namespace {
 
#ifdef QT_MOC_HAS_STRINGDATA
struct qt_meta_stringdata_CLASSZigQtENDCLASS_t {};
constexpr auto qt_meta_stringdata_CLASSZigQtENDCLASS = QtMocHelpers::stringData(
"ZigQt"
);
#else // !QT_MOC_HAS_STRINGDATA
#error "qtmochelpers.h not found or too old."
#endif // !QT_MOC_HAS_STRINGDATA
} // unnamed namespace
 
Q_CONSTINIT static const uint qt_meta_data_CLASSZigQtENDCLASS[] = {
 
// content:
12, // 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
};
 
Q_CONSTINIT const QMetaObject ZigQt::staticMetaObject = { {
QMetaObject::SuperData::link<QObject::staticMetaObject>(),
qt_meta_stringdata_CLASSZigQtENDCLASS.offsetsAndSizes,
qt_meta_data_CLASSZigQtENDCLASS,
qt_static_metacall,
nullptr,
qt_incomplete_metaTypeArray<qt_meta_stringdata_CLASSZigQtENDCLASS_t,
// Q_OBJECT / Q_GADGET
QtPrivate::TypeAndForceComplete<ZigQt, std::true_type>
>,
nullptr
} };
 
void ZigQt::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
(void)_o;
(void)_id;
(void)_c;
(void)_a;
}
 
const QMetaObject *ZigQt::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
 
void *ZigQt::qt_metacast(const char *_clname)
{
if (!_clname) return nullptr;
if (!strcmp(_clname, qt_meta_stringdata_CLASSZigQtENDCLASS.stringdata0))
return static_cast<void*>(this);
return QObject::qt_metacast(_clname);
}
 
int ZigQt::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
return _id;
}
QT_WARNING_POP
 
src/obs.zig added: 178, removed: 8, total 170
@@ -12,6 +12,7 @@ pub const OBS = @cImport({
});
 
pub const Scene = @import("obs/frontend.zig").OBSScene;
pub const QtShim = @import("obs/frontend.zig").QtShim;
 
/// Define a module_defaults in you root project file
const module_defaults: ModuleDefaults = if (@hasDecl(root, "module_defaults")) root.module_defaults else .{};
 
src/obs/frontend.zig added: 178, removed: 8, total 170
@@ -12,6 +12,8 @@ extern "obs-frontend-api" fn obs_frontend_get_scene_names() callconv(.C) [*:null
extern "obs-frontend-api" fn obs_frontend_get_scenes(?*obs_frontend_source_list) callconv(.C) void;
extern "obs-frontend-api" fn obs_frontend_preview_program_trigger_transition() callconv(.C) void;
//extern "obs-frontend-api" fn obs_frontend_source_list_free(?*obs_frontend_source_list) callconv(.C) void;
extern "obs-frontend-api" fn obs_frontend_add_dock(?*anyopaque) callconv(.C) void;
extern "obs-frontend-api" fn obs_frontend_get_main_window() callconv(.C) ?*anyopaque;
 
const obs_frontend_cb = *const fn (?*anyopaque) callconv(.C) void;
 
@@ -72,3 +74,13 @@ pub const OBSScene = struct {
return std.mem.span(obs_frontend_get_scene_names());
}
};
 
extern "qt_shim" fn createDock(?*anyopaque) callconv(.C) ?*anyopaque;
 
pub const QtShim = struct {
pub fn newDock() void {
const qtwin = obs_frontend_get_main_window();
const dock = createDock(qtwin);
obs_frontend_add_dock(dock);
}
};
 
src/root.zig added: 178, removed: 8, total 170
@@ -86,6 +86,7 @@ fn on_load() bool {
alloc = arena.allocator();
threads[0] = std.Thread.spawn(.{}, watchSway, .{null}) catch unreachable;
 
obs.QtShim.newDock();
return true;
}