Blame tests/Auto/lib/Synth/info/BeginSession.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: BeginSession.c /main/7 1995/07/14 11:31:26 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/***********************************************************************
Packit b099d7
  	@(#)BeginSession.c	1.8	Date:03/04/91
Packit b099d7
  	Author: TAT
Packit b099d7
	History:
Packit b099d7
            05/24/90 SJS add to sccs
Packit b099d7
            08/30/90 SJS cosmetic changes, exit on error
Packit b099d7
            10/03/90 SJS make keycode initialization changes
Packit b099d7
	Calls:
Packit b099d7
Packit b099d7
	Summary:
Packit b099d7
            Initializes the input synthesis libraries local copies of display 
Packit b099d7
        and application context pointers.  It also sets up local-globals for
Packit b099d7
        the screen and the root_window, and establishes pointers to functions 
Packit b099d7
        which need to be defined external to this library.  This remote function
Packit b099d7
        referencing is necessary since this library has been designed to know
Packit b099d7
        nothing internally about the widget set which it interacts with.
Packit b099d7
Packit b099d7
	    One further addition is to do all the key code lookup *1* time.
Packit b099d7
	This is a change from looking the key codes up every time a keyclick
Packit b099d7
	needs to be done.
Packit b099d7
Packit b099d7
        INPUTS:
Packit b099d7
            display_in     -  the display that is connected to
Packit b099d7
            app_context_in -  the Xt application context
Packit b099d7
            num_objects    -  number of unique objects defined
Packit b099d7
            generate_objects_func -a function which updates the object hierarchy
Packit b099d7
            get_object_type_name_func - a function which returns the object
Packit b099d7
                                        type name
Packit b099d7
            get_widget_class_name_func - a function which returns widget class
Packit b099d7
                                         name
Packit b099d7
            trace_msg_func - a function which prints out a trace message
Packit b099d7
            warning_msg_func - a function which prints out a warning message
Packit b099d7
            error_msg_func - a function which prints out an error message
Packit b099d7
        
Packit b099d7
        OUTPUTS:
Packit b099d7
            none
Packit b099d7
Packit b099d7
        RETURNS:
Packit b099d7
            nothing
Packit b099d7
************************************************************************/
Packit b099d7
#define DECLARE_XISLIB_GLOBALS_HERE
Packit b099d7
Packit b099d7
#include <AutoMessages.h>
Packit b099d7
#include "xislib.h"
Packit b099d7
#include <Xm/XmP.h>		/* for XmKeyBinding */
Packit b099d7
Packit b099d7
#define XK_MISCELLANY
Packit b099d7
Packit b099d7
#include <X11/keysymdef.h>
Packit b099d7
Packit b099d7
Packit b099d7
void AutoGetAdditionalModifier();
Packit b099d7
Packit b099d7
Packit b099d7
void  xisBeginSession(display_in,app_context_in,num_object_types,
Packit b099d7
                      generate_objects_func,
Packit b099d7
                      get_object_type_name_func, get_widget_class_name_func,
Packit b099d7
                      window_to_widget_func,
Packit b099d7
                      trace_msg_func, warning_msg_func, error_msg_func)
Packit b099d7
Display *display_in;
Packit b099d7
XtAppContext app_context_in;
Packit b099d7
int num_object_types;
Packit b099d7
void (*generate_objects_func) ( /* XisObjectRecord *root_obj, Root object */ );
Packit b099d7
Packit b099d7
char *(*get_object_type_name_func) ( /* int object_type
Packit b099d7
                                        Object type code (user defined) */ );
Packit b099d7
Packit b099d7
char *(*get_widget_class_name_func) ( /* Widget widget
Packit b099d7
                                         Widget to find lowest class name*/ );
Packit b099d7
Packit b099d7
Widget (*window_to_widget_func) ( /* Window window
Packit b099d7
                                     Window to find widget for */ );
