|
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 |
}
|