#include <X11/CoreP.h>
#include <X11/CompositeP.h>
+#include "../src/lisp.h"
+
#include "lwlib-Xm.h"
#include "lwlib-utils.h"
#include <Xm/DialogS.h>
#include <Xm/Form.h>
-#ifdef __STDC__
+#if defined __STDC__ || defined PROTOTYPES
#define P_(X) X
#else
#define P_(X) ()
static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer));
static void xm_pull_down_callback P_ ((Widget, XtPointer, XtPointer));
static void xm_pop_down_callback P_ ((Widget, XtPointer, XtPointer));
-static void xm_unmap_callback P_ ((Widget, XtPointer, XtPointer));
void xm_set_keyboard_focus P_ ((Widget, Widget));
void xm_set_main_areas P_ ((Widget, Widget, Widget));
static void xm_internal_update_other_instances P_ ((Widget, XtPointer,
#endif
+#if 0
+
+/* Print the complete X resource name of widget WIDGET to stderr.
+ This is sometimes handy to have available. */
+
+void
+x_print_complete_resource_name (widget)
+ Widget widget;
+{
+ int i;
+ String names[100];
+
+ for (i = 0; i < 100 && widget != NULL; ++i)
+ {
+ names[i] = XtName (widget);
+ widget = XtParent (widget);
+ }
+
+ for (--i; i >= 1; --i)
+ fprintf (stderr, "%s.", names[i]);
+ fprintf (stderr, "%s\n", names[0]);
+}
+
+#endif /* 0 */
+
+
static destroyed_instance *all_destroyed_instances = NULL;
static destroyed_instance*
widget_instance *instance;
/* Get the id of the menu bar or popup menu this widget is in. */
- while (1)
+ while (w != NULL)
{
if (XmIsRowColumn (w))
{
w = XtParent (w);
}
- instance = lw_get_widget_instance (w);
- if (instance && instance->info->highlight_cb)
+ if (w != NULL)
{
- call_data = cbs->reason == XmCR_DISARM ? NULL : wv;
- instance->info->highlight_cb (w, instance->info->id, call_data);
+ instance = lw_get_widget_instance (w);
+ if (instance && instance->info->highlight_cb)
+ {
+ call_data = cbs->reason == XmCR_DISARM ? NULL : wv;
+ instance->info->highlight_cb (w, instance->info->id, call_data);
+ }
}
}
Widget widget;
widget_value* val;
{
- XtVaSetValues (widget, XmNalignment, XmALIGNMENT_CENTER, 0);
+ XtVaSetValues (widget, XmNalignment, XmALIGNMENT_CENTER, NULL);
XtRemoveAllCallbacks (widget, XmNactivateCallback);
XtAddCallback (widget, XmNactivateCallback, xm_generic_callback, instance);
}
XtAddCallback (widget, XmNvalueChangedCallback,
xm_generic_callback, instance);
XtVaSetValues (widget, XmNset, val->selected,
- XmNalignment, XmALIGNMENT_BEGINNING, 0);
+ XmNalignment, XmALIGNMENT_BEGINNING, NULL);
}
static void
toggle = XtNameToWidget (widget, cur->value);
if (toggle)
{
- XtVaSetValues (toggle, XmNsensitive, cur->enabled, 0);
+ XtSetSensitive (toggle, cur->enabled);
if (!val->value && cur->selected)
- XtVaSetValues (toggle, XmNset, cur->selected, 0);
+ XtVaSetValues (toggle, XmNset, cur->selected, NULL);
if (val->value && strcmp (val->value, cur->value))
- XtVaSetValues (toggle, XmNset, False, 0);
+ XtVaSetValues (toggle, XmNset, False, NULL);
}
}
{
toggle = XtNameToWidget (widget, val->value);
if (toggle)
- XtVaSetValues (toggle, XmNset, True, 0);
+ XtVaSetValues (toggle, XmNset, True, NULL);
}
}
old_children = XtCompositeChildren (widget, &old_num_children);
/* Allocate the children array */
- for (num_children = 0, cur = val; cur; num_children++, cur = cur->next);
+ for (num_children = 0, cur = val; cur; num_children++, cur = cur->next)
+ ;
children = (Widget*)XtMalloc (num_children * sizeof (Widget));
/* WIDGET should be a RowColumn. */
abort ();
menubar_p = type == XmMENU_BAR;
-#if 0 /* This can't be used in LessTif as of 2000-01-24 because it's
- impossible to decide from this plus the cascading callback if a
- popup is still posted or not. When selecting cascade button A,
- then B, then clicking on the frame, the sequence of callbacks is
- `cascading A', cascading B', `popdown for all cascade buttons in
- the menu bar. */
/* Add a callback to popups and pulldowns that is called when
it is made invisible again. */
if (!menubar_p)
XtAddCallback (XtParent (widget), XmNpopdownCallback,
xm_pop_down_callback, (XtPointer)instance);
-#endif
/* Preserve the first KEEP_FIRST_CHILDREN old children. */
for (child_index = 0, cur = val; child_index < keep_first_children;
{
menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0);
- /* XmNpopdownCallback is working strangely under LessTif.
- Using XmNunmapCallback is the only way to go there. */
- if (menubar_p)
- XtAddCallback (menu, XmNunmapCallback, xm_unmap_callback,
- (XtPointer) instance);
-
make_menu_in_widget (instance, menu, cur->contents, 0);
XtSetArg (al[ac], XmNsubMenuId, menu); ac++;
button = XmCreateCascadeButton (widget, cur->name, al, ac);
XmNmenuHelpWidget work, we need to set it before managing the
children.. --gerd. */
if (button)
- XtVaSetValues (widget, XmNmenuHelpWidget, button, 0);
-
- /* LessTif apparently doesn't recompute centered text when more
- widgets are added. So, do it after all widgets have been
- created. */
- if (title)
- XtVaSetValues (title, XmNalignment, XmALIGNMENT_CENTER, 0);
+ XtVaSetValues (widget, XmNmenuHelpWidget, button, NULL);
if (num_children)
XtManageChildren (children, num_children);
/* update the sensitivity and userdata */
/* Common to all widget types */
- XtVaSetValues (widget,
- XmNsensitive, val->enabled,
- XmNuserData, val->call_data,
- 0);
+ XtSetSensitive (widget, val->enabled);
+ XtVaSetValues (widget, XmNuserData, val->call_data, NULL);
/* update the menu button as a label. */
if (val->this_one_change >= VISIBLE_CHANGE)
val->edited = False;
/* Common to all widget types */
- XtVaSetValues (widget,
- XmNsensitive, val->enabled,
- XmNuserData, val->call_data,
- 0);
+ XtSetSensitive (widget, val->enabled);
+ XtVaSetValues (widget, XmNuserData, val->call_data, NULL);
/* Common to all label like widgets */
if (XtIsSubclass (widget, xmLabelWidgetClass))
if (class == xmToggleButtonWidgetClass || class == xmToggleButtonGadgetClass)
{
- XtVaGetValues (widget, XmNset, &val->selected, 0);
+ XtVaGetValues (widget, XmNset, &val->selected, NULL);
val->edited = True;
}
else if (class == xmTextWidgetClass)
int set = False;
Widget toggle = radio->composite.children [i];
- XtVaGetValues (toggle, XmNset, &set, 0);
+ XtVaGetValues (toggle, XmNset, &set, NULL);
if (set)
{
if (val->value)
Position x;
Position y;
- XtVaGetValues (widget, XtNwidth, &child_width, XtNheight, &child_height, 0);
+ XtVaGetValues (widget, XtNwidth, &child_width, XtNheight, &child_height, NULL);
XtVaGetValues (parent, XtNwidth, &parent_width, XtNheight, &parent_height,
- 0);
+ NULL);
x = (((Position)parent_width) - ((Position)child_width)) / 2;
y = (((Position)parent_height) - ((Position)child_height)) / 2;
if (y < 0)
y = 0;
- XtVaSetValues (widget, XtNx, x, XtNy, y, 0);
+ XtVaSetValues (widget, XtNx, x, XtNy, y, NULL);
}
static Widget
/* shrink the separator label back to their original size */
separator = XtNameToWidget (widget, "*separator_button");
if (separator)
- XtVaSetValues (separator, XtNwidth, 5, XtNheight, 5, 0);
+ XtVaSetValues (separator, XtNwidth, 5, XtNheight, 5, NULL);
/* Center the dialog in its parent */
recenter_widget (widget);
Widget widget;
Boolean pop_up_p = instance->pop_up_p;
char* shell_name = 0;
- char* icon_name;
+ char* icon_name = 0;
Boolean text_input_slot = False;
Boolean radio_box = False;
Boolean list = False;
ac = 0;
XtSetArg(al[ac], XmNmenuAccelerator, 0); ++ac;
-
- /* As of 2000-01-17, the LessTif menu bar resizes to height 0 when
- all its children are removed, causing an annoying flickering
- behavior. Prevent that by not allowing resizing. */
- XtSetArg(al[ac], XmNresizeHeight, False); ++ac;
- XtSetArg(al[ac], XmNresizeWidth, False); ++ac;
-
return XmCreateMenuBar (instance->parent, instance->info->name, al, ac);
}
if (event->type == ButtonPress || event->type == ButtonRelease)
{
- /* This is so totally ridiculous: there's NO WAY to tell Motif
- that *any* button can select a menu item. Only one button
- can have that honor.
- */
- char *trans = 0;
- if (event->xbutton.state & Button5Mask) trans = "<Btn5Down>";
- else if (event->xbutton.state & Button4Mask) trans = "<Btn4Down>";
- else if (event->xbutton.state & Button3Mask) trans = "<Btn3Down>";
- else if (event->xbutton.state & Button2Mask) trans = "<Btn2Down>";
- else if (event->xbutton.state & Button1Mask) trans = "<Btn1Down>";
- if (trans) XtVaSetValues (widget, XmNmenuPost, trans, 0);
+ /* Setting the menuPost resource only required by Motif 1.1 and
+ LessTif 0.84 and earlier. With later versions of LessTif,
+ setting menuPost is unnecessary and may cause problems, so
+ don't do it. */
+#if XmVersion < 1002 || (defined LESSTIF_VERSION && LESSTIF_VERSION < 84)
+ {
+ /* This is so totally ridiculous: there's NO WAY to tell Motif
+ that *any* button can select a menu item. Only one button
+ can have that honor. */
+
+ char *trans = 0;
+ if (event->xbutton.state & Button5Mask) trans = "<Btn5Down>";
+ else if (event->xbutton.state & Button4Mask) trans = "<Btn4Down>";
+ else if (event->xbutton.state & Button3Mask) trans = "<Btn3Down>";
+ else if (event->xbutton.state & Button2Mask) trans = "<Btn2Down>";
+ else if (event->xbutton.state & Button1Mask) trans = "<Btn1Down>";
+ if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL);
+ }
+#endif
+
XmMenuPosition (widget, (XButtonPressedEvent *) event);
}
+
XtManageChild (widget);
}
{
short width;
short height;
- XtVaGetValues (w, XmNwidth, &width, XmNheight, &height, 0);
- XtVaSetValues (w, XmNminWidth, width, XmNminHeight, height, 0);
+ XtVaGetValues (w, XmNwidth, &width, XmNheight, &height, NULL);
+ XtVaSetValues (w, XmNminWidth, width, XmNminHeight, height, NULL);
}
void
user_data = NULL;
XtSetArg (al [ac], XmNuserData, &user_data); ac++;
XtGetValues (widget, al, ac);
+
switch (type)
{
case pre_activate:
if (instance->info->pre_activate_cb)
instance->info->pre_activate_cb (widget, id, user_data);
break;
+
case selection:
if (instance->info->selection_cb)
instance->info->selection_cb (widget, id, user_data);
break;
+
case no_selection:
if (instance->info->selection_cb)
instance->info->selection_cb (widget, id, (XtPointer) -1);
break;
+
case post_activate:
if (instance->info->post_activate_cb)
instance->info->post_activate_cb (widget, id, user_data);
break;
+
default:
abort ();
}
XtPointer closure;
XtPointer call_data;
{
- /* This callback is only called when a dialog box is dismissed with the wm's
- destroy button (WM_DELETE_WINDOW.) We want the dialog box to be destroyed
- in that case, not just unmapped, so that it releases its keyboard grabs.
- But there are problems with running our callbacks while the widget is in
- the process of being destroyed, so we set XmNdeleteResponse to XmUNMAP
- instead of XmDESTROY and then destroy it ourself after having run the
- callback.
- */
+ /* This callback is only called when a dialog box is dismissed with
+ the wm's destroy button (WM_DELETE_WINDOW.) We want the dialog
+ box to be destroyed in that case, not just unmapped, so that it
+ releases its keyboard grabs. But there are problems with running
+ our callbacks while the widget is in the process of being
+ destroyed, so we set XmNdeleteResponse to XmUNMAP instead of
+ XmDESTROY and then destroy it ourself after having run the
+ callback. */
do_call (widget, closure, no_selection);
XtDestroyWidget (widget);
}
/* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell,
- CLOSURE is a pointer to the widget_instance of the shell, CALL_DATA
- is always null under LessTif.
+ CLOSURE is a pointer to the widget_instance of the shell,
- 2000-01-23: This callback is called for each cascade button in
- a menu, whether or not its submenu is visible. */
+ Note that this callback is called for each cascade button in a
+ menu, whether or not its submenu is visible. */
static void
xm_pop_down_callback (widget, closure, call_data)
{
widget_instance *instance = (widget_instance *) closure;
- if ((!instance->pop_up_p && (XtParent (widget) == instance->widget))
- || (XtParent (widget) == instance->parent))
- do_call (widget, closure, post_activate);
-}
-
-static void
-xm_unmap_callback (widget, closure, call_data)
- Widget widget;
- XtPointer closure;
- XtPointer call_data;
-{
- widget_instance *instance = (widget_instance *) closure;
- if (!instance->pop_up_p)
+ if ((!instance->pop_up_p && XtParent (widget) == instance->widget)
+ || XtParent (widget) == instance->parent)
do_call (widget, closure, post_activate);
}