Packit b099d7
Packit b099d7
void (*trace_msg_func)();      /* These three funcs have params like printf */
Packit b099d7
void (*warning_msg_func)();
Packit b099d7
void (*error_msg_func)();
Packit b099d7
{
Packit b099d7
    static char routine_name[] = "xisBeginSession():";
Packit b099d7
    int i;
Packit b099d7
    char msg_string[125];
Packit b099d7
Packit b099d7
    /* Validate incoming parameters */
Packit b099d7
Packit b099d7
    xisTraceMsg = trace_msg_func;
Packit b099d7
    xisWarningMsg = warning_msg_func;
Packit b099d7
    xisErrorMsg = error_msg_func;
Packit b099d7
Packit b099d7
    if (error_msg_func == 0) {
Packit b099d7
        fprintf(stderr, "%s called with NULL error_msg_func\n", routine_name);
Packit b099d7
        exit(-1);
Packit b099d7
    }
Packit b099d7
    if (display_in == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG115], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
        
Packit b099d7
    }
Packit b099d7
    if (app_context_in == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG104], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
        
Packit b099d7
    }
Packit b099d7
    if (generate_objects_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG108], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
        
Packit b099d7
    }
Packit b099d7
    if (get_object_type_name_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG106], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
Packit b099d7
    }
Packit b099d7
    if (get_widget_class_name_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG110], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
Packit b099d7
    }
Packit b099d7
    if (window_to_widget_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG111], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
    }
Packit b099d7
    if (trace_msg_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG112], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
    }
Packit b099d7
    if (warning_msg_func == 0) {
Packit b099d7
        sprintf (msg_string, _AutoMessages[WARNMSG113], routine_name);
Packit b099d7
        AutoError(msg_string);
Packit b099d7
    }
Packit b099d7
    xisAppContext = app_context_in;
Packit b099d7
    xisDisplay = display_in;
Packit b099d7
Packit b099d7
    xisScreen = XDefaultScreen(xisDisplay);
Packit b099d7
    xisRootWindow = XDefaultRootWindow(xisDisplay);
Packit b099d7
Packit b099d7
    xisNumObjectTypes = num_object_types;
Packit b099d7
Packit b099d7
    xisGenerateObjects = generate_objects_func;
Packit b099d7
    xisGetObjectTypeName = get_object_type_name_func;
Packit b099d7
    xisGetWidgetClassName = get_widget_class_name_func;
Packit b099d7
    xisWindowToWidget = window_to_widget_func;
Packit b099d7
Packit b099d7
    /* Initialize the Root Object */
Packit b099d7
    xisObjects[0].in_use = 1;
Packit b099d7
    xisObjects[0].id.window = xisRootWindow;
Packit b099d7
    xisObjects[0].id.widget = NULL;
Packit b099d7
    xisObjects[0].id.object_type = 0; /* corresponds to oUserDefined */
Packit b099d7
    xisObjects[0].id.instance = 0;
Packit b099d7
    xisObjects[0].x = 0;
Packit b099d7
    xisObjects[0].y = 0;
Packit b099d7
    xisObjects[0].width = DisplayWidth(xisDisplay,xisScreen);
Packit b099d7
    xisObjects[0].height = DisplayHeight(xisDisplay,xisScreen);
Packit b099d7
    xisObjects[0].parent = NULL;
Packit b099d7
    xisObjects[0].first_child = NULL;
Packit b099d7
    xisObjects[0].next_sibling = NULL;
Packit b099d7
    xisObjects[0].proc_InformExpectedActions = NULL;
Packit b099d7
Packit b099d7
    xisMaxObjectNum++;           /* "Alloc" the object */
Packit b099d7
Packit b099d7
Packit b099d7
} /* end xisBeginSession */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CvtVirtualToActualKeysym( dpy, virtKeysym, actualKeysymRtn, modifiersRtn )
Packit b099d7
     Display *dpy ;
Packit b099d7
     KeySym virtKeysym ;
Packit b099d7
     KeySym *actualKeysymRtn ;
Packit b099d7
     Modifiers *modifiersRtn ;
