srctree

Gregory Mullen parent fc2213e1 82a613e3
use obzig-plugin

build.zig added: 40, removed: 366, total 0
@@ -7,31 +7,21 @@ 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);
 
const obs = b.dependency("obzig-plugin", .{
.target = target,
.optimize = optimize,
});
 
lib.root_module.addImport("OBS", obs.module("OBS"));
lib.linkLibrary(obs.artifact("obzig-plugin"));
 
b.getInstallStep().dependOn(
&b.addInstallArtifact(lib, .{
.dest_dir = .{ .override = std.Build.InstallDir{ .custom = "" } },
 
filename was Deleted added: 40, removed: 366, total 0
@@ -0,0 +1,17 @@
.{
.name = "obs-sway-plugin",
.version = "0.0.0",
//.minimum_zig_version = "0.11.0",
.dependencies = .{
.@"obzig-plugin" = .{
.path = "../obzig-plugin",
},
},
 
.paths = .{
"build.zig",
"build.zig.zon",
"src",
"README.md",
},
}
 
ev/null added: 40, removed: 366, total 0
@@ -1,24 +0,0 @@
#include <QtWidgets>
 
//#include "qtdockwidget.h"
#include "qtdockwidget.moc"
 
 
QDockWidget* ZigQt::createDock(QWidget *parent) {
QDockWidget *dock = new QDockWidget(tr("Sway-Focus"), parent);
dock->setObjectName("Sway-Focus");
 
return dock;
}
 
extern "C" {
 
QDockWidget* createDock(QWidget *parent) {
auto zqt = new ZigQt();
 
QDockWidget *dock = zqt->createDock(parent);
return dock;
}
 
}
 
 
ev/null added: 40, removed: 366, total 0
@@ -1,12 +0,0 @@
#include <QtWidgets>
 
class ZigQt : public QObject {
Q_OBJECT
 
public:
void ZigQT() {}
~ZigQt() {}
QDockWidget* createDock(QWidget *parent = nullptr);
 
};
 
 
ev/null added: 40, removed: 366, total 0
@@ -1,100 +0,0 @@
/****************************************************************************
** 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
 
ev/null added: 40, removed: 366, total 0
@@ -1,109 +0,0 @@
const std = @import("std");
const root = @import("root");
const bufPrintZ = std.fmt.bufPrintZ;
 
pub const OBS = @cImport({
@cInclude("obs/util/base.h");
@cInclude("obs/obs-module.h");
@cInclude("obs/obs-config.h");
@cInclude("obs/obs-data.h");
@cInclude("obs/obs-properties.h");
@cInclude("obs/obs-service.h");
});
 
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 .{};
 
pub const ModuleDefaults = struct {
/// Name of the OBS plugin
name: [:0]const u8 = "Unnamed Module",
/// Current version of this plugin
version: [:0]const u8 = "0.0.0",
/// Author of the this plugin
author: [:0]const u8 = "Anonymous Authors",
/// Description for this plugin
description: [:0]const u8 = "Default Description for an unnamed module.",
 
/// Optional function that will be called when the plugin is loaded by OBS
/// this function does not require callconv(.C) but other call backs
/// provided may require it.
on_load_fn: *const fn () bool = empty_on_load,
/// Optional function that will be called when the plugin is unloaded by OBS
/// usually at program exit, but there are other events that could unload a
/// plugin.
on_unload_fn: *const fn () void = empty_on_unload,
};
 
/// call exportOBS in comptime to ensure Zig is able to see the required
/// funtions obs needs to export.
pub inline fn exportOBS() void {
inline for (comptime std.meta.declarations(@This())) |decl| {
_ = &@field(@This(), decl.name);
}
}
 
var obs_module_pointer: ?*OBS.obs_module_t = null;
 
export fn obs_module_set_pointer(module: ?*OBS.obs_module_t) void {
obs_module_pointer = module;
}
 
export fn obs_current_module() ?*OBS.obs_module_t {
return obs_module_pointer;
}
 
export fn obs_module_name() [*:0]const u8 {
return module_defaults.name;
}
 
export fn obs_module_ver() u32 {
return OBS.LIBOBS_API_VER;
}
 
export fn obs_module_author() [*:0]const u8 {
return module_defaults.author;
}
 
export fn obs_module_description() [*:0]const u8 {
return module_defaults.description;
}
 
export fn obs_module_load() bool {
if (module_defaults.on_load_fn()) {
logFmt(
"{s} plugin loaded successfully (version: {s})",
.{ module_defaults.name, module_defaults.version },
);
return true;
}
 
logFmt(
"{s} plugin failed to load (version: {s})",
.{ module_defaults.name, module_defaults.version },
);
return false;
}
 
export fn obs_module_unload() void {
logFmt("{s} plugin shutdown", .{module_defaults.name});
return module_defaults.on_unload_fn();
}
 
fn empty_on_load() bool {
return true;
}
 
fn empty_on_unload() void {}
 
pub fn logFmt(comptime text: []const u8, vars: anytype) void {
var buf: [0xffff:0]u8 = undefined;
const txt = bufPrintZ(&buf, text, vars) catch unreachable;
log(txt);
}
 
pub fn log(text: [*:0]const u8) void {
OBS.blog(OBS.LOG_INFO, text);
}
 
ev/null added: 40, removed: 366, total 0
@@ -1,90 +0,0 @@
const std = @import("std");
const OBS = @import("../obs.zig").OBS;
 
extern "obs-frontend-api" fn obs_frontend_add_tools_menu_item(
name: [*:0]const u8,
cb: obs_frontend_cb,
?*anyopaque,
) void;
extern "obs-frontend-api" fn obs_frontend_get_current_scene() ?*OBS.obs_source_t;
extern "obs-frontend-api" fn obs_frontend_set_current_scene(*OBS.obs_source_t) callconv(.C) void;
extern "obs-frontend-api" fn obs_frontend_get_scene_names() callconv(.C) [*:null]?[*c]u8;
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;
 
const obs_src_array = extern struct {
array: [*]?*OBS.obs_source_t,
num: usize = 0,
capacity: usize = 0,
};
 
const obs_frontend_source_list = extern struct {
sources: extern union {
da: OBS.darray,
src: obs_src_array,
},
};
 
pub const OBSScene = struct {
pub fn findScenes() void {
var scenes: obs_frontend_source_list = std.mem.zeroes(obs_frontend_source_list);
 
obs_frontend_get_scenes(&scenes);
// TODO write a c compat header for this
// it's an inline and zig doesn't like C++
// defer obs_frontend_source_list_free(&scenes);
//std.debug.print("source data {any}\n", .{scenes.sources.src});
if (scenes.sources.src.num == 0) {
std.debug.print("Warning: 0 sources found}\n", .{});
return;
}
 
const array: [*]?*OBS.obs_source_t = @ptrCast(scenes.sources.src.array);
for (array[0..scenes.sources.src.num]) |src| {
//const scene: ?*OBS.obs_scene_t = OBS.obs_scene_from_source(src);
const name: [*c]const u8 = OBS.obs_source_get_name(src);
//const uuid: [*c]const u8 = OBS.obs_source_get_uuid(@ptrCast(scene));
std.debug.print("scene {s} \n", .{name});
}
}
 
pub fn swapPreview() void {
//std.debug.print("swaping\n", .{});
obs_frontend_preview_program_trigger_transition();
}
 
pub fn currentScene() ?[:0]const u8 {
_ = obs_frontend_get_current_scene() orelse return null;
 
//const t = @as(?*OBS.obs_source_info, @ptrCast(scene));
 
//if (t.?.get_name) |_gn| {
// const name: ?[*c]const u8 = _gn(scene);
// if (name) |n| return std.mem.span(n);
//}
return null;
}
 
pub fn setCurrentScene(scene: ?*OBS.obs_source_t) void {
obs_frontend_set_current_scene(scene);
}
 
pub fn getSceneNames() [:null]?[*c]const u8 {
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: 40, removed: 366, total 0
@@ -2,9 +2,9 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
 
const sway_ipc = @import("sway-ipc.zig");
const obs = @import("obs.zig");
const obs = @import("OBS");
 
pub const module_defaults: obs.ModuleDefaults = .{
pub const module_defaults: obs.ModuleInfo = .{
.name = "obs-sway-focus",
.version = "0.0.1",
.author = "grayhatter",
@@ -15,7 +15,7 @@ pub const module_defaults: obs.ModuleDefaults = .{
};
 
comptime {
obs.exportOBS();
obs.includeExports();
}
 
var arena: std.heap.ArenaAllocator = undefined;
@@ -86,7 +86,9 @@ fn on_load() bool {
alloc = arena.allocator();
threads[0] = std.Thread.spawn(.{}, watchSway, .{null}) catch unreachable;
 
obs.QtShim.newDock();
if (!obs.QtShim.newDock("Sway Focus")) {
obs.log("Unable to create dock");
}
return true;
}