• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

luttje / Key2Joy / 6517266969

14 Oct 2023 11:05AM UTC coverage: 12.469% (+0.2%) from 12.308%
6517266969

push

github

web-flow
Implementing plugins for better separation (#39)

* Start implementing plugins for better separation
* massive refactor in attempt to split appdomains for plugins
* (breaks old mapping profiles)
* Fix error when switching from mouse button trigger to keyboard trigger and clicking in the combobox where the mouse button capture textbox is.
* Simplify code by removing legacy
* SImplify grouping actions
* Fix profile and add helpful opposite mapping generator tool
* Change solution hierarchy
* Restrict AppDomain plugins went from Zone.MyComputer -> .Internet
* create keypair in ci
* Install the .NET framework tools
* Run command in workflow
* Plugin permissions. Plugins disabled by default
* update readme (icon is no longer used)
* Plugin action runs in seperated process
* Remove unused dependencies.
* Fix action name display for mapping
* Fix Lua plugin script calls (NOTE: laggy when using MessageBox)
* convert project to sdk style
* Add editorconfig and start cleaning up
* Fix documentation. Update namespaces to match files (breaks profiles)
* Include all projects in tests, disable building docs on debug
* Add messagebox script action
* Add tests for pluginhost
* Remove administrator from window title test
* add some icons to ui
* Add enabling/disabling plugins
* Close plugins when Key2Joy shuts down
* Fix appcommand failing
* Fix plugin permission form crashing. Fix plugin load exception not showing warning
* Handle plugin host closing better when app has crashed
* Seperate host and client logic in remote event subscriber
* Ensure the PluginHost shuts down if the app crashes
* Better error output for plugins
* Fix cmd interop not working, add some tests
* also generate docs on plugins
* Fix build order with docs
* Fix enum script parameters and ensure actions share environment scopes
* Fix _wpftmp folders being created dotnet/wpf#2930
* Fix sequence action. Add disabled trigger/action for unloaded plugins on start... (continued)

180 of 1703 branches covered (0.0%)

Branch coverage included in aggregate %.

6419 of 6419 new or added lines in 207 files covered. (100.0%)

1035 of 8041 relevant lines covered (12.87%)

8445.05 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/Core/Key2Joy.Core/Interop/InteropServer.cs
1
using System;
2
using System.IO.Pipes;
3
using System.Runtime.InteropServices;
4
using Key2Joy.Mapping;
5

6
namespace Key2Joy.Interop;
7

8
internal class InteropServer : IDisposable
9
{
10
    public const string PIPE_NAME = "Key2JoyService";
11

12
    public static InteropServer Instance { get; } = new InteropServer();
×
13

14
    private NamedPipeServerStream pipeServer;
15

16
    private InteropServer()
×
17
    { }
×
18

19
    public void Dispose() => this.StopListening();
×
20

21
    public void RestartListening()
22
    {
×
23
        this.pipeServer?.Dispose();
×
24

25
        this.pipeServer = new NamedPipeServerStream(PIPE_NAME, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
×
26
        this.pipeServer.BeginWaitForConnection(this.OnClientConnected, this.pipeServer);
×
27
    }
×
28

29
    public void StopListening() => this.pipeServer.Dispose();
×
30

31
    private void HandleEnableCommand(EnableCommand command)
32
        => Key2JoyManager.Instance.CallOnUiThread(()
×
33
        =>
×
34
        {
×
35
            var profile = MappingProfile.Load(command.ProfilePath);
×
36
            Key2JoyManager.Instance.ArmMappings(profile);
×
37
        });
×
38

39
    private void HandleDisableCommand(DisableCommand command)
40
        => Key2JoyManager.Instance.CallOnUiThread(()
×
41
        =>
×
42
        {
×
43
            if (Key2JoyManager.Instance.GetIsArmed())
×
44
            {
×
45
                Key2JoyManager.Instance.DisarmMappings();
×
46
            }
×
47
        });
×
48

49
    private void OnClientConnected(IAsyncResult asyncResult)
50
    {
×
51
        var pipeServer = (NamedPipeServerStream)asyncResult.AsyncState;
×
52

53
        try
54
        {
×
55
            pipeServer.EndWaitForConnection(asyncResult);
×
56
        }
×
57
        catch (ObjectDisposedException)
×
58
        {
×
59
            // Ignore when pipe is closed
60
            return;
×
61
        }
62

63
        // Read the first byte and use it to get the type struct
64
        var commandId = (byte)pipeServer.ReadByte();
×
65
        var commandInfo = CommandRepository.Instance.GetCommandInfo(commandId);
×
66

67
        // Marshall the other bytes to the given struct
68
        var bytes = new byte[Marshal.SizeOf(commandInfo.StructType)];
×
69
        pipeServer.Read(bytes, 0, bytes.Length);
×
70
        var command = commandInfo.CommandFromBytes(bytes);
×
71

72
        switch (command)
×
73
        {
74
            case EnableCommand enableCommand:
75
                this.HandleEnableCommand(enableCommand);
×
76
                break;
×
77
            case DisableCommand disableCommand:
78
                this.HandleDisableCommand(disableCommand);
×
79
                break;
×
80
            default:
81
                break;
×
82
        }
83

84
        // Restore the connection for the next client
85
        this.RestartListening();
×
86
    }
×
87
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc