#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "IntrinsicI.h"
#include "ShellP.h"
void _XtPopup(
Widget widget,
XtGrabKind grab_kind,
_XtBoolean spring_loaded)
{
register ShellWidget shell_widget = (ShellWidget) widget;
if (! XtIsShell(widget)) {
XtAppErrorMsg(XtWidgetToApplicationContext(widget),
"invalidClass","xtPopup",XtCXtToolkitError,
"XtPopup requires a subclass of shellWidgetClass",
(String *)NULL, (Cardinal *)NULL);
}
if (! shell_widget->shell.popped_up) {
XtGrabKind call_data = grab_kind;
XtCallCallbacks(widget, XtNpopupCallback, (XtPointer)&call_data);
shell_widget->shell.popped_up = TRUE;
shell_widget->shell.grab_kind = grab_kind;
shell_widget->shell.spring_loaded = spring_loaded;
if (shell_widget->shell.create_popup_child_proc != NULL) {
(*(shell_widget->shell.create_popup_child_proc))(widget);
}
if (grab_kind == XtGrabExclusive) {
XtAddGrab(widget, TRUE, spring_loaded);
} else if (grab_kind == XtGrabNonexclusive) {
XtAddGrab(widget, FALSE, spring_loaded);
}
XtRealizeWidget(widget);
XMapRaised(XtDisplay(widget), XtWindow(widget));
} else
XRaiseWindow(XtDisplay(widget), XtWindow(widget));
}
void XtPopup (Widget widget, XtGrabKind grab_kind)
{
Widget hookobj;
switch (grab_kind) {
case XtGrabNone:
case XtGrabExclusive:
case XtGrabNonexclusive:
break;
default:
XtAppWarningMsg(
XtWidgetToApplicationContext(widget),
"invalidGrabKind","xtPopup",XtCXtToolkitError,
"grab kind argument has invalid value; XtGrabNone assumed",
(String *)NULL, (Cardinal *)NULL);
grab_kind = XtGrabNone;
}
_XtPopup(widget, grab_kind, FALSE);
hookobj = XtHooksOfDisplay(XtDisplay(widget));
if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
XtChangeHookDataRec call_data;
call_data.type = XtHpopup;
call_data.widget = widget;
call_data.event_data = (XtPointer)grab_kind;
XtCallCallbackList(hookobj,
((HookObject)hookobj)->hooks.changehook_callbacks,
(XtPointer)&call_data);
}
}
void XtPopupSpringLoaded (
Widget widget)
{
Widget hookobj;
_XtPopup(widget, XtGrabExclusive, True);
hookobj = XtHooksOfDisplay(XtDisplay(widget));
if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
XtChangeHookDataRec call_data;
call_data.type = XtHpopupSpringLoaded;
call_data.widget = widget;
XtCallCallbackList(hookobj,
((HookObject)hookobj)->hooks.changehook_callbacks,
(XtPointer)&call_data);
}
}
void XtPopdown(
Widget widget)
{
Widget hookobj;
ShellWidget shell_widget = (ShellWidget) widget;
XtGrabKind grab_kind;
if (! XtIsShell(widget)) {
XtAppErrorMsg(XtWidgetToApplicationContext(widget),
"invalidClass","xtPopdown",XtCXtToolkitError,
"XtPopdown requires a subclass of shellWidgetClass",
(String *)NULL, (Cardinal *)NULL);
}
#ifndef X_NO_XT_POPDOWN_CONFORMANCE
if (!shell_widget->shell.popped_up)
return;
#endif
grab_kind = shell_widget->shell.grab_kind;
XWithdrawWindow(XtDisplay(widget), XtWindow(widget),
XScreenNumberOfScreen(XtScreen(widget)));
if (grab_kind != XtGrabNone)
XtRemoveGrab(widget);
shell_widget->shell.popped_up = FALSE;
XtCallCallbacks(widget, XtNpopdownCallback, (XtPointer)&grab_kind);
hookobj = XtHooksOfDisplay(XtDisplay(widget));
if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
XtChangeHookDataRec call_data;
call_data.type = XtHpopdown;
call_data.widget = widget;
XtCallCallbackList(hookobj,
((HookObject)hookobj)->hooks.changehook_callbacks,
(XtPointer)&call_data);
}
}
void XtCallbackPopdown(
Widget widget,
XtPointer closure,
XtPointer call_data)
{
register XtPopdownID id = (XtPopdownID) closure;
XtPopdown(id->shell_widget);
if (id->enable_widget != NULL) {
XtSetSensitive(id->enable_widget, TRUE);
}
}