xkeysymtounicodetablegen.rb
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 25 Jan 2018 10:48:17 +0000
branchjv
changeset 8272 b99e94212cb5
parent 8038 c7cab63f9ec9
child 8420 76e39223f5ab
permissions -rwxr-xr-x
Issue #154: set window as top-most if windows' `#windowStyle` is `#toolWindow1` ...to match the behavior on X11. This is a Windows counterpart of an earlier commit 00b6d158ab89. See https://swing.fit.cvut.cz/projects/stx-jv/ticket/154

#!/usr/bin/env ruby
# 
#  Copyright (c) 2017-now Jan Vrany
#  
#  Permission is hereby granted, free of charge, to any person obtaining
#  a copy of this software and associated documentation files (the
#  "Software"), to deal in the Software without restriction, including
#  without limitation the rights to use, copy, modify, merge, publish,
#  distribute, sublicense, and/or sell copies of the Software, and to
#  permit persons to whom the Software is furnished to do so, subject to
#  the following conditions:
#  
#  The above copyright notice and this permission notice shall be
#  included in all copies or substantial portions of the Software.
#  
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#  MeERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
#  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
#  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
#  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
#  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

#
# A quick and dirty generator of character lookup table used
# by XKeysymToUnicode(). 
#
# Usage: 
#
#   ruby xkeysymtounicodetablegen.rb > xkeysymtounicodetable.h
#

KEYSYMDEF_H = '/usr/include/X11/keysymdef.h'
KEYSYMDEF_MATCHER = /^#define (XK_[A-Za-z_]+)+\ +0x([0-9A-Fa-f]+)  \/\* U\+([0-9A-Fa-f]+) (.+) \*\/$/
KEYSYM_DIRECT_LOW_NAME = "XK_space"

keysyms = []
keysym_direct_low = nil
keysym_direct_high = nil

class KeySym
  attr_accessor :x_code, :x_name, :u_code, :u_name

  def initialize(xcode, xname, ucode, uname) 
    @x_code = xcode
    @x_name = xname
    @u_code = ucode
    @u_name = uname
  end

  def to_s
    return "#define #{x_name} 0x#{x_code.to_s(16)} /* U+#{u_code.to_s(16)} #{u_name} */"
  end
end

File.open(KEYSYMDEF_H).each do | line |
  m = line.match(KEYSYMDEF_MATCHER)
  if m then
    x_name, x_code, u_code, u_name = m.captures
    keysym = KeySym.new(x_code.to_i(16), x_name, u_code.to_i(16), u_name)    
    if keysym.x_code != 0 then
      keysyms << keysym
      if keysym.x_name == KEYSYM_DIRECT_LOW_NAME then
        keysym_direct_low = keysym
        keysym_direct_high = keysym
      end
    end
  end
end

keysyms.sort! { | a, b | a.x_code <=> b.x_code }

begin
  i = keysyms.index(keysym_direct_low) + 1
  while (true)
    keysym = keysyms[i]
    i = i + 1

    if (keysym.x_code == keysym.u_code && keysym.x_code >= keysym_direct_high.x_code) then
      keysym_direct_high = keysym      
    else
      break
    end
  end
end

print <<-end
/* 
 * Automatically generated - do not edit! 
 */

/* 
 * Copyright (c) 2017-now Jan Vrany
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MeERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

/* 
 * This header contain table definitions for XKeysymToUnicode() function. 
 *
 * Automatically generated by `xkeysymtounicodetablegen.rb` from `keysymdef.h`.
 */

#ifndef _XKEYSYMTOUNICODETABLE_H_
#define _XKEYSYMTOUNICODETABLE_H_

#include <stdint.h>
#include <X11/X.h>
#include <X11/keysym.h>

#define XKEYSYMTOUNICODE_DIRECT_LO 0x#{keysym_direct_low.x_code.to_s(16)} /* #{keysym_direct_low.x_name}, #{keysym_direct_low.u_name} */
#define XKEYSYMTOUNICODE_DIRECT_HI 0x#{keysym_direct_high.x_code.to_s(16)} /* #{keysym_direct_high.x_name}, #{keysym_direct_high.u_name} */

typedef struct _xkeysymtounicode_table_entry {
  KeySym keysym;
  uint16_t codepoint;
} xkeysymtounicode_table_entry_t;

static const xkeysymtounicode_table_entry_t 
xkeysymtounicode_table[] = {
end

keysyms_size = 0
keysyms.each do | keysym | 
  if keysym.x_code < keysym_direct_low.x_code || keysym.x_code > keysym_direct_high.x_code
    keysyms_size = keysyms_size + 1 
    print "    { 0x#{keysym.x_code.to_s(16)}, 0x#{keysym.u_code.to_s(16)} }, /* #{keysym.x_name}, #{keysym.u_name} */\n"
  end
end
print "    { 0, 0 } /* -- terminator -- */\n"
print "};\n"

print <<-end

static const int 
xkeysymtounicode_table_size = #{keysyms_size};

#endif // _XKEYSYMTOUNICODETABLE_H_
end