aboutsummaryrefslogtreecommitdiff
path: root/xkbcomp/misc.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2009-06-28 22:07:26 +0000
committermarha <marha@users.sourceforge.net>2009-06-28 22:07:26 +0000
commit3562e78743202e43aec8727005182a2558117eca (patch)
tree8f9113a77d12470c5c851a2a8e4cb02e89df7d43 /xkbcomp/misc.c
downloadvcxsrv-3562e78743202e43aec8727005182a2558117eca.tar.gz
vcxsrv-3562e78743202e43aec8727005182a2558117eca.tar.bz2
vcxsrv-3562e78743202e43aec8727005182a2558117eca.zip
Checked in the following released items:
xkeyboard-config-1.4.tar.gz ttf-bitstream-vera-1.10.tar.gz font-alias-1.0.1.tar.gz font-sun-misc-1.0.0.tar.gz font-sun-misc-1.0.0.tar.gz font-sony-misc-1.0.0.tar.gz font-schumacher-misc-1.0.0.tar.gz font-mutt-misc-1.0.0.tar.gz font-misc-misc-1.0.0.tar.gz font-misc-meltho-1.0.0.tar.gz font-micro-misc-1.0.0.tar.gz font-jis-misc-1.0.0.tar.gz font-isas-misc-1.0.0.tar.gz font-dec-misc-1.0.0.tar.gz font-daewoo-misc-1.0.0.tar.gz font-cursor-misc-1.0.0.tar.gz font-arabic-misc-1.0.0.tar.gz font-winitzki-cyrillic-1.0.0.tar.gz font-misc-cyrillic-1.0.0.tar.gz font-cronyx-cyrillic-1.0.0.tar.gz font-screen-cyrillic-1.0.1.tar.gz font-xfree86-type1-1.0.1.tar.gz font-adobe-utopia-type1-1.0.1.tar.gz font-ibm-type1-1.0.0.tar.gz font-bitstream-type1-1.0.0.tar.gz font-bitstream-speedo-1.0.0.tar.gz font-bh-ttf-1.0.0.tar.gz font-bh-type1-1.0.0.tar.gz font-bitstream-100dpi-1.0.0.tar.gz font-bh-lucidatypewriter-100dpi-1.0.0.tar.gz font-bh-100dpi-1.0.0.tar.gz font-adobe-utopia-100dpi-1.0.1.tar.gz font-adobe-100dpi-1.0.0.tar.gz font-util-1.0.1.tar.gz font-bitstream-75dpi-1.0.0.tar.gz font-bh-lucidatypewriter-75dpi-1.0.0.tar.gz font-adobe-utopia-75dpi-1.0.1.tar.gz font-bh-75dpi-1.0.0.tar.gz bdftopcf-1.0.1.tar.gz font-adobe-75dpi-1.0.0.tar.gz mkfontscale-1.0.6.tar.gz openssl-0.9.8k.tar.gz bigreqsproto-1.0.2.tar.gz xtrans-1.2.2.tar.gz resourceproto-1.0.2.tar.gz inputproto-1.4.4.tar.gz compositeproto-0.4.tar.gz damageproto-1.1.0.tar.gz zlib-1.2.3.tar.gz xkbcomp-1.0.5.tar.gz freetype-2.3.9.tar.gz pthreads-w32-2-8-0-release.tar.gz pixman-0.12.0.tar.gz kbproto-1.0.3.tar.gz evieext-1.0.2.tar.gz fixesproto-4.0.tar.gz recordproto-1.13.2.tar.gz randrproto-1.2.2.tar.gz scrnsaverproto-1.1.0.tar.gz renderproto-0.9.3.tar.gz xcmiscproto-1.1.2.tar.gz fontsproto-2.0.2.tar.gz xextproto-7.0.3.tar.gz xproto-7.0.14.tar.gz libXdmcp-1.0.2.tar.gz libxkbfile-1.0.5.tar.gz libfontenc-1.0.4.tar.gz libXfont-1.3.4.tar.gz libX11-1.1.5.tar.gz libXau-1.0.4.tar.gz libxcb-1.1.tar.gz xorg-server-1.5.3.tar.gz
Diffstat (limited to 'xkbcomp/misc.c')
-rw-r--r--xkbcomp/misc.c502
1 files changed, 502 insertions, 0 deletions
diff --git a/xkbcomp/misc.c b/xkbcomp/misc.c
new file mode 100644
index 000000000..91688f739
--- /dev/null
+++ b/xkbcomp/misc.c
@@ -0,0 +1,502 @@
+/* $Xorg: misc.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be
+ used in advertising or publicity pertaining to distribution
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/misc.c,v 3.4 2001/01/17 23:45:44 dawes Exp $ */
+
+#include "xkbcomp.h"
+#include "xkbpath.h"
+#include "tokens.h"
+#include "keycodes.h"
+#include "misc.h"
+#include <X11/keysym.h>
+#include "parseutils.h"
+
+#include <X11/extensions/XKBgeom.h>
+
+/***====================================================================***/
+
+Bool
+ProcessIncludeFile( IncludeStmt * stmt,
+ unsigned file_type,
+ XkbFile ** file_rtrn,
+ unsigned * merge_rtrn)
+{
+FILE *file;
+XkbFile *rtrn,*mapToUse;
+char oldFile[1024];
+int oldLine = lineNum;
+
+ rtrn= XkbFindFileInCache(stmt->file,file_type,&stmt->path);
+ if (rtrn==NULL) {
+ file= XkbFindFileInPath(stmt->file,file_type,&stmt->path);
+ if (file==NULL) {
+ ERROR2("Can't find file \"%s\" for %s include\n",stmt->file,
+ XkbDirectoryForInclude(file_type));
+ ACTION("Exiting\n");
+ return False;
+ }
+ strcpy(oldFile,scanFile);
+ oldLine= lineNum;
+ setScanState(stmt->file,1);
+ if (debugFlags&2)
+ INFO1("About to parse include file %s\n",stmt->file);
+ if ((XKBParseFile(file,&rtrn)==0)||(rtrn==NULL)) {
+ setScanState(oldFile,oldLine);
+ ERROR1("Error interpreting include file \"%s\"\n",stmt->file);
+ ACTION("Exiting\n");
+ fclose(file);
+ return False;
+ }
+ fclose(file);
+ XkbAddFileToCache(stmt->file,file_type,stmt->path,rtrn);
+ }
+ mapToUse= rtrn;
+ if (stmt->map!=NULL) {
+ while ((mapToUse)&&((!uStringEqual(mapToUse->name,stmt->map))||
+ (mapToUse->type!=file_type))) {
+ mapToUse= (XkbFile *)mapToUse->common.next;
+ }
+ if (!mapToUse) {
+ ERROR3("No %s named \"%s\" in the include file \"%s\"\n",
+ XkbConfigText(file_type,XkbMessage),
+ stmt->map,stmt->file);
+ ACTION("Exiting\n");
+ return False;
+ }
+ }
+ else if ((rtrn->common.next!=NULL)&&(warningLevel>5)) {
+ WARN1("No map in include statement, but \"%s\" contains several\n",
+ stmt->file);
+ ACTION1("Using first defined map, \"%s\"\n",rtrn->name);
+ }
+ setScanState(oldFile,oldLine);
+ if (mapToUse->type!=file_type) {
+ ERROR2("Include file wrong type (expected %s, got %s)\n",
+ XkbConfigText(file_type,XkbMessage),
+ XkbConfigText(mapToUse->type,XkbMessage));
+ ACTION1("Include file \"%s\" ignored\n",stmt->file);
+ return False;
+ }
+ /* FIXME: we have to check recursive includes here (or somewhere) */
+
+ mapToUse->compiled= True;
+ *file_rtrn= mapToUse;
+ *merge_rtrn= stmt->merge;
+ return True;
+}
+
+/***====================================================================***/
+
+int
+ReportNotArray(const char *type, const char *field, const char *name)
+{
+ ERROR2("The %s %s field is not an array\n",type,field);
+ ACTION1("Ignoring illegal assignment in %s\n",name);
+ return False;
+}
+
+int
+ReportShouldBeArray(const char *type, const char *field, char *name)
+{
+ ERROR2("Missing subscript for %s %s\n",type,field);
+ ACTION1("Ignoring illegal assignment in %s\n",name);
+ return False;
+}
+
+int
+ReportBadType(const char *type, const char *field,
+ const char *name, const char *wanted)
+{
+ ERROR3("The %s %s field must be a %s\n",type,field,wanted);
+ ACTION1("Ignoring illegal assignment in %s\n",name);
+ return False;
+}
+
+int
+ReportBadIndexType(char *type,char *field,char *name,char *wanted)
+{
+ ERROR3("Index for the %s %s field must be a %s\n",type,field,wanted);
+ ACTION1("Ignoring assignment to illegal field in %s\n",name);
+ return False;
+}
+
+int
+ReportBadField(const char *type, const char *field, const char *name)
+{
+ ERROR3("Unknown %s field %s in %s\n",type,field,name);
+ ACTION1("Ignoring assignment to unknown field in %s\n",name);
+ return False;
+}
+
+int
+ReportMultipleDefs(char *type,char *field,char *name)
+{
+ WARN3("Multiple definitions of %s in %s \"%s\"\n",field,type,name);
+ ACTION("Using last definition\n");
+ return False;
+}
+
+/***====================================================================***/
+
+Bool
+UseNewField( unsigned field,
+ CommonInfo * oldDefs,
+ CommonInfo * newDefs,
+ unsigned * pCollide)
+{
+Bool useNew;
+
+ useNew= False;
+ if (oldDefs->defined&field) {
+ if (newDefs->defined&field) {
+ if (((oldDefs->fileID==newDefs->fileID)&&(warningLevel>0))||
+ (warningLevel>9)) {
+ *pCollide|= field;
+ }
+ if (newDefs->merge!=MergeAugment)
+ useNew= True;
+ }
+ }
+ else if (newDefs->defined&field)
+ useNew= True;
+ return useNew;
+}
+
+Bool
+MergeNewField( unsigned field,
+ CommonInfo * oldDefs,
+ CommonInfo * newDefs,
+ unsigned * pCollide)
+{
+ if ((oldDefs->defined&field)&&(newDefs->defined&field)) {
+ if (((oldDefs->fileID==newDefs->fileID)&&(warningLevel>0))||
+ (warningLevel>9)) {
+ *pCollide|= field;
+ }
+ if (newDefs->merge==MergeAugment)
+ return True;
+ }
+ return False;
+}
+
+XPointer
+ClearCommonInfo(CommonInfo *cmn)
+{
+ if (cmn!=NULL) {
+ CommonInfo *this,*next;
+ for (this=cmn;this!=NULL;this=next) {
+ next= this->next;
+ uFree(this);
+ }
+ }
+ return NULL;
+}
+
+XPointer
+AddCommonInfo(CommonInfo *old,CommonInfo *new)
+{
+CommonInfo * first;
+
+ first= old;
+ while ( old && old->next ) {
+ old= old->next;
+ }
+ new->next= NULL;
+ if (old) {
+ old->next= new;
+ return (XPointer)first;
+ }
+ return (XPointer)new;
+}
+
+/***====================================================================***/
+
+typedef struct _KeyNameDesc {
+ KeySym level1;
+ KeySym level2;
+ char name[5];
+ Bool used;
+} KeyNameDesc;
+
+KeyNameDesc dfltKeys[] = {
+ { XK_Escape, NoSymbol, "ESC\0" },
+ { XK_quoteleft, XK_asciitilde, "TLDE" },
+ { XK_1, XK_exclam, "AE01" },
+ { XK_2, XK_at, "AE02" },
+ { XK_3, XK_numbersign, "AE03" },
+ { XK_4, XK_dollar, "AE04" },
+ { XK_5, XK_percent, "AE05" },
+ { XK_6, XK_asciicircum, "AE06" },
+ { XK_7, XK_ampersand, "AE07" },
+ { XK_8, XK_asterisk, "AE08" },
+ { XK_9, XK_parenleft, "AE09" },
+ { XK_0, XK_parenright, "AE10" },
+ { XK_minus, XK_underscore, "AE11" },
+ { XK_equal, XK_plus, "AE12" },
+ { XK_BackSpace, NoSymbol, "BKSP" },
+ { XK_Tab, NoSymbol, "TAB\0" },
+ { XK_q, XK_Q, "AD01" },
+ { XK_w, XK_W, "AD02" },
+ { XK_e, XK_E, "AD03" },
+ { XK_r, XK_R, "AD04" },
+ { XK_t, XK_T, "AD05" },
+ { XK_y, XK_Y, "AD06" },
+ { XK_u, XK_U, "AD07" },
+ { XK_i, XK_I, "AD08" },
+ { XK_o, XK_O, "AD09" },
+ { XK_p, XK_P, "AD10" },
+ { XK_bracketleft, XK_braceleft, "AD11" },
+ { XK_bracketright,XK_braceright, "AD12" },
+ { XK_Return, NoSymbol, "RTRN" },
+ { XK_Caps_Lock, NoSymbol, "CAPS" },
+ { XK_a, XK_A, "AC01" },
+ { XK_s, XK_S, "AC02" },
+ { XK_d, XK_D, "AC03" },
+ { XK_f, XK_F, "AC04" },
+ { XK_g, XK_G, "AC05" },
+ { XK_h, XK_H, "AC06" },
+ { XK_j, XK_J, "AC07" },
+ { XK_k, XK_K, "AC08" },
+ { XK_l, XK_L, "AC09" },
+ { XK_semicolon, XK_colon, "AC10" },
+ { XK_quoteright, XK_quotedbl, "AC11" },
+ { XK_Shift_L, NoSymbol, "LFSH" },
+ { XK_z, XK_Z, "AB01" },
+ { XK_x, XK_X, "AB02" },
+ { XK_c, XK_C, "AB03" },
+ { XK_v, XK_V, "AB04" },
+ { XK_b, XK_B, "AB05" },
+ { XK_n, XK_N, "AB06" },
+ { XK_m, XK_M, "AB07" },
+ { XK_comma, XK_less, "AB08" },
+ { XK_period, XK_greater, "AB09" },
+ { XK_slash, XK_question, "AB10" },
+ { XK_backslash, XK_bar, "BKSL" },
+ { XK_Control_L, NoSymbol, "LCTL" },
+ { XK_space, NoSymbol, "SPCE" },
+ { XK_Shift_R, NoSymbol, "RTSH" },
+ { XK_Alt_L, NoSymbol, "LALT" },
+ { XK_space, NoSymbol, "SPCE" },
+ { XK_Control_R, NoSymbol, "RCTL" },
+ { XK_Alt_R, NoSymbol, "RALT" },
+ { XK_F1, NoSymbol, "FK01" },
+ { XK_F2, NoSymbol, "FK02" },
+ { XK_F3, NoSymbol, "FK03" },
+ { XK_F4, NoSymbol, "FK04" },
+ { XK_F5, NoSymbol, "FK05" },
+ { XK_F6, NoSymbol, "FK06" },
+ { XK_F7, NoSymbol, "FK07" },
+ { XK_F8, NoSymbol, "FK08" },
+ { XK_F9, NoSymbol, "FK09" },
+ { XK_F10, NoSymbol, "FK10" },
+ { XK_F11, NoSymbol, "FK11" },
+ { XK_F12, NoSymbol, "FK12" },
+ { XK_Print, NoSymbol, "PRSC" },
+ { XK_Scroll_Lock, NoSymbol, "SCLK" },
+ { XK_Pause, NoSymbol, "PAUS" },
+ { XK_Insert, NoSymbol, "INS\0" },
+ { XK_Home, NoSymbol, "HOME" },
+ { XK_Prior, NoSymbol, "PGUP" },
+ { XK_Delete, NoSymbol, "DELE" },
+ { XK_End, NoSymbol, "END" },
+ { XK_Next, NoSymbol, "PGDN" },
+ { XK_Up, NoSymbol, "UP\0\0" },
+ { XK_Left, NoSymbol, "LEFT" },
+ { XK_Down, NoSymbol, "DOWN" },
+ { XK_Right, NoSymbol, "RGHT" },
+ { XK_Num_Lock, NoSymbol, "NMLK" },
+ { XK_KP_Divide, NoSymbol, "KPDV" },
+ { XK_KP_Multiply, NoSymbol, "KPMU" },
+ { XK_KP_Subtract, NoSymbol, "KPSU" },
+ { NoSymbol, XK_KP_7, "KP7\0" },
+ { NoSymbol, XK_KP_8, "KP8\0" },
+ { NoSymbol, XK_KP_9, "KP9\0" },
+ { XK_KP_Add, NoSymbol, "KPAD" },
+ { NoSymbol, XK_KP_4, "KP4\0" },
+ { NoSymbol, XK_KP_5, "KP5\0" },
+ { NoSymbol, XK_KP_6, "KP6\0" },
+ { NoSymbol, XK_KP_1, "KP1\0" },
+ { NoSymbol, XK_KP_2, "KP2\0" },
+ { NoSymbol, XK_KP_3, "KP3\0" },
+ { XK_KP_Enter, NoSymbol, "KPEN" },
+ { NoSymbol, XK_KP_0, "KP0\0" },
+ { XK_KP_Delete, NoSymbol, "KPDL" },
+ { XK_less, XK_greater, "LSGT" },
+ { XK_KP_Separator,NoSymbol, "KPCO" },
+ { XK_Find, NoSymbol, "FIND" },
+ { NoSymbol, NoSymbol, "\0\0\0\0" }
+};
+
+Status
+ComputeKbdDefaults(XkbDescPtr xkb)
+{
+Status rtrn;
+register int i,tmp,nUnknown;
+KeyNameDesc * name;
+KeySym * syms;
+
+ if ((xkb->names==NULL)||(xkb->names->keys==NULL)) {
+ if ((rtrn=XkbAllocNames(xkb,XkbKeyNamesMask,0,0))!=Success)
+ return rtrn;
+ }
+ for (name=dfltKeys;(name->name[0]!='\0');name++) {
+ name->used= False;
+ }
+ nUnknown= 0;
+ for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+ tmp= XkbKeyNumSyms(xkb,i);
+ if ((xkb->names->keys[i].name[0]=='\0')&&(tmp>0)) {
+ tmp= XkbKeyGroupsWidth(xkb,i);
+ syms= XkbKeySymsPtr(xkb,i);
+ for (name=dfltKeys;(name->name[0]!='\0');name++) {
+ Bool match= True;
+ if (((name->level1!=syms[0])&&(name->level1!=NoSymbol))||
+ ((name->level2!=NoSymbol)&&(tmp<2))||
+ ((name->level2!=syms[1])&&(name->level2!=NoSymbol))) {
+ match= False;
+ }
+ if (match) {
+ if (!name->used) {
+ memcpy(xkb->names->keys[i].name,name->name,
+ XkbKeyNameLength);
+ name->used= True;
+ }
+ else {
+ if (warningLevel>2) {
+ WARN1("Several keys match pattern for %s\n",
+ XkbKeyNameText(name->name,XkbMessage));
+ ACTION2("Using <U%03d> for key %d\n",nUnknown,i);
+ }
+ sprintf(xkb->names->keys[i].name,"U%03d",nUnknown++);
+ }
+ break;
+ }
+ }
+ if (xkb->names->keys[i].name[0]=='\0') {
+ if (warningLevel>2) {
+ WARN1("Key %d does not match any defaults\n",i);
+ ACTION1("Using name <U%03d>\n",nUnknown);
+ sprintf(xkb->names->keys[i].name,"U%03d",nUnknown++);
+ }
+ }
+ }
+ }
+ return Success;
+}
+
+Bool
+FindNamedKey( XkbDescPtr xkb,
+ unsigned long name,
+ unsigned int * kc_rtrn,
+ Bool use_aliases,
+ Bool create,
+ int start_from)
+{
+register unsigned n;
+
+ if (start_from<xkb->min_key_code) {
+ start_from= xkb->min_key_code;
+ }
+ else if (start_from>xkb->max_key_code) {
+ return False;
+ }
+
+ *kc_rtrn= 0; /* some callers rely on this */
+ if (xkb&&xkb->names&&xkb->names->keys) {
+ for (n=start_from;n<=xkb->max_key_code;n++) {
+ unsigned long tmp;
+ tmp= KeyNameToLong(xkb->names->keys[n].name);
+ if (tmp==name) {
+ *kc_rtrn= n;
+ return True;
+ }
+ }
+ if (use_aliases) {
+ unsigned long new_name;
+ if (FindKeyNameForAlias(xkb,name,&new_name))
+ return FindNamedKey(xkb,new_name,kc_rtrn,False,create,0);
+ }
+ }
+ if (create) {
+ if ((!xkb->names)||(!xkb->names->keys)) {
+ if (xkb->min_key_code<XkbMinLegalKeyCode) {
+ xkb->min_key_code= XkbMinLegalKeyCode;
+ xkb->max_key_code= XkbMaxLegalKeyCode;
+ }
+ if (XkbAllocNames(xkb,XkbKeyNamesMask,0,0)!=Success) {
+ if (warningLevel>0) {
+ WARN("Couldn't allocate key names in FindNamedKey\n");
+ ACTION1("Key \"%s\" not automatically created\n",
+ longText(name,XkbMessage));
+ }
+ return False;
+ }
+ }
+ for (n=xkb->min_key_code;n<=xkb->max_key_code;n++) {
+ if (xkb->names->keys[n].name[0]=='\0') {
+ char buf[XkbKeyNameLength+1];
+ LongToKeyName(name,buf);
+ memcpy(xkb->names->keys[n].name,buf,XkbKeyNameLength);
+ *kc_rtrn= n;
+ return True;
+ }
+ }
+ }
+ return False;
+}
+
+Bool
+FindKeyNameForAlias(XkbDescPtr xkb,unsigned long lname,unsigned long *real_name)
+{
+register int i;
+char name[XkbKeyNameLength+1];
+
+ if (xkb&&xkb->geom&&xkb->geom->key_aliases) {
+ XkbKeyAliasPtr a;
+ a= xkb->geom->key_aliases;
+ LongToKeyName(lname,name);
+ name[XkbKeyNameLength]= '\0';
+ for (i=0;i<xkb->geom->num_key_aliases;i++,a++) {
+ if (strncmp(name,a->alias,XkbKeyNameLength)==0) {
+ *real_name= KeyNameToLong(a->real);
+ return True;
+ }
+ }
+ }
+ if (xkb&&xkb->names&&xkb->names->key_aliases) {
+ XkbKeyAliasPtr a;
+ a= xkb->names->key_aliases;
+ LongToKeyName(lname,name);
+ name[XkbKeyNameLength]= '\0';
+ for (i=0;i<xkb->names->num_key_aliases;i++,a++) {
+ if (strncmp(name,a->alias,XkbKeyNameLength)==0) {
+ *real_name= KeyNameToLong(a->real);
+ return True;
+ }
+ }
+ }
+ return False;
+}