aboutsummaryrefslogtreecommitdiff
path: root/sherlock_nk.h
blob: 34b8efc1da40e5d2e093521b368749acd952708c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Copyright (c) 2015-2016 Hanspeter Portner (dev@open-music-kontrollers.ch)
 *
 * This is free software: you can redistribute it and/or modify
 * it under the terms of the Artistic License 2.0 as published by
 * The Perl Foundation.
 *
 * This source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * Artistic License 2.0 for more details.
 *
 * You should have received a copy of the Artistic License 2.0
 * along the source as a COPYING file. If not, obtain it from
 * http://www.perlfoundation.org/artistic_license_2_0.
 */

#ifndef _SHERLOCK_NK_H
#define _SHERLOCK_NK_H

#include "nk_pugl/nk_pugl.h"

#include <osc.lv2/osc.h>
#include <sratom/sratom.h>

#define MAX_LINES 2048

typedef enum _plugin_type_t plugin_type_t;
typedef enum _item_type_t item_type_t;
typedef struct _item_t item_t;
typedef struct _plughandle_t plughandle_t;
typedef struct _atom_ser_t atom_ser_t;

enum _item_type_t {
	ITEM_TYPE_NONE,
	ITEM_TYPE_FRAME,
	ITEM_TYPE_EVENT
};

struct _item_t {
	item_type_t type;

	union {
		struct {
			int64_t offset;
			uint32_t counter;
			int32_t nsamples;
		} frame;

		struct {
			LV2_Atom_Event ev;
			uint8_t body [0];
		} event;
	};
};

struct _atom_ser_t {
	uint32_t size;
	uint32_t offset;
	union {
		uint8_t *buf;
		LV2_Atom *atom;
	};
};

enum _plugin_type_t {
	SHERLOCK_ATOM_INSPECTOR,
	SHERLOCK_MIDI_INSPECTOR,
	SHERLOCK_OSC_INSPECTOR
};

struct _plughandle_t {
	LV2UI_Write_Function write_function;
	LV2UI_Controller controller;

	LV2_URID_Map *map;
	LV2_URID_Unmap *unmap;
	LV2_Atom_Forge forge;
	LV2_Atom_Forge_Frame frame;
	LV2_URID event_transfer;
	LV2_OSC_URID osc_urid;

	PROPS_T(props, MAX_NPROPS);
	struct {
		LV2_URID overwrite;
		LV2_URID block;
		LV2_URID follow;
		LV2_URID pretty;
		LV2_URID time;
	} urid;
	state_t state;
	state_t stash;

	nk_pugl_window_t win;

	bool ttl_dirty;
	const LV2_Atom *selected;
	struct nk_text_edit editor;

	Sratom *sratom;
	const char *base_uri;

	float dy;

	uint32_t counter;
	int n_item;
	item_t **items;

	bool shadow;
	plugin_type_t type;
};

extern const char *max_items [5];
extern const int32_t max_values [5];

void
_midi_inspector_expose(struct nk_context *ctx, struct nk_rect wbounds, void *data);

void
_atom_inspector_expose(struct nk_context *ctx, struct nk_rect wbounds, void *data);

void
_osc_inspector_expose(struct nk_context *ctx, struct nk_rect wbounds, void *data);

void
_empty(struct nk_context *ctx);

void
_toggle(plughandle_t *handle, LV2_URID property, int32_t val, bool is_bool);

void
_clear(plughandle_t *handle);

void
_ruler(struct nk_context *ctx, float line_thickness, struct nk_color color);

void
_post_redisplay(plughandle_t *handle);

float
_get_scale(plughandle_t *handle);

#endif // _SHERLOCK_NK_H