the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include <stdlib.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <unistd.h>
-#include <string.h>
#include <stdio.h>
#include <X11/StringDefs.h>
#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__
+#undef P_
+#if defined __STDC__ || defined PROTOTYPES
#define P_(X) X
#else
#define P_(X) ()
void xm_set_main_areas P_ ((Widget, Widget, Widget));
static void xm_internal_update_other_instances P_ ((Widget, XtPointer,
XtPointer));
+static void xm_arm_callback P_ ((Widget, XtPointer, XtPointer));
#if 0
void xm_update_one_widget P_ ((widget_instance *, Widget, widget_value *,
#endif
-static destroyed_instance*
-all_destroyed_instances = NULL;
+#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*
make_destroyed_instance (name, type, widget, parent, pop_up_p)
}
}
+
+\f
+/* Callback XmNarmCallback and XmNdisarmCallback for buttons in a
+ menu. CLIENT_DATA contains a pointer to the widget_value
+ corresponding to widget W. CALL_DATA contains a
+ XmPushButtonCallbackStruct containing the reason why the callback
+ is called. */
+
+static void
+xm_arm_callback (w, client_data, call_data)
+ Widget w;
+ XtPointer client_data, call_data;
+{
+ XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *) call_data;
+ widget_value *wv = (widget_value *) client_data;
+ widget_instance *instance;
+
+ /* Get the id of the menu bar or popup menu this widget is in. */
+ while (w != NULL)
+ {
+ if (XmIsRowColumn (w))
+ {
+ unsigned char type = 0xff;
+
+ XtVaGetValues (w, XmNrowColumnType, &type, NULL);
+ if (type == XmMENU_BAR || type == XmMENU_POPUP)
+ break;
+ }
+
+ w = XtParent (w);
+ }
+
+ if (w != NULL)
+ {
+ 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);
+ }
+ }
+}
+
+
\f
/* Update the label of widget WIDGET. WIDGET must be a Label widget
or a subclass of Label. WIDGET_INSTANCE is unused. VAL contains
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. */
? XmN_OF_MANY : XmONE_OF_MANY));
++ac;
button = XmCreateToggleButton (widget, cur->name, al, ac);
+ XtAddCallback (button, XmNarmCallback, xm_arm_callback, cur);
+ XtAddCallback (button, XmNdisarmCallback, xm_arm_callback, cur);
}
else
- button = XmCreatePushButton (widget, cur->name, al, ac);
-
+ {
+ button = XmCreatePushButton (widget, cur->name, al, ac);
+ XtAddCallback (button, XmNarmCallback, xm_arm_callback, cur);
+ XtAddCallback (button, XmNdisarmCallback, xm_arm_callback, cur);
+ }
+
xm_update_label (instance, button, cur);
/* Add a callback that is called when the button is
else
{
menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0);
+
make_menu_in_widget (instance, menu, cur->contents, 0);
- XtSetArg (al [ac], XmNsubMenuId, menu); ac++;
- /* Non-zero values don't work reliably in conjunction with
- Emacs' event loop */
- XtSetArg (al [ac], XmNmappingDelay, 0); ac++;
+ XtSetArg (al[ac], XmNsubMenuId, menu); ac++;
button = XmCreateCascadeButton (widget, cur->name, al, ac);
xm_update_label (instance, button, cur);
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;
make_menubar (instance)
widget_instance* instance;
{
- Arg al[1];
+ Arg al[3];
int ac;
ac = 0;
- XtSetArg(al[0], XmNmenuAccelerator, 0);
- return XmCreateMenuBar (instance->parent, instance->info->name, al, 1);
+ XtSetArg(al[ac], XmNmenuAccelerator, 0); ++ac;
+ return XmCreateMenuBar (instance->parent, instance->info->name, al, ac);
}
static void
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);
}
XtPointer closure;
XtPointer call_data;
{
- do_call (widget, closure, pre_activate);
+ Widget parent = XtParent (widget);
+
+ if (XmIsRowColumn (parent))
+ {
+ unsigned char type = 0xff;
+ XtVaGetValues (parent, XmNrowColumnType, &type, NULL);
+ if (type == XmMENU_BAR)
+ do_call (widget, closure, pre_activate);
+ }
}
+
+/* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell,
+ CLOSURE is a pointer to the widget_instance of the shell,
+
+ 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 widget;
{
widget_instance *instance = (widget_instance *) closure;
- if ((!instance->pop_up_p && (XtParent (widget) == instance->widget))
- || (XtParent (widget) == instance->parent))
+ if ((!instance->pop_up_p && XtParent (widget) == instance->widget)
+ || XtParent (widget) == instance->parent)
do_call (widget, closure, post_activate);
}
Widget w;
Boolean flag;
{
- if (flag)
- {
- /* Enable the edit widget for resizing. */
- Arg al[1];
-
- XtSetArg (al[0], XtNallowShellResize, 0);
- XtSetValues (w, al, 1);
- }
- else
- {
- /* Disable the edit widget from resizing. */
- Arg al[1];
-
- XtSetArg (al[0], XtNallowShellResize, 0);
- XtSetValues (w, al, 1);
- }
+ XtVaSetValues (w, XtNallowShellResize, flag, NULL);
}