Advertisement
Ancurio

win32_wrap.rb

Oct 14th, 2014
1,118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 11.50 KB | None | 0 0
  1.  
  2. module Scancodes
  3.     SDL = { :UNKNOWN => 0x00,
  4.         :A => 0x04, :B => 0x05, :C => 0x06, :D => 0x07,
  5.         :E => 0x08, :F => 0x09, :G => 0x0A, :H => 0x0B,
  6.         :I => 0x0C, :J => 0x0D, :K => 0x0E, :L => 0x0F,
  7.         :M => 0x10, :N => 0x11, :O => 0x12, :P => 0x13,
  8.         :Q => 0x14, :R => 0x15, :S => 0x16, :T => 0x17,
  9.         :U => 0x18, :V => 0x19, :W => 0x1A, :X => 0x1B,
  10.         :Y => 0x1C, :Z => 0x1D, :N1 => 0x1E, :N2 => 0x1F,
  11.         :N3 => 0x20, :N4 => 0x21, :N5 => 0x22, :N6 => 0x23,
  12.         :N7 => 0x24, :N8 => 0x25, :N9 => 0x26, :N0 => 0x27,
  13.         :RETURN => 0x28, :ESCAPE => 0x29, :BACKSPACE => 0x2A, :TAB => 0x2B,
  14.         :SPACE => 0x2C, :MINUS => 0x2D, :EQUALS => 0x2E, :LEFTBRACKET => 0x2F,
  15.         :RIGHTBRACKET => 0x30, :BACKSLASH => 0x31, :NONUSHASH => 0x32, :SEMICOLON => 0x33,
  16.         :APOSTROPHE => 0x34, :GRAVE => 0x35, :COMMA => 0x36, :PERIOD => 0x37,
  17.         :SLASH => 0x38, :CAPSLOCK => 0x39, :F1 => 0x3A, :F2 => 0x3B,
  18.         :F3 => 0x3C, :F4 => 0x3D, :F5 => 0x3E, :F6 => 0x3F,
  19.         :F7 => 0x40, :F8 => 0x41, :F9 => 0x42, :F10 => 0x43,
  20.         :F11 => 0x44, :F12 => 0x45, :PRINTSCREEN => 0x46, :SCROLLLOCK => 0x47,
  21.         :PAUSE => 0x48, :INSERT => 0x49, :HOME => 0x4A, :PAGEUP => 0x4B,
  22.         :DELETE => 0x4C, :END => 0x4D, :PAGEDOWN => 0x4E, :RIGHT => 0x4F,
  23.         :LEFT => 0x50, :DOWN => 0x51, :UP => 0x52, :NUMLOCKCLEAR => 0x53,
  24.         :KP_DIVIDE => 0x54, :KP_MULTIPLY => 0x55, :KP_MINUS => 0x56, :KP_PLUS => 0x57,
  25.         :KP_ENTER => 0x58, :KP_1 => 0x59, :KP_2 => 0x5A, :KP_3 => 0x5B,
  26.         :KP_4 => 0x5C, :KP_5 => 0x5D, :KP_6 => 0x5E, :KP_7 => 0x5F,
  27.         :KP_8 => 0x60, :KP_9 => 0x61, :KP_0 => 0x62, :KP_PERIOD => 0x63,
  28.         :NONUSBACKSLASH => 0x64, :APPLICATION => 0x65, :POWER => 0x66, :KP_EQUALS => 0x67,
  29.         :F13 => 0x68, :F14 => 0x69, :F15 => 0x6A, :F16 => 0x6B,
  30.         :F17 => 0x6C, :F18 => 0x6D, :F19 => 0x6E, :F20 => 0x6F,
  31.         :F21 => 0x70, :F22 => 0x71, :F23 => 0x72, :F24 => 0x73,
  32.         :EXECUTE => 0x74, :HELP => 0x75, :MENU => 0x76, :SELECT => 0x77,
  33.         :STOP => 0x78, :AGAIN => 0x79, :UNDO => 0x7A, :CUT => 0x7B,
  34.         :COPY => 0x7C, :PASTE => 0x7D, :FIND => 0x7E, :MUTE => 0x7F,
  35.         :VOLUMEUP => 0x80, :VOLUMEDOWN => 0x81, :LOCKINGCAPSLOCK => 0x82, :LOCKINGNUMLOCK => 0x83,
  36.         :LOCKINGSCROLLLOCK => 0x84, :KP_COMMA => 0x85, :KP_EQUALSAS400 => 0x86, :INTERNATIONAL1 => 0x87,
  37.         :INTERNATIONAL2 => 0x88, :INTERNATIONAL3 => 0x89, :INTERNATIONAL4 => 0x8A, :INTERNATIONAL5 => 0x8B,
  38.         :INTERNATIONAL6 => 0x8C, :INTERNATIONAL7 => 0x8D, :INTERNATIONAL8 => 0x8E, :INTERNATIONAL9 => 0x8F,
  39.         :LANG1 => 0x90, :LANG2 => 0x91, :LANG3 => 0x92, :LANG4 => 0x93,
  40.         :LANG5 => 0x94, :LANG6 => 0x95, :LANG7 => 0x96, :LANG8 => 0x97,
  41.         :LANG9 => 0x98, :ALTERASE => 0x99, :SYSREQ => 0x9A, :CANCEL => 0x9B,
  42.         :CLEAR => 0x9C, :PRIOR => 0x9D, :RETURN2 => 0x9E, :SEPARATOR => 0x9F,
  43.         :OUT => 0xA0, :OPER => 0xA1, :CLEARAGAIN => 0xA2, :CRSEL => 0xA3,
  44.         :EXSEL => 0xA4, :KP_00 => 0xB0, :KP_000 => 0xB1, :THOUSANDSSEPARATOR => 0xB2,
  45.         :DECIMALSEPARATOR => 0xB3, :CURRENCYUNIT => 0xB4, :CURRENCYSUBUNIT => 0xB5, :KP_LEFTPAREN => 0xB6,
  46.         :KP_RIGHTPAREN => 0xB7, :KP_LEFTBRACE => 0xB8, :KP_RIGHTBRACE => 0xB9, :KP_TAB => 0xBA,
  47.         :KP_BACKSPACE => 0xBB, :KP_A => 0xBC, :KP_B => 0xBD, :KP_C => 0xBE,
  48.         :KP_D => 0xBF, :KP_E => 0xC0, :KP_F => 0xC1, :KP_XOR => 0xC2,
  49.         :KP_POWER => 0xC3, :KP_PERCENT => 0xC4, :KP_LESS => 0xC5, :KP_GREATER => 0xC6,
  50.         :KP_AMPERSAND => 0xC7, :KP_DBLAMPERSAND => 0xC8, :KP_VERTICALBAR => 0xC9, :KP_DBLVERTICALBAR => 0xCA,
  51.         :KP_COLON => 0xCB, :KP_HASH => 0xCC, :KP_SPACE => 0xCD, :KP_AT => 0xCE,
  52.         :KP_EXCLAM => 0xCF, :KP_MEMSTORE => 0xD0, :KP_MEMRECALL => 0xD1, :KP_MEMCLEAR => 0xD2,
  53.         :KP_MEMADD => 0xD3, :KP_MEMSUBTRACT => 0xD4, :KP_MEMMULTIPLY => 0xD5, :KP_MEMDIVIDE => 0xD6,
  54.         :KP_PLUSMINUS => 0xD7, :KP_CLEAR => 0xD8, :KP_CLEARENTRY => 0xD9, :KP_BINARY => 0xDA,
  55.         :KP_OCTAL => 0xDB, :KP_DECIMAL => 0xDC, :KP_HEXADECIMAL => 0xDD, :LCTRL => 0xE0,
  56.         :LSHIFT => 0xE1, :LALT => 0xE2, :LGUI => 0xE3, :RCTRL => 0xE4,
  57.         :RSHIFT => 0xE5, :RALT => 0xE6, :RGUI => 0xE7, :MODE => 0x101,
  58.         :AUDIONEXT => 0x102, :AUDIOPREV => 0x103, :AUDIOSTOP => 0x104, :AUDIOPLAY => 0x105,
  59.         :AUDIOMUTE => 0x106, :MEDIASELECT => 0x107, :WWW => 0x108, :MAIL => 0x109,
  60.         :CALCULATOR => 0x10A, :COMPUTER => 0x10B, :AC_SEARCH => 0x10C, :AC_HOME => 0x10D,
  61.         :AC_BACK => 0x10E, :AC_FORWARD => 0x10F, :AC_STOP => 0x110, :AC_REFRESH => 0x111,
  62.         :AC_BOOKMARKS => 0x112, :BRIGHTNESSDOWN => 0x113, :BRIGHTNESSUP => 0x114, :DISPLAYSWITCH => 0x115,
  63.         :KBDILLUMTOGGLE => 0x116, :KBDILLUMDOWN => 0x117, :KBDILLUMUP => 0x118, :EJECT => 0x119,
  64.         :SLEEP => 0x11A, :APP1 => 0x11B, :APP2 => 0x11C
  65.     }
  66.  
  67.     SDL.default = SDL[:UNKNOWN]
  68.  
  69.     WIN32 = {
  70.         :LBUTTON => 0x01, :RBUTTON => 0x02, :MBUTTON => 0x04,
  71.  
  72.         :BACK => 0x08, :TAB => 0x09, :RETURN => 0x0D, :SHIFT => 0x10,
  73.         :CONTROL => 0x11, :MENU => 0x12, :PAUSE => 0x13, :CAPITAL => 0x14,
  74.         :ESCAPE => 0x1B, :SPACE => 0x20, :PRIOR => 0x21, :NEXT => 0x22,
  75.         :END => 0x23, :HOME => 0x24, :LEFT => 0x25, :UP => 0x26,
  76.         :RIGHT => 0x27, :DOWN => 0x28, :PRINT => 0x2A, :INSERT => 0x2D,
  77.         :DELETE => 0x2E,
  78.  
  79.         :N0 => 0x30, :N1 => 0x31, :N2 => 0x32, :N3 => 0x33,
  80.         :N4 => 0x34, :N5 => 0x35, :N6 => 0x36, :N7 => 0x37, :N8 => 0x38,
  81.         :N9 => 0x39,
  82.  
  83.         :A => 0x41, :B => 0x42, :C => 0x43, :D => 0x44, :E => 0x45, :F => 0x46,
  84.         :G => 0x47, :H => 0x48, :I => 0x49, :J => 0x4A, :K => 0x4B, :L => 0x4C,
  85.         :M => 0x4D, :N => 0x4E, :O => 0x4F, :P => 0x50, :Q => 0x51, :R => 0x52,
  86.         :S => 0x53, :T => 0x54, :U => 0x55, :V => 0x56, :W => 0x57, :X => 0x58,
  87.         :Y => 0x59, :Z => 0x5A,
  88.  
  89.         :LWIN => 0x5B, :RWIN => 0x5C,
  90.  
  91.         :NUMPAD0 => 0x60, :NUMPAD1 => 0x61, :NUMPAD2 => 0x62, :NUMPAD3 => 0x63,
  92.         :NUMPAD4 => 0x64, :NUMPAD5 => 0x65, :NUMPAD6 => 0x66, :NUMPAD7 => 0x67,
  93.         :NUMPAD8 => 0x68, :NUMPAD9 => 0x69,
  94.         :MULTIPLY => 0x6A, :ADD => 0x6B, :SEPARATOR => 0x6C, :SUBSTRACT => 0x6D,
  95.         :DECIMAL => 0x6E, :DIVIDE => 0x6F,
  96.  
  97.         :F1 => 0x70, :F2 => 0x71, :F3 => 0x72, :F4 => 0x73,
  98.         :F5 => 0x74, :F6 => 0x75, :F7 => 0x76, :F8 => 0x77,
  99.         :F9 => 0x78, :F10 => 0x79, :F11 => 0x7A, :F12 => 0x7B,
  100.         :F13 => 0x7C, :F14 => 0x7D, :F15 => 0x7E, :F16 => 0x7F,
  101.         :F17 => 0x80, :F18 => 0x81, :F19 => 0x82, :F20 => 0x83,
  102.         :F21 => 0x84, :F22 => 0x85, :F23 => 0x86, :F24 => 0x87,
  103.  
  104.         :NUMLOCK => 0x90, :SCROLL => 0x91,
  105.         :LSHIFT => 0xA0, :RSHIFT => 0xA1, :LCONTROL => 0xA2, :RCONTROL => 0xA3,
  106.         :LMENU => 0xA4, :RMENU => 0xA5, :OEM_1 => 0xBA,
  107.         :OEM_PLUS => 0xBB, :OEM_COMMA => 0xBC, :OEM_MINUS => 0xBD, :OEM_PERIOD => 0xBE,
  108.         :OEM_2 => 0xBF, :OEM_3 => 0xC0, :OEM_4 => 0xDB, :OEM_5 => 0xDC,
  109.         :OEM_6 => 0xDD, :OEM_7 => 0xDE
  110.     }
  111.  
  112.     WIN32INV = WIN32.invert
  113.  
  114.     WIN2SDL = {
  115.         :BACK => :BACKSPACE,
  116.         :CAPITAL => :CAPSLOCK,
  117.         :PRIOR => :PAGEUP, :NEXT => :PAGEDOWN,
  118.         :PRINT => :PRINTSCREEN,
  119.  
  120.         :LWIN => :LGUI, :RWIN => :RGUI,
  121.  
  122.         :NUMPAD0 => :KP_0, :NUMPAD1 => :KP_1, :NUMPAD2 => :KP_2, :NUMPAD3 => :KP_3,
  123.         :NUMPAD4 => :KP_4, :NUMPAD5 => :KP_5, :NUMPAD6 => :KP_6, :NUMPAD7 => :KP_7,
  124.         :NUMPAD8 => :KP_8, :NUMPAD9 => :KP_9,
  125.         :MULTIPLY => :KP_MULTIPLY, :ADD => :KP_PLUS, :SUBSTRACT => :KP_MINUS,
  126.         :DECIMAL => :KP_DECIMAL, :DIVIDE => :KP_DIVIDE,
  127.  
  128.         :NUMLOCK => :NUMLOCKCLEAR, :SCROLL => :SCROLLLOCK,
  129.         :LCONTROL => :LCTRL, :RCONTROL => :RCTRL,
  130.         # FIXME: Fill these out
  131.         :LMENU => :LALT, :RMENU => :RALT, :OEM_1 => :SEMICOLON,
  132.         :OEM_PLUS => :UNKNOWN, :OEM_COMMA => :UNKNOWN, :OEM_MINUS => :UNKNOWN, :OEM_PERIOD => :UNKNOWN,
  133.         :OEM_2 => :UNKNOWN, :OEM_3 => :UNKNOWN, :OEM_4 => :UNKNOWN, :OEM_5 => :UNKNOWN,
  134.         :OEM_6 => :UNKNOWN, :OEM_7 => :UNKNOWN
  135.     }
  136.  
  137.     WIN2SDL.default = :UNKNOWN
  138. end
  139.  
  140. $win32KeyStates = nil
  141.  
  142. module Graphics
  143.     class << self
  144.         alias_method(:win32wrap_update, :update)
  145.         def update
  146.             win32wrap_update
  147.             $win32KeyStates = nil
  148.         end
  149.     end
  150. end
  151.  
  152. def get_raw_keystates
  153.     if $win32KeyStates == nil
  154.         $win32KeyStates = MKXP.raw_key_states
  155.     end
  156.  
  157.     return $win32KeyStates
  158. end
  159.  
  160. def common_keystate(vkey)
  161.     vkey_name = Scancodes::WIN32INV[vkey]
  162.  
  163.     if vkey_name == :LBUTTON
  164.         return Input.press?(Input::MOUSELEFT) ? 1 : 0
  165.     elsif vkey_name == :RBUTTON
  166.         return Input.press?(Input::MOUSERIGHT) ? 1 : 0
  167.     elsif vkey_name == :MBUTTON
  168.         return Input.press?(Input::MOUSEMIDDLE) ? 1 : 0
  169.     end
  170.  
  171.     offset = Scancodes::SDL[vkey_name]
  172.     return get_raw_keystates.getbyte(offset)
  173. end
  174.  
  175. def memcpy_string(dst, src)
  176.     i = 0
  177.     src.each_byte do |b|
  178.         dst.setbyte(i, b)
  179.         i += 1
  180.     end
  181. end
  182.  
  183. def state_pressed(states, sdl_scan)
  184.     return states.getbyte(Scancodes::SDL[sdl_scan]) == 1
  185. end
  186.  
  187. def double_state(states, left, right)
  188.     return state_pressed(states, left) || state_pressed(states, right)
  189. end
  190.  
  191. module Win32API_Impl
  192.     module User32
  193.         class Keybd_event
  194.             Seq = [
  195.                 [0xA4, 0, 0, 0],
  196.                 [0xD, 0, 0, 0],
  197.                 [0xD, 0, 2, 0],
  198.                 [0xA4, 0, 2, 0]]
  199.             Seq2 = [
  200.                 [0x12, 0, 0, 0],
  201.                 [0xD, 0, 0, 0],
  202.                 [0xD, 0, 2, 0],
  203.                 [0x12, 0, 2, 0]]
  204.             def initialize
  205.                 @index = 0
  206.             end
  207.             def call(args)
  208.                 seq = [args[0], args[1], args[2], args[3]]
  209.  
  210.                 if seq == Seq[@index] or seq == Seq2[@index]
  211.                     @index += 1
  212.                 else
  213.                     @index = 0
  214.                 end
  215.  
  216.                 if @index == 4
  217.                     @index = 0
  218.                     Graphics.fullscreen = !Graphics.fullscreen
  219.                 end
  220.             end
  221.         end
  222.  
  223.         class GetKeyState
  224.             def call(vkey)
  225.                 return common_keystate(vkey[0])
  226.             end
  227.         end
  228.         class GetAsyncKeyState
  229.             PRESSED_BIT = (1 << 15)
  230.             def call(vkey)
  231.                 return common_keystate(vkey[0]) == 1 ? PRESSED_BIT : 0
  232.             end
  233.         end
  234.         class GetKeyboardState
  235.             PRESSED_BIT = 0x80
  236.             def call(args)
  237.                 out_states = args[0]
  238.                 states = get_raw_keystates
  239.  
  240.                 Scancodes::WIN32.each do |name, val|
  241.                     pressed = false
  242.  
  243.                     if name == :LBUTTON
  244.                         pressed = Input.press?(Input::MOUSELEFT)
  245.                     elsif name == :RBUTTON
  246.                         pressed = Input.press?(Input::MOUSERIGHT)
  247.                     elsif name == :MBUTTON
  248.                         pressed = Input.press?(Input::MOUSEMIDDLE)
  249.                     elsif name == :SHIFT
  250.                         pressed = double_state(states, :LSHIFT, :RSHIFT)
  251.                     elsif name == :MENU
  252.                         pressed = double_state(states, :LALT, :RALT)
  253.                     elsif name == :CONTROL
  254.                         pressed = double_state(states, :LCONTROL, :RCONTROL)
  255.                     else
  256.                         scan = nil
  257.                         if Scancodes::SDL.key?(name)
  258.                             scan = name
  259.                         else
  260.                             scan = Scancodes::WIN2SDL[name]
  261.                         end
  262.  
  263.                         pressed = state_pressed(states, name)
  264.                     end
  265.  
  266.                     out_states.setbyte(val, pressed ? PRESSED_BIT : 0)
  267.                 end
  268.                 return 1
  269.             end
  270.         end
  271.  
  272.         class ShowCursor
  273.             def initialize
  274.                 @cursor_count = 0
  275.             end
  276.             def call(args)
  277.                 if args[0] == 1
  278.                     @cursor_count += 1
  279.                 else
  280.                     @cursor_count -= 1
  281.                 end
  282.  
  283.                 Graphics.show_cursor = @cursor_count >= 0
  284.             end
  285.         end
  286.  
  287.         class GetCursorPos
  288.             def call(args)
  289.                 out = [Input.mouse_x, Input.mouse_y].pack('ll')
  290.                 memcpy_string(args[0], out)
  291.                 return 1
  292.             end
  293.         end
  294.  
  295.         class GetClientRect
  296.             def call(args)
  297.                 return 0 if args[0] != 42
  298.                 rect = [0, 0, 640, 480]
  299.                 begin
  300.                     rect[2] = Graphics.width
  301.                     rect[3] = Graphics.height
  302.                 rescue
  303.                 end
  304.                 memcpy_string(args[1], rect.pack('l4'))
  305.                 return 1
  306.             end
  307.         end
  308.  
  309.         class ScreenToClient
  310.             def call(args)
  311.                 return 1
  312.             end
  313.         end
  314.  
  315.         class FindWindowA
  316.             def call(args)
  317.                 if args[0] == "RGSS Player"
  318.                     return 42
  319.                 else
  320.                     return 0
  321.                 end
  322.             end
  323.         end
  324.     end
  325. end
  326.  
  327. def kappatalize(s)
  328.     s[0] = s[0].upcase
  329.     return s
  330. end
  331.  
  332. class Win32API
  333.     def initialize(dll, func, *args)
  334.         @dll = dll
  335.         @func = func
  336.         @called = false
  337.  
  338.         dll = kappatalize(dll.chomp(".dll"))
  339.         func = kappatalize(func)
  340.  
  341.         if Win32API_Impl.const_defined?(dll)
  342.             dll_impl = Win32API_Impl.const_get(dll)
  343.             if dll_impl.const_defined?(func)
  344.                 @impl = dll_impl.const_get(func).new
  345.             end
  346.         end
  347.  
  348.     end
  349.     def call(*args)
  350.         if @impl
  351.             return @impl.call(args)
  352.         end
  353.  
  354.         MKXP.puts("[#{@dll}:#{@func}] #{args.to_s}") if !@called
  355.         @called = true
  356.         return 0
  357.     end
  358. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement