# HG changeset patch
# User sl
# Date 1417823999 -3600
# Node ID d066e3999973569bbf15bc22ef729339448640b8
# Parent 24ac84ab96204261e75ee68a2432b64f95ef6d4e
Starting to remove special case for app commands.
Adding a whole bunch of consumer controls.
diff -r 24ac84ab9620 -r d066e3999973 Form1.cs
--- a/Form1.cs Fri Dec 05 23:18:13 2014 +0100
+++ b/Form1.cs Sat Dec 06 00:59:59 2014 +0100
@@ -122,12 +122,14 @@
base.WndProc(ref message);
}
- private void _remote_ButtonPressed(object sender, RemoteControlEventArgs e)
+ private bool _remote_ButtonPressed(object sender, RemoteControlEventArgs e)
{
+ bool processed = false;
_timer.Enabled = false;
if (e.Button != RemoteControlButton.Unknown)
{
label1.Text = e.Button.ToString();
+ processed = true;
}
else if (e.MceButton != Hid.UsageTables.MceButton.Null)
{
@@ -139,6 +141,14 @@
//Also display HP button name
label1.Text += " / HP:" + ((Hid.UsageTables.HpMceButton)e.MceButton).ToString();
}
+
+ processed = true;
+ }
+ else if (e.ConsumerControl != Hid.UsageTables.ConsumerControl.Null)
+ {
+ //Display consumer control name
+ label1.Text = e.ConsumerControl.ToString();
+ processed = true;
}
else
{
@@ -146,6 +156,7 @@
}
label2.Text = e.Device.ToString();
_timer.Enabled = true;
+ return processed;
}
private void _timer_Tick(object sender, EventArgs e)
diff -r 24ac84ab9620 -r d066e3999973 HumanInterfaceDevice.cs
--- a/HumanInterfaceDevice.cs Fri Dec 05 23:18:13 2014 +0100
+++ b/HumanInterfaceDevice.cs Sat Dec 06 00:59:59 2014 +0100
@@ -246,18 +246,129 @@
///
public enum ConsumerControl: ushort
{
+ Null = 0x0000,
+ //
+ Channel = 0x0086,
+ MediaSelection = 0x0087,
+ MediaSelectComputer = 0x0088,
+ MediaSelectTV = 0x0089,
+ MediaSelectWWW = 0x008A,
+ MediaSelectDVD = 0x008B,
+ MediaSelectTelephone = 0x008C,
+ MediaSelectProgramGuide = 0x008D,
+ MediaSelectVideoPhone = 0x008E,
+ MediaSelectGames = 0x008F,
+ MediaSelectMessages = 0x0090,
+ MediaSelectCD = 0x0091,
+ MediaSelectVCR = 0x0092,
+ MediaSelectTuner = 0x0093,
+ Quit = 0x0094,
+ Help = 0x0095,
+ MediaSelectTape = 0x0096,
+ MediaSelectCable = 0x0097,
+ MediaSelectSatellite = 0x0098,
+ MediaSelectSecurity = 0x0099,
+ MediaSelectHome = 0x009A,
+ MediaSelectCall = 0x009B,
+ ChannelIncrement = 0x009C,
+ ChannelDecrement = 0x009D,
+ MediaSelectSAP = 0x009E,
+ //
+ Play = 0x00B0,
+ Pause = 0x00B1,
+ Record = 0x00B2,
+ FastForward = 0x00B3,
+ Rewind = 0x00B4,
+ ScanNextTrack = 0x00B5,
+ ScanPreviousTrack = 0x00B6,
+ Stop = 0x00B7,
+ Eject = 0x00B8,
+ RandomPlay = 0x00B9,
+ SelectDisc = 0x00BA,
+ EnterDisc = 0x00BB,
+ Repeat = 0x00BC,
+ Tracking = 0x00BD,
+ TrackNormal = 0x00BE,
+ SlowTracking = 0x00BF,
+ FrameForward = 0x00C0,
+ FrameBack = 0x00C1,
+ Mark = 0x00C2,
+ ClearMark = 0x00C3,
+ RepeatFromMark = 0x00C4,
+ ReturnToMark = 0x00C5,
+ SearchMarkForward = 0x00C6,
+ SearchMarkBackwards = 0x00C7,
+ CounterReset = 0x00C8,
+ ShowCounter = 0x00C9,
+ TrackingIncrement = 0x00CA,
+ TrackingDecrement = 0x00CB,
+ StopEject = 0x00CC,
+ PlayPause = 0x00CD,
+ PlaySkip = 0x00CE,
+
///
- /// Sent by MCE remotes.
+ /// Audio controls
///
- MediaSelectProgramGuide = 0x008D,
- ///
- /// Sent by MCE remotes.
- ///
+ Volume = 0x00E0,
+ Balance = 0x00E1,
+ Mute = 0x00E2,
+ Bass = 0x00E3,
+ Treble = 0x00E4,
+ BassBoost = 0x00E5,
+ SurroundMode = 0x00E6,
+ Loudness = 0x00E7,
+ MPX = 0x00E8,
+ VolumeIncrement = 0x00E9,
+ VolumeDecrement = 0x00EA,
+
+ //Generic GUI Application Controls
+ GenericGUIApplicationControls = 0x0200,
+ AppCtrlNew = 0x0201,
+ AppCtrlOpen = 0x0202,
+ AppCtrlClose = 0x0203,
+ AppCtrlExit = 0x0204,
+ AppCtrlMaximize = 0x0205,
+ AppCtrlMinimize = 0x0206,
+ AppCtrlSave = 0x0207,
AppCtrlPrint = 0x0208,
- ///
- /// Sent by MCE remotes from the 'I' Informations or More Info buttons.
- ///
- AppCtrlProperties = 0x0209
+ AppCtrlProperties = 0x0209,
+ AppCtrlUndo = 0x021A,
+ AppCtrlCopy = 0x021B,
+ AppCtrlCut = 0x021C,
+ AppCtrlPaste = 0x021D,
+ AppCtrlSelectAll = 0x021E,
+ AppCtrlFind = 0x021F,
+ AppCtrlFindAndReplace = 0x0220,
+ AppCtrlSearch = 0x0221,
+ AppCtrlGoTo = 0x0222,
+ AppCtrlHome = 0x0223,
+ AppCtrlBack = 0x0224,
+ AppCtrlForward = 0x0225,
+ AppCtrlStop = 0x0226,
+ AppCtrlRefresh = 0x0227,
+ AppCtrlPreviousLink = 0x0228,
+ AppCtrlNextLink = 0x0229,
+ AppCtrlBookmarks = 0x022A,
+ AppCtrlHistory = 0x022B,
+ AppCtrlSubscriptions = 0x022C,
+ AppCtrlZoomIn = 0x022D,
+ AppCtrlZoomOut = 0x022E,
+ AppCtrlZoom = 0x022F,
+ AppCtrlFullScreenView = 0x0230,
+ AppCtrlNormalView = 0x0231,
+ AppCtrlViewToggle = 0x0232,
+ AppCtrlScrollUp = 0x0233,
+ AppCtrlScrollDown = 0x0234,
+ AppCtrlScroll = 0x0235,
+ AppCtrlPanLeft = 0x0236,
+ AppCtrlPanRight = 0x0237,
+ AppCtrlPan = 0x0238,
+ AppCtrlNewWindow = 0x0239,
+ AppCtrlTileHorizontally = 0x023A,
+ AppCtrlTileVertically = 0x023B,
+ AppCtrlFormat = 0x023C,
+ AppCtrlEdit = 0x023D,
+
}
}
}
\ No newline at end of file
diff -r 24ac84ab9620 -r d066e3999973 RawInput.cs
--- a/RawInput.cs Fri Dec 05 23:18:13 2014 +0100
+++ b/RawInput.cs Sat Dec 06 00:59:59 2014 +0100
@@ -94,7 +94,7 @@
}
///
- ///
+ /// Fetch pre-parsed data corresponding to HID descriptor for the given HID device.
///
///
///
@@ -118,120 +118,6 @@
return ppData;
}
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- /*
- private bool GetUsageFromRawInput(TwinhanHidDriver driver, TwinhanHid device, NativeMethods.RAWINPUT input, IntPtr rawInput, out UsageType usageType, out int usage, out string usageName)
- {
- usageType = 0;
- usage = 0;
- usageName = string.Empty;
- if (input.header.dwType == NativeMethods.RawInputDeviceType.RIM_TYPEKEYBOARD)
- {
- if (input.data.keyboard.Flags == NativeMethods.RawInputKeyboardFlag.RI_KEY_BREAK)
- {
- _modifiers = 0;
- // Key up event. We don't handle repeats, so ignore this.
- return false;
- }
- NativeMethods.VirtualKey vk = input.data.keyboard.VKey;
- if (vk == NativeMethods.VirtualKey.VK_CONTROL)
- {
- _modifiers |= VirtualKeyModifier.Control;
- return false;
- }
- if (vk == NativeMethods.VirtualKey.VK_SHIFT)
- {
- _modifiers |= VirtualKeyModifier.Shift;
- return false;
- }
- if (vk == NativeMethods.VirtualKey.VK_MENU)
- {
- _modifiers |= VirtualKeyModifier.Alt;
- return false;
- }
- usageType = UsageType.Keyboard;
- usage = (int)vk | (int)_modifiers;
- usageName = vk.ToString();
- if (_modifiers != 0)
- {
- usageName += string.Format(", modifiers = {0}", _modifiers);
- }
- }
- else if (input.header.dwType == NativeMethods.RawInputDeviceType.RIM_TYPEHID)
- {
- if ((!driver.IsTerraTec && device.Name.Contains("Col03")) || (driver.IsTerraTec && device.Name.Contains("Col02")))
- {
- usageType = UsageType.Raw;
- usage = Marshal.ReadByte(rawInput, HID_INPUT_DATA_OFFSET + 1);
- usageName = string.Format("0x{0:x2}", usage);
- }
- else if (device.Name.Contains("Col05"))
- {
- usageType = UsageType.Ascii;
- usage = Marshal.ReadByte(rawInput, HID_INPUT_DATA_OFFSET + 1);
- usageName = string.Format("0x{0:x2}", usage);
- }
- else
- {
- byte[] report = new byte[input.data.hid.dwSizeHid];
- Marshal.Copy(IntPtr.Add(rawInput, HID_INPUT_DATA_OFFSET), report, 0, report.Length);
- uint usageCount = input.data.hid.dwCount;
- NativeMethods.USAGE_AND_PAGE[] usages = new NativeMethods.USAGE_AND_PAGE[usageCount];
- NativeMethods.HidStatus status = NativeMethods.HidP_GetUsagesEx(NativeMethods.HIDP_REPORT_TYPE.HidP_Input, 0, usages, ref usageCount, device.PreParsedData, report, (uint)report.Length);
- if (status != NativeMethods.HidStatus.HIDP_STATUS_SUCCESS)
- {
- this.LogError("Twinhan HID remote: failed to get raw input HID usages, device = {0}, status = {1}", device.Name, status);
- Dump.DumpBinary(rawInput, (int)input.header.dwSize);
- return false;
- }
- if (usageCount > 1)
- {
- this.LogWarn("Twinhan HID remote: multiple simultaneous HID usages not supported");
- }
- NativeMethods.USAGE_AND_PAGE up = usages[0];
- HidUsagePage page = (HidUsagePage)up.UsagePage;
- usage = up.Usage;
- if (page != HidUsagePage.MceRemote && usage == 0)
- {
- // Key up event. We don't handle repeats, so ignore this.
- return false;
- }
- if (page == HidUsagePage.Consumer)
- {
- usageType = UsageType.Consumer;
- usageName = Enum.GetName(typeof(HidConsumerUsage), up.Usage);
- }
- else if (page == HidUsagePage.MceRemote)
- {
- usageType = UsageType.Mce;
- usageName = Enum.GetName(typeof(MceRemoteUsage), up.Usage);
- }
- else
- {
- this.LogError("Twinhan HID remote: unexpected usage page, device = {0}, page = {1}, usage = {2}", device.Name, page, up.Usage);
- return false;
- }
- }
- }
- else
- {
- this.LogError("Twinhan HID remote: received input from unsupported input device type, device = {0}, type = {1}", device.Name, input.header.dwType);
- return false;
- }
- return true;
- }
- * */
}
}
\ No newline at end of file
diff -r 24ac84ab9620 -r d066e3999973 RemoteControlDevice.cs
--- a/RemoteControlDevice.cs Fri Dec 05 23:18:13 2014 +0100
+++ b/RemoteControlDevice.cs Sat Dec 06 00:59:59 2014 +0100
@@ -80,19 +80,38 @@
RemoteControlButton _rcb;
InputDevice _device;
MceButton iMceButton;
+ ConsumerControl iConsumerControl;
public RemoteControlEventArgs(RemoteControlButton rcb, InputDevice device)
{
- iMceButton = MceButton.Null;
+ SetNullButtons();
+ //
_rcb = rcb;
- _device = device;
+ _device = device;
}
+ public RemoteControlEventArgs(ConsumerControl aConsumerControl, InputDevice device)
+ {
+ SetNullButtons();
+ //
+ iConsumerControl = aConsumerControl;
+ _device = device;
+ }
+
+
public RemoteControlEventArgs(MceButton mce, InputDevice device)
{
- iMceButton = mce;
+ SetNullButtons();
+ //
+ iMceButton = mce;
+ _device = device;
+ }
+
+ private void SetNullButtons()
+ {
+ iConsumerControl = ConsumerControl.Null;
+ iMceButton = MceButton.Null;
_rcb = RemoteControlButton.Unknown;
- _device = device;
}
public RemoteControlEventArgs()
@@ -114,6 +133,12 @@
set { iMceButton = value; }
}
+ public ConsumerControl ConsumerControl
+ {
+ get { return iConsumerControl; }
+ set { iConsumerControl = value; }
+ }
+
public InputDevice Device
{
get { return _device; }
@@ -126,10 +151,15 @@
public sealed class RemoteControlDevice
{
- public delegate void RemoteControlDeviceEventHandler(object sender, RemoteControlEventArgs e);
+ public delegate bool RemoteControlDeviceEventHandler(object sender, RemoteControlEventArgs e);
public event RemoteControlDeviceEventHandler ButtonPressed;
- public delegate void HidUsageHandler(ushort aUsage);
+ ///
+ /// Return true if the usage was processed.
+ ///
+ ///
+ ///
+ public delegate bool HidUsageHandler(ushort aUsage);
//-------------------------------------------------------------
@@ -178,11 +208,12 @@
ProcessKeyDown(message.WParam);
break;
case Const.WM_APPCOMMAND:
- ProcessAppCommand(message.LParam);
+ //ProcessAppCommand(message.LParam);
break;
case Const.WM_INPUT:
+ //Returning zero means we processed that message.
+ message.Result = new IntPtr(0);
ProcessInputCommand(ref message);
- message.Result = new IntPtr(0);
break;
}
@@ -318,37 +349,26 @@
///
///
///
- private void HidConsumerDeviceHandler(ushort aUsage)
+ private bool HidConsumerDeviceHandler(ushort aUsage)
{
if (aUsage == 0)
{
//Just skip those
- return;
+ return false;
}
if (Enum.IsDefined(typeof(ConsumerControl), aUsage) && aUsage != 0) //Our button is a known consumer control
{
if (this.ButtonPressed != null)
{
- RemoteControlButton button=RemoteControlButton.Unknown;
- if (aUsage == (ushort)ConsumerControl.AppCtrlProperties)
- {
- button = RemoteControlButton.MoreInfo;
- }
- else if (aUsage == (ushort)ConsumerControl.AppCtrlPrint)
- {
- button = RemoteControlButton.Print;
- }
- else if (aUsage == (ushort)ConsumerControl.MediaSelectProgramGuide)
- {
- button = RemoteControlButton.Guide;
- }
- this.ButtonPressed(this, new RemoteControlEventArgs(button, InputDevice.OEM));
+ return this.ButtonPressed(this, new RemoteControlEventArgs((ConsumerControl)aUsage, InputDevice.OEM));
}
+ return false;
}
else
{
Debug.WriteLine("Unknown Consumer Control!");
+ return false;
}
}
@@ -356,12 +376,12 @@
///
///
///
- private void HidMceRemoteHandler(ushort aUsage)
+ private bool HidMceRemoteHandler(ushort aUsage)
{
if (aUsage == 0)
{
//Just skip those
- return;
+ return false;
}
@@ -369,14 +389,15 @@
{
if (this.ButtonPressed != null)
{
- this.ButtonPressed(this, new RemoteControlEventArgs((MceButton)aUsage, InputDevice.OEM));
+ return this.ButtonPressed(this, new RemoteControlEventArgs((MceButton)aUsage, InputDevice.OEM));
}
+ return false;
}
else
{
Debug.WriteLine("Unknown MCE button!");
+ return false;
}
-
}