From 4a0c87e530bf22e9b960deac6eb1523c47fdb130 Mon Sep 17 00:00:00 2001 From: hpi1 Date: Thu, 13 Jun 2019 19:11:06 +0300 Subject: [PATCH] BDJ: implement AWT mouse events --- ChangeLog | 1 + .../bdj/java/java/awt/BDJHelper.java | 47 +++++++++++++++++-- .../bdj/java/org/videolan/Libbluray.java | 12 ++++- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3ddabbd..776119fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 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. +- Add support for AWT mouse events (BD-J). 2019-06-07: Version 1.1.2 - Add libxml version to pkg-config Requires.private. diff --git a/src/libbluray/bdj/java/java/awt/BDJHelper.java b/src/libbluray/bdj/java/java/awt/BDJHelper.java index 02dadd7c..02fca52c 100644 --- a/src/libbluray/bdj/java/java/awt/BDJHelper.java +++ b/src/libbluray/bdj/java/java/awt/BDJHelper.java @@ -22,6 +22,7 @@ package java.awt; import java.awt.event.InvocationEvent; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import org.videolan.Logger; @@ -70,13 +71,53 @@ public class BDJHelper { } } + /* + * Mouse events + */ + + private static int mouseX = 0, mouseY = 0, mouseMask = 0; + public static boolean postMouseEvent(int x, int y) { + mouseX = x; + mouseY = y; + return postMouseEventImpl(MouseEvent.MOUSE_MOVED, MouseEvent.NOBUTTON); + } + + public static boolean postMouseEvent(int id) { + boolean r; + + if (id == MouseEvent.MOUSE_PRESSED) + mouseMask = MouseEvent.BUTTON1_MASK; + + r = postMouseEventImpl(id, MouseEvent.BUTTON1); + + if (id == MouseEvent.MOUSE_RELEASED) + mouseMask = 0; + + return r; + } + + private static boolean postMouseEventImpl(int id, int button) { + Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner(); + if (focusOwner != null) { + EventQueue eq = BDToolkit.getEventQueue(focusOwner); + if (eq != null) { + long when = System.currentTimeMillis(); + try { + eq.postEvent(new MouseEvent(focusOwner, id, when, mouseMask, mouseX, mouseY, + (id == MouseEvent.MOUSE_CLICKED) ? 1 : 0, false, button)); + return true; + } catch (Exception e) { + logger.error("postMouseEvent failed: " + e); + } + } + } return false; } - public static boolean postMouseEvent(int button) { - return false; - } + /* + * Key events + */ public static boolean postKeyEvent(int id, int modifiers, int keyCode) { Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner(); diff --git a/src/libbluray/bdj/java/org/videolan/Libbluray.java b/src/libbluray/bdj/java/org/videolan/Libbluray.java index bd70c843..a95188fd 100644 --- a/src/libbluray/bdj/java/org/videolan/Libbluray.java +++ b/src/libbluray/bdj/java/org/videolan/Libbluray.java @@ -23,6 +23,7 @@ package org.videolan; import java.awt.BDFontMetrics; import java.awt.BDToolkit; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.io.File; import java.util.HashMap; import java.util.Map; @@ -724,7 +725,16 @@ public class Libbluray { case 405: key = HRcEvent.VK_COLORED_KEY_2; break; case 406: key = HRcEvent.VK_COLORED_KEY_3; break; case 17: - result = java.awt.BDJHelper.postMouseEvent(0); + result = false; + if ((param & 0x80000000) != 0) { + result = java.awt.BDJHelper.postMouseEvent(MouseEvent.MOUSE_PRESSED) || result; + } + if ((param & 0x40000000) != 0) { + result = java.awt.BDJHelper.postMouseEvent(MouseEvent.MOUSE_CLICKED) || result; + } + if ((param & 0x20000000) != 0) { + result = java.awt.BDJHelper.postMouseEvent(MouseEvent.MOUSE_RELEASED) || result; + } key = -1; break; default: