util.c revision 5dfecf96
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> 315dfecf96Smrg#include <stdlib.h> /* for realpath() */ 325dfecf96Smrg#include "xedit.h" 335dfecf96Smrg 345dfecf96Smrg#include <X11/Xfuncs.h> 355dfecf96Smrg#include <X11/Xos.h> /* for types.h */ 365dfecf96Smrg 375dfecf96Smrg#include <sys/stat.h> 385dfecf96Smrg#include <X11/Xmu/CharSet.h> 395dfecf96Smrg#include <X11/Xaw/SmeBSB.h> 405dfecf96Smrg#include <X11/Xaw/SimpleMenu.h> 415dfecf96Smrg 425dfecf96Smrg/* 435dfecf96Smrg * Prototypes 445dfecf96Smrg */ 455dfecf96Smrgstatic void SwitchSourceCallback(Widget, XtPointer, XtPointer); 465dfecf96Smrgstatic int WindowIndex(Widget); 475dfecf96Smrgstatic void ChangeTextWindow(Widget); 485dfecf96Smrg 495dfecf96Smrg/* 505dfecf96Smrg * External 515dfecf96Smrg */ 525dfecf96Smrgextern void _XawTextShowPosition(TextWidget); 535dfecf96Smrg 545dfecf96Smrg/* 555dfecf96Smrg * Initialization 565dfecf96Smrg */ 575dfecf96Smrgextern Widget scratch; 585dfecf96Smrgextern Widget vpanes[2], labels[3], texts[3], forms[3]; 595dfecf96Smrgextern XawTextWrapMode wrapmodes[3]; 605dfecf96Smrg 615dfecf96Smrg#ifndef va_copy 625dfecf96Smrg# ifdef __va_copy 635dfecf96Smrg# define va_copy __va_copy 645dfecf96Smrg# else 655dfecf96Smrg# error "no working va_copy was found" 665dfecf96Smrg# endif 675dfecf96Smrg#endif 685dfecf96Smrg 695dfecf96Smrg/* 705dfecf96Smrg * Implementation 715dfecf96Smrg */ 725dfecf96Smrgvoid 735dfecf96SmrgXeditPrintf(const char *format, ...) 745dfecf96Smrg{ 755dfecf96Smrg char *str; 765dfecf96Smrg size_t size; 775dfecf96Smrg va_list va, 785dfecf96Smrg va2; 795dfecf96Smrg XawTextBlock text; 805dfecf96Smrg XawTextPosition pos; 815dfecf96Smrg 825dfecf96Smrg va_start(va, format); 835dfecf96Smrg 845dfecf96Smrg va_copy(va2, va); 855dfecf96Smrg size = vsnprintf(NULL, 0, format, va2); 865dfecf96Smrg va_end(va2); 875dfecf96Smrg 885dfecf96Smrg str = (char *)malloc(size + 1); 895dfecf96Smrg if (str == NULL) 905dfecf96Smrg return; 915dfecf96Smrg 925dfecf96Smrg vsnprintf(str, size + 1, format, va); 935dfecf96Smrg str[size] = 0; 945dfecf96Smrg 955dfecf96Smrg va_end(va); 965dfecf96Smrg 975dfecf96Smrg pos = XawTextSourceScan(XawTextGetSource(messwidget), 985dfecf96Smrg 0, XawstAll, XawsdRight, 1, True); 995dfecf96Smrg 1005dfecf96Smrg text.length = strlen(str); 1015dfecf96Smrg text.ptr = str; 1025dfecf96Smrg text.firstPos = 0; 1035dfecf96Smrg text.format = FMT8BIT; 1045dfecf96Smrg 1055dfecf96Smrg XawTextReplace(messwidget, pos, pos, &text); 1065dfecf96Smrg 1075dfecf96Smrg XawTextSetInsertionPoint(messwidget, pos + text.length); 1085dfecf96Smrg 1095dfecf96Smrg free(str); 1105dfecf96Smrg} 1115dfecf96Smrg 1125dfecf96SmrgWidget 1135dfecf96SmrgMakeCommandButton(Widget box, char *name, XtCallbackProc function) 1145dfecf96Smrg{ 1155dfecf96Smrg Widget w = XtCreateManagedWidget(name, commandWidgetClass, box, NULL, ZERO); 1165dfecf96Smrg if (function != NULL) 1175dfecf96Smrg XtAddCallback(w, XtNcallback, function, (caddr_t) NULL); 1185dfecf96Smrg else 1195dfecf96Smrg XtVaSetValues(w, XtNsensitive, False, NULL); 1205dfecf96Smrg return w; 1215dfecf96Smrg} 1225dfecf96Smrg 1235dfecf96SmrgWidget 1245dfecf96SmrgMakeStringBox(Widget parent, String name, String string) 1255dfecf96Smrg{ 1265dfecf96Smrg Arg args[5]; 1275dfecf96Smrg Cardinal numargs = 0; 1285dfecf96Smrg Widget StringW; 1295dfecf96Smrg 1305dfecf96Smrg XtSetArg(args[numargs], XtNeditType, XawtextEdit); numargs++; 1315dfecf96Smrg XtSetArg(args[numargs], XtNstring, string); numargs++; 1325dfecf96Smrg 1335dfecf96Smrg StringW = XtCreateManagedWidget(name, asciiTextWidgetClass, 1345dfecf96Smrg parent, args, numargs); 1355dfecf96Smrg return(StringW); 1365dfecf96Smrg} 1375dfecf96Smrg 1385dfecf96Smrg/* Function Name: GetString 1395dfecf96Smrg * Description: retrieves the string from a asciiText widget. 1405dfecf96Smrg * Arguments: w - the ascii text widget. 1415dfecf96Smrg * Returns: the filename. 1425dfecf96Smrg */ 1435dfecf96Smrg 1445dfecf96SmrgString 1455dfecf96SmrgGetString(Widget w) 1465dfecf96Smrg{ 1475dfecf96Smrg String str; 1485dfecf96Smrg Arg arglist[1]; 1495dfecf96Smrg 1505dfecf96Smrg XtSetArg(arglist[0], XtNstring, &str); 1515dfecf96Smrg XtGetValues( w, arglist, ONE); 1525dfecf96Smrg return(str); 1535dfecf96Smrg} 1545dfecf96Smrg 1555dfecf96Smrg/* Function Name: MaybeCreateFile 1565dfecf96Smrg * Description: Checks to see if file exists, and if not, creates it. 1575dfecf96Smrg * Arguments: file - name of file to check. 1585dfecf96Smrg * Returns: permissions status 1595dfecf96Smrg */ 1605dfecf96Smrg 1615dfecf96SmrgFileAccess 1625dfecf96SmrgMaybeCreateFile(char *file) 1635dfecf96Smrg{ 1645dfecf96Smrg Boolean exists; 1655dfecf96Smrg int fd; 1665dfecf96Smrg 1675dfecf96Smrg if (access(file, F_OK) != 0) { 1685dfecf96Smrg fd = creat(file, 0666); 1695dfecf96Smrg if (fd != -1) 1705dfecf96Smrg close(fd); 1715dfecf96Smrg } 1725dfecf96Smrg 1735dfecf96Smrg return(CheckFilePermissions(file, &exists)); 1745dfecf96Smrg} 1755dfecf96Smrg 1765dfecf96Smrg 1775dfecf96SmrgFileAccess 1785dfecf96SmrgCheckFilePermissions(char *file, Boolean *exists) 1795dfecf96Smrg{ 1805dfecf96Smrg char temp[BUFSIZ], *ptr; 1815dfecf96Smrg 1825dfecf96Smrg if (access(file, F_OK) == 0) { 1835dfecf96Smrg *exists = TRUE; 1845dfecf96Smrg 1855dfecf96Smrg if (access(file, R_OK) != 0) 1865dfecf96Smrg return(NO_READ); 1875dfecf96Smrg 1885dfecf96Smrg if (access(file, R_OK | W_OK) == 0) 1895dfecf96Smrg return(WRITE_OK); 1905dfecf96Smrg return(READ_OK); 1915dfecf96Smrg } 1925dfecf96Smrg 1935dfecf96Smrg *exists = FALSE; 1945dfecf96Smrg 1955dfecf96Smrg strncpy(temp, file, sizeof(temp) - 1); 1965dfecf96Smrg temp[sizeof(temp) - 1] = '\0'; 1975dfecf96Smrg if ( (ptr = rindex(temp, '/')) == NULL) 1985dfecf96Smrg strcpy(temp, "."); 1995dfecf96Smrg else 2005dfecf96Smrg *ptr = '\0'; 2015dfecf96Smrg 2025dfecf96Smrg if (access(temp, R_OK | W_OK | X_OK) == 0) 2035dfecf96Smrg return(WRITE_OK); 2045dfecf96Smrg return(NO_READ); 2055dfecf96Smrg} 2065dfecf96Smrg 2075dfecf96Smrgxedit_flist_item * 2085dfecf96SmrgAddTextSource(Widget source, char *name, char *filename, int flags, 2095dfecf96Smrg FileAccess file_access) 2105dfecf96Smrg{ 2115dfecf96Smrg xedit_flist_item *item; 2125dfecf96Smrg char *wid_name; 2135dfecf96Smrg 2145dfecf96Smrg item = (xedit_flist_item*)XtMalloc(sizeof(xedit_flist_item)); 2155dfecf96Smrg item->source = source; 2165dfecf96Smrg item->name = XtNewString(name); 2175dfecf96Smrg item->filename = XtNewString(filename); 2185dfecf96Smrg item->flags = flags; 2195dfecf96Smrg item->file_access = file_access; 2205dfecf96Smrg item->display_position = item->insert_position = 0; 2215dfecf96Smrg item->mode = 0; 2225dfecf96Smrg item->properties = NULL; 2235dfecf96Smrg item->xldata = NULL; 2245dfecf96Smrg 2255dfecf96Smrg flist.itens = (xedit_flist_item**) 2265dfecf96Smrg XtRealloc((char*)flist.itens, sizeof(xedit_flist_item*) 2275dfecf96Smrg * (flist.num_itens + 1)); 2285dfecf96Smrg 2295dfecf96Smrg flist.itens[flist.num_itens++] = item; 2305dfecf96Smrg 2315dfecf96Smrg if (!flist.popup) { 2325dfecf96Smrg flist.popup = XtCreatePopupShell("fileMenu", simpleMenuWidgetClass, 2335dfecf96Smrg topwindow, NULL, 0); 2345dfecf96Smrg /* XXX hack: this don't allow setting the geometry of the popup widget 2355dfecf96Smrg * as it will override any settings when a menu entry is inserted 2365dfecf96Smrg * or deleted, but saves us the trouble generated by a resource 2375dfecf96Smrg * setting like: '*geometry: <width>x<height>' 2385dfecf96Smrg */ 2395dfecf96Smrg XtRealizeWidget(flist.popup); 2405dfecf96Smrg } 2415dfecf96Smrg if ((wid_name = strrchr(item->name, '/')) == NULL) 2425dfecf96Smrg wid_name = item->name; 2435dfecf96Smrg else 2445dfecf96Smrg ++wid_name; 2455dfecf96Smrg item->sme = XtVaCreateManagedWidget(wid_name, smeBSBObjectClass, 2465dfecf96Smrg flist.popup, XtNlabel, filename, 2475dfecf96Smrg NULL, NULL); 2485dfecf96Smrg XtAddCallback(item->sme, XtNcallback, 2495dfecf96Smrg SwitchSourceCallback, (XtPointer)item); 2505dfecf96Smrg 2515dfecf96Smrg SetTextProperties(item); 2525dfecf96Smrg 2535dfecf96Smrg return (item); 2545dfecf96Smrg} 2555dfecf96Smrg 2565dfecf96SmrgBool 2575dfecf96SmrgKillTextSource(xedit_flist_item *item) 2585dfecf96Smrg{ 2595dfecf96Smrg xedit_flist_item *nitem = NULL; 2605dfecf96Smrg unsigned idx, i; 2615dfecf96Smrg Arg targs[3]; 2625dfecf96Smrg Cardinal tnum_args; 2635dfecf96Smrg Arg largs[2]; 2645dfecf96Smrg Cardinal lnum_args; 2655dfecf96Smrg char label_buf[BUFSIZ]; 2665dfecf96Smrg 2675dfecf96Smrg for (idx = 0; idx < flist.num_itens; idx++) 2685dfecf96Smrg if (flist.itens[idx] == item) { 2695dfecf96Smrg if (idx + 1 < flist.num_itens) 2705dfecf96Smrg nitem = flist.itens[idx + 1]; 2715dfecf96Smrg else if (idx >= 1) 2725dfecf96Smrg nitem = flist.itens[idx - 1]; 2735dfecf96Smrg break; 2745dfecf96Smrg } 2755dfecf96Smrg 2765dfecf96Smrg if (idx >= flist.num_itens) 2775dfecf96Smrg return (False); 2785dfecf96Smrg 2795dfecf96Smrg flist.current = nitem; 2805dfecf96Smrg if (item == flist.other) 2815dfecf96Smrg flist.other = NULL; 2825dfecf96Smrg 2835dfecf96Smrg if (nitem->file_access == READ_OK) 2845dfecf96Smrg XmuSnprintf(label_buf, sizeof(label_buf), "%s READ ONLY", 2855dfecf96Smrg nitem->name); 2865dfecf96Smrg else if (nitem->file_access == WRITE_OK) 2875dfecf96Smrg XmuSnprintf(label_buf, sizeof(label_buf), "%s Read - Write", 2885dfecf96Smrg nitem->name); 2895dfecf96Smrg lnum_args = 0; 2905dfecf96Smrg XtSetArg(largs[lnum_args], XtNlabel, label_buf); ++lnum_args; 2915dfecf96Smrg if (nitem->flags & CHANGED_BIT) 2925dfecf96Smrg XtSetArg(largs[lnum_args], XtNleftBitmap, flist.pixmap); 2935dfecf96Smrg else 2945dfecf96Smrg XtSetArg(largs[lnum_args], XtNleftBitmap, None); 2955dfecf96Smrg ++lnum_args; 2965dfecf96Smrg 2975dfecf96Smrg tnum_args = 0; 2985dfecf96Smrg XtSetArg(targs[tnum_args], XtNtextSource, 2995dfecf96Smrg nitem->source); ++tnum_args; 3005dfecf96Smrg XtSetArg(targs[tnum_args], XtNdisplayPosition, 3015dfecf96Smrg nitem->display_position); ++tnum_args; 3025dfecf96Smrg XtSetArg(targs[tnum_args], XtNinsertPosition, 3035dfecf96Smrg nitem->insert_position); ++tnum_args; 3045dfecf96Smrg for (i = 0; i < 3; i++) 3055dfecf96Smrg if (XawTextGetSource(texts[i]) == item->source) { 3065dfecf96Smrg XtSetValues(labels[i], largs, lnum_args); 3075dfecf96Smrg XawTextDisableRedisplay(texts[i]); 3085dfecf96Smrg XtSetValues(texts[i], targs, tnum_args); 3095dfecf96Smrg 3105dfecf96Smrg UpdateTextProperties(0); 3115dfecf96Smrg 3125dfecf96Smrg _XawTextShowPosition((TextWidget)texts[i]); 3135dfecf96Smrg XawTextEnableRedisplay(texts[i]); 3145dfecf96Smrg if (texts[i] == textwindow) { 3155dfecf96Smrg Arg args[1]; 3165dfecf96Smrg 3175dfecf96Smrg if (nitem->source != scratch) 3185dfecf96Smrg XtSetArg(args[0], XtNstring, nitem->name); 3195dfecf96Smrg else 3205dfecf96Smrg XtSetArg(args[0], XtNstring, NULL); 3215dfecf96Smrg XtSetValues(filenamewindow, args, 1); 3225dfecf96Smrg } 3235dfecf96Smrg } 3245dfecf96Smrg 3255dfecf96Smrg UnsetTextProperties(item); 3265dfecf96Smrg XtFree(item->name); 3275dfecf96Smrg XtFree(item->filename); 3285dfecf96Smrg XtDestroyWidget(item->sme); 3295dfecf96Smrg XtDestroyWidget(item->source); 3305dfecf96Smrg XtFree((char*)item); 3315dfecf96Smrg 3325dfecf96Smrg if (idx < flist.num_itens - 1) 3335dfecf96Smrg memmove(&flist.itens[idx], &flist.itens[idx + 1], 3345dfecf96Smrg (flist.num_itens - idx) * sizeof(xedit_flist_item*)); 3355dfecf96Smrg 3365dfecf96Smrg --flist.num_itens; 3375dfecf96Smrg 3385dfecf96Smrg return (True); 3395dfecf96Smrg} 3405dfecf96Smrg 3415dfecf96Smrgxedit_flist_item * 3425dfecf96SmrgFindTextSource(Widget source, char *filename) 3435dfecf96Smrg{ 3445dfecf96Smrg unsigned i; 3455dfecf96Smrg 3465dfecf96Smrg if (source) { 3475dfecf96Smrg for (i = 0; i < flist.num_itens; i++) 3485dfecf96Smrg if (flist.itens[i]->source == source) 3495dfecf96Smrg return (flist.itens[i]); 3505dfecf96Smrg } 3515dfecf96Smrg else if (filename) { 3525dfecf96Smrg for (i = 0; i < flist.num_itens; i++) 3535dfecf96Smrg if (strcmp(flist.itens[i]->filename, filename) == 0) 3545dfecf96Smrg return (flist.itens[i]); 3555dfecf96Smrg } 3565dfecf96Smrg 3575dfecf96Smrg return (NULL); 3585dfecf96Smrg} 3595dfecf96Smrg 3605dfecf96Smrgvoid 3615dfecf96SmrgSwitchTextSource(xedit_flist_item *item) 3625dfecf96Smrg{ 3635dfecf96Smrg Arg args[4]; 3645dfecf96Smrg Cardinal num_args; 3655dfecf96Smrg char label_buf[BUFSIZ]; 3665dfecf96Smrg xedit_flist_item *old_item = 3675dfecf96Smrg FindTextSource(XawTextGetSource(textwindow), NULL); 3685dfecf96Smrg int i; 3695dfecf96Smrg 3705dfecf96Smrg if (old_item != item) 3715dfecf96Smrg flist.other = old_item; 3725dfecf96Smrg flist.current = item; 3735dfecf96Smrg 3745dfecf96Smrg XawTextDisableRedisplay(textwindow); 3755dfecf96Smrg if (item->file_access == READ_OK) 3765dfecf96Smrg XmuSnprintf(label_buf, sizeof(label_buf), "%s READ ONLY", 3775dfecf96Smrg item->name); 3785dfecf96Smrg else if (item->file_access == WRITE_OK) 3795dfecf96Smrg XmuSnprintf(label_buf, sizeof(label_buf), "%s Read - Write", 3805dfecf96Smrg item->name); 3815dfecf96Smrg num_args = 0; 3825dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_buf); ++num_args; 3835dfecf96Smrg if (item->flags & CHANGED_BIT) 3845dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, flist.pixmap); 3855dfecf96Smrg else 3865dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, None); 3875dfecf96Smrg ++num_args; 3885dfecf96Smrg XtSetValues(labelwindow, args, num_args); 3895dfecf96Smrg 3905dfecf96Smrg for (i = 0; i < 3; i++) 3915dfecf96Smrg if (XawTextGetSource(texts[i]) == item->source 3925dfecf96Smrg && XtIsManaged(texts[i])) 3935dfecf96Smrg break; 3945dfecf96Smrg 3955dfecf96Smrg if (i < 3) { 3965dfecf96Smrg num_args = 0; 3975dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, 3985dfecf96Smrg &(item->display_position)); ++num_args; 3995dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, 4005dfecf96Smrg &(item->insert_position)); ++num_args; 4015dfecf96Smrg XtGetValues(texts[i], args, num_args); 4025dfecf96Smrg } 4035dfecf96Smrg if (old_item != item) { 4045dfecf96Smrg int count, idx = 0; 4055dfecf96Smrg 4065dfecf96Smrg num_args = 0; 4075dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, 4085dfecf96Smrg &(old_item->display_position)); ++num_args; 4095dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, 4105dfecf96Smrg &(old_item->insert_position)); ++num_args; 4115dfecf96Smrg XtGetValues(textwindow, args, num_args); 4125dfecf96Smrg 4135dfecf96Smrg for (count = 0, i = 0; i < 3; i++) 4145dfecf96Smrg if (XawTextGetSource(texts[i]) == old_item->source 4155dfecf96Smrg && XtIsManaged(texts[i])) { 4165dfecf96Smrg if (++count > 1) 4175dfecf96Smrg break; 4185dfecf96Smrg idx = i; 4195dfecf96Smrg } 4205dfecf96Smrg 4215dfecf96Smrg if (count == 1) { 4225dfecf96Smrg num_args = 0; 4235dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, 4245dfecf96Smrg &(old_item->display_position)); ++num_args; 4255dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, 4265dfecf96Smrg &(old_item->insert_position)); ++num_args; 4275dfecf96Smrg XtGetValues(texts[idx], args, num_args); 4285dfecf96Smrg } 4295dfecf96Smrg } 4305dfecf96Smrg 4315dfecf96Smrg num_args = 0; 4325dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, item->source); ++num_args; 4335dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, item->display_position); 4345dfecf96Smrg ++num_args; 4355dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, item->insert_position); 4365dfecf96Smrg ++num_args; 4375dfecf96Smrg if (item->flags & WRAP_BIT) 4385dfecf96Smrg XtSetArg(args[num_args], XtNwrap, item->wrap); 4395dfecf96Smrg else 4405dfecf96Smrg XtSetArg(args[num_args], XtNwrap, wrapmodes[WindowIndex(textwindow)]); 4415dfecf96Smrg ++num_args; 4425dfecf96Smrg XtSetValues(textwindow, args, num_args); 4435dfecf96Smrg 4445dfecf96Smrg UpdateTextProperties(0); 4455dfecf96Smrg 4465dfecf96Smrg _XawTextShowPosition((TextWidget)textwindow); 4475dfecf96Smrg XawTextEnableRedisplay(textwindow); 4485dfecf96Smrg 4495dfecf96Smrg num_args = 0; 4505dfecf96Smrg if (item->source != scratch) { 4515dfecf96Smrg XtSetArg(args[num_args], XtNstring, item->name); ++num_args; 4525dfecf96Smrg } 4535dfecf96Smrg else { 4545dfecf96Smrg XtSetArg(args[num_args], XtNstring, NULL); ++num_args; 4555dfecf96Smrg } 4565dfecf96Smrg XtSetValues(filenamewindow, args, num_args); 4575dfecf96Smrg} 4585dfecf96Smrg 4595dfecf96Smrg/* XXX sizeof(name) must match argument size for realpath */ 4605dfecf96Smrgstatic char name[BUFSIZ]; 4615dfecf96Smrgchar * 4625dfecf96SmrgResolveName(char *filename) 4635dfecf96Smrg{ 4645dfecf96Smrg if (filename == NULL) 4655dfecf96Smrg filename = GetString(filenamewindow); 4665dfecf96Smrg 4675dfecf96Smrg#ifndef __UNIXOS2__ 4685dfecf96Smrg return (realpath(filename, name)); 4695dfecf96Smrg#else 4705dfecf96Smrg return filename; 4715dfecf96Smrg#endif 4725dfecf96Smrg} 4735dfecf96Smrg 4745dfecf96Smrgstatic void 4755dfecf96SmrgChangeTextWindow(Widget w) 4765dfecf96Smrg{ 4775dfecf96Smrg Arg args[1]; 4785dfecf96Smrg 4795dfecf96Smrg if (textwindow != w) { 4805dfecf96Smrg xedit_flist_item *other, *current; 4815dfecf96Smrg 4825dfecf96Smrg other = FindTextSource(XawTextGetSource(textwindow), NULL); 4835dfecf96Smrg current = FindTextSource(XawTextGetSource(w), NULL); 4845dfecf96Smrg if (other != current) 4855dfecf96Smrg flist.other = other; 4865dfecf96Smrg if (current) 4875dfecf96Smrg flist.current = current; 4885dfecf96Smrg XtSetArg(args[0], XtNdisplayCaret, False); 4895dfecf96Smrg XtSetValues(textwindow, args, 1); 4905dfecf96Smrg XtSetArg(args[0], XtNdisplayCaret, True); 4915dfecf96Smrg XtSetValues(w, args, 1); 4925dfecf96Smrg XawTextUnsetSelection(textwindow); 4935dfecf96Smrg textwindow = w; 4945dfecf96Smrg } 4955dfecf96Smrg} 4965dfecf96Smrg 4975dfecf96Smrg/*ARGSUSED*/ 4985dfecf96Smrgvoid 4995dfecf96SmrgXeditFocus(Widget w, XEvent *event, String *params, Cardinal *num_params) 5005dfecf96Smrg{ 5015dfecf96Smrg Arg args[1]; 5025dfecf96Smrg xedit_flist_item *item; 5035dfecf96Smrg int idx = WindowIndex(w); 5045dfecf96Smrg 5055dfecf96Smrg XtSetKeyboardFocus(topwindow, w); 5065dfecf96Smrg 5075dfecf96Smrg ChangeTextWindow(w); 5085dfecf96Smrg 5095dfecf96Smrg labelwindow = labels[idx]; 5105dfecf96Smrg item = FindTextSource(XawTextGetSource(textwindow), NULL); 5115dfecf96Smrg 5125dfecf96Smrg if (item->source != scratch) 5135dfecf96Smrg XtSetArg(args[0], XtNstring, item->name); 5145dfecf96Smrg else 5155dfecf96Smrg XtSetArg(args[0], XtNstring, NULL); 5165dfecf96Smrg 5175dfecf96Smrg XtSetValues(filenamewindow, args, 1); 5185dfecf96Smrg} 5195dfecf96Smrg 5205dfecf96Smrgvoid 5215dfecf96SmrgPopupMenu(Widget w, XEvent *event, String *params, Cardinal *num_params) 5225dfecf96Smrg{ 5235dfecf96Smrg Cardinal n_params = num_params ? *num_params : 0; 5245dfecf96Smrg 5255dfecf96Smrg if (*num_params && XmuCompareISOLatin1(*params, "editMenu") == 0) 5265dfecf96Smrg SetEditMenu(); 5275dfecf96Smrg 5285dfecf96Smrg XtCallActionProc(w, "XawPositionSimpleMenu", event, params, n_params); 5295dfecf96Smrg XtCallActionProc(w, "XtMenuPopup", event, params, n_params); 5305dfecf96Smrg} 5315dfecf96Smrg 5325dfecf96Smrg/*ARGSUSED*/ 5335dfecf96Smrgstatic void 5345dfecf96SmrgSwitchSourceCallback(Widget entry, XtPointer client_data, XtPointer call_data) 5355dfecf96Smrg{ 5365dfecf96Smrg SwitchTextSource((xedit_flist_item*)client_data); 5375dfecf96Smrg} 5385dfecf96Smrg 5395dfecf96Smrgstatic int 5405dfecf96SmrgWindowIndex(Widget w) 5415dfecf96Smrg{ 5425dfecf96Smrg int i; 5435dfecf96Smrg 5445dfecf96Smrg for (i = 0; i < 3; i++) 5455dfecf96Smrg if (texts[i] == w) 5465dfecf96Smrg return (i); 5475dfecf96Smrg 5485dfecf96Smrg return (-1); 5495dfecf96Smrg} 5505dfecf96Smrg 5515dfecf96Smrgvoid 5525dfecf96SmrgDeleteWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 5535dfecf96Smrg{ 5545dfecf96Smrg Widget unmanage[2]; 5555dfecf96Smrg int idx = WindowIndex(w), uidx; 5565dfecf96Smrg Bool current = False; 5575dfecf96Smrg 5585dfecf96Smrg if (*num_params == 1 && (*params[0] == 'd' || *params[0] == 'D')) { 5595dfecf96Smrg if (XtIsManaged(XtParent(dirwindow))) 5605dfecf96Smrg SwitchDirWindow(False); 5615dfecf96Smrg return; 5625dfecf96Smrg } 5635dfecf96Smrg 5645dfecf96Smrg if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) { 5655dfecf96Smrg Feep(); 5665dfecf96Smrg return; 5675dfecf96Smrg } 5685dfecf96Smrg 5695dfecf96Smrg if (num_params && *num_params == 1 && 5705dfecf96Smrg (*params[0] == 'o' || *params[0] == 'O')) 5715dfecf96Smrg current = True; 5725dfecf96Smrg 5735dfecf96Smrg uidx = XtIsManaged(texts[1]) ? 1 : 2; 5745dfecf96Smrg 5755dfecf96Smrg unmanage[0] = forms[uidx]; 5765dfecf96Smrg unmanage[1] = texts[uidx]; 5775dfecf96Smrg XtUnmanageChildren(unmanage, 2); 5785dfecf96Smrg 5795dfecf96Smrg if (!XtIsManaged(texts[2])) 5805dfecf96Smrg XtUnmanageChild(vpanes[1]); 5815dfecf96Smrg 5825dfecf96Smrg if ((!current && idx == 0) || (current && idx != 0)) { 5835dfecf96Smrg Arg args[4]; 5845dfecf96Smrg Cardinal num_args; 5855dfecf96Smrg String label_str; 5865dfecf96Smrg Pixmap label_pix; 5875dfecf96Smrg XawTextPosition d_pos, i_pos; 5885dfecf96Smrg Widget source; 5895dfecf96Smrg xedit_flist_item *item; 5905dfecf96Smrg 5915dfecf96Smrg num_args = 0; 5925dfecf96Smrg XtSetArg(args[num_args], XtNlabel, &label_str); ++num_args; 5935dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, &label_pix); ++num_args; 5945dfecf96Smrg XtGetValues(labels[current ? idx : uidx], args, num_args); 5955dfecf96Smrg 5965dfecf96Smrg num_args = 0; 5975dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 5985dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 5995dfecf96Smrg XtSetValues(labels[0], args, num_args); 6005dfecf96Smrg 6015dfecf96Smrg num_args = 0; 6025dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, &d_pos); ++num_args; 6035dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, &i_pos); ++num_args; 6045dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, &source); ++num_args; 6055dfecf96Smrg XtGetValues(texts[current ? idx : uidx], args, num_args); 6065dfecf96Smrg 6075dfecf96Smrg num_args = 0; 6085dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 6095dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 6105dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 6115dfecf96Smrg 6125dfecf96Smrg item = FindTextSource(source, NULL); 6135dfecf96Smrg if (item && (item->flags & WRAP_BIT)) 6145dfecf96Smrg XtSetArg(args[num_args], XtNwrap, item->wrap); 6155dfecf96Smrg else 6165dfecf96Smrg XtSetArg(args[num_args], XtNwrap, 6175dfecf96Smrg wrapmodes[WindowIndex(texts[current ? idx : uidx])]); 6185dfecf96Smrg XtSetValues(texts[0], args, num_args); 6195dfecf96Smrg 6205dfecf96Smrg UpdateTextProperties(0); 6215dfecf96Smrg } 6225dfecf96Smrg 6235dfecf96Smrg labelwindow = labels[0]; 6245dfecf96Smrg XeditFocus(texts[0], NULL, NULL, NULL); 6255dfecf96Smrg} 6265dfecf96Smrg 6275dfecf96Smrgvoid 6285dfecf96SmrgSwitchSource(Widget w, XEvent *event, String *params, Cardinal *num_params) 6295dfecf96Smrg{ 6305dfecf96Smrg int idx = WindowIndex(w); 6315dfecf96Smrg Widget source; 6325dfecf96Smrg int i; 6335dfecf96Smrg 6345dfecf96Smrg if (idx < 0 || textwindow != texts[idx]) { 6355dfecf96Smrg Feep(); 6365dfecf96Smrg return; 6375dfecf96Smrg } 6385dfecf96Smrg 6395dfecf96Smrg source = XawTextGetSource(textwindow); 6405dfecf96Smrg 6415dfecf96Smrg for (i = 0; i < flist.num_itens; i++) 6425dfecf96Smrg if (flist.itens[i]->source == source) { 6435dfecf96Smrg if (i > 0 && i == flist.num_itens - 1) 6445dfecf96Smrg i = 0; 6455dfecf96Smrg else if (i < flist.num_itens - 1) 6465dfecf96Smrg ++i; 6475dfecf96Smrg else { 6485dfecf96Smrg Feep(); 6495dfecf96Smrg return; 6505dfecf96Smrg } 6515dfecf96Smrg break; 6525dfecf96Smrg } 6535dfecf96Smrg 6545dfecf96Smrg if (i >= flist.num_itens) { 6555dfecf96Smrg Feep(); 6565dfecf96Smrg return; 6575dfecf96Smrg } 6585dfecf96Smrg 6595dfecf96Smrg SwitchTextSource(flist.itens[i]); 6605dfecf96Smrg} 6615dfecf96Smrg 6625dfecf96Smrgvoid 6635dfecf96SmrgOtherWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 6645dfecf96Smrg{ 6655dfecf96Smrg int oidx, idx = WindowIndex(w); 6665dfecf96Smrg 6675dfecf96Smrg if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) { 6685dfecf96Smrg Feep(); 6695dfecf96Smrg return; 6705dfecf96Smrg } 6715dfecf96Smrg 6725dfecf96Smrg if (idx == 0) 6735dfecf96Smrg oidx = XtIsManaged(texts[1]) ? 1 : 2; 6745dfecf96Smrg else 6755dfecf96Smrg oidx = 0; 6765dfecf96Smrg 6775dfecf96Smrg XeditFocus(texts[oidx], event, params, num_params); 6785dfecf96Smrg} 6795dfecf96Smrg 6805dfecf96Smrgvoid 6815dfecf96SmrgSplitWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 6825dfecf96Smrg{ 6835dfecf96Smrg Arg args[6]; 6845dfecf96Smrg Cardinal num_args; 6855dfecf96Smrg Widget nlabel, ntext, source, sink, manage[2]; 6865dfecf96Smrg Dimension width, height, bw; 6875dfecf96Smrg XawTextPosition i_pos, d_pos; 6885dfecf96Smrg String label_str; 6895dfecf96Smrg Pixmap label_pix; 6905dfecf96Smrg int idx = WindowIndex(w), dimension; 6915dfecf96Smrg Bool vert = True; 6925dfecf96Smrg xedit_flist_item *item; 6935dfecf96Smrg 6945dfecf96Smrg if (num_params && *num_params == 1 6955dfecf96Smrg && (*params[0] == 'h' || *params[0] == 'H')) 6965dfecf96Smrg vert = False; 6975dfecf96Smrg 6985dfecf96Smrg if (idx < 0 6995dfecf96Smrg || (vert && XtIsManaged(texts[1])) 7005dfecf96Smrg || (!vert && XtIsManaged(vpanes[1]))) { 7015dfecf96Smrg Feep(); 7025dfecf96Smrg return; 7035dfecf96Smrg } 7045dfecf96Smrg 7055dfecf96Smrg if (vert) { 7065dfecf96Smrg nlabel = labels[1]; 7075dfecf96Smrg ntext = texts[1]; 7085dfecf96Smrg } 7095dfecf96Smrg else { 7105dfecf96Smrg nlabel = labels[2]; 7115dfecf96Smrg ntext = texts[2]; 7125dfecf96Smrg } 7135dfecf96Smrg ChangeTextWindow(texts[idx]); 7145dfecf96Smrg labelwindow = labels[idx]; 7155dfecf96Smrg 7165dfecf96Smrg num_args = 0; 7175dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, &i_pos); ++num_args; 7185dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, &d_pos); ++num_args; 7195dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, &source); ++num_args; 7205dfecf96Smrg XtSetArg(args[num_args], XtNtextSink, &sink); ++num_args; 7215dfecf96Smrg XtSetArg(args[num_args], XtNwidth, &width); ++num_args; 7225dfecf96Smrg XtSetArg(args[num_args], XtNheight, &height); ++num_args; 7235dfecf96Smrg XtGetValues(w, args, num_args); 7245dfecf96Smrg 7255dfecf96Smrg num_args = 0; 7265dfecf96Smrg XtSetArg(args[num_args], XtNinternalBorderWidth, &bw); ++num_args; 7275dfecf96Smrg XtGetValues(XtParent(w), args, num_args); 7285dfecf96Smrg 7295dfecf96Smrg if (vert) { 7305dfecf96Smrg dimension = (int)height - (((int)bw) << 1); 7315dfecf96Smrg num_args = 0; 7325dfecf96Smrg XtSetArg(args[num_args], XtNheight, &height); ++num_args; 7335dfecf96Smrg XtGetValues(labelwindow, args, num_args); 7345dfecf96Smrg dimension -= (int)height; 7355dfecf96Smrg } 7365dfecf96Smrg else 7375dfecf96Smrg dimension = (int)width - (int)bw; 7385dfecf96Smrg 7395dfecf96Smrg dimension >>= 1; 7405dfecf96Smrg 7415dfecf96Smrg if (dimension <= 0 || dimension < XawTextSinkMaxHeight(sink, 3)) { 7425dfecf96Smrg Feep(); 7435dfecf96Smrg return; 7445dfecf96Smrg } 7455dfecf96Smrg 7465dfecf96Smrg num_args = 0; 7475dfecf96Smrg XtSetArg(args[num_args], XtNlabel, &label_str); ++num_args; 7485dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, &label_pix); ++num_args; 7495dfecf96Smrg XtGetValues(labelwindow, args, num_args); 7505dfecf96Smrg 7515dfecf96Smrg if (vert) { 7525dfecf96Smrg if (XtIsManaged(texts[2])) { 7535dfecf96Smrg manage[0] = forms[2]; 7545dfecf96Smrg manage[1] = texts[2]; 7555dfecf96Smrg XtUnmanageChildren(manage, 2); 7565dfecf96Smrg XtUnmanageChild(vpanes[1]); 7575dfecf96Smrg } 7585dfecf96Smrg } 7595dfecf96Smrg else { 7605dfecf96Smrg if (XtIsManaged(texts[1])) { 7615dfecf96Smrg manage[0] = forms[1]; 7625dfecf96Smrg manage[1] = texts[1]; 7635dfecf96Smrg XtUnmanageChildren(manage, 2); 7645dfecf96Smrg } 7655dfecf96Smrg } 7665dfecf96Smrg 7675dfecf96Smrg XawTextDisableRedisplay(texts[0]); 7685dfecf96Smrg XawTextDisableRedisplay(ntext); 7695dfecf96Smrg if (textwindow == texts[1] || textwindow == texts[2]) { 7705dfecf96Smrg num_args = 0; 7715dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 7725dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 7735dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 7745dfecf96Smrg ChangeTextWindow(texts[0]); 7755dfecf96Smrg XtSetValues(textwindow, args, num_args); 7765dfecf96Smrg XtSetKeyboardFocus(topwindow, textwindow); 7775dfecf96Smrg 7785dfecf96Smrg num_args = 0; 7795dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 7805dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 7815dfecf96Smrg XtSetValues(labelwindow = labels[0], args, num_args); 7825dfecf96Smrg } 7835dfecf96Smrg 7845dfecf96Smrg num_args = 0; 7855dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 7865dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 7875dfecf96Smrg XtSetValues(nlabel, args, num_args); 7885dfecf96Smrg 7895dfecf96Smrg num_args = 0; 7905dfecf96Smrg XtSetArg(args[num_args], XtNmin, dimension); ++num_args; 7915dfecf96Smrg XtSetArg(args[num_args], XtNmax, dimension); ++num_args; 7925dfecf96Smrg if (!vert) 7935dfecf96Smrg XtSetValues(vpanes[1], args, num_args); 7945dfecf96Smrg else 7955dfecf96Smrg XtSetValues(ntext, args, num_args); 7965dfecf96Smrg 7975dfecf96Smrg manage[0] = XtParent(nlabel); 7985dfecf96Smrg manage[1] = ntext; 7995dfecf96Smrg XtManageChildren(manage, 2); 8005dfecf96Smrg if (!vert) 8015dfecf96Smrg XtManageChild(vpanes[1]); 8025dfecf96Smrg 8035dfecf96Smrg num_args = 0; 8045dfecf96Smrg XtSetArg(args[num_args], XtNmin, 1); ++num_args; 8055dfecf96Smrg XtSetArg(args[num_args], XtNmax, 65535); ++num_args; 8065dfecf96Smrg if (!vert) { 8075dfecf96Smrg XtSetValues(vpanes[1], args, num_args); 8085dfecf96Smrg num_args = 0; 8095dfecf96Smrg } 8105dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 8115dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 8125dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 8135dfecf96Smrg item = FindTextSource(source, NULL); 8145dfecf96Smrg if (item && (item->flags & WRAP_BIT)) 8155dfecf96Smrg XtSetArg(args[num_args], XtNwrap, item->wrap); 8165dfecf96Smrg else 8175dfecf96Smrg XtSetArg(args[num_args], XtNwrap, wrapmodes[WindowIndex(ntext)]); 8185dfecf96Smrg ++num_args; 8195dfecf96Smrg XtSetValues(ntext, args, num_args); 8205dfecf96Smrg 8215dfecf96Smrg UpdateTextProperties(0); 8225dfecf96Smrg 8235dfecf96Smrg _XawTextShowPosition((TextWidget)textwindow); 8245dfecf96Smrg _XawTextShowPosition((TextWidget)ntext); 8255dfecf96Smrg 8265dfecf96Smrg XawTextEnableRedisplay(textwindow); 8275dfecf96Smrg XawTextEnableRedisplay(ntext); 8285dfecf96Smrg} 8295dfecf96Smrg 8305dfecf96Smrgvoid 8315dfecf96SmrgSwitchDirWindow(Bool show) 8325dfecf96Smrg{ 8335dfecf96Smrg static int map; /* There must be one instance of this 8345dfecf96Smrg * variable per top level window */ 8355dfecf96Smrg Widget manage[2]; 8365dfecf96Smrg 8375dfecf96Smrg if (!show && XtIsManaged(XtParent(dirwindow))) { 8385dfecf96Smrg manage[0] = dirlabel; 8395dfecf96Smrg manage[1] = XtParent(dirwindow); 8405dfecf96Smrg XtUnmanageChildren(manage, 2); 8415dfecf96Smrg XtUnmanageChild(vpanes[1]); 8425dfecf96Smrg 8435dfecf96Smrg XtManageChild(vpanes[0]); 8445dfecf96Smrg if (map == 2) { 8455dfecf96Smrg Arg args[2]; 8465dfecf96Smrg Dimension width, bw; 8475dfecf96Smrg 8485dfecf96Smrg XtSetArg(args[0], XtNwidth, &width); 8495dfecf96Smrg XtGetValues(texts[0], args, 1); 8505dfecf96Smrg XtSetArg(args[0], XtNinternalBorderWidth, &bw); 8515dfecf96Smrg XtGetValues(XtParent(texts[0]), args, 1); 8525dfecf96Smrg width = (width - bw) >> 1; 8535dfecf96Smrg XtSetArg(args[0], XtNmin, width); 8545dfecf96Smrg XtSetArg(args[0], XtNmax, width); 8555dfecf96Smrg XtSetValues(vpanes[0], args, 1); 8565dfecf96Smrg manage[0] = forms[2]; 8575dfecf96Smrg manage[1] = texts[2]; 8585dfecf96Smrg XtManageChildren(manage, 2); 8595dfecf96Smrg XtManageChild(vpanes[1]); 8605dfecf96Smrg XtSetArg(args[0], XtNmin, 1); 8615dfecf96Smrg XtSetArg(args[0], XtNmax, 65535); 8625dfecf96Smrg XtSetValues(vpanes[0], args, 1); 8635dfecf96Smrg } 8645dfecf96Smrg } 8655dfecf96Smrg else if (show && !XtIsManaged(XtParent(dirwindow))) { 8665dfecf96Smrg XtUnmanageChild(vpanes[0]); 8675dfecf96Smrg if (XtIsManaged(texts[2])) { 8685dfecf96Smrg manage[0] = forms[2]; 8695dfecf96Smrg manage[1] = texts[2]; 8705dfecf96Smrg XtUnmanageChildren(manage, 2); 8715dfecf96Smrg map = 2; 8725dfecf96Smrg } 8735dfecf96Smrg else { 8745dfecf96Smrg map = XtIsManaged(texts[1]); 8755dfecf96Smrg XtManageChild(vpanes[1]); 8765dfecf96Smrg } 8775dfecf96Smrg 8785dfecf96Smrg manage[0] = dirlabel; 8795dfecf96Smrg manage[1] = XtParent(dirwindow); 8805dfecf96Smrg XtManageChildren(manage, 2); 8815dfecf96Smrg } 8825dfecf96Smrg} 8835dfecf96Smrg 8845dfecf96Smrg/*ARGSUSED*/ 8855dfecf96Smrgvoid 8865dfecf96SmrgDirWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 8875dfecf96Smrg{ 8885dfecf96Smrg Arg args[1]; 8895dfecf96Smrg char path[BUFSIZ + 1], *dir; 8905dfecf96Smrg 8915dfecf96Smrg if (XtIsManaged(XtParent(dirwindow))) 8925dfecf96Smrg return; 8935dfecf96Smrg 8945dfecf96Smrg if (*num_params == 1) { 8955dfecf96Smrg strncpy(path, params[0], sizeof(path) - 2); 8965dfecf96Smrg path[sizeof(path) - 2] = '\0'; 8975dfecf96Smrg } 8985dfecf96Smrg else { 8995dfecf96Smrg char *slash; 9005dfecf96Smrg xedit_flist_item *item = FindTextSource(XawTextGetSource(textwindow), NULL); 9015dfecf96Smrg 9025dfecf96Smrg if (item == NULL || item->source == scratch 9035dfecf96Smrg || (slash = rindex(item->filename, '/')) == NULL) 9045dfecf96Smrg strcpy(path, "./"); 9055dfecf96Smrg else { 9065dfecf96Smrg int len = slash - item->filename + 1; 9075dfecf96Smrg 9085dfecf96Smrg if (len > sizeof(path) - 2) 9095dfecf96Smrg len = sizeof(path) - 2; 9105dfecf96Smrg strncpy(path, item->filename, len); 9115dfecf96Smrg path[len] = '\0'; 9125dfecf96Smrg } 9135dfecf96Smrg } 9145dfecf96Smrg 9155dfecf96Smrg dir = ResolveName(path); 9165dfecf96Smrg if (dir != NULL) { 9175dfecf96Smrg strncpy(path, dir, sizeof(path) - 2); 9185dfecf96Smrg path[sizeof(path) - 2] = '\0'; 9195dfecf96Smrg if (*path && path[strlen(path) - 1] != '/') 9205dfecf96Smrg strcat(path, "/"); 9215dfecf96Smrg 9225dfecf96Smrg XtSetArg(args[0], XtNlabel, ""); 9235dfecf96Smrg XtSetValues(dirlabel, args, 1); 9245dfecf96Smrg 9255dfecf96Smrg SwitchDirWindow(True); 9265dfecf96Smrg DirWindowCB(dirwindow, path, NULL); 9275dfecf96Smrg } 9285dfecf96Smrg else 9295dfecf96Smrg Feep(); 9305dfecf96Smrg} 931