|
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: SetFocus.c /main/8 1995/07/14 11:43:06 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/***********************************************************************
|
|
Packit |
b099d7 |
@(#)SetFocus.c 1.9.1.1 Date:1/22/91
|
|
Packit |
b099d7 |
Author: TAT
|
|
Packit |
b099d7 |
History:
|
|
Packit |
b099d7 |
05/30/90 SJS add to sccs
|
|
Packit |
b099d7 |
06/21/90 SJS do not set focus to unmapped objects
|
|
Packit |
b099d7 |
07/11/90 SJS test for success of XmProcessTraversal() even though
|
|
Packit |
b099d7 |
it is somewhat meaningless
|
|
Packit |
b099d7 |
08/23/90 SJS synchronize for events when creating the dummy window
|
|
Packit |
b099d7 |
10/17/90 SJS only worry about FocusIn/FocusOut when focus really
|
|
Packit |
b099d7 |
changes
|
|
Packit |
b099d7 |
Calls:
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Summary:
|
|
Packit |
b099d7 |
Sets the keyboard focus to the specified widget
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
INPUTS:
|
|
Packit |
b099d7 |
widget - the widget to set the keyboard focus to.
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
OUTPUTS:
|
|
Packit |
b099d7 |
none
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
RETURNS:
|
|
Packit |
b099d7 |
nothing
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "xislib.h"
|
|
Packit |
b099d7 |
#include <Xm/XmP.h> /* Warning: Potentially non-portable */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void xisSetKeyboardFocus(widget,object_type,instance)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
int object_type;
|
|
Packit |
b099d7 |
int instance;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XisObjectRecord *object = xisFindObjectFromWidget(widget);
|
|
Packit |
b099d7 |
XisObjectRecord *current_object;
|
|
Packit |
b099d7 |
unsigned char rc_type;
|
|
Packit |
b099d7 |
Arg args[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget == NULL)
|
|
Packit |
b099d7 |
(*xisTraceMsg)("Got send_event_request = SetFocus to RootWindow\n");
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
(*xisTraceMsg)("Got send_event_request = SetFocus to %s\n",
|
|
Packit |
b099d7 |
xisGetObjectName(object));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget != NULL && XmIsRowColumn(widget)) {
|
|
Packit |
b099d7 |
XtSetArg(args[0], XmNrowColumnType, &rc_type);
|
|
Packit |
b099d7 |
XtGetValues(widget, args, 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Call all relavent InformExpectedActions functions for Focus Out */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
current_object = xisGetFocusObject();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(object == current_object) {
|
|
Packit |
b099d7 |
return; /* Already here */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
xisInform.is_valid = 1;
|
|
Packit |
b099d7 |
xisInform.action_obj = current_object;
|
|
Packit |
b099d7 |
xisInform.modifier_key_status = 0;
|
|
Packit |
b099d7 |
xisInform.button_num = 0;
|
|
Packit |
b099d7 |
xisInform.key_code = 0;
|
|
Packit |
b099d7 |
xisInform.edge_code = 0;
|
|
Packit |
b099d7 |
xisInform.num_clicks = 0;
|
|
Packit |
b099d7 |
xisInform.event_code = EventFocusOut;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while (current_object != NULL) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (current_object->proc_InformExpectedActions != NULL) {
|
|
Packit |
b099d7 |
xisInform.current_obj = current_object;
|
|
Packit |
b099d7 |
(*current_object->proc_InformExpectedActions)(EventFocusOut);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
current_object = current_object->parent;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (widget == NULL || object == (&xisObjects[0]) ||
|
|
Packit |
b099d7 |
!xisWindowExists(XtWindowOfObject(widget)) ||
|
|
Packit |
b099d7 |
!xisIsMapped(XtWindowOfObject(widget))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!xisDummyFocusWindow) {
|
|
Packit |
b099d7 |
xisCreateSimple();
|
|
Packit |
b099d7 |
(void)xisSynchronize();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
xisState.focus_widget = NULL;
|
|
Packit |
b099d7 |
xisState.focus_object_type = 0;
|
|
Packit |
b099d7 |
xisState.focus_instance = 0;
|
|
Packit |
b099d7 |
xisState.focus_window = xisDummyFocusWindow;
|
|
Packit |
b099d7 |
XSetInputFocus(xisDisplay,xisState.focus_window,RevertToParent,
|
|
Packit |
b099d7 |
CurrentTime);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
xisState.focus_window = object->id.window;
|
|
Packit |
b099d7 |
xisState.focus_widget = widget;
|
|
Packit |
b099d7 |
xisState.focus_object_type = object_type;
|
|
Packit |
b099d7 |
xisState.focus_instance = instance;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Call all relavent InformExpectedActions functions for Focus In */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
current_object = object;
|
|
Packit |
b099d7 |
xisInform.action_obj = object;
|
|
Packit |
b099d7 |
xisInform.modifier_key_status = 0;
|
|
Packit |
b099d7 |
xisInform.button_num = 0;
|
|
Packit |
b099d7 |
xisInform.key_code = 0;
|
|
Packit |
b099d7 |
xisInform.edge_code = 0;
|
|
Packit |
b099d7 |
xisInform.num_clicks = 0;
|
|
Packit |
b099d7 |
xisInform.event_code = EventFocusIn;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while (current_object != NULL) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (current_object->proc_InformExpectedActions != NULL) {
|
|
Packit |
b099d7 |
xisInform.current_obj = current_object;
|
|
Packit |
b099d7 |
(*current_object->proc_InformExpectedActions)(EventFocusIn);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
current_object = current_object->parent;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(object->visibility_state & IsViewable) {
|
|
Packit |
b099d7 |
XSetInputFocus(xisDisplay,XtWindow(xisGetShellWidget(widget)),
|
|
Packit |
b099d7 |
RevertToNone,CurrentTime);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmProcessTraversal() does not do anything useful in the way
|
|
Packit |
b099d7 |
of being a query function. Add Check for RoWColumn Type. This
|
|
Packit |
b099d7 |
because in 1.2 XmProcessTraversal() will not return False
|
|
Packit |
b099d7 |
for the Traversal to a MenuBar, Pulldown, or Popup. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmProcessTraversal(widget,XmTRAVERSE_CURRENT) &&
|
|
Packit |
b099d7 |
rc_type != XmMENU_BAR &&
|
|
Packit |
b099d7 |
rc_type != XmMENU_POPUP &&
|
|
Packit |
b099d7 |
rc_type != XmMENU_PULLDOWN ) {
|
|
Packit |
b099d7 |
XisObjectRecord *new_focus; /* Lord only knows where it ends up */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XGetInputFocus(xisDisplay,&xisState.focus_window,
|
|
Packit |
b099d7 |
&xisState.focus_revert_to);
|
|
Packit |
b099d7 |
new_focus = xisFindObjectFromWindow(xisState.focus_window);
|
|
Packit |
b099d7 |
if(new_focus != NULL) {
|
|
Packit |
b099d7 |
xisState.focus_widget = new_focus->id.widget;
|
|
Packit |
b099d7 |
xisState.focus_object_type = new_focus->id.object_type;
|
|
Packit |
b099d7 |
xisState.focus_instance = new_focus->id.instance;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
XGetInputFocus(xisDisplay,&xisState.focus_window,
|
|
Packit |
b099d7 |
&xisState.focus_revert_to);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* End if (widget == NULL || object == (&xisObjects[0]) */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
xisProcessEvents(NULL,0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* End xisSetFocus() */
|