xdrp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -0
- data/lib/xdrp.rb +221 -0
- metadata +131 -0
- metadata.gz.sig +0 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 7a6300209a76178b4bffc1b5d3f319597aa206351e89a87b78bba23e41600a14
         | 
| 4 | 
            +
              data.tar.gz: 8796a1037a75704e0dbd4741a1b33c27e54047c2817818be60e0160eb490f830
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: a758de2052e2302be9506e381aa3fe48d3f26d2853efe8c3bcc64259e2f7ab368851f3b15ef347db0f21092e1a0f696507bff748d63391671ca6f854524f8639
         | 
| 7 | 
            +
              data.tar.gz: 2b8e0d980c43f507ed25815aaafd22a13da09fd71d6bd5310defcf8c298fd8c514f5091112bff0a02a8fc1e18066e507fc9a8e92732afbc6f373a2118380ff09
         | 
    
        checksums.yaml.gz.sig
    ADDED
    
    | Binary file | 
    
        data.tar.gz.sig
    ADDED
    
    | @@ -0,0 +1,3 @@ | |
| 1 | 
            +
            "��e����i+t��_=�!�4���Ӝ�Y��|K*t��<�@��� ^�qA,��2%�ގ�;6ϰ4����J��dmW#���n[8z��O��0^�s���,��ܷ���(��cƫ�(w�����u(.l�}sɽwd�5��{�����m_��%���
         | 
| 2 | 
            +
            � �mq�_&'��Y�$���U ��K����%=���J���E�Y�9^s��W�Z3��_��(��+;�A����F������oG�Mq��aC�"��w�M�zJ
         | 
| 3 | 
            +
            �bxz���Z��N�>����j���1������u$���shz��Hen!5c��xy��9�cPx�����hQԃ�Έ�e~��C
         | 
    
        data/lib/xdrp.rb
    ADDED
    
    | @@ -0,0 +1,221 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # file: xdrp.rb
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # description: A basic macro recorder for GNU/Linux which uses 
         | 
| 6 | 
            +
            #              program xinput to capture input events.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            require 'rxfhelper'
         | 
| 9 | 
            +
            require "xdo/mouse"
         | 
| 10 | 
            +
            require "xdo/xwindow"
         | 
| 11 | 
            +
            require "xdo/keyboard"
         | 
| 12 | 
            +
            require 'xinput_wrapper'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            MOUSE = 1
         | 
| 16 | 
            +
            KEYBOARD = 2
         | 
| 17 | 
            +
            KEYBOARD_MOUSE = 3
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
            module Xdrp
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              class Recorder
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                attr_reader :xml
         | 
| 25 | 
            +
                
         | 
| 26 | 
            +
                # level:
         | 
| 27 | 
            +
                #    1 = mouse
         | 
| 28 | 
            +
                #    2 = keyboard
         | 
| 29 | 
            +
                #    3 = keyboard + mouse
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def initialize(levelx=KEYBOARD_MOUSE, level: levelx, debug: false)
         | 
| 32 | 
            +
                  
         | 
| 33 | 
            +
                  @xiw = XInputWrapper.new(verbose: true, debug: debug, callback: self)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  @mouse, @keyboard = false, false
         | 
| 36 | 
            +
                  
         | 
| 37 | 
            +
                  case level
         | 
| 38 | 
            +
                  when 1
         | 
| 39 | 
            +
                    @mouse = true
         | 
| 40 | 
            +
                  when 2
         | 
| 41 | 
            +
                    @keyboard = true
         | 
| 42 | 
            +
                  when 3
         | 
| 43 | 
            +
                    @mouse, @keyboard = true, true
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def on_keypress(key, keycode, modifier=nil)      
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  if @debug then
         | 
| 50 | 
            +
                    puts 'key: ' + key.inspect
         | 
| 51 | 
            +
                    puts 'keycode: ' + keycode.inspect
         | 
| 52 | 
            +
                    puts 'modifier: ' + modifier.inspect
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  stop() if modifier and modifier[0] == :alt and key == :z
         | 
| 56 | 
            +
                  
         | 
| 57 | 
            +
                  return unless @keyboard      
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  add_sleep() if Time.now > (@t1 + 2)
         | 
| 60 | 
            +
                  
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  if @a.length >= 1 and @a[-1][0] == :type then
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    if modifier.nil? or (modifier and modifier.empty?) then
         | 
| 65 | 
            +
                      @a[-1][2] += key.to_s
         | 
| 66 | 
            +
                    else
         | 
| 67 | 
            +
                      @a << [modifier.first, {key: key}] if modifier.length < 2  
         | 
| 68 | 
            +
                    end
         | 
