Example #1
0
 /// <summary>
 /// Get the mapping for this remote
 /// </summary>
 /// <param name="msg"></param>
 /// <returns></returns>
 public MediaPortal.InputDevices.InputHandler.Mapping GetMapping(Message msg)
 {
     if (controlEnabled && msg.Msg == Win32.Const.WM_APPCOMMAND)
     {
         Mapping mappedCommand = null;
         if (WndProcAppCommand(ref msg, out mappedCommand, false))
         {
             return(mappedCommand);
         }
     }
     return(null);
 }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="action"></param>
        /// <param name="key"></param>
        /// <param name="keyCode"></param>
        /// <returns></returns>
        public bool WndProcAppCommand(ref Message msg, out Mapping mappedCommand, bool shouldRaiseAction = true)
        {
            mappedCommand = null;

            AppCommands appCommand = (AppCommands)Win32.Macro.GET_APPCOMMAND_LPARAM(msg.LParam);

            // find out which request the MCE remote handled last
            if ((appCommand == InputDevices.LastHidRequest) && (appCommand != AppCommands.VolumeDown) &&
                (appCommand != AppCommands.VolumeUp))
            {
                if (Enum.IsDefined(typeof(AppCommands), InputDevices.LastHidRequest))
                {
                    // possible that it is the same request mapped to an app command?
                    if (Environment.TickCount - InputDevices.LastHidRequestTick < 500)
                    {
                        return(true);
                    }
                }
            }

            InputDevices.LastHidRequest = appCommand;

            if (logVerbose)
            {
                Log.Info("AppCommand: {0} - {1}", appCommand, InputDevices.LastHidRequest.ToString());
            }

            mappedCommand = _inputHandler.GetMapping(((int)appCommand).ToString());

            if (shouldRaiseAction)
            {
                if (!_inputHandler.MapAction((int)appCommand))
                {
                    return(false);
                }
            }

            msg.Result = new IntPtr(1);

            return(true);
        }
