[libbluray-devel] [Git][videolan/libbluray][master] Allow application to provide separate user input events when key is pressed/typed/released.

Petri Hintukainen gitlab at videolan.org
Thu Jun 13 10:46:43 CEST 2019



Petri Hintukainen pushed to branch master at VideoLAN / libbluray


Commits:
4d450115 by hpi1 at 2019-06-13T08:43:43Z
Allow application to provide separate user input events when key is pressed/typed/released.

- - - - -


5 changed files:

- ChangeLog
- src/libbluray/bdj/java/org/videolan/Libbluray.java
- src/libbluray/bluray.c
- src/libbluray/bluray.h
- src/libbluray/keys.h


Changes:

=====================================
ChangeLog
=====================================
@@ -1,5 +1,6 @@
 2019-??-??: Version 1.2.0
 - Add functions to list and read BD-ROM files.
+- Add support for separate key pressed / typed / released user input events.
 
 2019-06-07: Version 1.1.2
 - Add libxml version to pkg-config Requires.private.


=====================================
src/libbluray/bdj/java/org/videolan/Libbluray.java
=====================================
@@ -702,7 +702,7 @@ public class Libbluray {
             break;
 
         case BDJ_EVENT_VK_KEY:
-            switch (param) {
+            switch (param & 0xffff) {
             case  0: key = KeyEvent.VK_0; break;
             case  1: key = KeyEvent.VK_1; break;
             case  2: key = KeyEvent.VK_2; break;
@@ -733,9 +733,16 @@ public class Libbluray {
                 break;
             }
             if (key > 0) {
-                boolean r1 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_PRESSED, 0, key);
-                boolean r2 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_TYPED, 0, key);
-                boolean r3 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_RELEASED, 0, key);
+                boolean r1 = false, r2 = false, r3 = false;
+                if ((param & 0x80000000) != 0) {
+                    r1 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_PRESSED, 0, key);
+                }
+                if ((param & 0x40000000) != 0) {
+                    r2 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_TYPED, 0, key);
+                }
+                if ((param & 0x20000000) != 0) {
+                    r3 = EventManager.getInstance().receiveKeyEventN(KeyEvent.KEY_RELEASED, 0, key);
+                }
                 result = r1 || r2 || r3;
             }
             break;


=====================================
src/libbluray/bluray.c
=====================================
@@ -3654,12 +3654,21 @@ int bd_mouse_select(BLURAY *bd, int64_t pts, uint16_t x, uint16_t y)
     return result;
 }
 
+#define BD_VK_FLAGS_MASK (BD_VK_KEY_PRESSED | BD_VK_KEY_TYPED | BD_VK_KEY_RELEASED)
+#define BD_VK_KEY(k)     ((k) & ~(BD_VK_FLAGS_MASK))
+#define BD_VK_FLAGS(k)   ((k) & BD_VK_FLAGS_MASK)
+/* HDMV: key is triggered when pressed down */
+#define BD_KEY_TYPED(k)  (!((k) & (BD_VK_KEY_TYPED | BD_VK_KEY_RELEASED)))
+
 int bd_user_input(BLURAY *bd, int64_t pts, uint32_t key)
 {
     int result = -1;
 
-    if (key == BD_VK_ROOT_MENU) {
-        return bd_menu_call(bd, pts);
+    if (BD_VK_KEY(key) == BD_VK_ROOT_MENU) {
+        if (BD_KEY_TYPED(key)) {
+            return bd_menu_call(bd, pts);
+        }
+        return 0;
     }
 
     bd_mutex_lock(&bd->mutex);
@@ -3667,8 +3676,17 @@ int bd_user_input(BLURAY *bd, int64_t pts, uint32_t key)
     _set_scr(bd, pts);
 
     if (bd->title_type == title_hdmv) {
-        result = _run_gc(bd, GC_CTRL_VK_KEY, key);
+        if (BD_KEY_TYPED(key)) {
+            result = _run_gc(bd, GC_CTRL_VK_KEY, BD_VK_KEY(key));
+        } else {
+            result = 0;
+        }
+
     } else if (bd->title_type == title_bdj) {
+        if (!BD_VK_FLAGS(key)) {
+            /* No flags --> single key press event */
+            key |= BD_VK_KEY_PRESSED | BD_VK_KEY_TYPED | BD_VK_KEY_RELEASED;
+        }
         result = _bdj_event(bd, BDJ_EVENT_VK_KEY, key);
     }
 


=====================================
src/libbluray/bluray.h
=====================================
@@ -1013,9 +1013,14 @@ int bd_set_rate(BLURAY *bd, uint32_t rate);
  *  Pass user input to graphics controller or BD-J.
  *  Keys are defined in libbluray/keys.h.
  *
+ *  Two user input models are supported:
+ *    - Single event when a key is typed once.
+ *    - Separate events when key is pressed and released.
+ *      VD_VK_KEY_PRESSED, BD_VK_TYPED and BD_VK_KEY_RELEASED are or'd with the key.
+ *
  * @param bd  BLURAY object
  * @param pts current playback position (1/90000s) or -1
- * @param key input key
+ * @param key input key (@see keys.h)
  * @return <0 on error, 0 on success, >0 if selection/activation changed
  */
 int bd_user_input(BLURAY *bd, int64_t pts, uint32_t key);


=====================================
src/libbluray/keys.h
=====================================
@@ -1,6 +1,6 @@
 /*
  * This file is part of libbluray
- * Copyright (C) 2010  hpi1
+ * Copyright (C) 2010-2019  Petri Hintukainen <phintuka at users.sourceforge.net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -61,4 +61,13 @@ typedef enum {
 
 } bd_vk_key_e;
 
+/*
+ * Application may optionally provide KEY_PRESSED, KEY_TYPED and KEY_RELEASED events.
+ * These masks are OR'd with the key code when calling bd_user_input().
+ */
+
+#define BD_VK_KEY_PRESSED   0x80000000   /* Key was pressed down */
+#define BD_VK_KEY_TYPED     0x40000000   /* Key was typed */
+#define BD_VK_KEY_RELEASED  0x20000000   /* Key was released */
+
 #endif // _BD_KEYS_H_



View it on GitLab: https://code.videolan.org/videolan/libbluray/commit/4d45011536b3288cd822983411b6d50b0a223ba9

-- 
View it on GitLab: https://code.videolan.org/videolan/libbluray/commit/4d45011536b3288cd822983411b6d50b0a223ba9
You're receiving this email because of your account on code.videolan.org.



More information about the libbluray-devel mailing list