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 187f765521fSmrgMaybeCreateFile(const 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 203f765521fSmrgCheckFilePermissions(const 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 * 233f765521fSmrgAddTextSource(Widget source, const char *name, const 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 * 370f765521fSmrgFindTextSource(Widget source, const 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 static char *name; 494f14f4646Smrg char *result, *tmp = name; 495f14f4646Smrg 4965dfecf96Smrg if (filename == NULL) 4975dfecf96Smrg filename = GetString(filenamewindow); 4985dfecf96Smrg 499f14f4646Smrg /* Ensure not passing the same pointer again to realpath */ 500f14f4646Smrg name = XtMalloc(BUFSIZ); 501f14f4646Smrg XtFree(tmp); 502f14f4646Smrg result = realpath(filename, name); 503f14f4646Smrg 504f14f4646Smrg if (result == NULL && errno == ENOENT) { 505f14f4646Smrg int length; 50696d43ffdSmrg char *dir, *file, *fname; 507f14f4646Smrg 508f14f4646Smrg length = strlen(filename); 509f14f4646Smrg tmp = dir = XtMalloc(length + 1); 510f14f4646Smrg strcpy(dir, filename); 51196d43ffdSmrg fname = strdup(filename); 512f14f4646Smrg 51396d43ffdSmrg file = basename(fname); 514f14f4646Smrg dir = dirname(tmp); 515f14f4646Smrg 516f14f4646Smrg /* Creating a new file? */ 517f14f4646Smrg if (dir && file && strcmp(dir, file) && 518f14f4646Smrg access(dir, F_OK) == 0 && 519f14f4646Smrg (result = realpath(dir, name)) == name) { 520f14f4646Smrg int length = strlen(result); 521f14f4646Smrg 522f14f4646Smrg XmuSnprintf(result + length, BUFSIZ - length, "%s%s", 52331de2854Smrg result[length - 1] == '/' ? "" : "/", file); 524f14f4646Smrg } 525f14f4646Smrg 526f14f4646Smrg XtFree(tmp); 52796d43ffdSmrg free(fname); 528f14f4646Smrg } 529f14f4646Smrg 530f14f4646Smrg return (result); 5315dfecf96Smrg} 5325dfecf96Smrg 5335dfecf96Smrgstatic void 5345dfecf96SmrgChangeTextWindow(Widget w) 5355dfecf96Smrg{ 5365dfecf96Smrg Arg args[1]; 5375dfecf96Smrg 5385dfecf96Smrg if (textwindow != w) { 5395dfecf96Smrg xedit_flist_item *other, *current; 5405dfecf96Smrg 5415dfecf96Smrg other = FindTextSource(XawTextGetSource(textwindow), NULL); 5425dfecf96Smrg current = FindTextSource(XawTextGetSource(w), NULL); 5435dfecf96Smrg if (other != current) 5445dfecf96Smrg flist.other = other; 5455dfecf96Smrg if (current) 5465dfecf96Smrg flist.current = current; 5475dfecf96Smrg XtSetArg(args[0], XtNdisplayCaret, False); 5485dfecf96Smrg XtSetValues(textwindow, args, 1); 5495dfecf96Smrg XtSetArg(args[0], XtNdisplayCaret, True); 5505dfecf96Smrg XtSetValues(w, args, 1); 5515dfecf96Smrg XawTextUnsetSelection(textwindow); 5525dfecf96Smrg textwindow = w; 5535dfecf96Smrg } 5545dfecf96Smrg} 5555dfecf96Smrg 5565dfecf96Smrg/*ARGSUSED*/ 5575dfecf96Smrgvoid 5585dfecf96SmrgXeditFocus(Widget w, XEvent *event, String *params, Cardinal *num_params) 5595dfecf96Smrg{ 5605dfecf96Smrg Arg args[1]; 5615dfecf96Smrg xedit_flist_item *item; 5625dfecf96Smrg int idx = WindowIndex(w); 5635dfecf96Smrg 5645dfecf96Smrg XtSetKeyboardFocus(topwindow, w); 5655dfecf96Smrg 5665dfecf96Smrg ChangeTextWindow(w); 5675dfecf96Smrg 5685dfecf96Smrg labelwindow = labels[idx]; 5695dfecf96Smrg item = FindTextSource(XawTextGetSource(textwindow), NULL); 5705dfecf96Smrg 5715dfecf96Smrg if (item->source != scratch) 5725dfecf96Smrg XtSetArg(args[0], XtNstring, item->name); 5735dfecf96Smrg else 5745dfecf96Smrg XtSetArg(args[0], XtNstring, NULL); 5755dfecf96Smrg 5765dfecf96Smrg XtSetValues(filenamewindow, args, 1); 577f14f4646Smrg 578f14f4646Smrg line_edit = False; 5795dfecf96Smrg} 5805dfecf96Smrg 5815dfecf96Smrgvoid 5825dfecf96SmrgPopupMenu(Widget w, XEvent *event, String *params, Cardinal *num_params) 5835dfecf96Smrg{ 5845dfecf96Smrg Cardinal n_params = num_params ? *num_params : 0; 5855dfecf96Smrg 5865dfecf96Smrg if (*num_params && XmuCompareISOLatin1(*params, "editMenu") == 0) 5875dfecf96Smrg SetEditMenu(); 5885dfecf96Smrg 5895dfecf96Smrg XtCallActionProc(w, "XawPositionSimpleMenu", event, params, n_params); 5905dfecf96Smrg XtCallActionProc(w, "XtMenuPopup", event, params, n_params); 5915dfecf96Smrg} 5925dfecf96Smrg 5935dfecf96Smrg/*ARGSUSED*/ 5945dfecf96Smrgstatic void 5955dfecf96SmrgSwitchSourceCallback(Widget entry, XtPointer client_data, XtPointer call_data) 5965dfecf96Smrg{ 5975dfecf96Smrg SwitchTextSource((xedit_flist_item*)client_data); 5985dfecf96Smrg} 5995dfecf96Smrg 6005dfecf96Smrgstatic int 6015dfecf96SmrgWindowIndex(Widget w) 6025dfecf96Smrg{ 6035dfecf96Smrg int i; 6045dfecf96Smrg 6055dfecf96Smrg for (i = 0; i < 3; i++) 6065dfecf96Smrg if (texts[i] == w) 6075dfecf96Smrg return (i); 6085dfecf96Smrg 6095dfecf96Smrg return (-1); 6105dfecf96Smrg} 6115dfecf96Smrg 6125dfecf96Smrgvoid 6135dfecf96SmrgDeleteWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 6145dfecf96Smrg{ 6155dfecf96Smrg Widget unmanage[2]; 6165dfecf96Smrg int idx = WindowIndex(w), uidx; 6175dfecf96Smrg Bool current = False; 6185dfecf96Smrg 6195dfecf96Smrg if (*num_params == 1 && (*params[0] == 'd' || *params[0] == 'D')) { 6205dfecf96Smrg if (XtIsManaged(XtParent(dirwindow))) 6215dfecf96Smrg SwitchDirWindow(False); 6225dfecf96Smrg return; 6235dfecf96Smrg } 6245dfecf96Smrg 6255dfecf96Smrg if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) { 6265dfecf96Smrg Feep(); 6275dfecf96Smrg return; 6285dfecf96Smrg } 6295dfecf96Smrg 6305dfecf96Smrg if (num_params && *num_params == 1 && 6315dfecf96Smrg (*params[0] == 'o' || *params[0] == 'O')) 6325dfecf96Smrg current = True; 6335dfecf96Smrg 6345dfecf96Smrg uidx = XtIsManaged(texts[1]) ? 1 : 2; 6355dfecf96Smrg 6365dfecf96Smrg unmanage[0] = forms[uidx]; 6375dfecf96Smrg unmanage[1] = texts[uidx]; 6385dfecf96Smrg XtUnmanageChildren(unmanage, 2); 6395dfecf96Smrg 6405dfecf96Smrg if (!XtIsManaged(texts[2])) 6415dfecf96Smrg XtUnmanageChild(vpanes[1]); 6425dfecf96Smrg 6435dfecf96Smrg if ((!current && idx == 0) || (current && idx != 0)) { 6445dfecf96Smrg Arg args[4]; 6455dfecf96Smrg Cardinal num_args; 6465dfecf96Smrg String label_str; 6475dfecf96Smrg Pixmap label_pix; 6485dfecf96Smrg XawTextPosition d_pos, i_pos; 6495dfecf96Smrg Widget source; 6505dfecf96Smrg xedit_flist_item *item; 6515dfecf96Smrg 6525dfecf96Smrg num_args = 0; 6535dfecf96Smrg XtSetArg(args[num_args], XtNlabel, &label_str); ++num_args; 6545dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, &label_pix); ++num_args; 6555dfecf96Smrg XtGetValues(labels[current ? idx : uidx], args, num_args); 6565dfecf96Smrg 6575dfecf96Smrg num_args = 0; 6585dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 6595dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 6605dfecf96Smrg XtSetValues(labels[0], args, num_args); 6615dfecf96Smrg 6625dfecf96Smrg num_args = 0; 6635dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, &d_pos); ++num_args; 6645dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, &i_pos); ++num_args; 6655dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, &source); ++num_args; 6665dfecf96Smrg XtGetValues(texts[current ? idx : uidx], args, num_args); 6675dfecf96Smrg 6685dfecf96Smrg num_args = 0; 6695dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 6705dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 6715dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 6725dfecf96Smrg 6735dfecf96Smrg item = FindTextSource(source, NULL); 6745dfecf96Smrg if (item && (item->flags & WRAP_BIT)) 6755dfecf96Smrg XtSetArg(args[num_args], XtNwrap, item->wrap); 6765dfecf96Smrg else 6775dfecf96Smrg XtSetArg(args[num_args], XtNwrap, 6785dfecf96Smrg wrapmodes[WindowIndex(texts[current ? idx : uidx])]); 6795dfecf96Smrg XtSetValues(texts[0], args, num_args); 6805dfecf96Smrg 6815dfecf96Smrg UpdateTextProperties(0); 6825dfecf96Smrg } 6835dfecf96Smrg 6845dfecf96Smrg labelwindow = labels[0]; 6855dfecf96Smrg XeditFocus(texts[0], NULL, NULL, NULL); 6865dfecf96Smrg} 6875dfecf96Smrg 6885dfecf96Smrgvoid 6895dfecf96SmrgSwitchSource(Widget w, XEvent *event, String *params, Cardinal *num_params) 6905dfecf96Smrg{ 6915dfecf96Smrg int idx = WindowIndex(w); 6925dfecf96Smrg Widget source; 6935dfecf96Smrg int i; 6945dfecf96Smrg 6955dfecf96Smrg if (idx < 0 || textwindow != texts[idx]) { 6965dfecf96Smrg Feep(); 6975dfecf96Smrg return; 6985dfecf96Smrg } 6995dfecf96Smrg 7005dfecf96Smrg source = XawTextGetSource(textwindow); 7015dfecf96Smrg 7025dfecf96Smrg for (i = 0; i < flist.num_itens; i++) 7035dfecf96Smrg if (flist.itens[i]->source == source) { 7045dfecf96Smrg if (i > 0 && i == flist.num_itens - 1) 7055dfecf96Smrg i = 0; 7065dfecf96Smrg else if (i < flist.num_itens - 1) 7075dfecf96Smrg ++i; 7085dfecf96Smrg else { 7095dfecf96Smrg Feep(); 7105dfecf96Smrg return; 7115dfecf96Smrg } 7125dfecf96Smrg break; 7135dfecf96Smrg } 7145dfecf96Smrg 7155dfecf96Smrg if (i >= flist.num_itens) { 7165dfecf96Smrg Feep(); 7175dfecf96Smrg return; 7185dfecf96Smrg } 7195dfecf96Smrg 7205dfecf96Smrg SwitchTextSource(flist.itens[i]); 7215dfecf96Smrg} 7225dfecf96Smrg 7235dfecf96Smrgvoid 7245dfecf96SmrgOtherWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 7255dfecf96Smrg{ 7265dfecf96Smrg int oidx, idx = WindowIndex(w); 7275dfecf96Smrg 7285dfecf96Smrg if (idx < 0 || (!XtIsManaged(texts[1]) && !XtIsManaged(texts[2]))) { 7295dfecf96Smrg Feep(); 7305dfecf96Smrg return; 7315dfecf96Smrg } 7325dfecf96Smrg 7335dfecf96Smrg if (idx == 0) 7345dfecf96Smrg oidx = XtIsManaged(texts[1]) ? 1 : 2; 7355dfecf96Smrg else 7365dfecf96Smrg oidx = 0; 7375dfecf96Smrg 7385dfecf96Smrg XeditFocus(texts[oidx], event, params, num_params); 7395dfecf96Smrg} 7405dfecf96Smrg 7415dfecf96Smrgvoid 7425dfecf96SmrgSplitWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 7435dfecf96Smrg{ 7445dfecf96Smrg Arg args[6]; 7455dfecf96Smrg Cardinal num_args; 7465dfecf96Smrg Widget nlabel, ntext, source, sink, manage[2]; 7475dfecf96Smrg Dimension width, height, bw; 7485dfecf96Smrg XawTextPosition i_pos, d_pos; 7495dfecf96Smrg String label_str; 7505dfecf96Smrg Pixmap label_pix; 7515dfecf96Smrg int idx = WindowIndex(w), dimension; 7525dfecf96Smrg Bool vert = True; 7535dfecf96Smrg xedit_flist_item *item; 7545dfecf96Smrg 7555dfecf96Smrg if (num_params && *num_params == 1 7565dfecf96Smrg && (*params[0] == 'h' || *params[0] == 'H')) 7575dfecf96Smrg vert = False; 7585dfecf96Smrg 7595dfecf96Smrg if (idx < 0 7605dfecf96Smrg || (vert && XtIsManaged(texts[1])) 7615dfecf96Smrg || (!vert && XtIsManaged(vpanes[1]))) { 7625dfecf96Smrg Feep(); 7635dfecf96Smrg return; 7645dfecf96Smrg } 7655dfecf96Smrg 7665dfecf96Smrg if (vert) { 7675dfecf96Smrg nlabel = labels[1]; 7685dfecf96Smrg ntext = texts[1]; 7695dfecf96Smrg } 7705dfecf96Smrg else { 7715dfecf96Smrg nlabel = labels[2]; 7725dfecf96Smrg ntext = texts[2]; 7735dfecf96Smrg } 7745dfecf96Smrg ChangeTextWindow(texts[idx]); 7755dfecf96Smrg labelwindow = labels[idx]; 7765dfecf96Smrg 7775dfecf96Smrg num_args = 0; 7785dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, &i_pos); ++num_args; 7795dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, &d_pos); ++num_args; 7805dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, &source); ++num_args; 7815dfecf96Smrg XtSetArg(args[num_args], XtNtextSink, &sink); ++num_args; 7825dfecf96Smrg XtSetArg(args[num_args], XtNwidth, &width); ++num_args; 7835dfecf96Smrg XtSetArg(args[num_args], XtNheight, &height); ++num_args; 7845dfecf96Smrg XtGetValues(w, args, num_args); 7855dfecf96Smrg 7865dfecf96Smrg num_args = 0; 7875dfecf96Smrg XtSetArg(args[num_args], XtNinternalBorderWidth, &bw); ++num_args; 7885dfecf96Smrg XtGetValues(XtParent(w), args, num_args); 7895dfecf96Smrg 7905dfecf96Smrg if (vert) { 7915dfecf96Smrg dimension = (int)height - (((int)bw) << 1); 7925dfecf96Smrg num_args = 0; 7935dfecf96Smrg XtSetArg(args[num_args], XtNheight, &height); ++num_args; 7945dfecf96Smrg XtGetValues(labelwindow, args, num_args); 7955dfecf96Smrg dimension -= (int)height; 7965dfecf96Smrg } 7975dfecf96Smrg else 7985dfecf96Smrg dimension = (int)width - (int)bw; 7995dfecf96Smrg 8005dfecf96Smrg dimension >>= 1; 8015dfecf96Smrg 8025dfecf96Smrg if (dimension <= 0 || dimension < XawTextSinkMaxHeight(sink, 3)) { 8035dfecf96Smrg Feep(); 8045dfecf96Smrg return; 8055dfecf96Smrg } 8065dfecf96Smrg 8075dfecf96Smrg num_args = 0; 8085dfecf96Smrg XtSetArg(args[num_args], XtNlabel, &label_str); ++num_args; 8095dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, &label_pix); ++num_args; 8105dfecf96Smrg XtGetValues(labelwindow, args, num_args); 8115dfecf96Smrg 8125dfecf96Smrg if (vert) { 8135dfecf96Smrg if (XtIsManaged(texts[2])) { 8145dfecf96Smrg manage[0] = forms[2]; 8155dfecf96Smrg manage[1] = texts[2]; 8165dfecf96Smrg XtUnmanageChildren(manage, 2); 8175dfecf96Smrg XtUnmanageChild(vpanes[1]); 8185dfecf96Smrg } 8195dfecf96Smrg } 8205dfecf96Smrg else { 8215dfecf96Smrg if (XtIsManaged(texts[1])) { 8225dfecf96Smrg manage[0] = forms[1]; 8235dfecf96Smrg manage[1] = texts[1]; 8245dfecf96Smrg XtUnmanageChildren(manage, 2); 8255dfecf96Smrg } 8265dfecf96Smrg } 8275dfecf96Smrg 8285dfecf96Smrg XawTextDisableRedisplay(texts[0]); 8295dfecf96Smrg XawTextDisableRedisplay(ntext); 8305dfecf96Smrg if (textwindow == texts[1] || textwindow == texts[2]) { 8315dfecf96Smrg num_args = 0; 8325dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 8335dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 8345dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 8355dfecf96Smrg ChangeTextWindow(texts[0]); 8365dfecf96Smrg XtSetValues(textwindow, args, num_args); 8375dfecf96Smrg XtSetKeyboardFocus(topwindow, textwindow); 8385dfecf96Smrg 8395dfecf96Smrg num_args = 0; 8405dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 8415dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 8425dfecf96Smrg XtSetValues(labelwindow = labels[0], args, num_args); 8435dfecf96Smrg } 8445dfecf96Smrg 8455dfecf96Smrg num_args = 0; 8465dfecf96Smrg XtSetArg(args[num_args], XtNlabel, label_str); ++num_args; 8475dfecf96Smrg XtSetArg(args[num_args], XtNleftBitmap, label_pix); ++num_args; 8485dfecf96Smrg XtSetValues(nlabel, args, num_args); 8495dfecf96Smrg 8505dfecf96Smrg num_args = 0; 8515dfecf96Smrg XtSetArg(args[num_args], XtNmin, dimension); ++num_args; 8525dfecf96Smrg XtSetArg(args[num_args], XtNmax, dimension); ++num_args; 8535dfecf96Smrg if (!vert) 8545dfecf96Smrg XtSetValues(vpanes[1], args, num_args); 8555dfecf96Smrg else 8565dfecf96Smrg XtSetValues(ntext, args, num_args); 8575dfecf96Smrg 8585dfecf96Smrg manage[0] = XtParent(nlabel); 8595dfecf96Smrg manage[1] = ntext; 8605dfecf96Smrg XtManageChildren(manage, 2); 8615dfecf96Smrg if (!vert) 8625dfecf96Smrg XtManageChild(vpanes[1]); 8635dfecf96Smrg 8645dfecf96Smrg num_args = 0; 8655dfecf96Smrg XtSetArg(args[num_args], XtNmin, 1); ++num_args; 8665dfecf96Smrg XtSetArg(args[num_args], XtNmax, 65535); ++num_args; 8675dfecf96Smrg if (!vert) { 8685dfecf96Smrg XtSetValues(vpanes[1], args, num_args); 8695dfecf96Smrg num_args = 0; 8705dfecf96Smrg } 8715dfecf96Smrg XtSetArg(args[num_args], XtNtextSource, source); ++num_args; 8725dfecf96Smrg XtSetArg(args[num_args], XtNdisplayPosition, d_pos); ++num_args; 8735dfecf96Smrg XtSetArg(args[num_args], XtNinsertPosition, i_pos); ++num_args; 8745dfecf96Smrg item = FindTextSource(source, NULL); 8755dfecf96Smrg if (item && (item->flags & WRAP_BIT)) 8765dfecf96Smrg XtSetArg(args[num_args], XtNwrap, item->wrap); 8775dfecf96Smrg else 8785dfecf96Smrg XtSetArg(args[num_args], XtNwrap, wrapmodes[WindowIndex(ntext)]); 8795dfecf96Smrg ++num_args; 8805dfecf96Smrg XtSetValues(ntext, args, num_args); 8815dfecf96Smrg 8825dfecf96Smrg UpdateTextProperties(0); 8835dfecf96Smrg 8845dfecf96Smrg _XawTextShowPosition((TextWidget)textwindow); 8855dfecf96Smrg _XawTextShowPosition((TextWidget)ntext); 8865dfecf96Smrg 8875dfecf96Smrg XawTextEnableRedisplay(textwindow); 8885dfecf96Smrg XawTextEnableRedisplay(ntext); 8895dfecf96Smrg} 8905dfecf96Smrg 8915dfecf96Smrgvoid 8925dfecf96SmrgSwitchDirWindow(Bool show) 8935dfecf96Smrg{ 8945dfecf96Smrg static int map; /* There must be one instance of this 8955dfecf96Smrg * variable per top level window */ 8965dfecf96Smrg Widget manage[2]; 8975dfecf96Smrg 8985dfecf96Smrg if (!show && XtIsManaged(XtParent(dirwindow))) { 8995dfecf96Smrg manage[0] = dirlabel; 9005dfecf96Smrg manage[1] = XtParent(dirwindow); 9015dfecf96Smrg XtUnmanageChildren(manage, 2); 9025dfecf96Smrg XtUnmanageChild(vpanes[1]); 9035dfecf96Smrg 9045dfecf96Smrg XtManageChild(vpanes[0]); 9055dfecf96Smrg if (map == 2) { 9065dfecf96Smrg Arg args[2]; 9075dfecf96Smrg Dimension width, bw; 9085dfecf96Smrg 9095dfecf96Smrg XtSetArg(args[0], XtNwidth, &width); 9105dfecf96Smrg XtGetValues(texts[0], args, 1); 9115dfecf96Smrg XtSetArg(args[0], XtNinternalBorderWidth, &bw); 9125dfecf96Smrg XtGetValues(XtParent(texts[0]), args, 1); 9135dfecf96Smrg width = (width - bw) >> 1; 9145dfecf96Smrg XtSetArg(args[0], XtNmin, width); 9155dfecf96Smrg XtSetArg(args[0], XtNmax, width); 9165dfecf96Smrg XtSetValues(vpanes[0], args, 1); 9175dfecf96Smrg manage[0] = forms[2]; 9185dfecf96Smrg manage[1] = texts[2]; 9195dfecf96Smrg XtManageChildren(manage, 2); 9205dfecf96Smrg XtManageChild(vpanes[1]); 9215dfecf96Smrg XtSetArg(args[0], XtNmin, 1); 9225dfecf96Smrg XtSetArg(args[0], XtNmax, 65535); 9235dfecf96Smrg XtSetValues(vpanes[0], args, 1); 9245dfecf96Smrg } 9255dfecf96Smrg } 9265dfecf96Smrg else if (show && !XtIsManaged(XtParent(dirwindow))) { 9275dfecf96Smrg XtUnmanageChild(vpanes[0]); 9285dfecf96Smrg if (XtIsManaged(texts[2])) { 9295dfecf96Smrg manage[0] = forms[2]; 9305dfecf96Smrg manage[1] = texts[2]; 9315dfecf96Smrg XtUnmanageChildren(manage, 2); 9325dfecf96Smrg map = 2; 9335dfecf96Smrg } 9345dfecf96Smrg else { 9355dfecf96Smrg map = XtIsManaged(texts[1]); 9365dfecf96Smrg XtManageChild(vpanes[1]); 9375dfecf96Smrg } 9385dfecf96Smrg 9395dfecf96Smrg manage[0] = dirlabel; 9405dfecf96Smrg manage[1] = XtParent(dirwindow); 9415dfecf96Smrg XtManageChildren(manage, 2); 9425dfecf96Smrg } 9435dfecf96Smrg} 9445dfecf96Smrg 9455dfecf96Smrg/*ARGSUSED*/ 9465dfecf96Smrgvoid 9475dfecf96SmrgDirWindow(Widget w, XEvent *event, String *params, Cardinal *num_params) 9485dfecf96Smrg{ 9495dfecf96Smrg Arg args[1]; 9505dfecf96Smrg char path[BUFSIZ + 1], *dir; 9515dfecf96Smrg 9525dfecf96Smrg if (XtIsManaged(XtParent(dirwindow))) 9535dfecf96Smrg return; 9545dfecf96Smrg 9555dfecf96Smrg if (*num_params == 1) { 9565dfecf96Smrg strncpy(path, params[0], sizeof(path) - 2); 9575dfecf96Smrg path[sizeof(path) - 2] = '\0'; 9585dfecf96Smrg } 9595dfecf96Smrg else { 9605dfecf96Smrg char *slash; 9615dfecf96Smrg xedit_flist_item *item = FindTextSource(XawTextGetSource(textwindow), NULL); 9625dfecf96Smrg 9635dfecf96Smrg if (item == NULL || item->source == scratch 9645dfecf96Smrg || (slash = rindex(item->filename, '/')) == NULL) 9655dfecf96Smrg strcpy(path, "./"); 9665dfecf96Smrg else { 9675dfecf96Smrg int len = slash - item->filename + 1; 9685dfecf96Smrg 9695dfecf96Smrg if (len > sizeof(path) - 2) 9705dfecf96Smrg len = sizeof(path) - 2; 9715dfecf96Smrg strncpy(path, item->filename, len); 9725dfecf96Smrg path[len] = '\0'; 9735dfecf96Smrg } 9745dfecf96Smrg } 9755dfecf96Smrg 9765dfecf96Smrg dir = ResolveName(path); 9775dfecf96Smrg if (dir != NULL) { 9785dfecf96Smrg strncpy(path, dir, sizeof(path) - 2); 9795dfecf96Smrg path[sizeof(path) - 2] = '\0'; 9805dfecf96Smrg if (*path && path[strlen(path) - 1] != '/') 9815dfecf96Smrg strcat(path, "/"); 9825dfecf96Smrg 9835dfecf96Smrg XtSetArg(args[0], XtNlabel, ""); 9845dfecf96Smrg XtSetValues(dirlabel, args, 1); 9855dfecf96Smrg 9865dfecf96Smrg SwitchDirWindow(True); 9875dfecf96Smrg DirWindowCB(dirwindow, path, NULL); 9885dfecf96Smrg } 9895dfecf96Smrg else 9905dfecf96Smrg Feep(); 9915dfecf96Smrg} 992