Example #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="action"></param>
        /// <param name="key"></param>
        /// <param name="keyCode"></param>
        /// <returns></returns>
        public bool WndProc(ref Message msg, out Action action, out char key, out Keys keyCode)
        {
            action  = null;
            key     = (char)0;
            keyCode = Keys.A;
            Mapping mappedCommand = null;

            if (!controlEnabled)
            {
                return(false);
            }
            // we are only interested in WM_APPCOMMAND
            switch (msg.Msg)
            {
            case Win32.Const.WM_APPCOMMAND:
                return(WndProcAppCommand(ref msg, out mappedCommand));

            default:
                return(false);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="action"></param>
        /// <param name="key"></param>
        /// <param name="keyCode"></param>
        /// <returns></returns>
        public bool WndProcAppCommand(ref Message msg, out Mapping mappedCommand, bool shouldRaiseAction = true)
        {
            mappedCommand = null;

            AppCommands appCommand = (AppCommands)Win32.Macro.GET_APPCOMMAND_LPARAM(msg.LParam);

            // find out which request the MCE remote handled last
            if ((appCommand == InputDevices.LastHidRequest) && (appCommand != AppCommands.VolumeDown) &&
                (appCommand != AppCommands.VolumeUp))
            {
                if (Enum.IsDefined(typeof(AppCommands), InputDevices.LastHidRequest))
                {
                    // possible that it is the same request mapped to an app command?
                    if (Environment.TickCount - InputDevices.LastHidRequestTick < 500)
                    {
                        return true;
                    }
                }
            }

            InputDevices.LastHidRequest = appCommand;

            if (logVerbose)
            {
                Log.Info("AppCommand: {0} - {1}", appCommand, InputDevices.LastHidRequest.ToString());
            }

            mappedCommand = _inputHandler.GetMapping(((int)appCommand).ToString());

            if (shouldRaiseAction)
            {
                if (!_inputHandler.MapAction((int)appCommand))
                {
                    return false;
                }
            }

            msg.Result = new IntPtr(1);

            return true;
        }
Example #5
0
        /// <summary>
        /// Map an app command to the MCE RemoteButton
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        private Mapping MapFromAppCommand(AppCommands command)
        {
            Mapping      result = null;
            RemoteButton button = RemoteButton.None;

            switch (command)
            {
            case AppCommands.BrowserBackward:
                button = RemoteButton.Back;
                break;

            case AppCommands.VolumeMute:
                button = RemoteButton.Mute;
                break;

            case AppCommands.VolumeDown:
                button = RemoteButton.VolumeDown;
                break;

            case AppCommands.VolumeUp:
                button = RemoteButton.VolumeUp;
                break;

            case AppCommands.MediaNextTrack:
                button = RemoteButton.Skip;
                break;

            case AppCommands.MediaPreviousTrack:
                button = RemoteButton.Replay;
                break;

            case AppCommands.MediaStop:
                button = RemoteButton.Stop;
                break;

            case AppCommands.MediaPlayPause:
                button = RemoteButton.Pause;
                break;

            case AppCommands.Print:
                button = RemoteButton.Print;
                break;

            case AppCommands.MediaPlay:
                button = RemoteButton.Play;
                break;

            case AppCommands.MediaPause:
                button = RemoteButton.Pause;
                break;

            case AppCommands.MediaRecord:
                button = RemoteButton.Record;
                break;

            case AppCommands.MediaFastForward:
                button = RemoteButton.Forward;
                break;

            case AppCommands.MediaRewind:
                button = RemoteButton.Rewind;
                break;

            case AppCommands.MediaChannelUp:
                button = RemoteButton.ChannelUp;
                break;

            case AppCommands.MediaChannelDown:
                button = RemoteButton.ChannelDown;
                break;
            }

            if (button != RemoteButton.None)
            {
                if (_inputHandler == null)
                {
                    InitInputHandler();
                }
                if (_inputHandler == null || !_inputHandler.IsLoaded)
                {
                    return(null);
                }

                result = _inputHandler.GetMapping(((int)button).ToString());

                // Get the mapping
                if (result != null)
                {
                    if (logVerbose)
                    {
                        Log.Info("MCE: Command \"{0}\" mapped from AppCommands {1}", button, command);
                    }
                }
                else if (logVerbose)
                {
                    Log.Info("MCE: Command \"{0}\" not mapped from AppCommands {1}", button, command);
                }
            }
            return(result);
        }
Example #6
0
        /// <summary>
        /// Map a WndProc message and optionally execute it
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        private Mapping MapWndProcMessage(Message msg, bool shouldRaiseAction = true)
        {
            Mapping result = null;

            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN || msg.Msg == Win32.Const.WM_APPCOMMAND || msg.Msg == WM_LBUTTONDOWN ||
                msg.Msg == WM_RBUTTONDOWN || msg.Msg == WM_MOUSEMOVE)
            {
                switch ((Keys)msg.WParam)
                {
                case Keys.ControlKey:
                    break;

                case Keys.ShiftKey:
                    break;

                case Keys.Menu:
                    break;

                default:
                    int keycode = (int)msg.WParam;

                    AppCommands appCommand = (AppCommands)Win32.Macro.GET_APPCOMMAND_LPARAM(msg.LParam);
                    InputDevices.LastHidRequest = appCommand;

                    // Due to the non-perfect placement of the OK button we allow the user to remap the joystick to okay.
                    if (_mapMouseButton)
                    {
                        if (msg.Msg == WM_LBUTTONDOWN)
                        {
                            if (_verboseLogging)
                            {
                                Log.Debug("Centarea: Command \"{0}\" mapped for left mouse button", keycode);
                            }
                            keycode = 13;
                        }
                        if (msg.Msg == WM_RBUTTONDOWN)
                        {
                            if (_verboseLogging)
                            {
                                Log.Debug("Centarea: Command \"{0}\" mapped for right mouse button", keycode);
                            }
                            keycode = 10069;
                        }
                    }
                    // Since mouse support is semi optimal we have this option to use the joystick like cursor keys
                    if (_mapJoystick && GUIGraphicsContext.Fullscreen)
                    {
                        if (msg.Msg == WM_MOUSEMOVE)
                        {
                            Point p = new Point(msg.LParam.ToInt32());
                            _ignoreDupMsg++;
                            // since our ResetCursor() triggers a mouse move MSG as well we ignore every second event
                            if (_ignoreDupMsg % 2 == 0)
                            {
                                GUIGraphicsContext.ResetCursor(false);
                            }
                            // we ignore double actions for the configured time
                            if (Environment.TickCount - _lastMouseTick < 400)
                            {
                                return(null);
                            }

                            MouseDirection mmove = OnMouseMoved(p);
                            _lastMouseTick = Environment.TickCount;
                            _ignoreDupMsg  = 0;

                            switch (mmove)
                            {
                            case MouseDirection.Up:
                                keycode = 38;
                                break;

                            case MouseDirection.Right:
                                keycode = 39;
                                break;

                            case MouseDirection.Down:
                                keycode = 40;
                                break;

                            case MouseDirection.Left:
                                keycode = 37;
                                break;
                            }
                            if (mmove != MouseDirection.None)
                            {
                                GUIGraphicsContext.ResetCursor(false);
                                if (_verboseLogging)
                                {
                                    Log.Debug("Centarea: Command \"{0}\" mapped for mouse movement", mmove.ToString());
                                }
                            }
                        }
                    }
                    // The Centarea Remote sends key combos. Therefore we use this trick to get a 1:1 mapping
                    if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
                    {
                        keycode += 1000;
                    }
                    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
                    {
                        keycode += 10000;
                    }
                    if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt)
                    {
                        keycode += 100000;
                    }

                    try
                    {
                        result = _inputHandler.GetMapping(keycode.ToString());
                        if (shouldRaiseAction)
                        {
                            // Get & execute Mapping
                            if (_inputHandler.MapAction(keycode))
                            {
                                if (_verboseLogging)
                                {
                                    Log.Debug("Centarea: Command \"{0}\" mapped", keycode);
                                }
                            }
                            else
                            {
                                if (keycode > 0)
                                {
                                    Log.Debug("Centarea: Command \"{0}\" not mapped", keycode);
                                }
                                return(null);
                            }
                        }
                    }
                    catch (ApplicationException ex)
                    {
                        Log.Error("CentAreaRemote:MapWndProcMessage: {0}", ex.Message);
                        return(null);
                    }
                    msg.Result = new IntPtr(1);
                    break;
                }
            }
            return(result);
        }