| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
- /*
- * Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
- * 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 <klemensbaum@gmail.com>
- */
- #include <X11/Xlib.h>
- #include <stddef.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;
- 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;
- 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;
- }
- if (offset_cache->size > 0) {
- data[i].key = key;
- data[i].offset = offset;
- }
- }
|