Skip to content

Commit fde86f1

Browse files
committed
Listen to property change callbacks for position setting
Signed-off-by: falkTX <falktx@falktx.com>
1 parent d163673 commit fde86f1

File tree

3 files changed

+96
-19
lines changed

3 files changed

+96
-19
lines changed

src/catia.py

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@
8888
iConnInGroup = 3
8989
iConnInPort = 4
9090

91-
URI_CANVAS_ICON = "http://kxstudio.sf.net/ns/canvas/icon"
91+
URI_MAIN_CLIENT_NAME = "https://kx.studio/ns/carla/main-client-name"
92+
URI_POSITION = "https://kx.studio/ns/carla/position"
93+
URI_PLUGIN_ICON = "https://kx.studio/ns/carla/plugin-icon"
94+
URI_PLUGIN_ID = "https://kx.studio/ns/carla/plugin-id"
95+
96+
URI_TYPE_INTEGER = "http://www.w3.org/2001/XMLSchema#integer"
97+
URI_TYPE_STRING = "text/plain"
9298

9399
# ------------------------------------------------------------------------------------------------------------
94100
# Catia Main Window
@@ -283,6 +289,7 @@ def __init__(self, parent=None):
283289
self.PortRegistrationCallback.connect(self.slot_PortRegistrationCallback)
284290
self.PortConnectCallback.connect(self.slot_PortConnectCallback)
285291
self.PortRenameCallback.connect(self.slot_PortRenameCallback)
292+
self.PropertyChangeCallback.connect(self.slot_PropertyChangeCallback)
286293
self.ShutdownCallback.connect(self.slot_ShutdownCallback)
287294

288295
# -------------------------------------------------------------
@@ -550,6 +557,7 @@ def initJackCallbacks(self):
550557
jacklib.set_xrun_callback(gJack.client, self.JackXRunCallback, None)
551558
jacklib.set_port_registration_callback(gJack.client, self.JackPortRegistrationCallback, None)
552559
jacklib.set_port_connect_callback(gJack.client, self.JackPortConnectCallback, None)
560+
jacklib.set_property_change_callback(gJack.client, self.JackPropertyChangeCallback, None)
553561
jacklib.on_shutdown(gJack.client, self.JackShutdownCallback, None)
554562

555563
jacklib.set_client_rename_callback(gJack.client, self.JackClientRenameCallback, None)
@@ -748,30 +756,46 @@ def canvas_addAlsaGroup(self, alsaGroupId, groupName, hwSplit):
748756
return groupId
749757

750758
def canvas_addJackGroup(self, groupName):
751-
ret, data, dataSize = jacklib.custom_get_data(gJack.client, groupName, URI_CANVAS_ICON)
759+
props = jacklib.get_client_properties(gJack.client, groupName)
752760

753761
groupId = self.fLastGroupId
754762
groupSplit = patchcanvas.SPLIT_UNDEF
755763
groupIcon = patchcanvas.ICON_APPLICATION
756-
757-
if ret == 0:
758-
iconName = voidptr2str(data)
759-
jacklib.free(data)
760-
761-
if iconName == "hardware":
762-
groupSplit = patchcanvas.SPLIT_YES
763-
groupIcon = patchcanvas.ICON_HARDWARE
764-
#elif iconName =="carla":
765-
#groupIcon = patchcanvas.ICON_CARLA
766-
elif iconName =="distrho":
767-
groupIcon = patchcanvas.ICON_DISTRHO
768-
elif iconName =="file":
769-
groupIcon = patchcanvas.ICON_FILE
770-
elif iconName =="plugin":
764+
groupPos = ""
765+
766+
for prop in props:
767+
if prop.key == URI_POSITION:
768+
groupPos = prop.value
769+
elif prop.key == URI_PLUGIN_ICON:
770+
print("plugin icon is", prop.value)
771+
elif prop.key == URI_PLUGIN_ID:
771772
groupIcon = patchcanvas.ICON_PLUGIN
772773

774+
#if iconName == "hardware":
775+
#groupSplit = patchcanvas.SPLIT_YES
776+
#groupIcon = patchcanvas.ICON_HARDWARE
777+
##elif iconName =="carla":
778+
##groupIcon = patchcanvas.ICON_CARLA
779+
#elif iconName =="distrho":
780+
#groupIcon = patchcanvas.ICON_DISTRHO
781+
#elif iconName =="file":
782+
#groupIcon = patchcanvas.ICON_FILE
783+
#elif iconName =="plugin":
784+
#groupIcon = patchcanvas.ICON_PLUGIN
785+
786+
if groupPos:
787+
x1, y1, x2, y2 = tuple(int(v) for v in groupPos.split(":",4))
788+
groupSplit = (x1 != 0 and x2 != 0) or (y1 != 0 and y2 != 0)
789+
773790
patchcanvas.addGroup(groupId, groupName, groupSplit, groupIcon)
774791

792+
if groupPos:
793+
if groupSplit:
794+
patchcanvas.splitGroup(groupId)
795+
else:
796+
patchcanvas.joinGroup(groupId)
797+
patchcanvas.setGroupPosFull(groupId, x1, y1, x2, y2)
798+
775799
groupObj = [None, None, None]
776800
groupObj[iGroupId] = groupId
777801
groupObj[iGroupName] = groupName
@@ -1112,6 +1136,11 @@ def JackPortRenameCallback(self, portId, oldName, newName, arg):
11121136
self.PortRenameCallback.emit(portId, str(oldName, encoding="utf-8"), str(newName, encoding="utf-8"))
11131137
return 0
11141138