| 69 | 
            +
                    
         | 
| 70 | 
            +
                    @a.last.last.gsub('{space}',' ')
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  else
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    a = case key.to_s[/^\{(\w+)\}$/,1]
         | 
| 75 | 
            +
                    when 'enter'
         | 
| 76 | 
            +
                      [:enter]
         | 
| 77 | 
            +
                    when 'tab'
         | 
| 78 | 
            +
                      [:tab]
         | 
| 79 | 
            +
                    else
         | 
| 80 | 
            +
                      [:type, {}, key.to_s]
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    @a << a
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                def on_mousedown(button, x, y)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  return unless @mouse
         | 
| 92 | 
            +
                  
         | 
| 93 | 
            +
                  puts "mouse %s button down at %s, %s" % [button, x, y] if @debug
         | 
| 94 | 
            +
                  add_sleep() if Time.now > (@t1 + 2)
         | 
| 95 | 
            +
                  @a << [:mouse, {click: button, x: x, y: y}]
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                def on_mouseup(button, x, y)
         | 
| 100 | 
            +
                  
         | 
| 101 | 
            +
                  return unless @mouse
         | 
| 102 | 
            +
                  
         | 
| 103 | 
            +
                  puts "mouse %s button up at %s, %s" % [button, x, y] if @debug
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                def on_mousemove(x, y)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  return unless @mouse
         | 
| 109 | 
            +
                  
         | 
| 110 | 
            +
                  puts 'mouse is moving at ' + x.to_s + ' y ' + y.to_s if @debug
         | 
| 111 | 
            +
                  add_sleep() if Time.now > (@t1 + 2)
         | 
| 112 | 
            +
                  @a << [:mousemove, {x: x, y: y}]
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                def on_mouse_scrolldown()
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                  return unless @mouse
         | 
| 119 | 
            +
                  
         | 
| 120 | 
            +
                  puts 'mouse is scrolling down' if @debug
         | 
| 121 | 
            +
                  add_sleep() if Time.now > (@t1 + 2)
         | 
| 122 | 
            +
                  @a << [:mousewheel, {scroll: 'down'}]
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                def on_mouse_scrollup()
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  return unless @mouse
         | 
| 129 | 
            +
                  
         | 
| 130 | 
            +
                  puts 'mouse is scrolling up ' if @debug
         | 
| 131 | 
            +
                  add_sleep() if Time.now > (@t1 + 2)
         | 
| 132 | 
            +
                  @a << [:mousewheel, {scroll: 'up'}]
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
                
         | 
| 136 | 
            +
                def save(filepath)
         | 
| 137 | 
            +
                  File.write filepath, xml()
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                def start()
         | 
| 141 | 
            +
                  
         | 
| 142 | 
            +
                  @a = []
         | 
| 143 | 
            +
                  Thread.new { @xiw.listen }
         | 
| 144 | 
            +
                  puts 'recording ...'
         | 
| 145 | 
            +
                  @t1 = Time.now
         | 
| 146 | 
            +
                  
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                def stop()
         | 
| 150 | 
            +
                  
         | 
| 151 | 
            +
                  @xiw.stop = true
         | 
| 152 | 
            +
                  @doc = Rexle.new(['xdrp', {}, '', *@a])
         | 
| 153 | 
            +
                  puts 'recording stopped'
         | 
| 154 | 
            +
                  
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                def xml()
         | 
| 158 | 
            +
                  @doc.xml(pretty: true)
         | 
| 159 | 
            +
                end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                private
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                def add_sleep()
         | 
| 164 | 
            +
                  @a << [:sleep, {duration: (Time.now - @t1).round}]
         | 
| 165 | 
            +
                  @t1 = Time.now
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
              end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
              class Player
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                def initialize(src, debug: false)
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                  @debug = debug
         | 
| 175 | 
            +
                  @doc = Rexle.new(RXFHelper.read(src).first)
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                def play()
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                  @doc.root.elements.each do |e|
         | 
| 182 | 
            +
                    puts 'e: ' + e.xml.inspect if @debug
         | 
| 183 | 
            +
                    method('xdo_' + e.name.to_s).call(e.text || e.attributes)
         | 
| 184 | 
            +
                  end
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                private
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                def xdo_enter(h={})
         | 
| 191 | 
            +
                  XDo::Keyboard.return
         | 
| 192 | 
            +
                end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                def xdo_mouse(click: 'left', x: 0, y: 0)
         | 
| 195 | 
            +
                  XDo::Mouse.click(x.to_i, y.to_i, 
         | 
| 196 | 
            +
                                   Object.const_get('XDo::Mouse::' + click.upcase))
         | 
