/* -*- Mode: C -*- * $Basename: util.c $ * $Revision: 1.12.1.3 $ * Author : jonathan@Think.COM * Created On : 92/06/15 13:46:55 * Last Modified By: Ulrich Pfeifer * Last Modified On: Mon May 5 09:29:50 1997 * Language : C * Update Count : 1 * Status : Unknown, Use with caution! * * (C) Copyright 1997, Universität Dortmund, all rights reserved. * (C) Copyright CNIDR (see ../doc/CNIDR/COPYRIGHT) */ #ifndef lint static char *PRCSid = "$Id: util.c 1.12.1.3 Mon, 05 May 1997 11:54:27 +0200 pfeifer $"; #endif #define _C_UTIL #define XWAIS #include "xwais.h" #include /* for XawLF */ #ifdef XawLF # define X11R5 #else # ifdef X11R5 # undef X11R5 # endif #endif int get_selected_item(w) Widget w; { #ifdef MOTIF int *positions, size, i; if(XmListGetSelectedPos(w, &positions, &size) == TRUE) return (positions[0]-1); return NO_ITEM_SELECTED; #else XawListReturnStruct *selected; if((selected = XawListShowCurrent(w)) == NULL) return NO_ITEM_SELECTED; else return selected->list_index; #endif } int listlength(list) List list; { int num; List l; for(num = 0, l = list; l != NULL; num++, l = l->nextNode); return num; } int charlistlength(list) char **list; { int num; if(list) { for(num = 0; list[num] != NULL; num++); return num; } else return 0; } void PrintStatusW(str, w, replacep) char * str; Widget w; boolean replacep; { XEvent event; XawTextBlock text; static long lastlen = 0; XawTextPosition pos = XawTextGetInsertionPoint(w); if(w == NULL) fprintf(stderr, "Couldn't display status, invalid window.\n%s", str); else { text.length = strlen(str); text.ptr = str; text.firstPos = 0; text.format = FMT8BIT; XawTextReplace(w, (replacep?pos-lastlen:pos), pos, &text); pos += text.length; XawTextSetInsertionPoint(w, pos); lastlen = text.length; XawTextDisplay(w); } while((XtPending()&XtIMXEvent) != 0) { XtNextEvent(&event); XtDispatchEvent(&event); } } void PrintStatus #ifdef ANSI_LIKE /* use ansi varargs */ (long logtype, long loglevel, char* format, ...) #else /* k&r */ (va_alist) va_dcl #endif ANSI_LIKE { va_list ap; /* the variable arguments */ char message[1000]; static long last_type = STATUS_INFO; #ifndef ANSI_LIKE long logtype, loglevel; char *format; va_start(ap); logtype = va_arg(ap, int); loglevel = va_arg(ap, int); format = va_arg(ap, char*); #else va_start(ap, format); #endif vsprintf(message, format, ap); PrintStatusW(message, messwidget, (last_type == STATUS_CONT && logtype == STATUS_CONT)); last_type = logtype; if (logtype == STATUS_URGENT) sleep(2); #ifndef ANSI_LIKE va_end(ap); #endif } void XwaisPrintf(str) char * str; { PrintStatusW(str, messwidget, false); } void ReplaceText(w, str) Widget w; char * str; { #ifdef MOTIF int lastpos; char *spaces = ""; lastpos = XmTextGetLastPosition(w); XmTextReplace(w,0,lastpos,spaces); XmTextSetInsertionPosition(w,0); XmTextReplace(w,0,0,str); XmTextSetInsertionPosition(w,0); #else ReplaceAsciiText(w, str); #endif } void ReplaceAsciiText(w, str) Widget w; char* str; { Arg args[ONE]; XtSetArg(args[ZERO], XtNstring, str); XtSetValues(w, args, ONE); } Widget MakeCommandButton(box, name, function, vlink, hlink, data) Widget box, vlink, hlink; char *name; XtCallbackProc function; caddr_t data; { Widget w; Arg args[10]; Cardinal numargs; numargs = 0; if(vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } if(hlink != NULL) { XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++; } w = XtCreateManagedWidget(name, COMMANDBUTTON, box, args, numargs); if (function != NULL) XtAddCallback(w, COMMANDCALLBACK, function, data); return w; } Widget MakeListWidget(parent, name, list, callback, vlink, hlink) Widget parent, vlink, hlink; String name; char **list; XtCallbackProc callback; { Arg args[6]; Cardinal numargs; Widget ListW, form; numargs = 0; if (vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } if (hlink != NULL) { XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++; } #ifdef MOTIF form = XtCreateManagedWidget (name, formWidgetClass, parent, args, numargs); numargs = 0; XtSetArg( args[numargs], XmNselectionPolicy, XmSINGLE_SELECT); numargs++; XtSetArg(args[numargs], XmNscrollBarDisplayPolicy, XmSTATIC); numargs++; ListW = XmCreateScrolledList(form, name, args, numargs); XtManageChild(ListW); #else XtSetArg(args[numargs], XtNhorizDistance, 0); numargs++; XtSetArg(args[numargs], XtNlist, list); numargs++; XtSetArg(args[numargs], XtNforceColumns, True); numargs++; XtSetArg(args[numargs], XtNdefaultColumns, 1); numargs++; #ifdef X11R5 ListW = XtCreateManagedWidget(name, myListWidgetClass, parent, args, numargs); #else ListW = XtCreateManagedWidget(name, listWidgetClass, parent, args, numargs); #endif #endif if (callback != NULL) XtAddCallback(ListW, #ifdef MOTIF XmNdefaultActionCallback, #else XtNcallback, #endif callback, NULL); return ListW; } #ifdef MOTIF static void moveViewport(p, action) Widget p; long action; { return; } #else #include static void SetBar(w, top, length, total) Widget w; Position top; Dimension length, total; { XawScrollbarSetThumb(w, (float)top/(float)total, (float)length/(float)total); } #ifdef X11R5 static void moveViewport(p, action) Widget p; long action; { if (action == LIST_TOP) { XawViewportSetLocation(p, 0.0, 0.0); } else if (action == LIST_BOTTOM) { XawViewportSetLocation(p, 0.0, 1.0); } } #else /* X11R4 is badly broken. Lets see if we can fix it. */ static void moveViewport(p, action) Widget p; long action; { ViewportWidget w = (ViewportWidget)p; Widget child, clip, scrollbar; if(w->composite.num_children >= 3) { /* 3 widgets: clip, child, and scrollbar (I hope) */ clip = w->composite.children[0]; child = w->composite.children[1]; scrollbar = w->composite.children[2]; if (action == LIST_TOP) { XtMoveWidget(child, 0, 0); SetBar(scrollbar, 0, clip->core.height, child->core.height ); } else if (action == LIST_BOTTOM) { XtMoveWidget(child, 0, -(child->core.height - clip->core.height)); SetBar(scrollbar, -(child->core.y), clip->core.height, child->core.height ); return; } } } #endif /* X11R5 */ #endif /* MOTIF */ void RebuildListWidget(s, list, action) ScrollList s; String *list; long action; { Widget p = XtParent(s->ListWidget); if(s->ListWidget == NULL) s->ListWidget = MakeListWidget(p, s->name, list, s->callback, NULL, NULL); else { #ifdef MOTIF XmString strn; if (s != NULL) { XmListDeleteAllItems( s->ListWidget ); while(*list) { strn = XmStringCreateSimple( *list ); XmListAddItem( s->ListWidget, strn, 0); XmStringFree( strn ); list++; } } #else if (list != NULL) XawListChange(s->ListWidget, list, 0, 0, True); moveViewport(p, action); #endif } } ScrollList MakeScrollList(parent, name, items, callback, vlink, hlink) Widget parent, vlink, hlink; XtCallbackProc callback; String name, *items; { Arg arglist[10]; Cardinal num_args; static char names[STRINGSIZE]; ScrollList result; result = (ScrollList) s_malloc(sizeof(_ScrollList)); result->name = s_strdup(name); result->callback = callback; num_args = 0; if(vlink != NULL) { XtSetArg(arglist[num_args], XtNfromVert, vlink); num_args++; } if(hlink != NULL) { XtSetArg(arglist[num_args], XtNfromHoriz, hlink); num_args++; } XtSetArg(arglist[num_args], XtNorientation, XtorientVertical); num_args++; result->ListWidget = MakeListWidget(parent, name, items, callback, vlink, NULL); return(result); } Widget MakeStringBox(parent, name, string, vlink, hlink) Widget parent, vlink, hlink; String name, string; { Arg args[5]; Cardinal numargs = 0; Widget StringW; #ifndef MOTIF XtSetArg(args[numargs], XtNeditType, XawtextEdit); numargs++; #endif XtSetArg(args[numargs], NSTRING, string); numargs++; if(vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } if(hlink != NULL) { XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++; } StringW = XtCreateManagedWidget(name, TEXTWIDGET, parent, args, numargs); return(StringW); } #ifdef MOTIF Widget MakeScrolledText(parent, name, string, vlink, hlink) Widget parent, vlink, hlink; String name, string; { Arg args[5]; Cardinal numargs = 0; Widget form, StringW; char *textWname[STRINGSIZE]; if(vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } if(hlink != NULL) { XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++; } form = XtCreateManagedWidget (name, formWidgetClass, parent, args, numargs); sprintf(textWname, "textW%s", name); numargs = 0; XtSetArg(args[numargs], XmNeditMode, XmMULTI_LINE_EDIT); numargs++; StringW = XmCreateScrolledText(form, textWname, args, numargs); XtManageChild(StringW); ReplaceText(StringW, string); return(StringW); } Widget MakeSeparator(parent, name, vlink) Widget parent, vlink; String name; { Arg args[5]; Cardinal numargs = 0; Widget sep; if(vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } sep = XtCreateManagedWidget(name, xmSeparatorWidgetClass, parent, args, numargs); return(sep); } #endif /* Function Name: GetString * Description: retrieves the string from a asciiText widget. * Arguments: w - the ascii text widget. * Returns: the filename. */ String GetString(w) Widget w; { String str; Arg args[1]; XtSetArg(args[0], NSTRING, &str); XtGetValues( w, args, ONE); return(str); } String GetAsciiString(w) Widget w; { String str; Arg args[1]; XtSetArg(args[0], XtNstring, &str); XtGetValues( w, args, ONE); return(str); } Widget MakeLabel(parent, name, label, vlink, hlink) Widget parent, vlink, hlink; char *name, *label; { Arg args[5]; Cardinal numargs; Widget labelwid; #ifdef MOTIF XmString strn = XmStringCreateSimple(label); #else char* strn = label; #endif numargs = 0; XtSetArg(args[numargs], NLABEL, strn); numargs++; if(vlink != NULL) { XtSetArg(args[numargs], XtNfromVert, vlink); numargs++; } if(hlink != NULL) { XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++; } /* XtSetArg(args[numargs], XtNborderWidth, 0); numargs++; Use default borderWidth dimension; i.e. 1 */ labelwid = XtCreateManagedWidget(name,LABELWIDGET, parent, args, numargs); #ifdef MOTIF XmStringFree( strn ); #endif return(labelwid); } #define BEFORE 1 #define DURING 2 #define QUOTE 5 /* ripped out of gmacs-ui.c */ int find_string_slot(source, key, value, value_size, delete_internal_quotes) char *source, *key, *value; long value_size; boolean delete_internal_quotes; { char ch; short state = BEFORE; long position = 0; /* position in value */ char *pos =(char*)strstr(source, key); /* address into source */ value[0] = '\0'; /* initialize to nothing */ if(NULL == pos) return(1); for(pos = pos + strlen(key); pos < source + strlen(source); pos++){ ch = *pos; if((state == BEFORE) && (ch == '\"')) state = DURING; else if ((state == DURING) && (ch == '\\')){ state = QUOTE; if(!delete_internal_quotes){ value[position] = ch; position++; if(position >= value_size){ value[value_size - 1] = '\0'; return(-1); } } } else if ((state == DURING) && (ch == '"')){ value[position] = '\0'; return(0); } else if ((state == QUOTE) || (state == DURING)){ if(state == QUOTE) state = DURING; value[position] = ch; position++; if(position >= value_size){ value[value_size - 1] = '\0'; return(-1); } } /* otherwise we are still before the start of the value */ } value[position] = '\0'; return(-1); /* error because we are in the middle of the string */ } void find_value(source, key, value, value_size) char *source, *key, *value; int value_size; { char ch; long position = 0; /* position in value */ char *pos =(char*)strstr(source, key); /* address into source */ value[0] = '\0'; /* initialize to nothing */ if(NULL == pos) return; pos = pos + strlen(key); ch = *pos; /* skip leading quotes and spaces */ while((ch == '\"') || (ch == ' ')) { pos++; ch = *pos; } for(position = 0; pos < source + strlen(source); pos++){ if((ch = *pos) == ' ') { value[position] = '\0'; return; } value[position] = ch; position++; if(position >= value_size){ value[value_size - 1] = '\0'; return; } } value[position] = '\0'; } void SortSources() { Boolean Changed = TRUE; Source s; SList sl; while(Changed) { Changed = FALSE; for(sl = Sources; sl->nextSource != NULL; sl = sl->nextSource) { if(sl->nextSource->thisSource->name == NULL) { Changed = TRUE; sl->nextSource = sl->nextSource->nextSource; } else if(0 < strcmp(sl->thisSource->name, sl->nextSource->thisSource->name)) { Changed = TRUE; s = sl->thisSource; sl->thisSource = sl->nextSource->thisSource; sl->nextSource->thisSource = s; } } } } char * get_filename(name) char* name; { char *result, *loc; long i; loc = (char*)strchr(name,' '); if (loc == NULL) return name; i = (long)loc - (long)name; result = s_malloc(i+1); strncpy(result, name, i); result[i] = 0; return result; } void Feep() { if (CurDpy != NULL) XBell(CurDpy, 0); } extern int alphasort(); char ** GetDirNames(directory) char *directory; { char **result; Direntry_t **list; int i, j; if ((j = scandir(directory, &list, NULL, alphasort)) < 0) { PrintStatus(STATUS_URGENT, STATUS_HIGH, "Error on open of source directory: %s.\n", directory); result = NULL; } else { result = (char**) s_malloc((j+1) * sizeof(char*)); for (i = 0; i < j; i++) { result[i] = s_strdup(list[i]->d_name); s_free(list[i]); } s_free(list); } return result; } #include "xwaist.bit" void SettIcon(parent) Widget parent; { Arg args[1]; Pixmap icon_pixmap = None; XtSetArg (args[ZERO], XtNiconPixmap, &icon_pixmap); XtGetValues(parent, args, ONE); if (icon_pixmap == None) { XtSetArg(args[ZERO], XtNiconPixmap, XCreateBitmapFromData(XtDisplay(parent), XtScreen(parent)->root, xwaist_bits, xwaist_width, xwaist_height)); XtSetValues (parent, args, ONE); } } static Widget helpwindow = NULL; void EndHelp(w, closure, call_data) Widget w; XtPointer closure, call_data; { XtPopdown(helpwindow); } #ifdef MOTIF static insert_help(w, filename) char *filename; { FILE *hf; char buffer[10000]; int loc; if((hf= fopen(filename, "r")) == NULL) { XwaisPrintf("Error opening help file"); } loc = fread(buffer, 1, 10000, hf); buffer[loc] = 0; ReplaceText(w, buffer); fclose(hf); } #endif /* ARGSUSED */ void XwaisHelp(w, closure, call_data) Widget w; XtPointer closure, call_data; { Widget textwindow, frame, button; Arg arglist[10]; Cardinal num_args; static String items[] = {NULL}; if (helpwindow == NULL) { num_args = 0; XtSetArg(arglist[num_args], XtNtitle, "X WAIS Help"); num_args++; XtSetArg(arglist[num_args], XtNiconName, "X WAIS Help"); num_args++; helpwindow = XtCreatePopupShell("textpopup", applicationShellWidgetClass, top, arglist, num_args); frame = XtCreateManagedWidget("helppopupform", formWidgetClass, helpwindow, NULL, ZERO); #ifdef MOTIF textwindow = MakeScrolledText(frame, "textWindow", "", NULL, NULL); button = MakeCommandButton(frame, "tdone", EndHelp, XtParent(XtParent(textwindow)), NULL); insert_help(textwindow, app_resources.helpFile); #else num_args = 0; XtSetArg(arglist[num_args], XtNtype, XawAsciiFile); num_args++; XtSetArg(arglist[num_args], XtNstring, app_resources.helpFile); num_args++; XtSetArg(arglist[num_args], XtNeditType, XawtextRead); num_args++; textwindow = XtCreateManagedWidget("textWindow", asciiTextWidgetClass, frame, arglist, num_args); button = MakeCommandButton(frame, "tdone", EndHelp, textwindow, NULL, NULL); #endif SettIcon(helpwindow); } XtPopup(helpwindow, XtGrabNone); }