sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    OnKeyDown: getting the charcater value from key

    Scheduled Pinned Locked Moved Developers' Forum
    32 Posts 7 Posters 1.7k Views 7 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A Offline
      Anton_S
      last edited by

      @tt_su said:

      You're talking about ToAscii?
      I was looking at ToUnicode.

      Yes, the ToUnicode and ToAscii both return same formatted Ruby strings, but on the actual approach they don't. When I initially created a buffer char = 0.chr*2 it was already formatted in US-ASCII. The ToUnicodeand ToAscii simply fills the the specified buffer with ascii/unicode characters without changing the format of the Ruby string.

      Changing char = 0.chr*2 to char= ' ' will initially create a UTF-8 formatted string, rather than the US-ASCII. The format remains unchanged when the ToUnicode/ToAscii functions fills the char string.

      @tt_su said:

      I'd be careful with force_encoding...

      For some reason force_encoding even managed to crash SketchUp at some points when testing key_test.

      1 Reply Last reply Reply Quote 0
      • Dan RathbunD Offline
        Dan Rathbun
        last edited by

        Ya'all need to be careful where testing string encoding, until MR1 comes out.
        The correct default encoding is not properly set in MR0.

        I'm not here much anymore.

        1 Reply Last reply Reply Quote 0
        • D Offline
          driven
          last edited by

          @dan rathbun said:

          The correct default encoding is not properly set in MR0.

          if anyones prepared to admit it...

          the other issue is why these things are so difficult on a mac...

          apple doesn't support key logging and goes out of it's way to prevent it occurring...

          apple does allow it IF it's for assistive devices to aid those with disabilities...

          if you want to use 'assistive devices api' to do ordinary tasks, you need to connivence the 'admin' user to turn it on.

          mac folk are reluctant to do this as it's system wide, and would enable malicious 'key loggers' to, key-log...

          john

          learn from the mistakes of others, you may not live long enough to make them all yourself...

          1 Reply Last reply Reply Quote 0
          • Dan RathbunD Offline
            Dan Rathbun
            last edited by

            Err.. found a Ruby Core bug.
            Even after setting Encoding::default_internal="UTF-8"
            the Integer#chr() method does not return a string in the default internal encoding.

            .. however there is a workaround. Ruby 2.0's Integer#chr() method now takes an encoding argument, so, this:
            char = 0.chr(Encoding::default_internal)*2
            or this:
            char = 0.chr("UTF-8")*2
            WILL work.

            I'm not here much anymore.

            1 Reply Last reply Reply Quote 0
            • A Offline
              Anton_S
              last edited by

              @dan rathbun said:

              char = 0.chr("UTF-8")*2

              Nice find Dan 👍 I re-edited the Ruby code above.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                @anton_s said:

                @dan rathbun said:

                char = 0.chr("UTF-8")*2

                Nice find Dan 👍 I re-edited the Ruby code above.

                But you did not enclosed the encoding nickname string in quotes. That'll raise a NameError exception ("uninitialized constant UTF".)

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • A Offline
                  Anton_S
                  last edited by

                  Okay, I figured a way to get key via the Windows API. The code below will give you the key code of the exact character that your pressing. For instance,

                  • Pressing 1 yields 1; Pressing Shift-1 returns !.
                  • Pressing w yields w; Pressing Shift-w returns W.

                  I guess it should work properly on the Français keyboard as well. Test it out.

                  require 'Win32API'
                  
                  class KeyTest
                  
                    GetKeyboardState = Win32API.new('User32', 'GetKeyboardState', 'P', 'L')
                    ToAscii          = Win32API.new('User32', 'ToAscii', 'LLPPL', 'L')
                    ToUnicode        = Win32API.new('User32', 'ToUnicode', 'LLPPLL', 'L')
                  
                    def onKeyDown(key, repeat, flags, view)
                      buffer = 0.chr*256
                      char = 0.chr('UTF-8')*2 # maintain UTF-8 encoding
                      GetKeyboardState.call(buffer)
                      res = ToUnicode.call(key, repeat, buffer, char, char.size, 0)
                      #res = ToAscii.call(key, repeat, buffer, char, 0)
                      return if res == 0
                      char.strip!
                      p char
                      # process
                    end
                  
                  end
                  
                  unless file_loaded?(__FILE__)
                    UI.menu('Plugins').add_item('Key Test'){
                      Sketchup.active_model.select_tool(KeyTest.new)
                    }
                  end
                  
                  
                  

                  You need Win32API.so for SU2013 and below though.


                  Place in the Plugins folder. Access: Plugins > Key Test

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    Anton_S
                    last edited by

                    @dan rathbun said:

                    . That'll raise a NameError exception ("uninitialized constant UTF".)

                    Oh 😆 Fixed

                    1 Reply Last reply Reply Quote 0
                    • tt_suT Offline
                      tt_su
                      last edited by

                      @dan rathbun said:

                      Err.. found a Ruby Core bug.
                      Even after setting Encoding::default_internal="UTF-8"
                      the Integer#chr() method does not return a string in the default internal encoding.

                      sigh "Unicode support" grumble kicks Ruby on the shin

                      1 Reply Last reply Reply Quote 0
                      • Dan RathbunD Offline
                        Dan Rathbun
                        last edited by

                        Yea did you look at the C code by clicking the method in the CHM ?
                        It has a kind of convoluted switch statement.

                        I'm not here much anymore.

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 1 / 2
                        • First post
                          Last post
                        Buy SketchPlus
                        Buy SUbD
                        Buy WrapR
                        Buy eBook
                        Buy Modelur
                        Buy Vertex Tools
                        Buy SketchCuisine
                        Buy FormFonts

                        Advertisement