XDefaultOMIF.c revision b4ee4795
11ab64890Smrg/* 21ab64890SmrgCopyright 1985, 1986, 1987, 1991, 1998 The Open Group 31ab64890Smrg 41ab64890SmrgPermission is hereby granted, free of charge, to any person obtaining a 51ab64890Smrgcopy of this software and associated documentation files (the 61ab64890Smrg"Software"), to deal in the Software without restriction, including 71ab64890Smrgwithout limitation the rights to use, copy, modify, merge, publish, 81ab64890Smrgdistribute, sublicense, and/or sell copies of the Software, and to 91ab64890Smrgpermit persons to whom the Software is furnished to do so, subject to 101ab64890Smrgthe following conditions: The above copyright notice and this 111ab64890Smrgpermission notice shall be included in all copies or substantial 121ab64890Smrgportions of the Software. 131ab64890Smrg 141ab64890Smrg 15b4ee4795SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b4ee4795SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b4ee4795SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18b4ee4795SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19b4ee4795SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20b4ee4795SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE 21b4ee4795SmrgEVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES. 221ab64890Smrg 231ab64890Smrg 24b4ee4795SmrgExcept as contained in this notice, the name of The Open Group shall not be 25b4ee4795Smrgused in advertising or otherwise to promote the sale, use or other dealings 26b4ee4795Smrgin this Software without prior written authorization from The Open Group. 271ab64890Smrg 281ab64890Smrg 291ab64890SmrgX Window System is a trademark of The Open Group 301ab64890Smrg 311ab64890SmrgOSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF 321ab64890Smrglogo, LBX, X Window System, and Xinerama are trademarks of the Open 331ab64890SmrgGroup. All other trademarks and registered trademarks mentioned herein 341ab64890Smrgare the property of their respective owners. No right, title or 351ab64890Smrginterest in or to any trademark, service mark, logo or trade name of 361ab64890SmrgSun Microsystems, Inc. or its licensors is granted. 371ab64890Smrg 381ab64890Smrg*/ 39b4ee4795Smrg/* 40b4ee4795Smrg * Copyright 2000 Sun Microsystems, Inc. All rights reserved. 41b4ee4795Smrg * 42b4ee4795Smrg * Permission is hereby granted, free of charge, to any person obtaining a 43b4ee4795Smrg * copy of this software and associated documentation files (the "Software"), 44b4ee4795Smrg * to deal in the Software without restriction, including without limitation 45b4ee4795Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 46b4ee4795Smrg * and/or sell copies of the Software, and to permit persons to whom the 47b4ee4795Smrg * Software is furnished to do so, subject to the following conditions: 48b4ee4795Smrg * 49b4ee4795Smrg * The above copyright notice and this permission notice (including the next 50b4ee4795Smrg * paragraph) shall be included in all copies or substantial portions of the 51b4ee4795Smrg * Software. 52b4ee4795Smrg * 53b4ee4795Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 54b4ee4795Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 55b4ee4795Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 56b4ee4795Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 57b4ee4795Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 58b4ee4795Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 59b4ee4795Smrg * DEALINGS IN THE SOFTWARE. 60b4ee4795Smrg */ 61b4ee4795Smrg 621ab64890Smrg 631ab64890Smrg#ifdef HAVE_CONFIG_H 641ab64890Smrg#include <config.h> 651ab64890Smrg#endif 661ab64890Smrg#include "Xlibint.h" 671ab64890Smrg#include "Xlcint.h" 681ab64890Smrg#include "XlcPublic.h" 691ab64890Smrg#include <X11/Xos.h> 701ab64890Smrg#include <X11/Xatom.h> 711ab64890Smrg#include <stdio.h> 721ab64890Smrg 731ab64890Smrg#define MAXFONTS 100 741ab64890Smrg 751ab64890Smrg#define XOM_GENERIC(om) (&((XOMGeneric) om)->gen) 761ab64890Smrg#define XOC_GENERIC(font_set) (&((XOCGeneric) font_set)->gen) 771ab64890Smrg 781ab64890Smrg#define DefineLocalBuf char local_buf[BUFSIZ] 791ab64890Smrg#define AllocLocalBuf(length) (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf) 801ab64890Smrg#define FreeLocalBuf(ptr) if (ptr != local_buf) Xfree(ptr) 811ab64890Smrg 821ab64890Smrgtypedef struct _FontDataRec { 831ab64890Smrg char *name; 841ab64890Smrg} FontDataRec, *FontData; 851ab64890Smrg 861ab64890Smrgtypedef struct _OMDataRec { 871ab64890Smrg int font_data_count; 881ab64890Smrg FontData font_data; 891ab64890Smrg} OMDataRec, *OMData; 901ab64890Smrg 911ab64890Smrgtypedef struct _XOMGenericPart { 921ab64890Smrg OMData data; 931ab64890Smrg} XOMGenericPart; 941ab64890Smrg 951ab64890Smrgtypedef struct _XOMGenericRec { 961ab64890Smrg XOMMethods methods; 971ab64890Smrg XOMCoreRec core; 981ab64890Smrg XOMGenericPart gen; 991ab64890Smrg} XOMGenericRec, *XOMGeneric; 1001ab64890Smrg 1011ab64890Smrgtypedef struct _FontSetRec { 1021ab64890Smrg int id; 1031ab64890Smrg int font_data_count; 1041ab64890Smrg FontData font_data; 1051ab64890Smrg char *font_name; 1061ab64890Smrg XFontStruct *info; 1071ab64890Smrg XFontStruct *font; 1081ab64890Smrg} FontSetRec, *FontSet; 1091ab64890Smrg 1101ab64890Smrgtypedef struct _XOCGenericPart { 1111ab64890Smrg XlcConv wcs_to_cs; 1121ab64890Smrg FontSet font_set; 1131ab64890Smrg} XOCGenericPart; 1141ab64890Smrg 1151ab64890Smrgtypedef struct _XOCGenericRec { 1161ab64890Smrg XOCMethods methods; 11761b2299dSmrg XOCCoreRec core; 1181ab64890Smrg XOCGenericPart gen; 1191ab64890Smrg} XOCGenericRec, *XOCGeneric; 1201ab64890Smrg 1211ab64890Smrgstatic Bool 1221ab64890Smrginit_fontset( 1231ab64890Smrg XOC oc) 1241ab64890Smrg{ 1251ab64890Smrg XOCGenericPart *gen; 1261ab64890Smrg FontSet font_set; 1271ab64890Smrg OMData data; 1281ab64890Smrg 1291ab64890Smrg data = XOM_GENERIC(oc->core.om)->data; 1301ab64890Smrg 1311ab64890Smrg font_set = (FontSet) Xmalloc(sizeof(FontSetRec)); 1321ab64890Smrg if (font_set == NULL) 1331ab64890Smrg return False; 1341ab64890Smrg bzero((char *) font_set, sizeof(FontSetRec)); 1351ab64890Smrg 1361ab64890Smrg gen = XOC_GENERIC(oc); 1371ab64890Smrg gen->font_set = font_set; 1381ab64890Smrg 1391ab64890Smrg font_set->font_data_count = data->font_data_count; 1401ab64890Smrg font_set->font_data = data->font_data; 1411ab64890Smrg 1421ab64890Smrg return True; 1431ab64890Smrg} 1441ab64890Smrg 1451ab64890Smrgstatic char * 1461ab64890Smrgget_prop_name( 1471ab64890Smrg Display *dpy, 1481ab64890Smrg XFontStruct *fs) 1491ab64890Smrg{ 1501ab64890Smrg unsigned long fp; 1511ab64890Smrg 1521ab64890Smrg if (XGetFontProperty(fs, XA_FONT, &fp)) 15361b2299dSmrg return XGetAtomName(dpy, fp); 1541ab64890Smrg 1551ab64890Smrg return (char *) NULL; 1561ab64890Smrg} 1571ab64890Smrg 1581ab64890Smrgstatic FontData 1591ab64890Smrgcheck_charset( 1601ab64890Smrg FontSet font_set, 1611ab64890Smrg char *font_name) 1621ab64890Smrg{ 1631ab64890Smrg FontData font_data; 1641ab64890Smrg char *last; 1651ab64890Smrg int count; 1661ab64890Smrg ssize_t length, name_len; 1671ab64890Smrg 1681ab64890Smrg name_len = strlen(font_name); 1691ab64890Smrg last = font_name + name_len; 1701ab64890Smrg 1711ab64890Smrg count = font_set->font_data_count; 1721ab64890Smrg font_data = font_set->font_data; 1731ab64890Smrg 1741ab64890Smrg for ( ; count-- > 0; font_data++) { 1751ab64890Smrg length = strlen(font_data->name); 1761ab64890Smrg 1771ab64890Smrg if (length > name_len) 1781ab64890Smrg return(NULL); 17961b2299dSmrg 1801ab64890Smrg if (_XlcCompareISOLatin1(last - length, font_data->name) == 0) 1811ab64890Smrg return font_data; 1821ab64890Smrg } 1831ab64890Smrg return (FontData) NULL; 1841ab64890Smrg} 1851ab64890Smrg 1861ab64890Smrg#if 0 /* Unused */ 1871ab64890Smrgstatic int 1881ab64890Smrgcheck_fontname( 1891ab64890Smrg XOC oc, 1901ab64890Smrg char *name) 1911ab64890Smrg{ 1921ab64890Smrg Display *dpy = oc->core.om->core.display; 1931ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 1941ab64890Smrg FontData data; 1951ab64890Smrg FontSet font_set; 1961ab64890Smrg XFontStruct *fs_list; 1971ab64890Smrg char **fn_list, *fname, *prop_fname = NULL; 1981ab64890Smrg int list_num, i; 1991ab64890Smrg int list2_num; 2001ab64890Smrg char **fn2_list = NULL; 2011ab64890Smrg int found_num = 0; 2021ab64890Smrg 2031ab64890Smrg fn_list = XListFonts(dpy, name, MAXFONTS, &list_num); 2041ab64890Smrg if (fn_list == NULL) 2051ab64890Smrg return found_num; 2061ab64890Smrg 2071ab64890Smrg for (i = 0; i < list_num; i++) { 2081ab64890Smrg fname = fn_list[i]; 2091ab64890Smrg 2101ab64890Smrg font_set = gen->font_set; 2111ab64890Smrg 2121ab64890Smrg if ((data = check_charset(font_set, fname)) == NULL) { 2131ab64890Smrg if ((fn2_list = XListFontsWithInfo(dpy, name, MAXFONTS, 2141ab64890Smrg &list2_num, &fs_list)) 2151ab64890Smrg && (prop_fname = get_prop_name(dpy, fs_list)) 2161ab64890Smrg && (data = check_charset(font_set, prop_fname))) 2171ab64890Smrg fname = prop_fname; 2181ab64890Smrg } 2191ab64890Smrg if (data) { 2201ab64890Smrg font_set->font_name = (char *) Xmalloc(strlen(fname) + 1); 2211ab64890Smrg if (font_set->font_name) { 2221ab64890Smrg strcpy(font_set->font_name, fname); 2231ab64890Smrg found_num++; 2241ab64890Smrg } 2251ab64890Smrg } 2261ab64890Smrg if (fn2_list) { 2271ab64890Smrg XFreeFontInfo(fn2_list, fs_list, list2_num); 2281ab64890Smrg fn2_list = NULL; 2291ab64890Smrg if (prop_fname) { 2301ab64890Smrg Xfree(prop_fname); 2311ab64890Smrg prop_fname = NULL; 2321ab64890Smrg } 2331ab64890Smrg } 2341ab64890Smrg if (found_num == 1) 2351ab64890Smrg break; 2361ab64890Smrg } 2371ab64890Smrg XFreeFontNames(fn_list); 2381ab64890Smrg return found_num; 2391ab64890Smrg} 2401ab64890Smrg#endif 2411ab64890Smrg 2421ab64890Smrgstatic Bool 2431ab64890Smrgload_font( 2441ab64890Smrg XOC oc) 2451ab64890Smrg{ 2461ab64890Smrg Display *dpy = oc->core.om->core.display; 2471ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 2481ab64890Smrg FontSet font_set = gen->font_set; 2491ab64890Smrg 2501ab64890Smrg if (font_set->font_name == NULL) 2511ab64890Smrg return False; 2521ab64890Smrg 2531ab64890Smrg if (font_set->font == NULL) { 2541ab64890Smrg font_set->font = XLoadQueryFont(dpy, font_set->font_name); 2551ab64890Smrg if (font_set->font == NULL) 2561ab64890Smrg return False; 2571ab64890Smrg } 2581ab64890Smrg return True; 2591ab64890Smrg} 2601ab64890Smrg 2611ab64890Smrg#if 0 2621ab64890Smrgstatic Bool 2631ab64890Smrgload_font_info( 2641ab64890Smrg XOC oc) 2651ab64890Smrg{ 2661ab64890Smrg Display *dpy = oc->core.om->core.display; 2671ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 2681ab64890Smrg FontSet font_set = gen->font_set; 2691ab64890Smrg char **fn_list; 2701ab64890Smrg int fn_num; 2711ab64890Smrg 2721ab64890Smrg if (font_set->font_name == NULL) 2731ab64890Smrg return False; 2741ab64890Smrg 2751ab64890Smrg if (font_set->info == NULL) { 2761ab64890Smrg fn_list = XListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num, 2771ab64890Smrg &font_set->info); 2781ab64890Smrg if (font_set->info == NULL) 2791ab64890Smrg return False; 2801ab64890Smrg if (fn_num > 0) 2811ab64890Smrg font_set->info->fid = XLoadFont(dpy, font_set->font_name); 28261b2299dSmrg 2831ab64890Smrg if (fn_list) XFreeFontNames(fn_list); 2841ab64890Smrg } 2851ab64890Smrg return True; 2861ab64890Smrg} 2871ab64890Smrg#endif 2881ab64890Smrg 2891ab64890Smrgstatic void 2901ab64890Smrgset_fontset_extents( 2911ab64890Smrg XOC oc) 2921ab64890Smrg{ 2931ab64890Smrg XRectangle *ink = &oc->core.font_set_extents.max_ink_extent; 2941ab64890Smrg XRectangle *logical = &oc->core.font_set_extents.max_logical_extent; 2951ab64890Smrg XFontStruct **font_list, *font; 2961ab64890Smrg XCharStruct overall; 2971ab64890Smrg int logical_ascent, logical_descent; 2981ab64890Smrg 2991ab64890Smrg font_list = oc->core.font_info.font_struct_list; 3001ab64890Smrg font = *font_list++; 3011ab64890Smrg overall = font->max_bounds; 3021ab64890Smrg overall.lbearing = font->min_bounds.lbearing; 3031ab64890Smrg logical_ascent = font->ascent; 3041ab64890Smrg logical_descent = font->descent; 3051ab64890Smrg 3061ab64890Smrg ink->x = overall.lbearing; 3071ab64890Smrg ink->y = -(overall.ascent); 3081ab64890Smrg ink->width = overall.rbearing - overall.lbearing; 3091ab64890Smrg ink->height = overall.ascent + overall.descent; 3101ab64890Smrg 3111ab64890Smrg logical->x = 0; 3121ab64890Smrg logical->y = -(logical_ascent); 3131ab64890Smrg logical->width = overall.width; 3141ab64890Smrg logical->height = logical_ascent + logical_descent; 3151ab64890Smrg} 3161ab64890Smrg 3171ab64890Smrgstatic Bool 3181ab64890Smrginit_core_part( 3191ab64890Smrg XOC oc) 3201ab64890Smrg{ 3211ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 3221ab64890Smrg FontSet font_set; 3231ab64890Smrg XFontStruct **font_struct_list; 3241ab64890Smrg char **font_name_list, *font_name_buf; 3251ab64890Smrg int count, length; 3261ab64890Smrg 3271ab64890Smrg font_set = gen->font_set; 3281ab64890Smrg count = length = 0; 3291ab64890Smrg 3301ab64890Smrg if (font_set->font_name != NULL) { 3311ab64890Smrg length += strlen(font_set->font_name) + 1; 3321ab64890Smrg count++; 3331ab64890Smrg } 3341ab64890Smrg if (count == 0) 3351ab64890Smrg return False; 3361ab64890Smrg 3371ab64890Smrg font_struct_list = (XFontStruct **) Xmalloc(sizeof(XFontStruct *)); 3381ab64890Smrg if (font_struct_list == NULL) 3391ab64890Smrg return False; 3401ab64890Smrg 3411ab64890Smrg font_name_list = (char **) Xmalloc(sizeof(char *)); 3421ab64890Smrg if (font_name_list == NULL) 3431ab64890Smrg goto err; 3441ab64890Smrg 3451ab64890Smrg font_name_buf = (char *) Xmalloc(length); 3461ab64890Smrg if (font_name_buf == NULL) 3471ab64890Smrg goto err; 3481ab64890Smrg 3491ab64890Smrg oc->core.font_info.num_font = 1; 3501ab64890Smrg oc->core.font_info.font_name_list = font_name_list; 3511ab64890Smrg oc->core.font_info.font_struct_list = font_struct_list; 3521ab64890Smrg 3531ab64890Smrg font_set = gen->font_set; 3541ab64890Smrg 3551ab64890Smrg if (font_set->font_name != NULL) { 3561ab64890Smrg font_set->id = 1; 3571ab64890Smrg if (font_set->font) 3581ab64890Smrg *font_struct_list++ = font_set->font; 3591ab64890Smrg else 3601ab64890Smrg *font_struct_list++ = font_set->info; 3611ab64890Smrg strcpy(font_name_buf, font_set->font_name); 3621ab64890Smrg Xfree(font_set->font_name); 3631ab64890Smrg *font_name_list++ = font_set->font_name = font_name_buf; 3641ab64890Smrg font_name_buf += strlen(font_name_buf) + 1; 3651ab64890Smrg } 3661ab64890Smrg 3671ab64890Smrg set_fontset_extents(oc); 3681ab64890Smrg 3691ab64890Smrg return True; 3701ab64890Smrg 3711ab64890Smrgerr: 3721ab64890Smrg if (font_name_list) 3731ab64890Smrg Xfree(font_name_list); 3741ab64890Smrg Xfree(font_struct_list); 3751ab64890Smrg 3761ab64890Smrg return False; 3771ab64890Smrg} 3781ab64890Smrg 3791ab64890Smrgstatic char * 3801ab64890Smrgget_font_name( 3811ab64890Smrg XOC oc, 3821ab64890Smrg char *pattern) 3831ab64890Smrg{ 3841ab64890Smrg char **list, *name, *prop_name; 3851ab64890Smrg int count; 3861ab64890Smrg XFontStruct *fs; 3871ab64890Smrg Display *dpy = oc->core.om->core.display; 3881ab64890Smrg 3891ab64890Smrg list = XListFonts(dpy, pattern, 1, &count); 3901ab64890Smrg if (list != NULL) { 3911ab64890Smrg name = (char *) Xmalloc(strlen(*list) + 1); 3921ab64890Smrg if (name) 3931ab64890Smrg strcpy(name, *list); 39461b2299dSmrg 3951ab64890Smrg XFreeFontNames(list); 3961ab64890Smrg } else { 3971ab64890Smrg fs = XLoadQueryFont(dpy, pattern); 3981ab64890Smrg if (fs == NULL) return NULL; 3991ab64890Smrg 4001ab64890Smrg prop_name = get_prop_name(dpy, fs); 4011ab64890Smrg if (prop_name == NULL) return NULL; 4021ab64890Smrg 4031ab64890Smrg name = (char*) Xmalloc(strlen(prop_name) + 1); 4041ab64890Smrg if (name) 4051ab64890Smrg strcpy(name, prop_name); 4061ab64890Smrg 4071ab64890Smrg XFreeFont(dpy, fs); 4081ab64890Smrg } 4091ab64890Smrg return name; 4101ab64890Smrg} 4111ab64890Smrg 4121ab64890Smrgstatic int 4131ab64890Smrgparse_fontname( 4141ab64890Smrg XOC oc) 4151ab64890Smrg{ 4161ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 4171ab64890Smrg FontSet font_set; 4181ab64890Smrg FontData font_data; 4191ab64890Smrg char *pattern, *last, buf[BUFSIZ]; 4201ab64890Smrg int font_data_count, found_num = 0; 4211ab64890Smrg ssize_t length; 4221ab64890Smrg int count, num_fields; 4231ab64890Smrg char *base_name, *font_name, **name_list, **cur_name_list; 4241ab64890Smrg char *charset_p = NULL; 4251ab64890Smrg Bool append_charset; 4261ab64890Smrg /* 4271ab64890Smrg append_charset flag should be set to True when the XLFD fontname 4281ab64890Smrg doesn't contain a chaset part. 4291ab64890Smrg */ 4301ab64890Smrg 4311ab64890Smrg name_list = _XParseBaseFontNameList(oc->core.base_name_list, &count); 4321ab64890Smrg if (name_list == NULL) 4331ab64890Smrg return -1; 4341ab64890Smrg cur_name_list = name_list; 4351ab64890Smrg 4361ab64890Smrg while (count-- > 0) { 4371ab64890Smrg pattern = *cur_name_list++; 4381ab64890Smrg if (pattern == NULL || *pattern == '\0') 4391ab64890Smrg continue; 4401ab64890Smrg 4411ab64890Smrg append_charset = False; 4421ab64890Smrg 4431ab64890Smrg if (strchr(pattern, '*') == NULL && 4441ab64890Smrg (font_name = get_font_name(oc, pattern))) { 4451ab64890Smrg 4461ab64890Smrg font_set = gen->font_set; 4471ab64890Smrg 4481ab64890Smrg font_data = check_charset(font_set, font_name); 4491ab64890Smrg if (font_data == NULL) { 4501ab64890Smrg Display *dpy = oc->core.om->core.display; 4511ab64890Smrg char **fn_list = NULL, *prop_fname = NULL; 4521ab64890Smrg int list_num; 4531ab64890Smrg XFontStruct *fs_list; 4541ab64890Smrg if ((fn_list = XListFontsWithInfo(dpy, font_name, 4551ab64890Smrg MAXFONTS, 4561ab64890Smrg &list_num, &fs_list)) 4571ab64890Smrg && (prop_fname = get_prop_name(dpy, fs_list)) 4581ab64890Smrg && (font_data = check_charset(font_set, prop_fname))) { 4591ab64890Smrg if (fn_list) { 4601ab64890Smrg XFreeFontInfo(fn_list, fs_list, list_num); 4611ab64890Smrg fn_list = NULL; 4621ab64890Smrg } 4631ab64890Smrg font_name = prop_fname; 4641ab64890Smrg } 4651ab64890Smrg } 4661ab64890Smrg if (font_data == NULL) 4671ab64890Smrg continue; 4681ab64890Smrg 4691ab64890Smrg font_set->font_name = (char *) Xmalloc(strlen(font_name) + 1); 4701ab64890Smrg if (font_set->font_name == NULL) { 4711ab64890Smrg Xfree(font_name); 4721ab64890Smrg goto err; 4731ab64890Smrg } 4741ab64890Smrg strcpy(font_set->font_name, font_name); 4751ab64890Smrg Xfree(font_name); 4761ab64890Smrg found_num++; 4771ab64890Smrg goto found; 4781ab64890Smrg } 4791ab64890Smrg/* 4801ab64890Smrg1266793 4811ab64890SmrgLimit the length of the string copy to prevent stack corruption. 4821ab64890Smrg strcpy(buf, pattern); 4831ab64890Smrg*/ 4841ab64890Smrg strncpy(buf, pattern, BUFSIZ); 4851ab64890Smrg buf[BUFSIZ-1] = '\0'; 4861ab64890Smrg length = strlen(buf); 4871ab64890Smrg last = buf + length - 1; 4881ab64890Smrg 4891ab64890Smrg for (num_fields = 0, base_name = buf; *base_name != '\0'; base_name++) 4901ab64890Smrg if (*base_name == '-') num_fields++; 4911ab64890Smrg if (strchr(pattern, '*') == NULL) { 4921ab64890Smrg if (num_fields == 12) { 4931ab64890Smrg append_charset = True; 4941ab64890Smrg *++last = '-'; 4951ab64890Smrg last++; 4961ab64890Smrg } else 4971ab64890Smrg continue; 4981ab64890Smrg } else { 4991ab64890Smrg if (num_fields == 13 || num_fields == 14) { 50061b2299dSmrg /* 5011ab64890Smrg * There are 14 fields in an XLFD name -- make certain the 5021ab64890Smrg * charset (& encoding) is placed in the correct field. 5031ab64890Smrg */ 5041ab64890Smrg append_charset = True; 5051ab64890Smrg last = strrchr (buf, '-'); 5061ab64890Smrg if (num_fields == 14) { 5071ab64890Smrg *last = '\0'; 5081ab64890Smrg last = strrchr (buf, '-'); 5091ab64890Smrg } 5101ab64890Smrg last++; 5111ab64890Smrg } else if (*last == '*') { 5121ab64890Smrg append_charset = True; 5131ab64890Smrg if (length > 3 && *(last-3) == '-' && *(last-2) == '*' 5141ab64890Smrg && *(last-1) == '-') { 5151ab64890Smrg last -= 2; 5161ab64890Smrg } 5171ab64890Smrg *++last = '-'; 5181ab64890Smrg last++; 5191ab64890Smrg } else { 5201ab64890Smrg last = strrchr (buf, '-'); 5211ab64890Smrg charset_p = last; 5221ab64890Smrg charset_p = strrchr (buf, '-'); 5231ab64890Smrg while (*(--charset_p) != '-'); 5241ab64890Smrg charset_p++; 5251ab64890Smrg } 5261ab64890Smrg } 5271ab64890Smrg 5281ab64890Smrg font_set = gen->font_set; 5291ab64890Smrg 5301ab64890Smrg font_data = font_set->font_data; 5311ab64890Smrg font_data_count = font_set->font_data_count; 5321ab64890Smrg for ( ; font_data_count-- > 0; font_data++) { 5331ab64890Smrg if (append_charset) 5341ab64890Smrg { 5351ab64890Smrg/* 5361ab64890Smrg1266793 5371ab64890SmrgLimit the length of the string copy to prevent stack corruption. 5381ab64890Smrg strcpy(last, font_data->name); 5391ab64890Smrg*/ 5401ab64890Smrg strncpy(last, font_data->name, BUFSIZ - length); 5411ab64890Smrg buf[BUFSIZ-1] = '\0'; 5421ab64890Smrg } 5431ab64890Smrg else { 5441ab64890Smrg if (_XlcCompareISOLatin1(charset_p, 5451ab64890Smrg font_data->name)) { 5461ab64890Smrg continue; 5471ab64890Smrg } 5481ab64890Smrg } 5491ab64890Smrg if ((font_set->font_name = get_font_name(oc, buf))) 5501ab64890Smrg break; 5511ab64890Smrg } 5521ab64890Smrg if (font_set->font_name != NULL) { 5531ab64890Smrg found_num++; 5541ab64890Smrg goto found; 5551ab64890Smrg } 5561ab64890Smrg } 5571ab64890Smrg found: 5581ab64890Smrg base_name = (char *) Xmalloc(strlen(oc->core.base_name_list) + 1); 5591ab64890Smrg if (base_name == NULL) 5601ab64890Smrg goto err; 5611ab64890Smrg 5621ab64890Smrg strcpy(base_name, oc->core.base_name_list); 5631ab64890Smrg oc->core.base_name_list = base_name; 5641ab64890Smrg 56561b2299dSmrg XFreeStringList(name_list); 5661ab64890Smrg 5671ab64890Smrg return found_num; 5681ab64890Smrgerr: 56961b2299dSmrg XFreeStringList(name_list); 5701ab64890Smrg 5711ab64890Smrg return -1; 5721ab64890Smrg} 5731ab64890Smrg 5741ab64890Smrgstatic Bool 5751ab64890Smrgset_missing_list( 5761ab64890Smrg XOC oc) 5771ab64890Smrg{ 5781ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 5791ab64890Smrg FontSet font_set; 5801ab64890Smrg char **charset_list, *charset_buf; 5811ab64890Smrg int count, length; 5821ab64890Smrg 5831ab64890Smrg font_set = gen->font_set; 5841ab64890Smrg count = length = 0; 5851ab64890Smrg 5861ab64890Smrg if (!font_set->info && !font_set->font) { 5871ab64890Smrg length += strlen(font_set->font_data->name) + 1; 5881ab64890Smrg count++; 5891ab64890Smrg } 5901ab64890Smrg 5911ab64890Smrg if (count == 0) 5921ab64890Smrg return True; 5931ab64890Smrg 5941ab64890Smrg charset_list = (char **) Xmalloc(sizeof(char *)); 5951ab64890Smrg if (charset_list == NULL) 5961ab64890Smrg return False; 5971ab64890Smrg 5981ab64890Smrg charset_buf = (char *) Xmalloc(length); 5991ab64890Smrg if (charset_buf == NULL) { 6001ab64890Smrg Xfree(charset_list); 6011ab64890Smrg return False; 6021ab64890Smrg } 6031ab64890Smrg 6041ab64890Smrg oc->core.missing_list.charset_list = charset_list; 6051ab64890Smrg 6061ab64890Smrg font_set = gen->font_set; 6071ab64890Smrg 6081ab64890Smrg if (!font_set->info && !font_set->font) { 6091ab64890Smrg strcpy(charset_buf, font_set->font_data->name); 6101ab64890Smrg *charset_list++ = charset_buf; 6111ab64890Smrg charset_buf += strlen(charset_buf) + 1; 6121ab64890Smrg } 6131ab64890Smrg return True; 6141ab64890Smrg} 6151ab64890Smrg 6161ab64890Smrgstatic Bool 6171ab64890Smrgcreate_fontset( 6181ab64890Smrg XOC oc) 6191ab64890Smrg{ 6201ab64890Smrg int found_num; 6211ab64890Smrg 6221ab64890Smrg if (init_fontset(oc) == False) 6231ab64890Smrg return False; 6241ab64890Smrg 6251ab64890Smrg found_num = parse_fontname(oc); 6261ab64890Smrg if (found_num <= 0) { 6271ab64890Smrg if (found_num == 0) 6281ab64890Smrg set_missing_list(oc); 6291ab64890Smrg return False; 6301ab64890Smrg } 6311ab64890Smrg 6321ab64890Smrg if (load_font(oc) == False) 6331ab64890Smrg return False; 6341ab64890Smrg 6351ab64890Smrg if (init_core_part(oc) == False) 6361ab64890Smrg return False; 6371ab64890Smrg 6381ab64890Smrg if (set_missing_list(oc) == False) 6391ab64890Smrg return False; 6401ab64890Smrg 6411ab64890Smrg return True; 6421ab64890Smrg} 6431ab64890Smrg 6441ab64890Smrgstatic void 6451ab64890Smrgdestroy_oc( 6461ab64890Smrg XOC oc) 6471ab64890Smrg{ 6481ab64890Smrg Display *dpy = oc->core.om->core.display; 6491ab64890Smrg XOCGenericPart *gen = XOC_GENERIC(oc); 6501ab64890Smrg XFontStruct **font_list, *font; 6511ab64890Smrg 6521ab64890Smrg if (gen->font_set) 6531ab64890Smrg Xfree(gen->font_set); 6541ab64890Smrg 6551ab64890Smrg if (oc->core.base_name_list) 6561ab64890Smrg Xfree(oc->core.base_name_list); 6571ab64890Smrg 6581ab64890Smrg if (oc->core.font_info.font_name_list) 6591ab64890Smrg XFreeStringList(oc->core.font_info.font_name_list); 6601ab64890Smrg 6611ab64890Smrg if ((font_list = oc->core.font_info.font_struct_list)) { 6621ab64890Smrg if ((font = *font_list)) { 6631ab64890Smrg if (font->fid) 6641ab64890Smrg XFreeFont(dpy, font); 6651ab64890Smrg else 6661ab64890Smrg XFreeFontInfo(NULL, font, 1); 6671ab64890Smrg } 6681ab64890Smrg Xfree(oc->core.font_info.font_struct_list); 6691ab64890Smrg } 6701ab64890Smrg 6711ab64890Smrg if (oc->core.missing_list.charset_list) 6721ab64890Smrg XFreeStringList(oc->core.missing_list.charset_list); 6731ab64890Smrg 6741ab64890Smrg#ifdef notdef 6751ab64890Smrg if (oc->core.res_name) 6761ab64890Smrg Xfree(oc->core.res_name); 6771ab64890Smrg if (oc->core.res_class) 6781ab64890Smrg Xfree(oc->core.res_class); 6791ab64890Smrg#endif 68061b2299dSmrg 6811ab64890Smrg Xfree(oc); 6821ab64890Smrg} 6831ab64890Smrg 6841ab64890Smrgstatic char * 6851ab64890Smrgset_oc_values( 6861ab64890Smrg XOC oc, 6871ab64890Smrg XlcArgList args, 6881ab64890Smrg int num_args) 6891ab64890Smrg{ 6901ab64890Smrg if (oc->core.resources == NULL) 6911ab64890Smrg return NULL; 6921ab64890Smrg 6931ab64890Smrg return _XlcSetValues((XPointer) oc, oc->core.resources, 6941ab64890Smrg oc->core.num_resources, args, num_args, XlcSetMask); 6951ab64890Smrg} 6961ab64890Smrg 6971ab64890Smrgstatic char * 6981ab64890Smrgget_oc_values( 6991ab64890Smrg XOC oc, 7001ab64890Smrg XlcArgList args, 7011ab64890Smrg int num_args) 7021ab64890Smrg{ 7031ab64890Smrg if (oc->core.resources == NULL) 7041ab64890Smrg return NULL; 7051ab64890Smrg 7061ab64890Smrg return _XlcGetValues((XPointer) oc, oc->core.resources, 7071ab64890Smrg oc->core.num_resources, args, num_args, XlcGetMask); 7081ab64890Smrg} 7091ab64890Smrg 7101ab64890Smrgstatic Bool 7111ab64890Smrgwcs_to_mbs( 7121ab64890Smrg XOC oc, 7131ab64890Smrg char *to, 7141ab64890Smrg _Xconst wchar_t *from, 7151ab64890Smrg int length) 7161ab64890Smrg{ 7171ab64890Smrg XlcConv conv = XOC_GENERIC(oc)->wcs_to_cs; 7181ab64890Smrg XLCd lcd; 7191ab64890Smrg int ret, to_left = length; 7201ab64890Smrg 7211ab64890Smrg if (conv == NULL) { 7221ab64890Smrg lcd = oc->core.om->core.lcd; 7231ab64890Smrg conv = _XlcOpenConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte); 7241ab64890Smrg if (conv == NULL) 7251ab64890Smrg return False; 7261ab64890Smrg XOC_GENERIC(oc)->wcs_to_cs = conv; 7271ab64890Smrg } else 7281ab64890Smrg _XlcResetConverter(conv); 7291ab64890Smrg 7301ab64890Smrg ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to, 7311ab64890Smrg &to_left, NULL, 0); 7321ab64890Smrg if (ret != 0 || length > 0) 7331ab64890Smrg return False; 73461b2299dSmrg 7351ab64890Smrg return True; 7361ab64890Smrg} 7371ab64890Smrg 7381ab64890Smrgstatic int 7391ab64890Smrg_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length) 7401ab64890Smrg{ 7411ab64890Smrg return XTextWidth(*oc->core.font_info.font_struct_list, text, length); 7421ab64890Smrg} 7431ab64890Smrg 7441ab64890Smrgstatic int 7451ab64890Smrg_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length) 7461ab64890Smrg{ 7471ab64890Smrg DefineLocalBuf; 7481ab64890Smrg char *buf = AllocLocalBuf(length); 7491ab64890Smrg int ret = 0; 7501ab64890Smrg 7511ab64890Smrg if (buf == NULL) 7521ab64890Smrg return 0; 7531ab64890Smrg 7541ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 7551ab64890Smrg goto err; 7561ab64890Smrg 7571ab64890Smrg ret = _XmbDefaultTextEscapement(oc, buf, length); 7581ab64890Smrg 7591ab64890Smrgerr: 7601ab64890Smrg FreeLocalBuf(buf); 7611ab64890Smrg 7621ab64890Smrg return ret; 7631ab64890Smrg} 7641ab64890Smrg 7651ab64890Smrgstatic int 7661ab64890Smrg_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length, 7671ab64890Smrg XRectangle *overall_ink, XRectangle *overall_logical) 7681ab64890Smrg{ 7691ab64890Smrg int direction, logical_ascent, logical_descent; 7701ab64890Smrg XCharStruct overall; 7711ab64890Smrg 7721ab64890Smrg XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction, 7731ab64890Smrg &logical_ascent, &logical_descent, &overall); 7741ab64890Smrg 7751ab64890Smrg if (overall_ink) { 7761ab64890Smrg overall_ink->x = overall.lbearing; 7771ab64890Smrg overall_ink->y = -(overall.ascent); 7781ab64890Smrg overall_ink->width = overall.rbearing - overall.lbearing; 7791ab64890Smrg overall_ink->height = overall.ascent + overall.descent; 7801ab64890Smrg } 7811ab64890Smrg 7821ab64890Smrg if (overall_logical) { 7831ab64890Smrg overall_logical->x = 0; 7841ab64890Smrg overall_logical->y = -(logical_ascent); 7851ab64890Smrg overall_logical->width = overall.width; 7861ab64890Smrg overall_logical->height = logical_ascent + logical_descent; 7871ab64890Smrg } 7881ab64890Smrg 7891ab64890Smrg return overall.width; 7901ab64890Smrg} 7911ab64890Smrg 7921ab64890Smrgstatic int 7931ab64890Smrg_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length, 7941ab64890Smrg XRectangle *overall_ink, XRectangle *overall_logical) 7951ab64890Smrg{ 7961ab64890Smrg DefineLocalBuf; 7971ab64890Smrg char *buf = AllocLocalBuf(length); 7981ab64890Smrg int ret = 0; 7991ab64890Smrg 8001ab64890Smrg if (buf == NULL) 8011ab64890Smrg return 0; 8021ab64890Smrg 8031ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 8041ab64890Smrg goto err; 8051ab64890Smrg 8061ab64890Smrg ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical); 8071ab64890Smrg 8081ab64890Smrgerr: 8091ab64890Smrg FreeLocalBuf(buf); 8101ab64890Smrg 8111ab64890Smrg return ret; 8121ab64890Smrg} 8131ab64890Smrg 8141ab64890Smrgstatic Status 8151ab64890Smrg_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length, 8161ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 8171ab64890Smrg int buf_size, int *num_chars, 8181ab64890Smrg XRectangle *overall_ink, 8191ab64890Smrg XRectangle *overall_logical) 8201ab64890Smrg{ 8211ab64890Smrg XFontStruct *font = *oc->core.font_info.font_struct_list; 8221ab64890Smrg XCharStruct *def, *cs, overall; 8231ab64890Smrg Bool first = True; 8241ab64890Smrg 8251ab64890Smrg if (buf_size < length) 8261ab64890Smrg return 0; 8271ab64890Smrg 8281ab64890Smrg bzero((char *) &overall, sizeof(XCharStruct)); 8291ab64890Smrg *num_chars = 0; 8301ab64890Smrg 8311ab64890Smrg CI_GET_DEFAULT_INFO_1D(font, def) 8321ab64890Smrg 8331ab64890Smrg while (length-- > 0) { 8341ab64890Smrg CI_GET_CHAR_INFO_1D(font, *text, def, cs) 8351ab64890Smrg text++; 8361ab64890Smrg if (cs == NULL) 8371ab64890Smrg continue; 8381ab64890Smrg 8391ab64890Smrg ink_buf->x = overall.width + cs->lbearing; 8401ab64890Smrg ink_buf->y = -(cs->ascent); 8411ab64890Smrg ink_buf->width = cs->rbearing - cs->lbearing; 8421ab64890Smrg ink_buf->height = cs->ascent + cs->descent; 8431ab64890Smrg ink_buf++; 8441ab64890Smrg 8451ab64890Smrg logical_buf->x = overall.width; 8461ab64890Smrg logical_buf->y = -(font->ascent); 8471ab64890Smrg logical_buf->width = cs->width; 8481ab64890Smrg logical_buf->height = font->ascent + font->descent; 8491ab64890Smrg logical_buf++; 8501ab64890Smrg 8511ab64890Smrg if (first) { 8521ab64890Smrg overall = *cs; 8531ab64890Smrg first = False; 8541ab64890Smrg } else { 8551ab64890Smrg overall.ascent = max(overall.ascent, cs->ascent); 8561ab64890Smrg overall.descent = max(overall.descent, cs->descent); 8571ab64890Smrg overall.lbearing = min(overall.lbearing, overall.width + 8581ab64890Smrg cs->lbearing); 8591ab64890Smrg overall.rbearing = max(overall.rbearing, overall.width + 8601ab64890Smrg cs->rbearing); 8611ab64890Smrg overall.width += cs->width; 8621ab64890Smrg } 86361b2299dSmrg (*num_chars)++; 8641ab64890Smrg } 8651ab64890Smrg 8661ab64890Smrg if (overall_ink) { 8671ab64890Smrg overall_ink->x = overall.lbearing; 8681ab64890Smrg overall_ink->y = -(overall.ascent); 8691ab64890Smrg overall_ink->width = overall.rbearing - overall.lbearing; 8701ab64890Smrg overall_ink->height = overall.ascent + overall.descent; 8711ab64890Smrg } 8721ab64890Smrg 8731ab64890Smrg if (overall_logical) { 8741ab64890Smrg overall_logical->x = 0; 8751ab64890Smrg overall_logical->y = -(font->ascent); 8761ab64890Smrg overall_logical->width = overall.width; 8771ab64890Smrg overall_logical->height = font->ascent + font->descent; 8781ab64890Smrg } 8791ab64890Smrg 8801ab64890Smrg return 1; 8811ab64890Smrg} 8821ab64890Smrg 8831ab64890Smrgstatic Status 8841ab64890Smrg_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length, 8851ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 8861ab64890Smrg int buf_size, int *num_chars, 8871ab64890Smrg XRectangle *overall_ink, 8881ab64890Smrg XRectangle *overall_logical) 8891ab64890Smrg{ 8901ab64890Smrg DefineLocalBuf; 8911ab64890Smrg char *buf = AllocLocalBuf(length); 8921ab64890Smrg Status ret = 0; 8931ab64890Smrg 8941ab64890Smrg if (buf == NULL) 8951ab64890Smrg return 0; 8961ab64890Smrg 8971ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 8981ab64890Smrg goto err; 8991ab64890Smrg 9001ab64890Smrg ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf, 9011ab64890Smrg buf_size, num_chars, overall_ink, 9021ab64890Smrg overall_logical); 9031ab64890Smrg 9041ab64890Smrgerr: 9051ab64890Smrg FreeLocalBuf(buf); 9061ab64890Smrg 9071ab64890Smrg return ret; 9081ab64890Smrg} 9091ab64890Smrg 9101ab64890Smrgstatic int 9111ab64890Smrg_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y, 9121ab64890Smrg _Xconst char *text, int length) 9131ab64890Smrg{ 9141ab64890Smrg XFontStruct *font = *oc->core.font_info.font_struct_list; 9151ab64890Smrg 9161ab64890Smrg XSetFont(dpy, gc, font->fid); 9171ab64890Smrg XDrawString(dpy, d, gc, x, y, text, length); 9181ab64890Smrg 9191ab64890Smrg return XTextWidth(font, text, length); 9201ab64890Smrg} 9211ab64890Smrg 9221ab64890Smrgstatic int 9231ab64890Smrg_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y, 9241ab64890Smrg _Xconst wchar_t *text, int length) 9251ab64890Smrg{ 9261ab64890Smrg DefineLocalBuf; 9271ab64890Smrg char *buf = AllocLocalBuf(length); 9281ab64890Smrg int ret = 0; 9291ab64890Smrg 9301ab64890Smrg if (buf == NULL) 9311ab64890Smrg return 0; 9321ab64890Smrg 9331ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 9341ab64890Smrg goto err; 9351ab64890Smrg 9361ab64890Smrg ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length); 9371ab64890Smrg 9381ab64890Smrgerr: 9391ab64890Smrg FreeLocalBuf(buf); 9401ab64890Smrg 9411ab64890Smrg return ret; 9421ab64890Smrg} 9431ab64890Smrg 9441ab64890Smrgstatic void 9451ab64890Smrg_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x, 9461ab64890Smrg int y, _Xconst char *text, int length) 9471ab64890Smrg{ 9481ab64890Smrg XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid); 9491ab64890Smrg XDrawImageString(dpy, d, gc, x, y, text, length); 9501ab64890Smrg} 9511ab64890Smrg 9521ab64890Smrgstatic void 9531ab64890Smrg_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x, 9541ab64890Smrg int y, _Xconst wchar_t *text, int length) 9551ab64890Smrg{ 9561ab64890Smrg DefineLocalBuf; 9571ab64890Smrg char *buf = AllocLocalBuf(length); 9581ab64890Smrg 9591ab64890Smrg if (buf == NULL) 9601ab64890Smrg return; 9611ab64890Smrg 9621ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 9631ab64890Smrg goto err; 9641ab64890Smrg 9651ab64890Smrg _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length); 9661ab64890Smrg 9671ab64890Smrgerr: 9681ab64890Smrg FreeLocalBuf(buf); 9691ab64890Smrg} 9701ab64890Smrg 9711ab64890Smrgstatic _Xconst XOCMethodsRec oc_default_methods = { 9721ab64890Smrg destroy_oc, 9731ab64890Smrg set_oc_values, 9741ab64890Smrg get_oc_values, 9751ab64890Smrg _XmbDefaultTextEscapement, 9761ab64890Smrg _XmbDefaultTextExtents, 9771ab64890Smrg _XmbDefaultTextPerCharExtents, 9781ab64890Smrg _XmbDefaultDrawString, 9791ab64890Smrg _XmbDefaultDrawImageString, 9801ab64890Smrg _XwcDefaultTextEscapement, 9811ab64890Smrg _XwcDefaultTextExtents, 9821ab64890Smrg _XwcDefaultTextPerCharExtents, 9831ab64890Smrg _XwcDefaultDrawString, 9841ab64890Smrg _XwcDefaultDrawImageString 9851ab64890Smrg}; 9861ab64890Smrg 9871ab64890Smrgstatic XlcResource oc_resources[] = { 9881ab64890Smrg { XNBaseFontName, NULLQUARK, sizeof(char *), 9891ab64890Smrg XOffsetOf(XOCRec, core.base_name_list), XlcCreateMask | XlcGetMask }, 9901ab64890Smrg { XNOMAutomatic, NULLQUARK, sizeof(Bool), 9911ab64890Smrg XOffsetOf(XOCRec, core.om_automatic), XlcGetMask }, 9921ab64890Smrg { XNMissingCharSet, NULLQUARK, sizeof(XOMCharSetList), 9931ab64890Smrg XOffsetOf(XOCRec, core.missing_list), XlcGetMask }, 9941ab64890Smrg { XNDefaultString, NULLQUARK, sizeof(char *), 9951ab64890Smrg XOffsetOf(XOCRec, core.default_string), XlcGetMask }, 9961ab64890Smrg { XNOrientation, NULLQUARK, sizeof(XOrientation), 9971ab64890Smrg XOffsetOf(XOCRec, core.orientation), XlcSetMask | XlcGetMask }, 9981ab64890Smrg { XNResourceName, NULLQUARK, sizeof(char *), 9991ab64890Smrg XOffsetOf(XOCRec, core.res_name), XlcSetMask | XlcGetMask }, 10001ab64890Smrg { XNResourceClass, NULLQUARK, sizeof(char *), 10011ab64890Smrg XOffsetOf(XOCRec, core.res_class), XlcSetMask | XlcGetMask }, 10021ab64890Smrg { XNFontInfo, NULLQUARK, sizeof(XOMFontInfo), 10031ab64890Smrg XOffsetOf(XOCRec, core.font_info), XlcGetMask } 10041ab64890Smrg}; 10051ab64890Smrg 10061ab64890Smrgstatic XOC 10071ab64890Smrgcreate_oc( 10081ab64890Smrg XOM om, 10091ab64890Smrg XlcArgList args, 10101ab64890Smrg int num_args) 10111ab64890Smrg{ 10121ab64890Smrg XOC oc; 10131ab64890Smrg 10141ab64890Smrg oc = (XOC) Xmalloc(sizeof(XOCGenericRec)); 10151ab64890Smrg if (oc == NULL) 10161ab64890Smrg return (XOC) NULL; 10171ab64890Smrg bzero((char *) oc, sizeof(XOCGenericRec)); 101861b2299dSmrg 10191ab64890Smrg oc->core.om = om; 10201ab64890Smrg 10211ab64890Smrg if (oc_resources[0].xrm_name == NULLQUARK) 10221ab64890Smrg _XlcCompileResourceList(oc_resources, XlcNumber(oc_resources)); 102361b2299dSmrg 10241ab64890Smrg if (_XlcSetValues((XPointer) oc, oc_resources, XlcNumber(oc_resources), 10251ab64890Smrg args, num_args, XlcCreateMask | XlcDefaultMask)) 10261ab64890Smrg goto err; 10271ab64890Smrg 10281ab64890Smrg if (oc->core.base_name_list == NULL) 10291ab64890Smrg goto err; 10301ab64890Smrg 10311ab64890Smrg oc->core.resources = oc_resources; 10321ab64890Smrg oc->core.num_resources = XlcNumber(oc_resources); 10331ab64890Smrg 10341ab64890Smrg if (create_fontset(oc) == False) 10351ab64890Smrg goto err; 10361ab64890Smrg 10371ab64890Smrg oc->methods = (XOCMethods)&oc_default_methods; 10381ab64890Smrg 10391ab64890Smrg return oc; 10401ab64890Smrg 10411ab64890Smrgerr: 10421ab64890Smrg destroy_oc(oc); 10431ab64890Smrg 10441ab64890Smrg return (XOC) NULL; 10451ab64890Smrg} 10461ab64890Smrg 10471ab64890Smrgstatic Status 10481ab64890Smrgclose_om( 10491ab64890Smrg XOM om) 10501ab64890Smrg{ 10511ab64890Smrg XOMGenericPart *gen = XOM_GENERIC(om); 10521ab64890Smrg OMData data; 10531ab64890Smrg FontData font_data; 10541ab64890Smrg int count; 10551ab64890Smrg 10561ab64890Smrg if ((data = gen->data)) { 10571ab64890Smrg if (data->font_data) { 10581ab64890Smrg for (font_data = data->font_data, count = data->font_data_count; 105961b2299dSmrg count-- > 0 ; font_data++) { 10601ab64890Smrg if (font_data->name) 10611ab64890Smrg Xfree(font_data->name); 10621ab64890Smrg } 10631ab64890Smrg Xfree(data->font_data); 10641ab64890Smrg } 10651ab64890Smrg Xfree(gen->data); 10661ab64890Smrg } 10671ab64890Smrg 10681ab64890Smrg if (om->core.res_name) 10691ab64890Smrg Xfree(om->core.res_name); 10701ab64890Smrg if (om->core.res_class) 10711ab64890Smrg Xfree(om->core.res_class); 10721ab64890Smrg if (om->core.required_charset.charset_list) 10731ab64890Smrg XFreeStringList(om->core.required_charset.charset_list); 10741ab64890Smrg else 10751ab64890Smrg Xfree((char*)om->core.required_charset.charset_list); 10761ab64890Smrg if (om->core.orientation_list.orientation) 10771ab64890Smrg Xfree(om->core.orientation_list.orientation); 10781ab64890Smrg 10791ab64890Smrg Xfree(om); 10801ab64890Smrg 10811ab64890Smrg return 1; 10821ab64890Smrg} 10831ab64890Smrg 10841ab64890Smrgstatic char * 10851ab64890Smrgset_om_values( 10861ab64890Smrg XOM om, 10871ab64890Smrg XlcArgList args, 10881ab64890Smrg int num_args) 10891ab64890Smrg{ 10901ab64890Smrg if (om->core.resources == NULL) 10911ab64890Smrg return NULL; 10921ab64890Smrg 10931ab64890Smrg return _XlcSetValues((XPointer) om, om->core.resources, 10941ab64890Smrg om->core.num_resources, args, num_args, XlcSetMask); 10951ab64890Smrg} 10961ab64890Smrg 10971ab64890Smrgstatic char * 10981ab64890Smrgget_om_values( 10991ab64890Smrg XOM om, 11001ab64890Smrg XlcArgList args, 11011ab64890Smrg int num_args) 11021ab64890Smrg{ 11031ab64890Smrg if (om->core.resources == NULL) 11041ab64890Smrg return NULL; 11051ab64890Smrg 11061ab64890Smrg return _XlcGetValues((XPointer) om, om->core.resources, 11071ab64890Smrg om->core.num_resources, args, num_args, XlcGetMask); 11081ab64890Smrg} 11091ab64890Smrg 11101ab64890Smrgstatic _Xconst XOMMethodsRec methods = { 11111ab64890Smrg close_om, 11121ab64890Smrg set_om_values, 11131ab64890Smrg get_om_values, 11141ab64890Smrg create_oc 11151ab64890Smrg}; 11161ab64890Smrg 11171ab64890Smrgstatic XlcResource om_resources[] = { 11181ab64890Smrg { XNRequiredCharSet, NULLQUARK, sizeof(XOMCharSetList), 11191ab64890Smrg XOffsetOf(XOMRec, core.required_charset), XlcGetMask }, 11201ab64890Smrg { XNQueryOrientation, NULLQUARK, sizeof(XOMOrientation), 11211ab64890Smrg XOffsetOf(XOMRec, core.orientation_list), XlcGetMask }, 11221ab64890Smrg { XNDirectionalDependentDrawing, NULLQUARK, sizeof(Bool), 11231ab64890Smrg XOffsetOf(XOMRec, core.directional_dependent), XlcGetMask }, 11241ab64890Smrg { XNContextualDrawing, NULLQUARK, sizeof(Bool), 11251ab64890Smrg XOffsetOf(XOMRec, core.contextual_drawing), XlcGetMask } 11261ab64890Smrg}; 11271ab64890Smrg 11281ab64890Smrgstatic OMData 11291ab64890Smrgadd_data( 11301ab64890Smrg XOM om) 11311ab64890Smrg{ 11321ab64890Smrg XOMGenericPart *gen = XOM_GENERIC(om); 11331ab64890Smrg OMData new; 11341ab64890Smrg 11351ab64890Smrg new = (OMData) Xmalloc(sizeof(OMDataRec)); 11361ab64890Smrg 11371ab64890Smrg if (new == NULL) 11381ab64890Smrg return NULL; 11391ab64890Smrg 11401ab64890Smrg gen->data = new; 11411ab64890Smrg 11421ab64890Smrg bzero((char *) new, sizeof(OMDataRec)); 11431ab64890Smrg 11441ab64890Smrg return new; 11451ab64890Smrg} 11461ab64890Smrg 11471ab64890Smrgstatic _Xconst char *supported_charset_list[] = { 11481ab64890Smrg "ISO8859-1", 11491ab64890Smrg/* fix for bug4332979 */ 11501ab64890Smrg "adobe-fontspecific", 11511ab64890Smrg/* fix for bug4237353: "JISX0201.1976-0" entry should be removed from 11521ab64890Smrg supported_charset_list because it is not a supported_charset for C locale 11531ab64890Smrg "JISX0201.1976-0", */ 11541ab64890Smrg "SUNOLCURSOR-1", 11551ab64890Smrg "SUNOLGLYPH-1" 11561ab64890Smrg}; 115761b2299dSmrg 11581ab64890Smrgstatic Bool 11591ab64890Smrginit_om( 11601ab64890Smrg XOM om) 11611ab64890Smrg{ 11621ab64890Smrg XOMGenericPart *gen = XOM_GENERIC(om); 11631ab64890Smrg OMData data; 11641ab64890Smrg FontData font_data; 11651ab64890Smrg char **required_list; 11661ab64890Smrg XOrientation *orientation; 11671ab64890Smrg char **value, buf[BUFSIZ], *bufptr; 11681ab64890Smrg int count, length = 0; 11691ab64890Smrg 11701ab64890Smrg value = (char**)supported_charset_list; 11711ab64890Smrg count = XlcNumber(supported_charset_list); 11721ab64890Smrg 11731ab64890Smrg data = add_data(om); 11741ab64890Smrg if (data == NULL) 11751ab64890Smrg return False; 11761ab64890Smrg 11771ab64890Smrg font_data = (FontData) Xmalloc(sizeof(FontDataRec) * count); 11781ab64890Smrg if (font_data == NULL) 11791ab64890Smrg return False; 11801ab64890Smrg bzero((char *) font_data, sizeof(FontDataRec) * count); 11811ab64890Smrg data->font_data = font_data; 11821ab64890Smrg data->font_data_count = count; 11831ab64890Smrg 11841ab64890Smrg for ( ; count-- > 0; font_data++) { 11851ab64890Smrg/* 11861ab64890Smrg1266793 11871ab64890SmrgThis one is fine. *value points to one of the local strings in 11881ab64890Smrgsupported_charset_list[]. 11891ab64890Smrg*/ 11901ab64890Smrg strcpy(buf, *value++); 11911ab64890Smrg font_data->name = (char *) Xmalloc(strlen(buf) + 1); 11921ab64890Smrg if (font_data->name == NULL) 11931ab64890Smrg return False; 11941ab64890Smrg strcpy(font_data->name, buf); 11951ab64890Smrg } 11961ab64890Smrg 11971ab64890Smrg length += strlen(data->font_data->name) + 1; 11981ab64890Smrg 11991ab64890Smrg /* required charset list */ 12001ab64890Smrg required_list = (char **) Xmalloc(sizeof(char *)); 12011ab64890Smrg if (required_list == NULL) 12021ab64890Smrg return False; 12031ab64890Smrg 12041ab64890Smrg bufptr = (char *) Xmalloc(length); 12051ab64890Smrg if (bufptr == NULL) { 12061ab64890Smrg Xfree(required_list); 12071ab64890Smrg return False; 12081ab64890Smrg } 12091ab64890Smrg 12101ab64890Smrg om->core.required_charset.charset_list = required_list; 12111ab64890Smrg om->core.required_charset.charset_count = 1; /* always 1 */ 12121ab64890Smrg 12131ab64890Smrg data = gen->data; 12141ab64890Smrg 12151ab64890Smrg strcpy(bufptr, data->font_data->name); 12161ab64890Smrg *required_list++ = bufptr; 12171ab64890Smrg bufptr += strlen(bufptr) + 1; 12181ab64890Smrg 12191ab64890Smrg /* orientation list */ 12201ab64890Smrg orientation = (XOrientation *) Xmalloc(sizeof(XOrientation)); 12211ab64890Smrg if (orientation == NULL) 12221ab64890Smrg return False; 12231ab64890Smrg 12241ab64890Smrg *orientation = XOMOrientation_LTR_TTB; 12251ab64890Smrg om->core.orientation_list.orientation = orientation; 12261ab64890Smrg om->core.orientation_list.num_orientation = 1; 12271ab64890Smrg 12281ab64890Smrg /* directional dependent drawing */ 12291ab64890Smrg om->core.directional_dependent = False; 12301ab64890Smrg 12311ab64890Smrg /* contexual drawing */ 12321ab64890Smrg om->core.contextual_drawing = False; 12331ab64890Smrg 12341ab64890Smrg /* context dependent */ 12351ab64890Smrg om->core.context_dependent = False; 12361ab64890Smrg 12371ab64890Smrg return True; 12381ab64890Smrg} 12391ab64890Smrg 12401ab64890SmrgXOM 12411ab64890Smrg_XDefaultOpenOM(XLCd lcd, Display *dpy, XrmDatabase rdb, 12421ab64890Smrg _Xconst char *res_name, _Xconst char *res_class) 12431ab64890Smrg{ 12441ab64890Smrg XOM om; 12451ab64890Smrg 12461ab64890Smrg om = (XOM) Xmalloc(sizeof(XOMGenericRec)); 12471ab64890Smrg if (om == NULL) 12481ab64890Smrg return (XOM) NULL; 12491ab64890Smrg bzero((char *) om, sizeof(XOMGenericRec)); 125061b2299dSmrg 12511ab64890Smrg om->methods = (XOMMethods)&methods; 12521ab64890Smrg om->core.lcd = lcd; 12531ab64890Smrg om->core.display = dpy; 12541ab64890Smrg om->core.rdb = rdb; 12551ab64890Smrg if (res_name) { 12561ab64890Smrg om->core.res_name = (char *)Xmalloc(strlen(res_name) + 1); 12571ab64890Smrg if (om->core.res_name == NULL) 12581ab64890Smrg goto err; 12591ab64890Smrg strcpy(om->core.res_name, res_name); 12601ab64890Smrg } 12611ab64890Smrg if (res_class) { 12621ab64890Smrg om->core.res_class = (char *)Xmalloc(strlen(res_class) + 1); 12631ab64890Smrg if (om->core.res_class == NULL) 12641ab64890Smrg goto err; 12651ab64890Smrg strcpy(om->core.res_class, res_class); 12661ab64890Smrg } 12671ab64890Smrg 12681ab64890Smrg if (om_resources[0].xrm_name == NULLQUARK) 12691ab64890Smrg _XlcCompileResourceList(om_resources, XlcNumber(om_resources)); 127061b2299dSmrg 12711ab64890Smrg om->core.resources = om_resources; 12721ab64890Smrg om->core.num_resources = XlcNumber(om_resources); 12731ab64890Smrg 12741ab64890Smrg if (init_om(om) == False) 12751ab64890Smrg goto err; 12761ab64890Smrg 12771ab64890Smrg return om; 12781ab64890Smrgerr: 12791ab64890Smrg close_om(om); 12801ab64890Smrg 12811ab64890Smrg return (XOM) NULL; 12821ab64890Smrg} 1283