+#ifdef LWLIB_TABS_LUCID
+/* tab control
+
+ lwlib is such an incredible hairy crock. I just cannot believe
+ it! There are random dependencies between functions, there is a
+ total lack of genericity, even though it initially appears to be
+ generic. It should all be junked and begun again. Building tabs are
+ an example - in theory we should be able to reuse a lot of the
+ general stuff because we want to put labels of whatever toolkit we
+ are using in the tab. Instead we have to hack it by hand. */
+static void
+xlw_tab_control_callback (Widget w, XtPointer client_data, XtPointer call_data)
+{
+ /* call data is the topmost widget */
+ widget_instance* instance = (widget_instance*)client_data;
+ Widget top = (Widget)call_data;
+ char *name = XtName (top);
+ widget_value* widget_val;
+ XtPointer widget_arg;
+ LWLIB_ID id;
+ lw_callback post_activate_cb;
+
+ if (w->core.being_destroyed)
+ return;
+
+ /* Grab these values before running any functions, in case running
+ the selection_cb causes the widget to be destroyed. */
+ id = instance->info->id;
+ post_activate_cb = instance->info->post_activate_cb;
+
+ /* search for the widget_val for the selected tab */
+ for (widget_val = instance->info->val->contents; widget_val;
+ widget_val = widget_val->next)
+ {
+ if (!strcmp (widget_val->name, name))
+ break;
+ }
+
+ widget_arg = widget_val ? widget_val->call_data : NULL;
+
+ if (instance->info->selection_cb &&
+ widget_val &&
+ widget_val->enabled &&
+ !widget_val->contents)
+ instance->info->selection_cb (w, id, widget_arg);
+
+ if (post_activate_cb)
+ post_activate_cb (w, id, widget_arg);
+}
+
+static Widget
+xlw_create_tab_control (widget_instance *instance)
+{
+ Arg al[20];
+ int ac = 0;
+ Widget tab = 0;
+ widget_value* val = instance->info->val;
+
+ XtSetArg (al [ac], XtNsensitive, val->enabled); ac++;
+ XtSetArg (al [ac], XtNmappedWhenManaged, FALSE); ac++;
+ XtSetArg (al [ac], XtNorientation, XtorientHorizontal); ac++;
+ XtSetArg (al [ac], XtNresizable, False); ac++;
+
+ /* add any args the user supplied for creation time */
+ lw_add_value_args_to_args (val, al, &ac);
+
+ tab = XtCreateManagedWidget (val->name, tabsWidgetClass,
+ instance->parent, al, ac);
+ XtRemoveAllCallbacks (tab, XtNcallback);
+ XtAddCallback (tab, XtNcallback, xlw_tab_control_callback, (XtPointer)instance);
+
+ XtManageChild (tab);
+
+ return tab;
+}
+
+static void build_tabs_in_widget (widget_instance* instance, Widget widget,
+ widget_value* val)
+{
+ widget_value* cur = val;
+ for (cur = val; cur; cur = cur->next)
+ {
+ if (cur->value)
+ {
+#ifdef LWLIB_WIDGETS_MOTIF
+ xm_create_label (widget, cur);
+#else
+ xaw_create_label (widget, cur);
+#endif
+ }
+ cur->change = NO_CHANGE;
+ }
+}
+
+static void
+xlw_update_tab_control (widget_instance* instance, Widget widget, widget_value* val)
+{
+ Widget* children;
+ unsigned int num_children;
+ int i;
+ widget_value *cur = 0;
+
+ XtRemoveAllCallbacks (widget, XtNcallback);
+ XtAddCallback (widget, XtNcallback, xlw_tab_control_callback, (XtPointer)instance);
+
+ if (val->change == STRUCTURAL_CHANGE
+ ||
+ (val->contents && val->contents->change == STRUCTURAL_CHANGE))
+ {
+ destroy_all_children (widget);
+ build_tabs_in_widget (instance, widget, val->contents);
+ }
+
+ children = XtCompositeChildren (widget, &num_children);
+ if (children)
+ {
+ for (i = 0, cur = val->contents; i < num_children; i++)
+ {
+ if (!cur)
+ abort ();
+ if (children [i]->core.being_destroyed
+ || strcmp (XtName (children [i]), cur->name))
+ continue;
+#ifdef NEED_MOTIF
+ if (lw_motif_widget_p (children [i]))
+ xm_update_one_widget (instance, children [i], cur, False);
+#endif
+#ifdef NEED_ATHENA
+ if (lw_xaw_widget_p (children [i]))
+ xaw_update_one_widget (instance, children [i], cur, False);
+#endif
+ cur = cur->next;
+ }
+ XtFree ((char *) children);
+ }
+ if (cur)
+ abort ();
+}
+#endif /* LWLIB_TABS_LUCID */
+
+#ifdef HAVE_WIDGETS
+static Widget
+xlw_create_clip_window (widget_instance *instance)
+{
+ Arg al[20];
+ int ac = 0;
+ Widget clip = 0;
+ widget_value* val = instance->info->val;
+
+ XtSetArg (al [ac], XtNmappedWhenManaged, FALSE); ac++;
+ XtSetArg (al [ac], XtNsensitive, TRUE); ac++;
+ /* add any args the user supplied for creation time */
+ lw_add_value_args_to_args (val, al, &ac);
+
+ /* Create a clip window to contain the subwidget. Incredibly the
+ XEmacs manager seems to be the most appropriate widget for
+ this. Nothing else is simple enough and yet does what is
+ required. */
+ clip = XtCreateManagedWidget (val->name,
+ emacsManagerWidgetClass,
+ instance->parent, al, ac);
+
+ return clip;
+}
+#endif
+