Packit b099d7
{
Packit b099d7
  int num_keys;
Packit b099d7
  XmKeyBinding keys;
Packit b099d7
Packit b099d7
  /* Initialize the return parameters. */
Packit b099d7
  *actualKeysymRtn = NoSymbol;
Packit b099d7
  *modifiersRtn = 0;
Packit b099d7
Packit b099d7
  /* Arbitrarily return the first keysym in the list. */
Packit b099d7
  num_keys = XmeVirtualToActualKeysyms(dpy, virtKeysym, &keys);
Packit b099d7
  if (num_keys > 0)
Packit b099d7
    {
Packit b099d7
      *actualKeysymRtn = keys[0].keysym;
Packit b099d7
      *modifiersRtn = keys[0].modifiers;
Packit b099d7
    }
Packit b099d7
  XtFree((char*) keys);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
void xisInitKeyCodes(sh_widget)
Packit b099d7
Widget sh_widget ;
Packit b099d7
{
Packit b099d7
Packit b099d7
    KeySym   tmp_key, tmp_key2 ;
Packit b099d7
    int i,j ;
Packit b099d7
    int x,y ;
Packit b099d7
    Boolean collision ;
Packit b099d7
    Modifiers	new_modifier;
Packit b099d7
    char msg_string[125];
Packit b099d7
Packit b099d7
    /* Initialize all keycodes declared */
Packit b099d7
Packit b099d7
    for(i=0; i< _MaxKey; i++) {
Packit b099d7
        tmp_key = XStringToKeysym(xisKeySymName[i].key_name) ;
Packit b099d7
Packit b099d7
        /* if it is an osf key then translate it again */
Packit b099d7
        if ( strncmp(xisKeySymName[i].key_name,"osf",3) == 0 )
Packit b099d7
            CvtVirtualToActualKeysym(xisDisplay,tmp_key,&tmp_key2,
Packit b099d7
				     &xisKeySymName[i].modifier) ;
Packit b099d7
        else /* just copy it over */
Packit b099d7
           tmp_key2 = tmp_key ;
Packit b099d7
Packit b099d7
        xisKeySymName[i].code = XKeysymToKeycode(xisDisplay,tmp_key2) ;
Packit b099d7
	/*
Packit b099d7
	 * The following two lines added for automation.
Packit b099d7
	 */
Packit b099d7
	AutoGetAdditionalModifier(xisDisplay, tmp_key2, &new_modifier);
Packit b099d7
	xisKeySymName[i].modifier |= new_modifier;
Packit b099d7
Packit b099d7
        (*xisTraceMsg)(" keycode number %2d: %s -> %d -> %d/%d --> %d \n",
Packit b099d7
               i,xisKeySymName[i].key_name,tmp_key,tmp_key2,
Packit b099d7
                      xisKeySymName[i].modifier,xisKeySymName[i].code) ;
Packit b099d7
  
Packit b099d7
       
Packit b099d7
        /* a key is undefined */
Packit b099d7
        if (( i != 0 ) && ( i != (_MaxKey-1) ))  {
Packit b099d7
           if (( tmp_key == NoSymbol ) || ( tmp_key2 == NoSymbol )) {
Packit b099d7
	     sprintf (msg_string,_AutoMessages[WARNMSG114],
Packit b099d7
		      xisKeySymName[i].key_name) ;
Packit b099d7
             AutoMessage (msg_string);
Packit b099d7
Packit b099d7
	   }   
Packit b099d7
         }
Packit b099d7
      }
Packit b099d7
    
Packit b099d7
         /* look for duplicate key bindings */
Packit b099d7
Packit b099d7
        collision = False ;
Packit b099d7
        for(i=1;i<(_MaxKey-1);i++) {
Packit b099d7
           for(j=i;j<(_MaxKey-1);j++) {
Packit b099d7
              if ( i != j ) {
Packit b099d7
                 x = (int)xisKeySymName[i].code ;
Packit b099d7
                 y = (int)xisKeySymName[j].code ;
Packit b099d7
                 if ( x == y ) {
Packit b099d7
                    collision = True ;
Packit b099d7
		  }
Packit b099d7
	       }
Packit b099d7
	    }
Packit b099d7
	 }
Packit b099d7
Packit b099d7
} /* end xisInitKeyCodes */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *	The following routine has been added to get the group modifier when
Packit b099d7
 *	needed. If the key modmap is arranged in more than two columns
Packit b099d7
 *	(i.e. when the no. of keysyms_per_keycode is greater than two), to
Packit b099d7
 *	send the key event corresponding to any keysym in the third or
Packit b099d7
 *	fourth column of the modmap, it is necessary to add the group modifier
Packit b099d7
 *	to the current modifier switch in order for the server to interpret
Packit b099d7
 *	the event correctly. This group modifier is available through the
Packit b099d7
 *	variable 'mode_switch' in the display, which gets initialized when
Packit b099d7
 *	the internal modmap for X is getting initialized. (InitModMap() in
Packit b099d7
 *	XKeyBind.c).
Packit b099d7
 */
Packit b099d7
void AutoGetAdditionalModifier(dpy, ks, new_mod)
Packit b099d7
Display		*dpy;
Packit b099d7
KeySym		ks;
Packit b099d7
Modifiers	*new_mod;
Packit b099d7
{
Packit b099d7
    register int i, j, n;
Packit b099d7
    Boolean	done = False;
Packit b099d7
    KeySym	ksym, *ks_list;
Packit b099d7
    XModifierKeymap *mod_keymap;
Packit b099d7
    int		min_keycode_rtn, max_keycode_rtn ;
Packit b099d7
    int		keysyms_per_keycode_rtn ;
Packit b099d7
    int		keycode_count ;
Packit b099d7
    unsigned int  mode_switch;
Packit b099d7
Packit b099d7
    *new_mod = 0;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Fix for CR 5663 -- Use function interface to retrieve
Packit b099d7
 * publicly accessible Display info.
Packit b099d7
 */
Packit b099d7
    XDisplayKeycodes( dpy, &min_keycode_rtn, &max_keycode_rtn ) ;
Packit b099d7
    keycode_count = max_keycode_rtn - min_keycode_rtn + 1 ;
Packit b099d7
    if (!( ks_list =
Packit b099d7
	   XGetKeyboardMapping( dpy, min_keycode_rtn, keycode_count,
Packit b099d7
				&keysyms_per_keycode_rtn ) ) )
Packit b099d7
		return; 
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Fix for CR 5663 -- Since X11R5 made the display mode_switch
Packit b099d7
 * variable opaque, we will have to regenerate it here, using
Packit b099d7
 * the same algorithm as in XKeyBind.c.
Packit b099d7
 */
Packit b099d7
Packit b099d7
    mod_keymap = XGetModifierMapping( dpy );
Packit b099d7
    /* Find any Mod<n> modifier acting as the Group modifier */
Packit b099d7
    mode_switch = 0;
Packit b099d7
    n = 8 * mod_keymap->max_keypermod;
Packit b099d7
    for (i = 3*mod_keymap->max_keypermod; i < n; i++) {
Packit b099d7
        for (j = 0; j < keysyms_per_keycode_rtn; j++) {
Packit b099d7
            ksym = XKeycodeToKeysym(dpy, mod_keymap->modifiermap[i], j);
Packit b099d7
            if (ksym == XK_Mode_switch)
Packit b099d7
                mode_switch |= 1 << (i / mod_keymap->max_keypermod);
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (i = min_keycode_rtn; i <= max_keycode_rtn && !done; i++) {
Packit b099d7
Packit b099d7
	for (j = 0; j < keysyms_per_keycode_rtn; j++) {
Packit b099d7
	    	if (XKeycodeToKeysym(dpy, (KeyCode) i, j) == ks) {
Packit b099d7
			if (j > 1)
Packit b099d7
				*new_mod = mode_switch;
Packit b099d7
			done = True;
Packit b099d7
			break;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XFree( ks_list ) ;
Packit b099d7
    XFreeModifiermap ( mod_keymap );
Packit b099d7
    return;
Packit b099d7
Packit b099d7
}