util.c revision f14f4646
15dfecf96Smrg/* $XConsortium: util.c,v 1.16 92/08/12 16:46:22 converse Exp $ */
25dfecf96Smrg
35dfecf96Smrg/*
45dfecf96Smrg *			  COPYRIGHT 1987
55dfecf96Smrg *		   DIGITAL EQUIPMENT CORPORATION
65dfecf96Smrg *		       MAYNARD, MASSACHUSETTS
75dfecf96Smrg *			ALL RIGHTS RESERVED.
85dfecf96Smrg *
95dfecf96Smrg * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
105dfecf96Smrg * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
115dfecf96Smrg * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
125dfecf96Smrg * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
135dfecf96Smrg *
145dfecf96Smrg * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
155dfecf96Smrg * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
165dfecf96Smrg * SET FORTH ABOVE.
175dfecf96Smrg *
185dfecf96Smrg *
195dfecf96Smrg * Permission to use, copy, modify, and distribute this software and its
205dfecf96Smrg * documentation for any purpose and without fee is hereby granted, provided
215dfecf96Smrg * that the above copyright notice appear in all copies and that both that
225dfecf96Smrg * copyright notice and this permission notice appear in supporting
235dfecf96Smrg * documentation, and that the name of Digital Equipment Corporation not be
245dfecf96Smrg * used in advertising or publicity pertaining to distribution of the software
255dfecf96Smrg * without specific, written prior permission.
265dfecf96Smrg */
275dfecf96Smrg/* $XFree86: xc/programs/xedit/util.c,v 1.26 2003/05/07 20:54:43 herrb Exp $ */
285dfecf96Smrg
295dfecf96Smrg#include <stdio.h>
305dfecf96Smrg#include <stdarg.h>
31f14f4646Smrg
32f14f4646Smrg#include <libgen.h>		/* POSIX basename() */
335dfecf96Smrg#include <stdlib.h>		/* for realpath() */
34f14f4646Smrg#include <errno.h>		/* for ENOENT */
355dfecf96Smrg#include "xedit.h"
365dfecf96Smrg
375dfecf96Smrg#include <X11/Xfuncs.h>
385dfecf96Smrg#include <X11/Xos.h>		/* for types.h */
395dfecf96Smrg
405dfecf96Smrg#include <sys/stat.h>
415dfecf96Smrg#include <X11/Xmu/CharSet.h>
425dfecf96Smrg#include <X11/Xaw/SmeBSB.h>
435dfecf96Smrg#include <X11/Xaw/SimpleMenu.h>
445dfecf96Smrg
455dfecf96Smrg/*
465dfecf96Smrg * Prototypes
475dfecf96Smrg */
485dfecf96Smrgstatic void SwitchSourceCallback(Widget, XtPointer, XtPointer);
495dfecf96Smrgstatic int WindowIndex(Widget);
505dfecf96Smrgstatic void ChangeTextWindow(Widget);
515dfecf96Smrg
525dfecf96Smrg/*
535dfecf96Smrg * External
545dfecf96Smrg */
555dfecf96Smrgextern void _XawTextShowPosition(TextWidget);
565dfecf96Smrg
575dfecf96Smrg/*
585dfecf96Smrg * Initialization
595dfecf96Smrg */
605dfecf96Smrgextern Widget scratch;
615dfecf96Smrgextern Widget vpanes[2], labels[3], texts[3], forms[3];
625dfecf96Smrgextern XawTextWrapMode wrapmodes[3];
635dfecf96Smrg
645dfecf96Smrg#ifndef va_copy
655dfecf96Smrg# ifdef __va_copy
665dfecf96Smrg#  define va_copy __va_copy
675dfecf96Smrg# else
685dfecf96Smrg#  error "no working va_copy was found"
695dfecf96Smrg# endif
705dfecf96Smrg#endif
715dfecf96Smrg
725dfecf96Smrg/*
735dfecf96Smrg * Implementation
745dfecf96Smrg */
755dfecf96Smrgvoid
765dfecf96SmrgXeditPrintf(const char *format, ...)
775dfecf96Smrg{
78f14f4646Smrg    static struct {
79f14f4646Smrg	XawTextPosition	last;
80f14f4646Smrg	int		size;
81f14f4646Smrg	int		length;
82f14f4646Smrg	int		repeat;
83f14f4646Smrg	char		*buffer;
84f14f4646Smrg    } info;
85f14f4646Smrg
86f14f4646Smrg    size_t		size;
87f14f4646Smrg    va_list		va;
88f14f4646Smrg    XawTextBlock	text;
89f14f4646Smrg    XawTextPosition	left, right;
90f14f4646Smrg    char		buffer[BUFSIZ];
91f14f4646Smrg    char		*string, rbuffer[32];
925dfecf96Smrg
93f14f4646Smrg    va_start(va, format);
94f14f4646Smrg    size = vsnprintf(buffer, sizeof(buffer), format, va);
955dfecf96Smrg    va_end(va);
965dfecf96Smrg
97f14f4646Smrg    /* Should never happen... */
98f14f4646Smrg    if (size >= sizeof(buffer)) {
99f14f4646Smrg	strcpy(buffer + sizeof(buffer) - 5, "...\n");
100f14f4646Smrg	size = sizeof(buffer) - 1;
101f14f4646Smrg    }
102f14f4646Smrg    else if (size) {
103f14f4646Smrg	left = right = XawTextSourceScan(XawTextGetSource(messwidget),
104f14f4646Smrg					 0, XawstAll, XawsdRight, 1, True);
105f14f4646Smrg
106f14f4646Smrg	if (left == info.last &&
107f14f4646Smrg	    info.buffer &&
108f14f4646Smrg	    strcmp(buffer, info.buffer) == 0) {
109f14f4646Smrg	    string = rbuffer;
110f14f4646Smrg	    if (info.repeat == 1)
111f14f4646Smrg		left -= info.buffer[strlen(info.buffer) - 1] == '\n';
112f14f4646Smrg	    else
113f14f4646Smrg		left -= info.length;
114f14f4646Smrg	    size = info.length = XmuSnprintf(rbuffer, sizeof(rbuffer),
115f14f4646Smrg					     " [%d times]\n", ++info.repeat);
116f14f4646Smrg	}
117f14f4646Smrg	else {
118f14f4646Smrg	    string = buffer;
119f14f4646Smrg	    if (size >= info.size)
120f14f4646Smrg		info.buffer = XtMalloc(size + 1);
121f14f4646Smrg	    strcpy(info.buffer, buffer);
122f14f4646Smrg	    info.repeat = 1;
123f14f4646Smrg	}
124f14f4646Smrg
125f14f4646Smrg	text.length = size;
126f14f4646Smrg	text.ptr = string;
127f14f4646Smrg	text.firstPos = 0;
128f14f4646Smrg	text.format = FMT8BIT;
1295dfecf96Smrg
130f14f4646Smrg	XawTextReplace(messwidget, left, right, &text);
1315dfecf96Smrg
132f14f4646Smrg	info.last = left + text.length;
133f14f4646Smrg	XawTextSetInsertionPoint(messwidget, info.last);
134f14f4646Smrg    }
1355dfecf96Smrg}
1365dfecf96Smrg
1375dfecf96SmrgWidget
1385dfecf96SmrgMakeCommandButton(Widget box, char *name, XtCallbackProc function)
1395dfecf96Smrg{
1405dfecf96Smrg  Widget w = XtCreateManagedWidget(name, commandWidgetClass, box, NULL, ZERO);
1415dfecf96Smrg  if (function != NULL)
1425dfecf96Smrg    XtAddCallback(w, XtNcallback, function, (caddr_t) NULL);
1435dfecf96Smrg  else
1445dfecf96Smrg    XtVaSetValues(w, XtNsensitive, False, NULL);
1455dfecf96Smrg  return w;
1465dfecf96Smrg}
1475dfecf96Smrg
1485dfecf96SmrgWidget
1495dfecf96SmrgMakeStringBox(Widget parent, String name, String string)
1505dfecf96Smrg{
1515dfecf96Smrg  Arg args[5];
1525dfecf96Smrg  Cardinal numargs = 0;
1535dfecf96Smrg  Widget StringW;
1545dfecf96Smrg
1555dfecf96Smrg  XtSetArg(args[numargs], XtNeditType, XawtextEdit); numargs++;
1565dfecf96Smrg  XtSetArg(args[numargs], XtNstring, string); numargs++;
1575dfecf96Smrg
1585dfecf96Smrg  StringW = XtCreateManagedWidget(name, asciiTextWidgetClass,
1595dfecf96Smrg				  parent, args, numargs);
1605dfecf96Smrg  return(StringW);
1615dfecf96Smrg}
1625dfecf96Smrg
1635dfecf96Smrg/*	Function Name: GetString
1645dfecf96Smrg *	Description: retrieves the string from a asciiText widget.
1655dfecf96Smrg *	Arguments: w - the ascii text widget.
1665dfecf96Smrg *	Returns: the filename.
1675dfecf96Smrg */
1685dfecf96Smrg
1695dfecf96SmrgString
1705dfecf96SmrgGetString(Widget w)
1715dfecf96Smrg{
1725dfecf96Smrg  String str;
1735dfecf96Smrg  Arg arglist[1];
1745dfecf96Smrg
1755dfecf96Smrg  XtSetArg(arglist[0], XtNstring, &str);
1765dfecf96Smrg  XtGetValues( w, arglist, ONE);
1775dfecf96Smrg  return(str);
1785dfecf96Smrg}
1795dfecf96Smrg
1805dfecf96Smrg/*	Function Name: MaybeCreateFile
1815dfecf96Smrg *	Description: Checks to see if file exists, and if not, creates it.
1825dfecf96Smrg *	Arguments: file - name of file to check.
1835dfecf96Smrg *	Returns: permissions status
1845dfecf96Smrg */
1855dfecf96Smrg
1865dfecf96SmrgFileAccess
1875dfecf96SmrgMaybeCreateFile(char *file)
1885dfecf96Smrg{
1895dfecf96Smrg    Boolean exists;
1905dfecf96Smrg    int fd;
1915dfecf96Smrg
1925dfecf96Smrg    if (access(file, F_OK) != 0) {
1935dfecf96Smrg	fd = creat(file, 0666);
1945dfecf96Smrg	if (fd != -1)
1955dfecf96Smrg	    close(fd);
1965dfecf96Smrg    }
1975dfecf96Smrg
1985dfecf96Smrg    return(CheckFilePermissions(file, &exists));
1995dfecf96Smrg}
2005dfecf96Smrg
2015dfecf96Smrg
2025dfecf96SmrgFileAccess
2035dfecf96SmrgCheckFilePermissions(char *file, Boolean *exists)
2045dfecf96Smrg{
2055dfecf96Smrg    char temp[BUFSIZ], *ptr;
2065dfecf96Smrg
2075dfecf96Smrg    if (access(file, F_OK) == 0) {
2085dfecf96Smrg	*exists = TRUE;
2095dfecf96Smrg
2105dfecf96Smrg	if (access(file, R_OK) != 0)
2115dfecf96Smrg	    return(NO_READ);
2125dfecf96Smrg
2135dfecf96Smrg	if (access(file, R_OK | W_OK) == 0)
2145dfecf96Smrg	    return(WRITE_OK);
2155dfecf96Smrg	return(READ_OK);
2165dfecf96Smrg    }
2175dfecf96Smrg
2185dfecf96Smrg    *exists = FALSE;
2195dfecf96Smrg
2205dfecf96Smrg    strncpy(temp, file, sizeof(temp) - 1);
2215dfecf96Smrg    temp[sizeof(temp) - 1] = '\0';
2225dfecf96Smrg    if ( (ptr = rindex(temp, '/')) == NULL)
2235dfecf96Smrg	strcpy(temp, ".");
2245dfecf96Smrg    else
2255dfecf96Smrg	*ptr = '\0';
2265dfecf96Smrg
2275dfecf96Smrg    if (access(temp, R_OK | W_OK | X_OK) == 0)
2285dfecf96Smrg	return(WRITE_OK);
2295dfecf96Smrg    return(NO_READ);
2305dfecf96Smrg}
2315dfecf96Smrg
2325dfecf96Smrgxedit_flist_item *
2335dfecf96SmrgAddTextSource(Widget source, char *name, char *filename, int flags,
2345dfecf96Smrg	      FileAccess file_access)
2355dfecf96Smrg{
2365dfecf96Smrg    xedit_flist_item *item;
2375dfecf96Smrg    char *wid_name;
2385dfecf96Smrg
2395dfecf96Smrg    item = (xedit_flist_item*)XtMalloc(sizeof(xedit_flist_item));
2405dfecf96Smrg    item->source = source;
2415dfecf96Smrg    item->name = XtNewString(name);
2425dfecf96Smrg    item->filename = XtNewString(filename);
2435dfecf96Smrg    item->flags = flags;
2445dfecf96Smrg    item->file_access = file_access;
2455dfecf96Smrg    item->display_position = item->insert_position = 0;
2465dfecf96Smrg    item->mode = 0;
247f14f4646Smrg    item->mtime = 0;
2485dfecf96Smrg    item->properties = NULL;
2495dfecf96Smrg    item->xldata = NULL;
250f14f4646Smrg    /* Try to load associated tags file */
251f14f4646Smrg    SearchTagsFile(item);
2525dfecf96Smrg
2535dfecf96Smrg    flist.itens = (xedit_flist_item**)
2545dfecf96Smrg	XtRealloc((char*)flist.itens, sizeof(xedit_flist_item*)
2555dfecf96Smrg		  * (flist.num_itens + 1));
2565dfecf96Smrg
2575dfecf96Smrg    flist.itens[flist.num_itens++] = item;
2585dfecf96Smrg
2595dfecf96Smrg    if (!flist.popup) {
2605dfecf96Smrg	flist.popup = XtCreatePopupShell("fileMenu", simpleMenuWidgetClass,
2615dfecf96Smrg					 topwindow, NULL, 0);
2625dfecf96Smrg	/* XXX hack: this don't allow setting the geometry of the popup widget
2635dfecf96Smrg	 * as it will override any settings when a menu entry is inserted
2645dfecf96Smrg	 * or deleted, but saves us the trouble generated by a resource
2655dfecf96Smrg	 * setting like: '*geometry: <width>x<height>'
2665dfecf96Smrg	 */
2675dfecf96Smrg	XtRealizeWidget(flist.popup);
2685dfecf96Smrg    }
2695dfecf96Smrg    if ((wid_name = strrchr(item->name, '/')) == NULL)
2705dfecf96Smrg	wid_name = item->name;
2715dfecf96Smrg    else
2725dfecf96Smrg	++wid_name;
2735dfecf96Smrg    item->sme = XtVaCreateManagedWidget(wid_name, smeBSBObjectClass,
274f14f4646Smrg					flist.popup, XtNlabel, item->filename,
2755dfecf96Smrg					NULL, NULL);
2765dfecf96Smrg    XtAddCallback(item->sme, XtNcallback,
2775dfecf96Smrg		  SwitchSourceCallback, (XtPointer)item);
2785dfecf96Smrg
2795dfecf96Smrg    SetTextProperties(item);
2805dfecf96Smrg
2815dfecf96Smrg    return (item);
2825dfecf96Smrg}
2835dfecf96Smrg
2845dfecf96SmrgBool
2855dfecf96SmrgKillTextSource(xedit_flist_item *item)
2865dfecf96Smrg{
2875dfecf96Smrg    xedit_flist_item *nitem = NULL;
2885dfecf96Smrg    unsigned idx, i;
2895dfecf96Smrg    Arg targs[3];
2905dfecf96Smrg    Cardinal tnum_args;
2915dfecf96Smrg    Arg largs[2];
2925dfecf96Smrg    Cardinal lnum_args;
2935dfecf96Smrg    char label_buf[BUFSIZ];
2945dfecf96Smrg
2955dfecf96Smrg    for (idx = 0; idx < flist.num_itens; idx++)
2965dfecf96Smrg	if (flist.itens[idx] == item) {
2975dfecf96Smrg	    if (idx + 1 < flist.num_itens)
2985dfecf96Smrg		nitem = flist.itens[idx + 1];
2995dfecf96Smrg	    else if (idx >= 1)
3005dfecf96Smrg		nitem = flist.itens[idx - 1];
3015dfecf96Smrg	    break;
3025dfecf96Smrg	}
3035dfecf96Smrg
3045dfecf96Smrg    if (idx >= flist.num_itens)
3055dfecf96Smrg	return (False);
3065dfecf96Smrg
3075dfecf96Smrg    flist.current = nitem;
3085dfecf96Smrg    if (item == flist.other)
3095dfecf96Smrg	flist.other = NULL;
3105dfecf96Smrg
3115dfecf96Smrg    if (nitem->file_access == READ_OK)
3125dfecf96Smrg	XmuSnprintf(label_buf, sizeof(label_buf), "%s       READ ONLY",
3135dfecf96Smrg		    nitem->name);
3145dfecf96Smrg    else if (nitem->file_access == WRITE_OK)
3155dfecf96Smrg	XmuSnprintf(label_buf, sizeof(label_buf), "%s       Read - Write",
3165dfecf96Smrg		    nitem->name);
3175dfecf96Smrg    lnum_args = 0;
3185dfecf96Smrg    XtSetArg(largs[lnum_args], XtNlabel, label_buf);		++lnum_args;
3195dfecf96Smrg    if (nitem->flags & CHANGED_BIT)
3205dfecf96Smrg	XtSetArg(largs[lnum_args], XtNleftBitmap, flist.pixmap);
3215dfecf96Smrg    else
3225dfecf96Smrg	XtSetArg(largs[lnum_args], XtNleftBitmap, None);
3235dfecf96Smrg    ++lnum_args;
3245dfecf96Smrg
3255dfecf96Smrg    tnum_args = 0;
3265dfecf96Smrg    XtSetArg(targs[tnum_args], XtNtextSource,
3275dfecf96Smrg	     nitem->source);				++tnum_args;
3285dfecf96Smrg    XtSetArg(targs[tnum_args], XtNdisplayPosition,
3295dfecf96Smrg	     nitem->display_position);			++tnum_args;
3305dfecf96Smrg    XtSetArg(targs[tnum_args], XtNinsertPosition,
3315dfecf96Smrg	     nitem->insert_position);			++tnum_args;
3325dfecf96Smrg    for (i = 0; i < 3; i++)
3335dfecf96Smrg	if (XawTextGetSource(texts[i]) == item->source) {
3345dfecf96Smrg	    XtSetValues(labels[i], largs, lnum_args);
3355dfecf96Smrg	    XawTextDisableRedisplay(texts[i]);
3365dfecf96Smrg	    XtSetValues(texts[i], targs, tnum_args);
3375dfecf96Smrg
3385dfecf96Smrg	    UpdateTextProperties(0);
3395dfecf96Smrg
3405dfecf96Smrg	    _XawTextShowPosition((TextWidget)texts[i]);
3415dfecf96Smrg	    XawTextEnableRedisplay(texts[i]);
3425dfecf96Smrg	    if (texts[i] == textwindow) {
3435dfecf96Smrg		Arg args[1];
3445dfecf96Smrg
3455dfecf96Smrg		if (nitem->source != scratch)
3465dfecf96Smrg		    XtSetArg(args[0], XtNstring, nitem->name);
3475dfecf96Smrg		else
3485dfecf96Smrg		    XtSetArg(args[0], XtNstring, NULL);
3495dfecf96Smrg		XtSetValues(filenamewindow, args, 1);
3505dfecf96Smrg	    }
3515dfecf96Smrg	}
3525dfecf96Smrg
3535dfecf96Smrg    UnsetTextProperties(item);
3545dfecf96Smrg    XtFree(item->name);
3555dfecf96Smrg    XtFree(item->filename);
3565dfecf96Smrg    XtDestroyWidget(item->sme);
3575dfecf96Smrg    XtDestroyWidget(item->source);
3585dfecf96Smrg    XtFree((char*)item);
3595dfecf96Smrg
3605dfecf96Smrg    if (idx < flist.num_itens - 1)
3615dfecf96Smrg	memmove(&flist.itens[idx], &flist.itens[idx + 1],
3625dfecf96Smrg		(flist.num_itens - idx) * sizeof(xedit_flist_item*));
3635dfecf96Smrg
3645dfecf96Smrg    --flist.num_itens;
3655dfecf96Smrg
3665dfecf96Smrg    return (True);
3675dfecf96Smrg}
3685dfecf96Smrg
3695dfecf96Smrgxedit_flist_item *
3705dfecf96SmrgFindTextSource(Widget source, char *filename)
3715dfecf96Smrg{
3725dfecf96Smrg    unsigned i;
3735dfecf96Smrg
3745dfecf96Smrg    if (source) {
3755dfecf96Smrg	for (i = 0; i < flist.num_itens; i++)
3765dfecf96Smrg	    if (flist.itens[i]->source == source)
3775dfecf96Smrg		return (flist.itens[i]);
3785dfecf96Smrg    }
3795dfecf96Smrg    else if (filename) {
3805dfecf96Smrg	for (i = 0; i < flist.num_itens; i++)
3815dfecf96Smrg	    if (strcmp(flist.itens[i]->filename, filename) == 0)
3825dfecf96Smrg		return (flist.itens[i]);
3835dfecf96Smrg    }
3845dfecf96Smrg
3855dfecf96Smrg    return (NULL);
3865dfecf96Smrg}
3875dfecf96Smrg
3885dfecf96Smrgvoid
3895dfecf96SmrgSwitchTextSource(xedit_flist_item *item)
3905dfecf96Smrg{
3915dfecf96Smrg    Arg args[4];
3925dfecf96Smrg    Cardinal num_args;
3935dfecf96Smrg    char label_buf[BUFSIZ];
3945dfecf96Smrg    xedit_flist_item *old_item =
3955dfecf96Smrg	FindTextSource(XawTextGetSource(textwindow), NULL);
3965dfecf96Smrg    int i;
3975dfecf96Smrg
3985dfecf96Smrg    if (old_item != item)
3995dfecf96Smrg	flist.other = old_item;
4005dfecf96Smrg    flist.current = item;
4015dfecf96Smrg
4025dfecf96Smrg    XawTextDisableRedisplay(textwindow);
4035dfecf96Smrg    if (item->file_access == READ_OK)
4045dfecf96Smrg	XmuSnprintf(label_buf, sizeof(label_buf), "%s       READ ONLY",
4055dfecf96Smrg		    item->name);
4065dfecf96Smrg    else if (item->file_access == WRITE_OK)
4075dfecf96Smrg	XmuSnprintf(label_buf, sizeof(label_buf), "%s       Read - Write",
4085dfecf96Smrg		    item->name);
4095dfecf96Smrg    num_args = 0;
4105dfecf96Smrg    XtSetArg(args[num_args], XtNlabel, label_buf);		++num_args;
4115dfecf96Smrg    if (item->flags & CHANGED_BIT)
4125dfecf96Smrg	XtSetArg(args[num_args], XtNleftBitmap, flist.pixmap);
4135dfecf96Smrg    else
4145dfecf96Smrg	XtSetArg(args[num_args], XtNleftBitmap, None);
4155dfecf96Smrg    ++num_args;
4165dfecf96Smrg    XtSetValues(labelwindow, args, num_args);
4175dfecf96Smrg
4185dfecf96Smrg    for (i = 0; i < 3; i++)
4195dfecf96Smrg	if (XawTextGetSource(texts[i]) == item->source
4205dfecf96Smrg	    && XtIsManaged(texts[i]))
4215dfecf96Smrg	    break;
4225dfecf96Smrg
4235dfecf96Smrg    if (i < 3) {
4245dfecf96Smrg	num_args = 0;
4255dfecf96Smrg	XtSetArg(args[num_args], XtNdisplayPosition,
4265dfecf96Smrg	     &(item->display_position));			++num_args;
4275dfecf96Smrg	XtSetArg(args[num_args], XtNinsertPosition,
4285dfecf96Smrg	     &(item->insert_position));				++num_args;
4295dfecf96Smrg	XtGetValues(texts[i], args, num_args);
4305dfecf96Smrg    }
4315dfecf96Smrg    if (old_item != item) {
4325dfecf96Smrg	int count, idx = 0;
4335dfecf96Smrg
4345dfecf96Smrg	num_args = 0;
4355dfecf96Smrg	XtSetArg(args[num_args], XtNdisplayPosition,
4365dfecf96Smrg	     &(old_item->display_position));			++num_args;
4375dfecf96Smrg	XtSetArg(args[num_args], XtNinsertPosition,
4385dfecf96Smrg	     &(old_item->insert_position));			++num_args;
4395dfecf96Smrg	XtGetValues(textwindow, args, num_args);
4405dfecf96Smrg
4415dfecf96Smrg	for (count = 0, i = 0; i < 3; i++)
4425dfecf96Smrg	    if (XawTextGetSource(texts[i]) == old_item->source
4435dfecf96Smrg		&& XtIsManaged(texts[i])) {
4445dfecf96Smrg		if (++count > 1)
4455dfecf96Smrg		    break;
4465dfecf96Smrg		idx = i;
4475dfecf96Smrg	    }
4485dfecf96Smrg
4495dfecf96Smrg	if (count == 1) {
4505dfecf96Smrg	    num_args = 0;
4515dfecf96Smrg	    XtSetArg(args[num_args], XtNdisplayPosition,
4525dfecf96Smrg		     &(old_item->display_position));		++num_args;
4535dfecf96Smrg		XtSetArg(args[num_args], XtNinsertPosition,
4545dfecf96Smrg		     &(old_item->insert_position));		++num_args;
4555dfecf96Smrg	    XtGetValues(texts[idx], args, num_args);
4565dfecf96Smrg	}
4575dfecf96Smrg    }
4585dfecf96Smrg
4595dfecf96Smrg    num_args = 0;
4605dfecf96Smrg    XtSetArg(args[num_args], XtNtextSource, item->source);	++num_args;
4615dfecf96Smrg    XtSetArg(args[num_args], XtNdisplayPosition, item->display_position);
4625dfecf96Smrg    ++num_args;
4635dfecf96Smrg    XtSetArg(args[num_args], XtNinsertPosition, item->insert_position);
4645dfecf96Smrg    ++num_args;
4655dfecf96Smrg    if (item->flags & WRAP_BIT)
4665dfecf96Smrg	XtSetArg(args[num_args], XtNwrap, item->wrap);
4675dfecf96Smrg    else
4685dfecf96Smrg	XtSetArg(args[num_args], XtNwrap, wrapmodes[WindowIndex(textwindow)]);
4695dfecf96Smrg    ++num_args;
4705dfecf96Smrg    XtSetValues(textwindow, args, num_args);
4715dfecf96Smrg
4725dfecf96Smrg    UpdateTextProperties(0);
4735dfecf96Smrg
4745dfecf96Smrg    _XawTextShowPosition((TextWidget)textwindow);
4755dfecf96Smrg    XawTextEnableRedisplay(textwindow);
4765dfecf96Smrg
4775dfecf96Smrg    num_args = 0;
4785dfecf96Smrg    if (item->source != scratch) {
4795dfecf96Smrg	XtSetArg(args[num_args], XtNstring, item->name);	++num_args;
4805dfecf96Smrg    }
4815dfecf96Smrg    else {
4825dfecf96Smrg	XtSetArg(args[num_args], XtNstring, NULL);		++num_args;
4835dfecf96Smrg    }
4845dfecf96Smrg    XtSetValues(filenamewindow, args, num_args);
485f14f4646Smrg    /* XXX This probably should be done by the TextWidget, i.e. notice
486f14f4646Smrg     * if the cursor became inivisible due to an horizontal scroll */
487f14f4646Smrg    _XawTextShowPosition((TextWidget)filenamewindow);
4885dfecf96Smrg}
4895dfecf96Smrg
4905dfecf96Smrgchar *
4915dfecf96SmrgResolveName(char *filename)
4925dfecf96Smrg{
493f14f4646Smrg#ifndef __UNIXOS2__
494f14f4646Smrg    static char *name;
495f14f4646Smrg    char	*result, *tmp = name;
496f14f4646Smrg#endif
497f14f4646Smrg
4985dfecf96Smrg    if (filename == NULL)
4995dfecf96Smrg	filename = GetString(filenamewindow);
5005dfecf96Smrg
5015dfecf96Smrg#ifndef __UNIXOS2__
502f14f4646Smrg    /* Ensure not passing the same pointer again to realpath */
503f14f4646Smrg    name = XtMalloc(BUFSIZ);
504f14f4646Smrg    XtFree(tmp);
505f14f4646Smrg    result = realpath(filename, name);
506f14f4646Smrg
507f14f4646Smrg    if (result == NULL && errno == ENOENT) {
508f14f4646Smrg	int	length;
509f14f4646Smrg	char	*dir, *file;
510f14f4646Smrg
511f14f4646Smrg	length = strlen(filename);
512f14f4646Smrg	tmp = dir = XtMalloc(length + 1);
513f14f4646Smrg	strcpy(dir, filename);
514f14f4646Smrg
515f14f4646Smrg	file = basename(filename);
516f14f4646Smrg	dir = dirname(tmp);
517f14f4646Smrg
518f14f4646Smrg	/* Creating a new file? */
519f14f4646Smrg	if (dir && file && strcmp(dir, file) &&
520f14f4646Smrg	    access(dir, F_OK) == 0 &&
521f14f4646Smrg	    (result = realpath(dir, name)) == name) {
522f14f4646Smrg	    int	length = strlen(result);
523f14f4646Smrg
524f14f4646Smrg	    XmuSnprintf(result + length, BUFSIZ - length, "%s%s",
525f14f4646Smrg			dir[length - 1] == '/' ? "" : "/", file);
526f14f4646Smrg	}
527f14f4646Smrg
528f14f4646Smrg	XtFree(tmp);
529f14f4646Smrg    }
530f14f4646Smrg
531f14f4646Smrg    return (result);
5325dfecf96Smrg#else
5335dfecf96Smrg    return filename;
5345dfecf96Smrg#endif
5355dfecf96Smrg}
5365dfecf96Smrg
5375dfecf96Smrgstatic void
5385dfecf96SmrgChangeTextWindow(Widget w)
5395dfecf96Smrg{
5405dfecf96Smrg    Arg args[1];
5415dfecf96Smrg
5425dfecf96Smrg    if (textwindow != w) {
5435dfecf96Smrg	xedit_flist_item *other, *current;
5445dfecf96Smrg
5455dfecf96Smrg	other = FindTextSource(XawTextGetSource(textwindow), NULL);
5465dfecf96Smrg	current = FindTextSource(XawTextGetSource(w), NULL);
5475dfecf96Smrg	if (other != current)
5485dfecf96Smrg	    flist.other = other;
5495dfecf96Smrg	if (current)
5505dfecf96Smrg	    flist.current = current;
5515dfecf96Smrg	XtSetArg(args[0], XtNdisplayCaret, False);
5525dfecf96Smrg	XtSetValues(textwindow, args, 1);
5535dfecf96Smrg	XtSetArg(args[0], XtNdisplayCaret, True);
5545dfecf96Smrg	XtSetValues(w, args, 1);
5555dfecf96Smrg	XawTextUnsetSelection(textwindow);
5565dfecf96Smrg	textwindow = w;
5575dfecf96Smrg    }
5585dfecf96Smrg}
5595dfecf96Smrg
5605dfecf96Smrg/*ARGSUSED*/
5615dfecf96Smrgvoid
5625dfecf96SmrgXeditFocus(Widget w, XEvent *event, String *params, Cardinal *num_params)
5635dfecf96Smrg{
5645dfecf96Smrg    Arg args[1];
5655dfecf96Smrg    xedit_flist_item *item;
5665dfecf96Smrg    int idx = WindowIndex(w);
5675dfecf96Smrg
5685dfecf96Smrg    XtSetKeyboardFocus(topwindow, w);
5695dfecf96Smrg
5705dfecf96Smrg    ChangeTextWindow(w);
5715dfecf96Smrg
5725dfecf96Smrg    labelwindow = labels[idx];
5735dfecf96Smrg    item = FindTextSource(XawTextGetSource(textwindow), NULL);
5745dfecf96Smrg
5755dfecf96Smrg    if (item->source != scratch)
5765dfecf96Smrg	XtSetArg(args[0], XtNstring, item->name);
5775dfecf96Smrg    else
5785dfecf96Smrg	XtSetArg(args[0], XtNstring, NULL);
5795dfecf96Smrg
5805dfecf96Smrg    XtSetValues(filenamewindow, args, 1);
581f14f4646Smrg
582f14f4646Smrg    line_edit = False;
5835dfecf96Smrg}
5845dfecf96Smrg
5855dfecf96Smrgvoid
5865dfecf96SmrgPopupMenu(Widget w, XEvent *event, String *params, Cardinal *num_params)
5875dfecf96Smrg{
5885dfecf96Smrg    Cardinal n_params = num_params ? *num_params : 0;
5895dfecf96Smrg
5905dfecf96Smrg    if (*num_params && XmuCompareISOLatin1(*params, "editMenu") == 0)
5915dfecf96Smrg	SetEditMenu();
5925dfecf96Smrg
5935dfecf96Smrg    XtCallActionProc(w, "XawPositionSimpleMenu", event, params, n_params);
5945dfecf96Smrg    XtCallActionProc(w, "XtMenuPopup", event, params, n_params);
5955dfecf96Smrg}
5965dfecf96Smrg
5975dfecf96Smrg/*ARGSUSED*/
5985dfecf96Smrgstatic void
5995dfecf96SmrgSwitchSourceCallback(Widget entry, XtPointer client_data, XtPointer call_data)
6005dfecf96Smrg{
6015dfecf96Smrg    SwitchTextSource((xedit_flist_item*)client_data);
6025dfecf96Smrg}
6035dfecf96Smrg
6045dfecf96Smrgstatic int
6055dfecf96SmrgWindowIndex(Widget w)
6065dfecf96Smrg{
6075dfecf96Smrg    int i;
6085dfecf96Smrg
6095dfecf96Smrg    for (i = 0; i < 3; i++)
6105dfecf96Smrg	if (texts[i] == w)
6115dfecf96Smrg	    return (i);
6125dfecf96Smrg
6135dfecf96Smrg    return (-1);
6145dfecf96Smrg}
6155dfecf96Smrg
6165dfecf96Smrgvoid
6175dfecf96SmrgDeleteWindow(Widget w, XEvent *event, String *params, Cardinal *num_params)
6185dfecf96Smrg{
6195dfecf96Smrg    Widget unmanage[2];
6205dfecf96Smrg    int idx = WindowIndex(w), uidx;
6215dfecf96Smrg    Bool current = False;
6225dfecf96Smrg
6235dfecf96Smrg    if (*num_params == 1 && (*params[0] == 'd' || *params[0] == 'D')) {
6245dfecf96Smrg	if (XtIsManaged(XtParent(dirwindow)))
6255dfecf96Smrg	    SwitchDirWindow(False);
6265dfecf96Smrg	return;
6275dfecf96Smrg    }
6285dfecf96Smrg
6295dfecf96Smrg    if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) {
6305dfecf96Smrg	Feep();
6315dfecf96Smrg	return;
6325dfecf96Smrg    }
6335dfecf96Smrg
6345dfecf96Smrg    if (num_params && *num_params == 1 &&
6355dfecf96Smrg	(*params[0] == 'o' || *params[0] == 'O'))
6365dfecf96Smrg	current = True;
6375dfecf96Smrg
6385dfecf96Smrg    uidx = XtIsManaged(texts[1]) ? 1 : 2;
6395dfecf96Smrg
6405dfecf96Smrg    unmanage[0] = forms[uidx];
6415dfecf96Smrg    unmanage[1] = texts[uidx];
6425dfecf96Smrg    XtUnmanageChildren(unmanage, 2);
6435dfecf96Smrg
6445dfecf96Smrg    if (!XtIsManaged(texts[2]))
6455dfecf96Smrg	XtUnmanageChild(vpanes[1]);
6465dfecf96Smrg
6475dfecf96Smrg    if ((!current && idx == 0) || (current && idx != 0)) {
6485dfecf96Smrg	Arg args[4];
6495dfecf96Smrg	Cardinal num_args;
6505dfecf96Smrg	String label_str;
6515dfecf96Smrg	Pixmap label_pix;
6525dfecf96Smrg	XawTextPosition d_pos, i_pos;
6535dfecf96Smrg	Widget source;
6545dfecf96Smrg	xedit_flist_item *item;
6555dfecf96Smrg
6565dfecf96Smrg	num_args = 0;
6575dfecf96Smrg	XtSetArg(args[num_args], XtNlabel, &label_str);		++num_args;
6585dfecf96Smrg	XtSetArg(args[num_args], XtNleftBitmap, &label_pix);	++num_args;
6595dfecf96Smrg	XtGetValues(labels[current ? idx : uidx], args, num_args);
6605dfecf96Smrg
6615dfecf96Smrg	num_args = 0;
6625dfecf96Smrg	XtSetArg(args[num_args], XtNlabel, label_str);		++num_args;
6635dfecf96Smrg	XtSetArg(args[num_args], XtNleftBitmap, label_pix);	++num_args;
6645dfecf96Smrg	XtSetValues(labels[0], args, num_args);
6655dfecf96Smrg
6665dfecf96Smrg	num_args = 0;
6675dfecf96Smrg	XtSetArg(args[num_args], XtNdisplayPosition, &d_pos);	++num_args;
6685dfecf96Smrg	XtSetArg(args[num_args], XtNinsertPosition, &i_pos);	++num_args;
6695dfecf96Smrg	XtSetArg(args[num_args], XtNtextSource, &source);	++num_args;
6705dfecf96Smrg	XtGetValues(texts[current ? idx : uidx], args, num_args);
6715dfecf96Smrg
6725dfecf96Smrg	num_args = 0;
6735dfecf96Smrg	XtSetArg(args[num_args], XtNdisplayPosition, d_pos);	++num_args;
6745dfecf96Smrg	XtSetArg(args[num_args], XtNinsertPosition, i_pos);	++num_args;
6755dfecf96Smrg	XtSetArg(args[num_args], XtNtextSource, source);	++num_args;
6765dfecf96Smrg
6775dfecf96Smrg	item = FindTextSource(source, NULL);
6785dfecf96Smrg	if (item && (item->flags & WRAP_BIT))
6795dfecf96Smrg	    XtSetArg(args[num_args], XtNwrap, item->wrap);
6805dfecf96Smrg	else
6815dfecf96Smrg	    XtSetArg(args[num_args], XtNwrap,
6825dfecf96Smrg		     wrapmodes[WindowIndex(texts[current ? idx : uidx])]);
6835dfecf96Smrg	XtSetValues(texts[0], args, num_args);
6845dfecf96Smrg
6855dfecf96Smrg	UpdateTextProperties(0);
6865dfecf96Smrg    }
6875dfecf96Smrg
6885dfecf96Smrg    labelwindow = labels[0];
6895dfecf96Smrg    XeditFocus(texts[0], NULL, NULL, NULL);
6905dfecf96Smrg}
6915dfecf96Smrg
6925dfecf96Smrgvoid
6935dfecf96SmrgSwitchSource(Widget w, XEvent *event, String *params, Cardinal *num_params)
6945dfecf96Smrg{
6955dfecf96Smrg    int idx = WindowIndex(w);
6965dfecf96Smrg    Widget source;
6975dfecf96Smrg    int i;
6985dfecf96Smrg
6995dfecf96Smrg    if (idx < 0 || textwindow != texts[idx]) {
7005dfecf96Smrg	Feep();
7015dfecf96Smrg	return;
7025dfecf96Smrg    }
7035dfecf96Smrg
7045dfecf96Smrg    source = XawTextGetSource(textwindow);
7055dfecf96Smrg
7065dfecf96Smrg    for (i = 0; i < flist.num_itens; i++)
7075dfecf96Smrg	if (flist.itens[i]->source == source) {
7085dfecf96Smrg	    if (i > 0 && i == flist.num_itens - 1)
7095dfecf96Smrg		i = 0;
7105dfecf96Smrg	    else if (i < flist.num_itens - 1)
7115dfecf96Smrg		++i;
7125dfecf96Smrg	    else {
7135dfecf96Smrg		Feep();
7145dfecf96Smrg		return;
7155dfecf96Smrg	    }
7165dfecf96Smrg	    break;
7175dfecf96Smrg	}
7185dfecf96Smrg
7195dfecf96Smrg    if (i >= flist.num_itens) {
7205dfecf96Smrg	Feep();
7215dfecf96Smrg	return;
7225dfecf96Smrg    }
7235dfecf96Smrg
7245dfecf96Smrg    SwitchTextSource(flist.itens[i]);
7255dfecf96Smrg}
7265dfecf96Smrg
7275dfecf96Smrgvoid
7285dfecf96SmrgOtherWindow(Widget w, XEvent *event, String *params, Cardinal *num_params)
7295dfecf96Smrg{
7305dfecf96Smrg    int oidx, idx = WindowIndex(w);
7315dfecf96Smrg
7325dfecf96Smrg    if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) {
7335dfecf96Smrg	Feep();
7345dfecf96Smrg	return;
7355dfecf96Smrg    }
7365dfecf96Smrg
7375dfecf96Smrg    if (idx == 0)
7385dfecf96Smrg	oidx = XtIsManaged(texts[1]) ? 1 : 2;
7395dfecf96Smrg    else
7405dfecf96Smrg	oidx = 0;
7415dfecf96Smrg
7425dfecf96Smrg    XeditFocus(texts[oidx], event, params, num_params);
7435dfecf96Smrg}
7445dfecf96Smrg
7455dfecf96Smrgvoid
7465dfecf96SmrgSplitWindow(Widget w, XEvent *event, String *params, Cardinal *num_params)
7475dfecf96Smrg{
7485dfecf96Smrg    Arg args[6];
7495dfecf96Smrg    Cardinal num_args;
7505dfecf96Smrg    Widget nlabel, ntext, source, sink, manage[2];
7515dfecf96Smrg    Dimension width, height, bw;
7525dfecf96Smrg    XawTextPosition i_pos, d_pos;
7535dfecf96Smrg    String label_str;
7545dfecf96Smrg    Pixmap label_pix;
7555dfecf96Smrg    int idx = WindowIndex(w), dimension;
7565dfecf96Smrg    Bool vert = True;
7575dfecf96Smrg    xedit_flist_item *item;
7585dfecf96Smrg
7595dfecf96Smrg    if (num_params && *num_params == 1
7605dfecf96Smrg	&& (*params[0] == 'h' || *params[0] == 'H'))
7615dfecf96Smrg	vert = False;
7625dfecf96Smrg
7635dfecf96Smrg    if (idx < 0
7645dfecf96Smrg	|| (vert && XtIsManaged(texts[1]))
7655dfecf96Smrg	|| (!vert && XtIsManaged(vpanes[1]))) {
7665dfecf96Smrg	Feep();
7675dfecf96Smrg	return;
7685dfecf96Smrg    }
7695dfecf96Smrg
7705dfecf96Smrg    if (vert) {
7715dfecf96Smrg	nlabel = labels[1];
7725dfecf96Smrg	ntext = texts[1];
7735dfecf96Smrg    }
7745dfecf96Smrg    else {
7755dfecf96Smrg	nlabel = labels[2];
7765dfecf96Smrg	ntext = texts[2];
7775dfecf96Smrg    }
7785dfecf96Smrg    ChangeTextWindow(texts[idx]);
7795dfecf96Smrg    labelwindow = labels[idx];
7805dfecf96Smrg
7815dfecf96Smrg    num_args = 0;
7825dfecf96Smrg    XtSetArg(args[num_args], XtNinsertPosition, &i_pos);	++num_args;
7835dfecf96Smrg    XtSetArg(args[num_args], XtNdisplayPosition, &d_pos);	++num_args;
7845dfecf96Smrg    XtSetArg(args[num_args], XtNtextSource, &source);		++num_args;
7855dfecf96Smrg    XtSetArg(args[num_args], XtNtextSink, &sink);		++num_args;
7865dfecf96Smrg    XtSetArg(args[num_args], XtNwidth, &width);			++num_args;
7875dfecf96Smrg    XtSetArg(args[num_args], XtNheight, &height);		++num_args;
7885dfecf96Smrg    XtGetValues(w, args, num_args);
7895dfecf96Smrg
7905dfecf96Smrg    num_args = 0;
7915dfecf96Smrg    XtSetArg(args[num_args], XtNinternalBorderWidth, &bw);	++num_args;
7925dfecf96Smrg    XtGetValues(XtParent(w), args, num_args);
7935dfecf96Smrg
7945dfecf96Smrg    if (vert) {
7955dfecf96Smrg	dimension = (int)height - (((int)bw) << 1);
7965dfecf96Smrg	num_args = 0;
7975dfecf96Smrg	XtSetArg(args[num_args], XtNheight, &height);		++num_args;
7985dfecf96Smrg	XtGetValues(labelwindow, args, num_args);
7995dfecf96Smrg	dimension -= (int)height;
8005dfecf96Smrg    }
8015dfecf96Smrg    else
8025dfecf96Smrg	dimension = (int)width - (int)bw;
8035dfecf96Smrg
8045dfecf96Smrg    dimension >>= 1;
8055dfecf96Smrg
8065dfecf96Smrg    if (dimension <= 0 || dimension < XawTextSinkMaxHeight(sink, 3)) {
8075dfecf96Smrg	Feep();
8085dfecf96Smrg	return;
8095dfecf96Smrg    }
8105dfecf96Smrg
8115dfecf96Smrg    num_args = 0;
8125dfecf96Smrg    XtSetArg(args[num_args], XtNlabel, &label_str);		++num_args;
8135dfecf96Smrg    XtSetArg(args[num_args], XtNleftBitmap, &label_pix);	++num_args;
8145dfecf96Smrg    XtGetValues(labelwindow, args, num_args);
8155dfecf96Smrg
8165dfecf96Smrg    if (vert) {
8175dfecf96Smrg	if (XtIsManaged(texts[2])) {
8185dfecf96Smrg	    manage[0] = forms[2];
8195dfecf96Smrg	    manage[1] = texts[2];
8205dfecf96Smrg	    XtUnmanageChildren(manage, 2);
8215dfecf96Smrg	    XtUnmanageChild(vpanes[1]);
8225dfecf96Smrg	}
8235dfecf96Smrg    }
8245dfecf96Smrg    else {
8255dfecf96Smrg	if (XtIsManaged(texts[1])) {
8265dfecf96Smrg	    manage[0] = forms[1];
8275dfecf96Smrg	    manage[1] = texts[1];
8285dfecf96Smrg	    XtUnmanageChildren(manage, 2);
8295dfecf96Smrg	}
8305dfecf96Smrg    }
8315dfecf96Smrg
8325dfecf96Smrg    XawTextDisableRedisplay(texts[0]);
8335dfecf96Smrg    XawTextDisableRedisplay(ntext);
8345dfecf96Smrg    if (textwindow == texts[1] || textwindow == texts[2]) {
8355dfecf96Smrg	num_args = 0;
8365dfecf96Smrg	XtSetArg(args[num_args], XtNdisplayPosition, d_pos);	++num_args;
8375dfecf96Smrg	XtSetArg(args[num_args], XtNinsertPosition, i_pos);	++num_args;
8385dfecf96Smrg	XtSetArg(args[num_args], XtNtextSource, source);	++num_args;
8395dfecf96Smrg	ChangeTextWindow(texts[0]);
8405dfecf96Smrg	XtSetValues(textwindow, args, num_args);
8415dfecf96Smrg	XtSetKeyboardFocus(topwindow, textwindow);
8425dfecf96Smrg
8435dfecf96Smrg	num_args = 0;
8445dfecf96Smrg	XtSetArg(args[num_args], XtNlabel, label_str);		++num_args;
8455dfecf96Smrg	XtSetArg(args[num_args], XtNleftBitmap, label_pix);	++num_args;
8465dfecf96Smrg	XtSetValues(labelwindow = labels[0], args, num_args);
8475dfecf96Smrg    }
8485dfecf96Smrg
8495dfecf96Smrg    num_args = 0;
8505dfecf96Smrg    XtSetArg(args[num_args], XtNlabel, label_str);		++num_args;
8515dfecf96Smrg    XtSetArg(args[num_args], XtNleftBitmap, label_pix);		++num_args;
8525dfecf96Smrg    XtSetValues(nlabel, args, num_args);
8535dfecf96Smrg
8545dfecf96Smrg    num_args = 0;
8555dfecf96Smrg    XtSetArg(args[num_args], XtNmin, dimension);		++num_args;
8565dfecf96Smrg    XtSetArg(args[num_args], XtNmax, dimension);		++num_args;
8575dfecf96Smrg    if (!vert)
8585dfecf96Smrg	XtSetValues(vpanes[1], args, num_args);
8595dfecf96Smrg    else
8605dfecf96Smrg	XtSetValues(ntext, args, num_args);
8615dfecf96Smrg
8625dfecf96Smrg    manage[0] = XtParent(nlabel);
8635dfecf96Smrg    manage[1] = ntext;
8645dfecf96Smrg    XtManageChildren(manage, 2);
8655dfecf96Smrg    if (!vert)
8665dfecf96Smrg	XtManageChild(vpanes[1]);
8675dfecf96Smrg
8685dfecf96Smrg    num_args = 0;
8695dfecf96Smrg    XtSetArg(args[num_args], XtNmin, 1);			++num_args;
8705dfecf96Smrg    XtSetArg(args[num_args], XtNmax, 65535);			++num_args;
8715dfecf96Smrg    if (!vert) {
8725dfecf96Smrg	XtSetValues(vpanes[1], args, num_args);
8735dfecf96Smrg	num_args = 0;
8745dfecf96Smrg    }
8755dfecf96Smrg    XtSetArg(args[num_args], XtNtextSource, source);		++num_args;
8765dfecf96Smrg    XtSetArg(args[num_args], XtNdisplayPosition, d_pos);	++num_args;
8775dfecf96Smrg    XtSetArg(args[num_args], XtNinsertPosition, i_pos);		++num_args;
8785dfecf96Smrg    item = FindTextSource(source, NULL);
8795dfecf96Smrg    if (item && (item->flags & WRAP_BIT))
8805dfecf96Smrg	XtSetArg(args[num_args], XtNwrap, item->wrap);
8815dfecf96Smrg    else
8825dfecf96Smrg	XtSetArg(args[num_args], XtNwrap, wrapmodes[WindowIndex(ntext)]);
8835dfecf96Smrg    ++num_args;
8845dfecf96Smrg    XtSetValues(ntext, args, num_args);
8855dfecf96Smrg
8865dfecf96Smrg    UpdateTextProperties(0);
8875dfecf96Smrg
8885dfecf96Smrg    _XawTextShowPosition((TextWidget)textwindow);
8895dfecf96Smrg    _XawTextShowPosition((TextWidget)ntext);
8905dfecf96Smrg
8915dfecf96Smrg    XawTextEnableRedisplay(textwindow);
8925dfecf96Smrg    XawTextEnableRedisplay(ntext);
8935dfecf96Smrg}
8945dfecf96Smrg
8955dfecf96Smrgvoid
8965dfecf96SmrgSwitchDirWindow(Bool show)
8975dfecf96Smrg{
8985dfecf96Smrg    static int map;	/* There must be one instance of this
8995dfecf96Smrg			 * variable per top level window */
9005dfecf96Smrg    Widget manage[2];
9015dfecf96Smrg
9025dfecf96Smrg    if (!show && XtIsManaged(XtParent(dirwindow))) {
9035dfecf96Smrg	manage[0] = dirlabel;
9045dfecf96Smrg	manage[1] = XtParent(dirwindow);
9055dfecf96Smrg	XtUnmanageChildren(manage, 2);
9065dfecf96Smrg	XtUnmanageChild(vpanes[1]);
9075dfecf96Smrg
9085dfecf96Smrg	XtManageChild(vpanes[0]);
9095dfecf96Smrg	if (map == 2) {
9105dfecf96Smrg	    Arg args[2];
9115dfecf96Smrg	    Dimension width, bw;
9125dfecf96Smrg
9135dfecf96Smrg	    XtSetArg(args[0], XtNwidth, &width);
9145dfecf96Smrg	    XtGetValues(texts[0], args, 1);
9155dfecf96Smrg	    XtSetArg(args[0], XtNinternalBorderWidth, &bw);
9165dfecf96Smrg	    XtGetValues(XtParent(texts[0]), args, 1);
9175dfecf96Smrg	    width = (width - bw) >> 1;
9185dfecf96Smrg	    XtSetArg(args[0], XtNmin, width);
9195dfecf96Smrg	    XtSetArg(args[0], XtNmax, width);
9205dfecf96Smrg	    XtSetValues(vpanes[0], args, 1);
9215dfecf96Smrg	    manage[0] = forms[2];
9225dfecf96Smrg	    manage[1] = texts[2];
9235dfecf96Smrg	    XtManageChildren(manage, 2);
9245dfecf96Smrg	    XtManageChild(vpanes[1]);
9255dfecf96Smrg	    XtSetArg(args[0], XtNmin, 1);
9265dfecf96Smrg	    XtSetArg(args[0], XtNmax, 65535);
9275dfecf96Smrg	    XtSetValues(vpanes[0], args, 1);
9285dfecf96Smrg	}
9295dfecf96Smrg    }
9305dfecf96Smrg    else if (show && !XtIsManaged(XtParent(dirwindow))) {
9315dfecf96Smrg	XtUnmanageChild(vpanes[0]);
9325dfecf96Smrg	if (XtIsManaged(texts[2])) {
9335dfecf96Smrg	    manage[0] = forms[2];
9345dfecf96Smrg	    manage[1] = texts[2];
9355dfecf96Smrg	    XtUnmanageChildren(manage, 2);
9365dfecf96Smrg	    map = 2;
9375dfecf96Smrg	}
9385dfecf96Smrg	else {
9395dfecf96Smrg	    map = XtIsManaged(texts[1]);
9405dfecf96Smrg	    XtManageChild(vpanes[1]);
9415dfecf96Smrg	}
9425dfecf96Smrg
9435dfecf96Smrg	manage[0] = dirlabel;
9445dfecf96Smrg	manage[1] = XtParent(dirwindow);
9455dfecf96Smrg	XtManageChildren(manage, 2);
9465dfecf96Smrg    }
9475dfecf96Smrg}
9485dfecf96Smrg
9495dfecf96Smrg/*ARGSUSED*/
9505dfecf96Smrgvoid
9515dfecf96SmrgDirWindow(Widget w, XEvent *event, String *params, Cardinal *num_params)
9525dfecf96Smrg{
9535dfecf96Smrg    Arg args[1];
9545dfecf96Smrg    char path[BUFSIZ + 1], *dir;
9555dfecf96Smrg
9565dfecf96Smrg    if (XtIsManaged(XtParent(dirwindow)))
9575dfecf96Smrg	return;
9585dfecf96Smrg
9595dfecf96Smrg    if (*num_params == 1) {
9605dfecf96Smrg	strncpy(path, params[0], sizeof(path) - 2);
9615dfecf96Smrg	path[sizeof(path) - 2] = '\0';
9625dfecf96Smrg    }
9635dfecf96Smrg    else {
9645dfecf96Smrg	char *slash;
9655dfecf96Smrg	xedit_flist_item *item = FindTextSource(XawTextGetSource(textwindow), NULL);
9665dfecf96Smrg
9675dfecf96Smrg	if (item == NULL || item->source == scratch
9685dfecf96Smrg	    || (slash = rindex(item->filename, '/')) == NULL)
9695dfecf96Smrg	    strcpy(path, "./");
9705dfecf96Smrg	else {
9715dfecf96Smrg	    int len = slash - item->filename + 1;
9725dfecf96Smrg
9735dfecf96Smrg	    if (len > sizeof(path) - 2)
9745dfecf96Smrg		len = sizeof(path) - 2;
9755dfecf96Smrg	    strncpy(path, item->filename, len);
9765dfecf96Smrg	    path[len] = '\0';
9775dfecf96Smrg	}
9785dfecf96Smrg    }
9795dfecf96Smrg
9805dfecf96Smrg    dir = ResolveName(path);
9815dfecf96Smrg    if (dir != NULL) {
9825dfecf96Smrg	strncpy(path, dir, sizeof(path) - 2);
9835dfecf96Smrg	path[sizeof(path) - 2] = '\0';
9845dfecf96Smrg	if (*path && path[strlen(path) - 1] != '/')
9855dfecf96Smrg	    strcat(path, "/");
9865dfecf96Smrg
9875dfecf96Smrg	XtSetArg(args[0], XtNlabel, "");
9885dfecf96Smrg	XtSetValues(dirlabel, args, 1);
9895dfecf96Smrg
9905dfecf96Smrg	SwitchDirWindow(True);
9915dfecf96Smrg	DirWindowCB(dirwindow, path, NULL);
9925dfecf96Smrg    }
9935dfecf96Smrg    else
9945dfecf96Smrg	Feep();
9955dfecf96Smrg}
996