]> source.dussan.org Git - tigervnc.git/commitdiff
Add helper to get combining codepoint from a spacing character
authorPierre Ossman <ossman@cendio.se>
Mon, 21 Jul 2014 14:36:50 +0000 (16:36 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 22 Aug 2014 13:09:59 +0000 (15:09 +0200)
vncviewer/keysym2ucs.c
vncviewer/keysym2ucs.h

index d82d8c6a8e93d4db0e87286f87c2323fd358fe72..d91df677ca6a646bff27323f2842572523d4b978 100644 (file)
@@ -41,6 +41,11 @@ struct codepair {
   unsigned short ucs;
 };
 
+struct combiningpair {
+  unsigned short spacing;
+  unsigned short combining;
+};
+
 static const struct codepair keysymtab[] = {
   { 0x01a1, 0x0104 }, /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
   { 0x01a2, 0x02d8 }, /*                       breve ˘ BREVE */
@@ -833,6 +838,31 @@ static const struct codepair keysymtab[] = {
   { 0xfe60, 0x0323 }, /*                               COMBINING DOT BELOW */
 };
 
+static const struct combiningpair combinetab[] = {
+  { 0x0060, 0x0300 }, /*                GRAVE ACCENT ` COMBINING GRAVE ACCENT */
+  { 0x00b4, 0x0301 }, /*                ACUTE ACCENT ´ COMBINING ACUTE ACCENT */
+  { 0x0027, 0x0301 }, /*                  APOSTROPHE ' COMBINING ACUTE ACCENT */
+  { 0x0384, 0x0301 }, /*                 GREEK TONOS ΄ COMBINING ACUTE ACCENT */
+  { 0x005e, 0x0302 }, /*           CIRCUMFLEX ACCENT ^ COMBINING CIRCUMFLEX ACCENT */
+  { 0x007e, 0x0303 }, /*                       TILDE ~ COMBINING TILDE */
+  { 0x00af, 0x0304 }, /*                      MACRON ¯ COMBINING MACRON */
+  { 0x02d8, 0x0306 }, /*                       BREVE ˘ COMBINING BREVE */
+  { 0x02d9, 0x0307 }, /*                   DOT ABOVE ˙ COMBINING DOT ABOVE */
+  { 0x00a8, 0x0308 }, /*                   DIAERESIS ¨ COMBINING DIAERESIS */
+  { 0x0022, 0x0308 }, /*              QUOTATION MARK " COMBINING DIAERESIS */
+  { 0x02da, 0x030a }, /*                  RING ABOVE ˚ COMBINING RING ABOVE */
+  { 0x00b0, 0x030a }, /*                 DEGREE SIGN ° COMBINING RING ABOVE */
+  { 0x02dd, 0x030b }, /*         DOUBLE ACUTE ACCENT ˝ COMBINING DOUBLE ACUTE ACCENT */
+  { 0x02c7, 0x030c }, /*                       CARON ˇ COMBINING CARON */
+  { 0x00b8, 0x0327 }, /*                     CEDILLA ¸ COMBINING CEDILLA */
+  { 0x02db, 0x0328 }, /*                      OGONEK ¸ COMBINING OGONEK */
+  { 0x037a, 0x0345 }, /*         GREEK YPOGEGRAMMENI ͺ COMBINING GREEK YPOGEGRAMMENI */
+  { 0x309b, 0x3099 }, /* KATAKANA-HIRAGANA VOICED SOUND MARK ゛COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK */
+  { 0x309c, 0x309a }, /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK ゜COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+  { 0x002e, 0x0323 }, /*                   FULL STOP . COMBINING DOT BELOW */
+  { 0x0385, 0x0344 }, /*       GREEK DIALYTIKA TONOS ΅ COMBINING GREEK DIALYTIKA TONOS */
+};
+
 unsigned keysym2ucs(unsigned keysym)
 {
   int min = 0;
@@ -890,3 +920,19 @@ unsigned ucs2keysym(unsigned ucs)
   /* no matching keysym value found */
   return NoSymbol;
 }
+
+unsigned ucs2combining(unsigned spacing)
+{
+  int cur = 0;
+  int max = sizeof(combinetab) / sizeof(struct combiningpair) - 1;
+
+  /* linear search in table */
+  while (cur <= max) {
+    if (combinetab[cur].spacing == spacing)
+      return combinetab[cur].combining;
+    cur++;
+  }
+
+  /* no matching Unicode value found */
+  return -1;
+}
index a09165b9b497f0a163bc5e5bcf51084bb0ae3dae..01a7ddb0f4014417d7e49ac2e9024251a28f85c4 100644 (file)
@@ -10,6 +10,8 @@ extern "C" {
 unsigned keysym2ucs(unsigned keysym);
 unsigned ucs2keysym(unsigned ucs);
 
+unsigned ucs2combining(unsigned spacing);
+
 #ifdef __cplusplus
 }
 #endif