summaryrefslogtreecommitdiff
path: root/xc/programs/xedit/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/xedit/options.c')
-rw-r--r--xc/programs/xedit/options.c670
1 files changed, 670 insertions, 0 deletions
diff --git a/xc/programs/xedit/options.c b/xc/programs/xedit/options.c
new file mode 100644
index 000000000..2ba9eedcb
--- /dev/null
+++ b/xc/programs/xedit/options.c
@@ -0,0 +1,670 @@
+/*
+ * Copyright (c) 1999 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the XFree86 Project shall
+ * not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in this Software without prior written authorization from the
+ * XFree86 Project.
+ *
+ * Author: Paulo César Pereira de Andrade
+ */
+
+/* $XFree86: xc/programs/xedit/options.c,v 1.7 1999/09/27 06:30:09 dawes Exp $ */
+
+#include <stdio.h>
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+#include "xedit.h"
+
+#include <X11/Xaw/SmeBSB.h>
+#include <X11/Xaw/SimpleMenu.h>
+
+/*
+ * Types
+ */
+typedef struct _property_info {
+ Boolean automatic;
+ char *ext_res, *prop_res;
+ char **extensions;
+ int num_extensions;
+ XawTextPropertyList *properties;
+ void (*SetMode)(Widget);
+ void (*UnsetMode)(Widget);
+} property_info;
+
+/*
+ * Prototypes
+ */
+static void SetColumns(Widget, XEvent*, String*, Cardinal*);
+static void ChangeField(Widget, XEvent*, String*, Cardinal*);
+static void EditCallback(Widget, XtPointer, XtPointer);
+static void ModeCallback(Widget, XtPointer, XtPointer);
+static void PopupColumnsCallback(Widget, XtPointer, XtPointer);
+static void CreateColumnsShell(void);
+static void ProcessColumnsCallback(Widget, XtPointer, XtPointer);
+static void DoSetTextProperties(xedit_flist_item*, property_info*);
+
+/*
+ * externs in c-mode.c
+ */
+extern void C_ModeStart(Widget);
+extern void C_ModeEnd(Widget);
+
+extern void _XawTextBuildLineTable(TextWidget, XawTextPosition, _XtBoolean);
+
+/*
+ * Initialization
+ */
+extern Widget texts[3];
+
+static Widget edit_popup, wrap_popup, justify_popup, scroll_popup,
+ columns_shell, left_text, right_text, mode_popup;
+
+static XFontStruct *fonts[3];
+static Pixel foregrounds[3], backgrounds[3];
+
+static XtActionsRec actions[] = {
+ {"set-columns", SetColumns},
+ {"change-field", ChangeField},
+};
+
+#define C_MODE 0
+static property_info property_list[] = {
+ {
+ /* C */
+ False, /* automatic */
+ NULL, /* ext_res */
+ NULL, /* prop_res */
+ NULL, /* extensions */
+ 0, /* num_extensions */
+ NULL, /* properties */
+ C_ModeStart, /* SetMode */
+ C_ModeEnd /* UnsetMode */
+ },
+};
+
+#define Offset(field) XtOffsetOf(struct _property_info, field)
+static XtResource C_resources[] = {
+ {"auto", "Auto", XtRBoolean, sizeof(Boolean),
+ Offset(automatic), XtRImmediate, (XtPointer)True},
+ {"extensions", "Extensions", XtRString, sizeof(char*),
+ Offset(ext_res), XtRString, "c,h,cc,C"},
+ {"properties", "Properties", XtRString, sizeof(char*),
+ Offset(prop_res), XtRString, "error?background=black&foreground=white"},
+};
+#undef Offset
+
+#define WRAP_NEVER 1
+#define WRAP_LINE 2
+#define WRAP_WORD 3
+#define AUTO_FILL 4
+#define JUST_LEFT 5
+#define JUST_RIGHT 6
+#define JUST_CENTER 7
+#define JUST_FULL 8
+#define SCROLL_VERT 9
+#define SCROLL_HORIZ 10
+
+static Widget autoFill, wrapNever, wrapLine, wrapWord,
+ justifyLeft, justifyRight, justifyCenter, justifyFull,
+ breakColumns, scrollVert, scrollHoriz, modeNone, modeC;
+
+void
+CreateEditPopup(void)
+{
+ Arg args[1];
+
+ edit_popup = XtCreatePopupShell("editMenu", simpleMenuWidgetClass,
+ topwindow, NULL, 0);
+ XtRealizeWidget(edit_popup);
+
+ wrap_popup = XtCreatePopupShell("wrapMenu", simpleMenuWidgetClass,
+ edit_popup, NULL, 0);
+ XtRealizeWidget(wrap_popup);
+
+ XtSetArg(args[0], XtNmenuName, "wrapMenu");
+ XtCreateManagedWidget("wrapMenuItem", smeBSBObjectClass, edit_popup, args, 1);
+
+ wrapNever = XtCreateManagedWidget("never", smeBSBObjectClass,
+ wrap_popup, NULL, 0);
+ XtAddCallback(wrapNever, XtNcallback, EditCallback, (XtPointer)WRAP_NEVER);
+ wrapLine = XtCreateManagedWidget("line", smeBSBObjectClass,
+ wrap_popup, NULL, 0);
+ XtAddCallback(wrapLine, XtNcallback, EditCallback, (XtPointer)WRAP_LINE);
+ wrapWord = XtCreateManagedWidget("word", smeBSBObjectClass,
+ wrap_popup, NULL, 0);
+ XtAddCallback(wrapWord, XtNcallback, EditCallback, (XtPointer)WRAP_WORD);
+
+ autoFill = XtCreateManagedWidget("autoFill", smeBSBObjectClass,
+ edit_popup, NULL, 0);
+ XtAddCallback(autoFill, XtNcallback, EditCallback, (XtPointer)AUTO_FILL);
+
+ justify_popup = XtCreatePopupShell("justifyMenu", simpleMenuWidgetClass,
+ edit_popup, NULL, 0);
+ XtRealizeWidget(justify_popup);
+
+ XtSetArg(args[0], XtNmenuName, "justifyMenu");
+ XtCreateManagedWidget("justifyMenuItem", smeBSBObjectClass, edit_popup, args, 1);
+
+ justifyLeft = XtCreateManagedWidget("left", smeBSBObjectClass,
+ justify_popup, NULL, 0);
+ XtAddCallback(justifyLeft, XtNcallback, EditCallback, (XtPointer)JUST_LEFT);
+ justifyRight = XtCreateManagedWidget("right", smeBSBObjectClass,
+ justify_popup, NULL, 0);
+ XtAddCallback(justifyRight, XtNcallback, EditCallback, (XtPointer)JUST_RIGHT);
+ justifyCenter = XtCreateManagedWidget("center", smeBSBObjectClass,
+ justify_popup, NULL, 0);
+ XtAddCallback(justifyCenter, XtNcallback, EditCallback, (XtPointer)JUST_CENTER);
+ justifyFull = XtCreateManagedWidget("full", smeBSBObjectClass,
+ justify_popup, NULL, 0);
+ XtAddCallback(justifyFull, XtNcallback, EditCallback, (XtPointer)JUST_FULL);
+
+ breakColumns = XtCreateManagedWidget("breakColumns", smeBSBObjectClass,
+ edit_popup, NULL, 0);
+ XtAddCallback(breakColumns, XtNcallback, PopupColumnsCallback, NULL);
+
+ scroll_popup = XtCreatePopupShell("scrollMenu", simpleMenuWidgetClass,
+ edit_popup, NULL, 0);
+ XtRealizeWidget(scroll_popup);
+
+ XtSetArg(args[0], XtNmenuName, "scrollMenu");
+ XtCreateManagedWidget("scrollMenuItem", smeBSBObjectClass, edit_popup, args, 1);
+
+ scrollVert = XtCreateManagedWidget("vertical", smeBSBObjectClass,
+ scroll_popup, NULL, 0);
+ XtAddCallback(scrollVert, XtNcallback, EditCallback, (XtPointer)SCROLL_VERT);
+ scrollHoriz = XtCreateManagedWidget("horizontal", smeBSBObjectClass,
+ scroll_popup, NULL, 0);
+ XtAddCallback(scrollHoriz, XtNcallback, EditCallback, (XtPointer)SCROLL_HORIZ);
+
+ if (international == False) {
+ char *list, *str;
+
+ mode_popup = XtCreatePopupShell("editModes", simpleMenuWidgetClass,
+ edit_popup, NULL, 0);
+ XtRealizeWidget(mode_popup);
+
+ XtSetArg(args[0], XtNmenuName, "editModes");
+ XtCreateManagedWidget("modeMenuItem", smeBSBObjectClass, edit_popup, args, 1);
+
+ modeNone = XtCreateManagedWidget("none", smeBSBObjectClass,
+ mode_popup, NULL, 0);
+ XtAddCallback(modeNone, XtNcallback, ModeCallback, (XtPointer)NULL);
+ modeC = XtCreateManagedWidget("C", smeBSBObjectClass,
+ mode_popup, NULL, 0);
+ XtGetApplicationResources(modeC, (XtPointer)&property_list[C_MODE],
+ C_resources, XtNumber(C_resources), NULL, 0);
+ property_list[C_MODE].properties =
+ XawTextSinkConvertPropertyList("C", property_list[C_MODE].prop_res,
+ topwindow->core.screen,
+ topwindow->core.colormap,
+ topwindow->core.depth);
+ list = XtNewString(property_list[C_MODE].ext_res);
+ for (str = strtok(list, " \t,"); str; str = strtok(NULL, " \t,")) {
+ property_list[C_MODE].extensions =
+ (char**)XtRealloc((XtPointer)property_list[C_MODE].extensions,
+ (property_list[C_MODE].num_extensions + 1) *
+ sizeof(char*));
+ property_list[C_MODE].extensions
+ [property_list[C_MODE].num_extensions++] = XtNewString(str);
+ }
+ XtFree(list);
+
+ XtAddCallback(modeC, XtNcallback, ModeCallback, (XtPointer)&property_list[C_MODE]);
+ }
+}
+
+void
+SetEditMenu(void)
+{
+ Arg args[7];
+ Cardinal num_args;
+ Boolean auto_fill;
+ XawTextWrapMode wrap_mode;
+ XawTextJustifyMode justify;
+ XawTextScrollMode vscroll, hscroll;
+ short left, right;
+ XawTextPropertyList *prop;
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwrap, &wrap_mode); ++num_args;
+ XtSetArg(args[num_args], XtNautoFill, &auto_fill); ++num_args;
+ XtSetArg(args[num_args], XtNjustifyMode, &justify); ++num_args;
+ XtSetArg(args[num_args], XtNleftColumn, &left); ++num_args;
+ XtSetArg(args[num_args], XtNrightColumn, &right); ++num_args;
+ XtSetArg(args[num_args], XtNscrollVertical, &vscroll); ++num_args;
+ XtSetArg(args[num_args], XtNscrollHorizontal, &hscroll); ++num_args;
+ XtGetValues(textwindow, args, num_args);
+
+ if (international == False) {
+ XtSetArg(args[0], XawNtextProperties, &prop);
+ XtGetValues(XawTextGetSink(textwindow), args, 1);
+ }
+
+ if (flist.pixmap) {
+ XtSetArg(args[0], XtNleftBitmap, None);
+ XtSetArg(args[1], XtNleftBitmap, flist.pixmap);
+ if (!auto_fill)
+ XtSetValues(autoFill, &args[0], 1);
+ else
+ XtSetValues(autoFill, &args[1], 1);
+ switch (wrap_mode) {
+ case XawtextWrapNever:
+ XtSetValues(wrapLine, &args[0], 1);
+ XtSetValues(wrapWord, &args[0], 1);
+ XtSetValues(wrapNever, &args[1], 1);
+ break;
+ case XawtextWrapLine:
+ XtSetValues(wrapNever, &args[0], 1);
+ XtSetValues(wrapWord, &args[0], 1);
+ XtSetValues(wrapLine, &args[1], 1);
+ break;
+ case XawtextWrapWord:
+ XtSetValues(wrapNever, &args[0], 1);
+ XtSetValues(wrapLine, &args[0], 1);
+ XtSetValues(wrapWord, &args[1], 1);
+ break;
+ }
+ switch (justify) {
+ case XawjustifyLeft:
+ XtSetValues(justifyRight, &args[0], 1);
+ XtSetValues(justifyCenter, &args[0], 1);
+ XtSetValues(justifyFull, &args[0], 1);
+ XtSetValues(justifyLeft, &args[1], 1);
+ break;
+ case XawjustifyRight:
+ XtSetValues(justifyLeft, &args[0], 1);
+ XtSetValues(justifyCenter, &args[0], 1);
+ XtSetValues(justifyFull, &args[0], 1);
+ XtSetValues(justifyRight, &args[1], 1);
+ break;
+ case XawjustifyCenter:
+ XtSetValues(justifyLeft, &args[0], 1);
+ XtSetValues(justifyRight, &args[0], 1);
+ XtSetValues(justifyFull, &args[0], 1);
+ XtSetValues(justifyCenter, &args[1], 1);
+ break;
+ case XawjustifyFull:
+ XtSetValues(justifyLeft, &args[0], 1);
+ XtSetValues(justifyRight, &args[0], 1);
+ XtSetValues(justifyCenter, &args[0], 1);
+ XtSetValues(justifyFull, &args[1], 1);
+ break;
+ }
+ if (!vscroll)
+ XtSetValues(scrollVert, &args[0], 1);
+ else
+ XtSetValues(scrollVert, &args[1], 1);
+ if (!hscroll)
+ XtSetValues(scrollHoriz, &args[0], 1);
+ else
+ XtSetValues(scrollHoriz, &args[1], 1);
+
+ if (international == False) {
+ if (prop == NULL) {
+ XtSetValues(modeNone, &args[1], 1);
+ XtSetValues(modeC, &args[0], 1);
+ }
+ else if (prop == property_list[C_MODE].properties) {
+ XtSetValues(modeNone, &args[0], 1);
+ XtSetValues(modeC, &args[1], 1);
+ }
+ }
+ }
+ if (!auto_fill) {
+ XtSetSensitive(wrapNever, True);
+ XtSetSensitive(wrapLine, True);
+ XtSetSensitive(wrapWord, True);
+
+ XtSetSensitive(justifyLeft, False);
+ XtSetSensitive(justifyRight, False);
+ XtSetSensitive(justifyCenter, False);
+ XtSetSensitive(justifyFull, False);
+ XtSetSensitive(breakColumns, False);
+ }
+ else {
+ XtSetSensitive(wrapNever, False);
+ XtSetSensitive(wrapLine, False);
+ XtSetSensitive(wrapWord, False);
+
+ XtSetSensitive(justifyLeft, left < right);
+ XtSetSensitive(justifyRight, left < right);
+ XtSetSensitive(justifyCenter, left < right);
+ XtSetSensitive(justifyFull, left < right);
+ XtSetSensitive(breakColumns, True);
+ }
+}
+
+/*ARGSUSED*/
+static void
+EditCallback(Widget sme, XtPointer client_data, XtPointer call_data)
+{
+ Arg args[1];
+ Boolean auto_fill;
+ XawTextScrollMode scroll;
+
+ switch ((int)client_data) {
+ case WRAP_NEVER:
+ XtSetArg(args[0], XtNwrap, XawtextWrapNever);
+ break;
+ case WRAP_LINE:
+ XtSetArg(args[0], XtNwrap, XawtextWrapLine);
+ break;
+ case WRAP_WORD:
+ XtSetArg(args[0], XtNwrap, XawtextWrapWord);
+ break;
+ case AUTO_FILL:
+ XtSetArg(args[0], XtNautoFill, &auto_fill);
+ XtGetValues(textwindow, args, 1);
+ XtSetArg(args[0], XtNautoFill, !auto_fill);
+ break;
+ case JUST_LEFT:
+ XtSetArg(args[0], XtNjustifyMode, XawjustifyLeft);
+ break;
+ case JUST_RIGHT:
+ XtSetArg(args[0], XtNjustifyMode, XawjustifyRight);
+ break;
+ case JUST_CENTER:
+ XtSetArg(args[0], XtNjustifyMode, XawjustifyCenter);
+ break;
+ case JUST_FULL:
+ XtSetArg(args[0], XtNjustifyMode, XawjustifyFull);
+ break;
+ case SCROLL_VERT:
+ XtSetArg(args[0], XtNscrollVertical, &scroll);
+ XtGetValues(textwindow, args, 1);
+ XtSetArg(args[0], XtNscrollVertical, scroll == XawtextScrollNever ?
+ XawtextScrollAlways : XawtextScrollNever);
+ break;
+ case SCROLL_HORIZ:
+ XtSetArg(args[0], XtNscrollHorizontal, &scroll);
+ XtGetValues(textwindow, args, 1);
+ XtSetArg(args[0], XtNscrollHorizontal, scroll == XawtextScrollNever ?
+ XawtextScrollAlways : XawtextScrollNever);
+ break;
+ }
+
+ XtSetValues(textwindow, args, 1);
+}
+
+static void
+CreateColumnsShell(void)
+{
+ Atom delete_window;
+ Widget form, ok, cancel;
+
+ if (columns_shell)
+ return;
+
+ XtAppAddActions(XtWidgetToApplicationContext(topwindow),
+ actions, XtNumber(actions));
+
+ columns_shell = XtCreatePopupShell("columns", transientShellWidgetClass,
+ topwindow, NULL, 0);
+ form = XtCreateManagedWidget("form", formWidgetClass,
+ columns_shell, NULL, 0);
+ XtCreateManagedWidget("leftLabel", labelWidgetClass, form, NULL, 0);
+ left_text = XtVaCreateManagedWidget("left", asciiTextWidgetClass,
+ form, XtNeditType, XawtextEdit,
+ NULL, 0);
+ XtCreateManagedWidget("rightLabel", labelWidgetClass, form, NULL, 0);
+ right_text = XtVaCreateManagedWidget("right", asciiTextWidgetClass,
+ form, XtNeditType, XawtextEdit,
+ NULL, 0);
+ ok = XtCreateManagedWidget("ok", commandWidgetClass,
+ form, NULL, 0);
+ XtAddCallback(ok, XtNcallback, ProcessColumnsCallback, (XtPointer)True);
+ cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
+ form, NULL, 0);
+ XtAddCallback(cancel, XtNcallback, ProcessColumnsCallback, (XtPointer)False);
+
+ XtRealizeWidget(columns_shell);
+ delete_window = XInternAtom(XtDisplay(columns_shell), "WM_DELETE_WINDOW", False);
+ XSetWMProtocols(XtDisplay(columns_shell), XtWindow(columns_shell), &delete_window, 1);
+
+ XtSetKeyboardFocus(columns_shell, left_text);
+}
+
+/*ARGSUSED*/
+static void
+PopupColumnsCallback(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Arg args[3];
+ char sleft[6], sright[6];
+ short left, right;
+ Dimension width, height, b_width;
+ Window r, c;
+ int x, y, wx, wy, max_x, max_y;
+ unsigned mask;
+
+ CreateColumnsShell();
+
+ XQueryPointer(XtDisplay(columns_shell), XtWindow(columns_shell),
+ &r, &c, &x, &y, &wx, &wy, &mask);
+
+ XtSetArg(args[0], XtNwidth, &width);
+ XtSetArg(args[1], XtNheight, &height);
+ XtSetArg(args[2], XtNborderWidth, &b_width);
+ XtGetValues(columns_shell, args, 3);
+
+ width += b_width << 1;
+ height += b_width << 1;
+
+ x -= (Position)(width >> 1);
+ if (x < 0)
+ x = 0;
+ if (x > (max_x = (Position)(XtScreen(columns_shell)->width - width)))
+ x = max_x;
+
+ y -= (Position)(height >> 1);
+ if (y < 0)
+ y = 0;
+ if (y > (max_y = (Position)(XtScreen(columns_shell)->height - height)))
+ y = max_y;
+
+ XtSetArg(args[0], XtNx, x);
+ XtSetArg(args[1], XtNy, y);
+ XtSetValues(columns_shell, args, 2);
+
+ XtSetArg(args[0], XtNleftColumn, &left);
+ XtSetArg(args[1], XtNrightColumn, &right);
+ XtGetValues(textwindow, args, 2);
+ XmuSnprintf(sleft, sizeof(sleft), "%d", left);
+ XmuSnprintf(sright, sizeof(sright), "%d", right);
+ XtSetArg(args[0], XtNstring, sleft);
+ XtSetValues(left_text, args, 1);
+ XtSetArg(args[0], XtNstring, sright);
+ XtSetValues(right_text, args, 1);
+ XtPopup(columns_shell, XtGrabExclusive);
+}
+
+/*ARGSUSED*/
+static void
+ProcessColumnsCallback(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ if (client_data) {
+ Arg args[2];
+ char *left, *right;
+ short leftc, rightc;
+
+ left = GetString(left_text);
+ right = GetString(right_text);
+
+ leftc = atoi(left);
+ rightc = atoi(right);
+ XtSetArg(args[0], XtNleftColumn, leftc);
+ XtSetArg(args[1], XtNrightColumn, rightc);
+
+ XtSetValues(textwindow, args, 2);
+ }
+
+ XtPopdown(columns_shell);
+}
+
+/*ARGSUSED*/
+static void
+SetColumns(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ Bool ok = False;
+
+ if (*num_params &&
+ (params[0][0] == 'o' || params[0][0] == 'O'))
+ ok = True;
+
+ ProcessColumnsCallback(w, (XtPointer)ok, NULL);
+}
+
+/*ARGSUSED*/
+static void
+ChangeField(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ Widget focus = XtGetKeyboardFocusWidget(columns_shell);
+
+ XtSetKeyboardFocus(columns_shell,
+ focus == left_text ? right_text : left_text);
+}
+
+/*ARGSUSED*/
+static void
+ModeCallback(Widget sme, XtPointer client_data, XtPointer call_data)
+{
+ DoSetTextProperties(FindTextSource(XawTextGetSource(textwindow), NULL),
+ (property_info*)client_data);
+}
+
+void
+SetTextProperties(xedit_flist_item *item, Bool force)
+{
+ int i, j;
+ char *ext = strrchr(item->name, '.');
+ property_info *info = NULL;
+
+ if (!ext || !*ext) {
+ DoSetTextProperties(item, NULL);
+ return;
+ }
+
+ ++ext;
+
+ for (i = 0; i < sizeof(property_list) / sizeof(property_list[0]); i++) {
+ info = &property_list[i];
+ for (j = 0; j < info->num_extensions; j++)
+ if (strcmp(info->extensions[j], ext) == 0)
+ break;
+ if (j < info->num_extensions)
+ break;
+ }
+
+ if (i >= sizeof(property_list) / sizeof(property_list[0]) ||
+ (!force && info->automatic == False))
+ info = NULL;
+ DoSetTextProperties(item, info);
+}
+
+void
+UpdateTextProperties(void)
+{
+ Arg args[4];
+ Cardinal num_args;
+ xedit_flist_item *item;
+ XawTextPropertyList *prop;
+ Widget text, source, sink;
+ int i;
+
+ /* save default information */
+ if (fonts[0] == NULL) {
+ for (i = 0; i < 3; i++) {
+ num_args = 0;
+ XtSetArg(args[num_args], XtNfont, &fonts[i]); ++num_args;
+ XtSetArg(args[num_args], XtNforeground, &foregrounds[i]); ++num_args;
+ XtSetArg(args[num_args], XtNbackground, &backgrounds[i]); ++num_args;
+ XtGetValues(XawTextGetSink(texts[i]), args, num_args);
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ text = texts[i];
+ source = XawTextGetSource(text);
+ sink = XawTextGetSink(text);
+ item = FindTextSource(source, NULL);
+
+ XtSetArg(args[0], XawNtextProperties, &prop);
+ XtGetValues(sink, args, 1);
+
+ if (item == NULL || prop == item->properties)
+ continue;
+
+ XtSetArg(args[0], XawNtextProperties, item->properties);
+ num_args = 1;
+ if (item->properties == NULL) {
+ XtSetArg(args[num_args], XtNfont, fonts[i]); ++num_args;
+ XtSetArg(args[num_args], XtNforeground, foregrounds[i]); ++num_args;
+ XtSetArg(args[num_args], XtNbackground, backgrounds[i]); ++num_args;
+ }
+ XtSetValues(sink, args, num_args);
+
+ _XawTextBuildLineTable((TextWidget)text,
+ XawTextTopPosition(text), True);
+ XawTextDisplay(text);
+ }
+}
+
+static void
+DoSetTextProperties(xedit_flist_item *item, property_info *info)
+{
+ XawTextPropertyList *prop;
+ Widget source;
+ Arg args[1];
+ int idx, i;
+
+ for (idx = 0; idx < 3; idx++)
+ if (texts[idx] == textwindow)
+ break;
+
+ source = item->source;
+
+ XtSetArg(args[0], XawNtextProperties, &prop);
+ XtGetValues(XawTextGetSink(texts[idx]), args, 1);
+
+ XawTextSourceClearEntities(source, 0,
+ XawTextSourceScan(source, 0, XawstAll,
+ XawsdRight, 1, True));
+
+ if (prop) {
+ for (i = 0; i < sizeof(property_list) / sizeof(property_list[0]); i++)
+ if (property_list[i].properties == prop) {
+ (property_list[i].UnsetMode)(source);
+ break;
+ }
+ }
+
+ item->properties = info ? info->properties : NULL;
+
+ XtSetArg(args[0], XawNtextProperties, item->properties);
+ XtSetValues(XawTextGetSink(textwindow), args, 1);
+ if (info)
+ (info->SetMode)(source);
+ XtSetArg(args[0], XawNtextProperties, prop);
+ XtSetValues(XawTextGetSink(textwindow), args, 1);
+
+ UpdateTextProperties();
+}