| 197 | 
            +
                end
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                def xdo_mousemove(x: 0, y: 0)
         | 
| 200 | 
            +
                  XDo::Mouse.move(x.to_i, y.to_i)
         | 
| 201 | 
            +
                end
         | 
| 202 | 
            +
                                  
         | 
| 203 | 
            +
                def xdo_mousewheel(scroll: 'down')
         | 
| 204 | 
            +
                  XDo::Mouse.wheel(Object.const_get('XDo::Mouse::' + scroll.upcase, 4))
         | 
| 205 | 
            +
                end                      
         | 
| 206 | 
            +
             | 
| 207 | 
            +
                def xdo_sleep(duration: 0)
         | 
| 208 | 
            +
                  sleep duration.to_f
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                def xdo_tab(h={})
         | 
| 212 | 
            +
                  XDo::Keyboard.tab
         | 
| 213 | 
            +
                end
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                def xdo_type(s)
         | 
| 216 | 
            +
                  XDo::Keyboard.simulate(s.gsub('{enter}', "\n"))
         | 
| 217 | 
            +
                end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
              end
         | 
| 220 | 
            +
             | 
| 221 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,131 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: xdrp
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - James Robertson
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain:
         | 
| 11 | 
            +
            - |
         | 
| 12 | 
            +
              -----BEGIN CERTIFICATE-----
         | 
| 13 | 
            +
              MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
         | 
| 14 | 
            +
              YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwODA0MTkxNzIzWhcN
         | 
| 15 | 
            +
              MjEwODA0MTkxNzIzWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
         | 
| 16 | 
            +
              cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC+0Nf7
         | 
| 17 | 
            +
              3r8/tK7O+C/D9z6Q8Dg8eMFjyC5LJIe1zsGoX3HaT7G6GHFlavar3XZ0UcEBOvdv
         | 
| 18 | 
            +
              khojT/S2viTGUURzB3mQIVQnf2O9JDs9qXroyX6npMymN5XN4OlMiiriOdiFB9kk
         | 
| 19 | 
            +
              y0L8S0Y+MUh0VOg5hN9vP9i2MrKIZKN3YD7G0eGku//a+nNYe3Q1Vq3+6fS4yvai
         | 
| 20 | 
            +
              /N7GW8EmaldaOc7PpoehOKjMnLrWIwpcYKG+D24HIsXZP2+58a3xlIsk0fCcf7IO
         | 
| 21 | 
            +
              a4uCOj2WbjlfGSJoLWFU7szqW/h1nnP8GGaFJTPLjC9mDaGlS+7LGrKEFl+cfhFE
         | 
| 22 | 
            +
              FBI0ZpvWKuaf9IZaEYac8pKJPuzp3LsLAoK2HnhGln6w9dn82F2dFrFhewqPBOjZ
         | 
| 23 | 
            +
              CWxhShTFYxBc2yo3H6oNvETRPO5/qNZblmeHUW24tWsZOsjABLJCBB0iJS61XaQm
         | 
| 24 | 
            +
              n2zJqynV9y4u5/iHKN2+OZAXzG83d62MxU9SHiGP72H+XlPt5momLWQGH8UCAwEA
         | 
| 25 | 
            +
              AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU6LzsKZ6w
         | 
| 26 | 
            +
              GuZSIK6Opg6mWh9mB10wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
         | 
| 27 | 
            +
              c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
         | 
| 28 | 
            +
              BgkqhkiG9w0BAQsFAAOCAYEAQQTOyG+mZBVdTXl9XhdBoBOP0JNOwjdav2OGDTsb
         | 
| 29 | 
            +
              TGJexyhF4LMMoYZMX0gZOoJ0EfLwE/gJwPg8lc6kNla4KMXNfO881+LV4UKXpgB7
         | 
| 30 | 
            +
              xIWLeYkM/yVOW01XgyoKcag9XI9hJxTCzY0ihbYaUI3CNSf0GQKQiV+DOgm2KLBP
         | 
| 31 | 
            +
              4Q11hrXke22CfLH/cqEmjlaUDBYInOLYqCTLf08ssgFTd3+DLFpWhAzjBdksIQdA
         | 
| 32 | 
            +
              MenyNICp3O9LfpXRSL4m8tF3d42IV0KxLtRHzO72YHyOCQJPWJ5nHXME9zFdYHyi
         | 
| 33 | 
            +
              P8eBkrKjbJ1wPQnSXMhuxYnwUnKPImDUfwfJFx/xNXVAY9Y8F2T+HajpD6Tm+K9V
         | 
