/* * Copyright (C) 2014 Peng Huang * Copyright (C) 2014 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation, and that the name of * the copyright holders not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. * * Author: Klemens Baum */ #include #include #include #include "IMdkit.h" #include "Xi18n.h" #include "Xi18n.h" /* * The XIM specification does not limit the number of window properties * that can be used to transfer data, but Xlib uses the atom strings * _client0 through _client20. * * So use that as a sensible initial size for the offset cache. */ #define INITIAL_OFFSET_CACHE_CAPACITY 21 #define OFFSET_CACHE_GROWTH_FACTOR 2 void _Xi18nInitOffsetCache (Xi18nOffsetCache *offset_cache) { offset_cache->size = 0; offset_cache->capacity = INITIAL_OFFSET_CACHE_CAPACITY; offset_cache->data = (Xi18nAtomOffsetPair *) malloc ( INITIAL_OFFSET_CACHE_CAPACITY * sizeof (Xi18nAtomOffsetPair)); } unsigned long _Xi18nLookupPropertyOffset (Xi18nOffsetCache *offset_cache, Atom key) { Xi18nAtomOffsetPair *data; size_t i; assert (offset_cache); data = offset_cache->data; for (i = 0; i < offset_cache->size; ++i) { if (data[i].key == key) { return data[i].offset; } } return 0; } void _Xi18nSetPropertyOffset (Xi18nOffsetCache *offset_cache, Atom key, unsigned long offset) { Xi18nAtomOffsetPair *data = offset_cache->data; size_t i; assert (data != NULL); for (i = 0; i < offset_cache->size; ++i) { if (data[i].key == key) { data[i].offset = offset; return; } } if (++offset_cache->size > offset_cache->capacity) { offset_cache->capacity *= OFFSET_CACHE_GROWTH_FACTOR; offset_cache->data = (Xi18nAtomOffsetPair *) realloc (data, offset_cache->capacity * sizeof (Xi18nAtomOffsetPair)); if (offset_cache->data == NULL) { offset_cache->data = data; --offset_cache->size; } data = offset_cache->data; } assert (data != NULL); if (offset_cache->size > 0) { data[i].key = key; data[i].offset = offset; } }