1139+
def JackPropertyChangeCallback(self, uuid, key, change, arg):
1140+
if DEBUG: print("PropertyChangeCallback(%i, %s, %i)" % (uuid, key, change))
1141+
self.PropertyChangeCallback.emit(jacklib.jack_uuid_t(uuid), str(key, encoding="utf-8"), change)
1142+
return 0
1143+
11151144
def JackShutdownCallback(self, arg):
11161145
if DEBUG: print("JackShutdownCallback()")
11171146
self.ShutdownCallback.emit()
@@ -1223,6 +1252,34 @@ def slot_PortRenameCallback(self, portIdJack, oldName, newName):
12231252
else:
12241253
self.canvas_renamePort(portIdCanvas, portShortName)
12251254

1255+
@pyqtSlot(jacklib.jack_uuid_t, str, int)
1256+
def slot_PropertyChangeCallback(self, uuid, key, change):
1257+
if key != URI_POSITION:
1258+
return
1259+
1260+
prop = jacklib.get_property(uuid, key)
1261+
1262+
if prop is None:
1263+
return
1264+
1265+
x1, y1, x2, y2 = tuple(int(v) for v in prop.value.split(":",4))
1266+
1267+
clientName = jacklib.get_client_name_by_uuid(gJack.client, jacklib.uuid_unparse(uuid))
1268+
1269+
if not clientName:
1270+
return
1271+
1272+
groupId = self.canvas_getGroupId(jacklib._d(clientName))
1273+
1274+
if groupId == -1:
1275+
return
1276+
1277+
if (x1 != 0 and x2 != 0) or (y1 != 0 and y2 != 0):
1278+
patchcanvas.splitGroup(groupId)
1279+
else:
1280+
patchcanvas.joinGroup(groupId)
1281+
patchcanvas.setGroupPosFull(groupId, x1, y1, x2, y2)
1282+
12261283
@pyqtSlot()
12271284
def slot_ShutdownCallback(self):
12281285
self.jackStopped()

src/jacklib/jacklib.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ class _jack_client(Structure):
7979
JACK_DEFAULT_AUDIO_TYPE = "32 bit float mono audio"
8080
JACK_DEFAULT_MIDI_TYPE = "8 bit raw midi"
8181

82+
JACK_UUID_SIZE = 36
83+
JACK_UUID_STRING_SIZE = JACK_UUID_SIZE + 1
84+
JACK_UUID_EMPTY_INITIALIZER = 0
85+
8286
# Meta data
8387
_JACK_METADATA_PREFIX = "http://jackaudio.org/metadata/"
8488
JACK_METADATA_CONNECTED = _JACK_METADATA_PREFIX + "connected"
@@ -981,7 +985,7 @@ def port_connected_to(port, port_name):
981985

982986

983987
def port_get_connections(port):
984-
ports = jlib.jack_port_get_connections(port)
988+
ports = jlib.jack_port_get_connections(port)
985989
if not ports:
986990
return
987991
for port_name in ports:
@@ -1496,6 +1500,12 @@ def midi_get_lost_event_count(port_buffer):
14961500
except AttributeError:
14971501
jlib.jack_uuid_parse = None
14981502

1503+
try:
1504+
jlib.jack_uuid_unparse.argtypes = [jack_uuid_t, c_char_p]
1505+
jlib.jack_uuid_unparse.restype = None
1506+
except AttributeError:
1507+
jlib.jack_uuid_unparse = None
1508+
14991509

15001510
def set_session_callback(client, session_callback, arg):
15011511
if jlib.jack_set_session_callback:
@@ -1566,14 +1576,23 @@ def client_has_session_callback(client, client_name):
15661576

15671577

15681578
def uuid_parse(uuid_cstr):
1569-
if jlib.jack_uuid_parse:
1579+
if jlib.jack_uuid_parse and uuid_cstr is not None:
15701580
uuid = jack_uuid_t()
15711581
res = jlib.jack_uuid_parse(uuid_cstr, byref(uuid))
15721582
return uuid if res != -1 else None
15731583

15741584
return -1
15751585

15761586

1587+
def uuid_unparse(uuid, encoding=ENCODING):
1588+
if jlib.jack_uuid_unparse:
1589+
uuid_str = c_char_p(b" " * JACK_UUID_STRING_SIZE)
1590+
jlib.jack_uuid_unparse(uuid, uuid_str)
1591+
return _d(uuid_str.value, encoding)
1592+
1593+
return ""
1594+
1595+
15771596
# -------------------------------------------------------------------------------------------------
15781597
# Custom
15791598

src/shared_canvasjack.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class AbstractCanvasJackClass(QMainWindow):
8585
PortRegistrationCallback = pyqtSignal(int, bool)
8686
PortConnectCallback = pyqtSignal(int, int, bool)
8787
PortRenameCallback = pyqtSignal(int, str, str)
88+
PropertyChangeCallback = pyqtSignal(jacklib.jack_uuid_t, str, int)
8889
ShutdownCallback = pyqtSignal()
8990

9091
SIGTERM = pyqtSignal()

0 commit comments

Comments
 (0)