| 34 | 
            +
              uYADR2lL52Rgbgbe3PCZ/oKTW1SjUgaC4MECdc3okdkxFWtysc0L+muLcjVFzUED
         | 
| 35 | 
            +
              Cqn27EoN8MQ4Dix2yFfGGMZBeer8GVOTtrIixZnGr7bSWglZWNDDy/x2ZTBU0jYB
         | 
| 36 | 
            +
              V66loB9HaeHxmtMl4Ylv2wvn
         | 
| 37 | 
            +
              -----END CERTIFICATE-----
         | 
| 38 | 
            +
            date: 2020-08-04 00:00:00.000000000 Z
         | 
| 39 | 
            +
            dependencies:
         | 
| 40 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 41 | 
            +
              name: xdo
         | 
| 42 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 43 | 
            +
                requirements:
         | 
| 44 | 
            +
                - - "~>"
         | 
| 45 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            +
                    version: '0.0'
         | 
| 47 | 
            +
                - - ">="
         | 
| 48 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 49 | 
            +
                    version: 0.0.4
         | 
| 50 | 
            +
              type: :runtime
         | 
| 51 | 
            +
              prerelease: false
         | 
| 52 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 53 | 
            +
                requirements:
         | 
| 54 | 
            +
                - - "~>"
         | 
| 55 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 56 | 
            +
                    version: '0.0'
         | 
| 57 | 
            +
                - - ">="
         | 
| 58 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 59 | 
            +
                    version: 0.0.4
         | 
| 60 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 61 | 
            +
              name: rxfhelper
         | 
| 62 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 63 | 
            +
                requirements:
         | 
| 64 | 
            +
                - - ">="
         | 
| 65 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 66 | 
            +
                    version: 1.0.0
         | 
| 67 | 
            +
                - - "~>"
         | 
| 68 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 69 | 
            +
                    version: '1.0'
         | 
| 70 | 
            +
              type: :runtime
         | 
| 71 | 
            +
              prerelease: false
         | 
| 72 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 73 | 
            +
                requirements:
         | 
| 74 | 
            +
                - - ">="
         | 
| 75 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 76 | 
            +
                    version: 1.0.0
         | 
| 77 | 
            +
                - - "~>"
         | 
| 78 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 79 | 
            +
                    version: '1.0'
         | 
| 80 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 81 | 
            +
              name: xinput_wrapper
         | 
| 82 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 83 | 
            +
                requirements:
         | 
| 84 | 
            +
                - - ">="
         | 
| 85 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 86 | 
            +
                    version: 0.7.0
         | 
| 87 | 
            +
                - - "~>"
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0.7'
         | 
| 90 | 
            +
              type: :runtime
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - ">="
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: 0.7.0
         | 
| 97 | 
            +
                - - "~>"
         | 
| 98 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 99 | 
            +
                    version: '0.7'
         | 
| 100 | 
            +
            description: 
         | 
| 101 | 
            +
            email: james@jamesrobertson.eu
         | 
| 102 | 
            +
            executables: []
         | 
| 103 | 
            +
            extensions: []
         | 
| 104 | 
            +
            extra_rdoc_files: []
         | 
| 105 | 
            +
            files:
         | 
| 106 | 
            +
            - lib/xdrp.rb
         | 
| 107 | 
            +
            homepage: https://github.com/jrobertson/xdrp
         | 
| 108 | 
            +
            licenses:
         | 
| 109 | 
            +
            - MIT
         | 
| 110 | 
            +
            metadata: {}
         | 
| 111 | 
            +
            post_install_message: 
         | 
| 112 | 
            +
            rdoc_options: []
         | 
| 113 | 
            +
            require_paths:
         | 
| 114 | 
            +
            - lib
         | 
| 115 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 116 | 
            +
              requirements:
         | 
| 117 | 
            +
              - - ">="
         | 
| 118 | 
            +
                - !ruby/object:Gem::Version
         | 
| 119 | 
            +
                  version: '0'
         | 
| 120 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 121 | 
            +
              requirements:
         | 
| 122 | 
            +
              - - ">="
         | 
| 123 | 
            +
                - !ruby/object:Gem::Version
         | 
| 124 | 
            +
                  version: '0'
         | 
| 125 | 
            +
            requirements: []
         | 
| 126 | 
            +
            rubygems_version: 3.0.3
         | 
| 127 | 
            +
            signing_key: 
         | 
| 128 | 
            +
            specification_version: 4
         | 
| 129 | 
            +
            summary: A basic macro recorder for GNU/Linux which uses program xinput to capture
         | 
| 130 | 
            +
              input events.
         | 
| 131 | 
            +
            test_files: []
         | 
    
        metadata.gz.sig
    ADDED
    
    | Binary file |