@@ -37,6 +37,8 @@ void lorieKeysymKeyboardEvent(KeySym keysym, int down);
37
37
char * xtrans_unix_path_x11 = NULL ;
38
38
char * xtrans_unix_dir_x11 = NULL ;
39
39
40
+ struct xorg_list registeredBuffers ;
41
+
40
42
static void * startServer (__unused void * cookie ) {
41
43
char * envp [] = { NULL };
42
44
exit (dix_main (argc , (char * * ) argv , envp ));
@@ -196,6 +198,7 @@ Java_com_termux_x11_CmdEntryPoint_start(JNIEnv *env, __unused jclass cls, jobjec
196
198
// Trigger it first time
197
199
AChoreographer_postFrameCallback (choreographer , (AChoreographer_frameCallback ) lorieChoreographerFrameCallback , choreographer );
198
200
201
+ xorg_list_init (& registeredBuffers );
199
202
pthread_create (& t , NULL , startServer , vm );
200
203
return JNI_TRUE ;
201
204
}
@@ -261,10 +264,13 @@ void handleLorieEvents(int fd, __unused int ready, __unused void *ignored) {
261
264
valuator_mask_zero (& mask );
262
265
263
266
if (ready & X_NOTIFY_ERROR ) {
267
+ LorieBuffer * buf ;
264
268
InputThreadUnregisterDev (fd );
265
269
close (fd );
266
270
conn_fd = -1 ;
267
271
lorieEnableClipboardSync (FALSE);
272
+ while ((buf = LorieBufferList_first (& registeredBuffers )))
273
+ LorieBuffer_removeFromList (buf );
268
274
return ;
269
275
}
270
276
@@ -433,11 +439,30 @@ void lorieSendSharedServerState(int memfd) {
433
439
}
434
440
}
435
441
436
- void lorieSendRootWindowBuffer (LorieBuffer * buffer ) {
442
+ void lorieRegisterBuffer (LorieBuffer * buffer ) {
443
+ unsigned long id = LorieBuffer_description (buffer )-> id ;
444
+ if (LorieBufferList_findById (& registeredBuffers , id ))
445
+ return ; // Already registered
446
+
437
447
if (conn_fd != -1 && buffer ) {
438
- lorieEvent e = { .type = EVENT_SHARED_ROOT_WINDOW_BUFFER };
448
+ lorieEvent e = { .type = EVENT_ADD_BUFFER };
439
449
write (conn_fd , & e , sizeof (e ));
440
450
LorieBuffer_sendHandleToUnixSocket (buffer , conn_fd );
451
+ LorieBuffer_addToList (buffer , & registeredBuffers );
452
+ const LorieBuffer_Desc * desc = LorieBuffer_description (buffer );
453
+ log (INFO , "Received shared buffer width %d height %d format %d type %d id %llu" , desc -> width , desc -> height , desc -> format , desc -> type , desc -> id );
454
+ }
455
+ }
456
+
457
+ void lorieUnregisterBuffer (LorieBuffer * buffer ) {
458
+ unsigned long id ;
459
+ if (!buffer || (!LorieBufferList_findById (& registeredBuffers , (id = LorieBuffer_description (buffer )-> id ))))
460
+ return ; // Not exist or not registered so no need to unregister
461
+
462
+ if (conn_fd != -1 && buffer ) {
463
+ lorieEvent e = { .removeBuffer = { .t = EVENT_REMOVE_BUFFER , .id = id } };
464
+ write (conn_fd , & e , sizeof (e ));
465
+ LorieBuffer_removeFromList (buffer );
441
466
}
442
467
}
443
468
0 commit comments