diff options
author | Michael Stapelberg <michael@stapelberg.de> | 2012-10-26 20:24:55 +0200 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2012-10-26 20:39:59 +0200 |
commit | e1d86a327945111b99148650dc536c9ad8598cc1 (patch) | |
tree | f120f2e29e47cfa7eb494f811c3282449cf3d720 /ucs2_to_utf8.c | |
parent | 1d08065fe02304f078c9b34250148777f3d0a734 (diff) |
use libxkbcommon for input handling
Thanks to Ran Benita and Daniel Stone (the libxkbcommon authors) for
answering my questions and reviewing this code.
With this commit, input handling should be more correct with using less
code (in i3lock, that is).
Diffstat (limited to 'ucs2_to_utf8.c')
-rw-r--r-- | ucs2_to_utf8.c | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/ucs2_to_utf8.c b/ucs2_to_utf8.c deleted file mode 100644 index ab56bf2..0000000 --- a/ucs2_to_utf8.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * vim:ts=8:expandtab - * - * i3 - an improved dynamic tiling window manager - * - * © 2009-2012 Michael Stapelberg and contributors - * - * See file LICENSE for license information. - * - */ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <err.h> -#include <iconv.h> - -static iconv_t conversion_descriptor = 0; -static iconv_t conversion_descriptor2 = 0; - -/* isutf, u8_dec © 2005 Jeff Bezanson, public domain */ -#define isutf(c) (((c) & 0xC0) != 0x80) - -/* - * Decrements i to point to the previous unicode glyph - * - */ -void u8_dec(char *s, int *i) { - (void)(isutf(s[--(*i)]) || isutf(s[--(*i)]) || isutf(s[--(*i)]) || --(*i)); -} - -/* - * Returns the input string, but converted from UCS-2 to UTF-8. Memory will be - * allocated, thus the caller has to free the output. - * - */ -int convert_ucs_to_utf8(char *input, char *output) { - size_t input_size = 2; - - /* UTF-8 may consume up to 4 byte */ - size_t output_size = 8; - /* We need to use an additional pointer, because iconv() modifies it */ - char *outptr = output; - - /* We convert the input into UCS-2 big endian */ - if (conversion_descriptor == 0) { - conversion_descriptor = iconv_open("UTF-8", "UCS-2BE"); - if (conversion_descriptor == 0) { - fprintf(stderr, "error opening the conversion context\n"); - exit(1); - } - } - - /* Get the conversion descriptor back to original state */ - iconv(conversion_descriptor, NULL, NULL, NULL, NULL); - - /* Convert our text */ - int rc = iconv(conversion_descriptor, (void*)&input, &input_size, &outptr, &output_size); - if (rc == (size_t)-1) { - perror("Converting to UCS-2 failed"); - return 0; - } - - return (8 - output_size); -} - -/* - * Converts the given string to UCS-2 big endian for use with - * xcb_image_text_16(). The amount of real glyphs is stored in real_strlen, - * a buffer containing the UCS-2 encoded string (16 bit per glyph) is - * returned. It has to be freed when done. - * - */ -char *convert_utf8_to_ucs2(char *input, int *real_strlen) { - size_t input_size = strlen(input) + 1; - /* UCS-2 consumes exactly two bytes for each glyph */ - int buffer_size = input_size * 2; - - char *buffer = malloc(buffer_size); - if (buffer == NULL) - err(EXIT_FAILURE, "malloc() failed\n"); - size_t output_size = buffer_size; - /* We need to use an additional pointer, because iconv() modifies it */ - char *output = buffer; - - /* We convert the input into UCS-2 big endian */ - if (conversion_descriptor2 == 0) { - conversion_descriptor2 = iconv_open("UCS-2BE", "UTF-8"); - if (conversion_descriptor2 == 0) { - fprintf(stderr, "error opening the conversion context\n"); - exit(1); - } - } - - /* Get the conversion descriptor back to original state */ - iconv(conversion_descriptor2, NULL, NULL, NULL, NULL); - - /* Convert our text */ - int rc = iconv(conversion_descriptor2, (void*)&input, &input_size, &output, &output_size); - if (rc == (size_t)-1) { - perror("Converting to UCS-2 failed"); - if (real_strlen != NULL) - *real_strlen = 0; - return NULL; - } - - if (real_strlen != NULL) - *real_strlen = ((buffer_size - output_size) / 2) - 1; - - return buffer; -} - |