/* * Function: * XawAsciiSaveAsFile * * Arguments: * w - AsciiSrc widget * name - name of the file to save this file into * * Description: * Save the current buffer as a file. * * Returns: * True if the save was sucessful */ Bool XawAsciiSaveAsFile(Widget w, _Xconst char *name) { AsciiSrcObject src = (AsciiSrcObject)w; Bool ret; /* If the src is really a multi, call the multi save */ if (XtIsSubclass( w, multiSrcObjectClass)) return (_XawMultiSaveAsFile(w, name)); else if (!XtIsSubclass(w, asciiSrcObjectClass)) XtErrorMsg("bad argument", "asciiSource", "XawError", "XawAsciiSaveAsFile's 1st parameter must be an " "asciiSrc or multiSrc.", NULL, NULL); if (src->ascii_src.type == XawAsciiFile) ret = WritePiecesToFile(src, (String)name); else { String string = StorePiecesInString(src); ret = WriteToFile(string, (String)name, src->ascii_src.length); XtFree(string); } return (ret); }
void _XtAllocError( String type) { Cardinal num_params = 1; if (type == NULL) type = "local memory allocation"; XtErrorMsg("allocError", type, XtCXtToolkitError, "Cannot perform %s", &type, &num_params); }
static void LoadPieces(AsciiSrcObject src, FILE *file, char *string) { char *ptr; Piece *piece = NULL; XawTextPosition left; if (string == NULL) { if (src->ascii_src.type == XawAsciiFile) { if (src->ascii_src.length != 0) { int len; left = 0; fseek(file, 0, 0); while (left < src->ascii_src.length) { ptr = XtMalloc((unsigned)src->ascii_src.piece_size); if ((len = fread(ptr, (Size_t)sizeof(unsigned char), (Size_t)src->ascii_src.piece_size, file)) < 0) XtErrorMsg("readError", "asciiSourceCreate", "XawError", "fread returned error.", NULL, NULL); piece = AllocNewPiece(src, piece); piece->text = ptr; piece->used = XawMin(len, src->ascii_src.piece_size); left += piece->used; } } else { piece = AllocNewPiece(src, NULL); piece->text = XtMalloc((unsigned)src->ascii_src.piece_size); piece->used = 0; } return; } else string = src->ascii_src.string; } if (src->ascii_src.use_string_in_place) { piece = AllocNewPiece(src, piece); piece->used = XawMin(src->ascii_src.length, src->ascii_src.piece_size); piece->text = src->ascii_src.string; return; } ptr = string; left = src->ascii_src.length; do { piece = AllocNewPiece(src, piece); piece->text = XtMalloc((unsigned)src->ascii_src.piece_size); piece->used = XawMin(left, src->ascii_src.piece_size); if (piece->used != 0) memcpy(piece->text, ptr, (unsigned)piece->used); left -= piece->used; ptr += piece->used; } while (left > 0); }
/* * Function: * XawAsciiSave * * Parameters: * w - asciiSrc Widget * * Description: * Saves all the pieces into a file or string as required. * * Returns: * True if the save was successful */ Bool XawAsciiSave(Widget w) { AsciiSrcObject src = (AsciiSrcObject)w; /* If the src is really a multi, call the multi save */ if (XtIsSubclass(w, multiSrcObjectClass )) return (_XawMultiSave(w)); else if (!XtIsSubclass(w, asciiSrcObjectClass)) XtErrorMsg("bad argument", "asciiSource", "XawError", "XawAsciiSave's parameter must be an asciiSrc or multiSrc.", NULL, NULL); /* * If using the string in place then there is no need to play games * to get the internal info into a readable string. */ if (src->ascii_src.use_string_in_place) return (True); if (src->ascii_src.type == XawAsciiFile) { #ifdef OLDXAW if (!src->ascii_src.changes) #else if (!src->text_src.changed) /* No changes to save */ #endif return (True); if (WritePiecesToFile(src, src->ascii_src.string) == False) return (False); } else { if (src->ascii_src.allocated_string == True) XtFree(src->ascii_src.string); else src->ascii_src.allocated_string = True; src->ascii_src.string = StorePiecesInString(src); } #ifdef OLDXAW src->ascii_src.changes = False; #else src->text_src.changed = False; #endif return (True); }
/* * Internal routine; must be called only after XtIsWidget returns false */ Widget _XtWindowedAncestor( register Widget object) { Widget obj = object; for (object = XtParent(object); object && !XtIsWidget(object);) object = XtParent(object); if (object == NULL) { String params = XtName(obj); Cardinal num_params = 1; XtErrorMsg("noWidgetAncestor", "windowedAncestor", XtCXtToolkitError, "Object \"%s\" does not have windowed ancestor", ¶ms, &num_params); } return object; }
void _XtCopyToArg( char* src, XtArgVal *dst, register unsigned int size) { if (!*dst) { #ifdef GETVALUES_BUG /* old GetValues semantics (storing directly into arglists) are bad, * but preserve for compatibility as long as arglist contains NULL. */ union { long longval; #ifdef LONG64 int intval; #endif short shortval; char charval; char* charptr; XtPointer ptr; } u; if (size <= sizeof(XtArgVal)) { (void) memmove((char*)&u, (char*)src, (int)size ); if (size == sizeof(long)) *dst = (XtArgVal)u.longval; #ifdef LONG64 else if (size == sizeof(int)) *dst = (XtArgVal)u.intval; #endif else if (size == sizeof(short)) *dst = (XtArgVal)u.shortval; else if (size == sizeof(char)) *dst = (XtArgVal)u.charval; else if (size == sizeof(char*)) *dst = (XtArgVal)u.charptr; else if (size == sizeof(XtPointer)) *dst = (XtArgVal)u.ptr; else (void) memmove((char*)dst, (char*)src, (int)size ); } else (void) memmove((char*)dst, (char*)src, (int)size ); #else XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError, "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL); #endif } else { /* proper GetValues semantics: argval is pointer to destination */ (void) memmove((char*)*dst, (char*)src, (int)size ); } } /* _XtCopyToArg */
void help_win(Widget widget, XtPointer client_data, XtPointer call_data) { Widget tL1, vpane, buttonbox; Widget close, txt; int one = 1; char *argv[2]; Display * dpy; if (help_context != NULL) return; argv[0] = "xsuprem"; argv[1] = NULL; help_context = XtCreateApplicationContext(); dpy = XtOpenDisplay(help_context, (String) NULL, NULL, "XSuprem", NULL, 0, &one, argv); if (dpy == NULL) XtErrorMsg("invalidDisplay","xtInitialize","XtToolkitError", "Can't Open display", (String *) NULL, (Cardinal *)NULL); tL1 = XtVaAppCreateShell( "XSupHelp", "XSuprem", applicationShellWidgetClass, dpy, XtNscreen, (XtArgVal)DefaultScreenOfDisplay(dpy), NULL ); vpane = XtVaCreateManagedWidget("vpane", panedWidgetClass, tL1, NULL); buttonbox = XtVaCreateManagedWidget("buttonbox", boxWidgetClass, vpane, NULL); /*Make the Help Button*/ close = XtVaCreateManagedWidget("Cancel", commandWidgetClass, buttonbox, NULL); XtAddCallback(close, XtNcallback, destroy_help, NULL); txt = XtVaCreateManagedWidget("help", asciiTextWidgetClass, vpane, XtNscrollVertical, XawtextScrollAlways, XtNtype, XawAsciiFile, /*XtNstring, "/home/helios0/law/src/xgraph/help",*/ NULL); XtRealizeWidget(tL1); }
/* * Function: * XawAsciiSourceChanged * * Parameters: * w - ascii source widget * * Description: * Returns true if the source has changed since last saved. * * Returns: * A Boolean (see description). */ Bool XawAsciiSourceChanged(Widget w) { #ifdef OLDXAW if (XtIsSubclass(w, multiSrcObjectClass)) return (((MultiSrcObject)w)->multi_src.changes); if (XtIsSubclass(w, asciiSrcObjectClass)) return (((AsciiSrcObject)w)->ascii_src.changes); #else if (XtIsSubclass(w, textSrcObjectClass)) return (((TextSrcObject)w)->textSrc.changed); #endif XtErrorMsg("bad argument", "asciiSource", "XawError", "XawAsciiSourceChanged parameter must be an " "asciiSrc or multiSrc.", NULL, NULL); return (True); }
/* * Function: * XawAsciiSourceFreeString * * Parameters: * w - AsciiSrc widget * * Description: * Frees the string returned by a get values call * on the string when the source is of type string. */ void XawAsciiSourceFreeString(Widget w) { AsciiSrcObject src = (AsciiSrcObject)w; /* If the src is really a multi, call the multi routine */ if (XtIsSubclass(w, multiSrcObjectClass)) { _XawMultiSourceFreeString(w); return; } else if (!XtIsSubclass(w, asciiSrcObjectClass)) { XtErrorMsg("bad argument", "asciiSource", "XawError", "XawAsciiSourceFreeString's parameter must be " "an asciiSrc or multiSrc.", NULL, NULL); } if (src->ascii_src.allocated_string && src->ascii_src.type != XawAsciiFile) { src->ascii_src.allocated_string = False; XtFree(src->ascii_src.string); src->ascii_src.string = NULL; } }
/* * Function: * InsertFileNamed * * Parameters: * tw - text widget to insert this file into * str - name of the file to insert * * Description: * Inserts a file into the text widget. * * Returns: * True if the insert was sucessful, False otherwise. */ static Bool InsertFileNamed(Widget tw, char *str) { FILE *file; XawTextBlock text; XawTextPosition pos; if (str == NULL || strlen(str) == 0 || (file = fopen(str, "r")) == NULL) return (False); pos = XawTextGetInsertionPoint(tw); fseek(file, 0L, 2); text.firstPos = 0; text.length = ftell(file); text.ptr = XtMalloc(text.length + 1); text.format = XawFmt8Bit; fseek(file, 0L, 0); if (fread(text.ptr, 1, text.length, file) != text.length) XtErrorMsg("readError", "insertFileNamed", "XawError", "fread returned error", NULL, NULL); if (XawTextReplace(tw, pos, pos, &text) != XawEditDone) { XtFree(text.ptr); fclose(file); return (False); } pos += text.length; XtFree(text.ptr); fclose(file); XawTextSetInsertionPoint(tw, pos); _XawTextShowPosition((TextWidget)tw); return (True); }
/*ARGSUSED*/ void XmuCvtStringToCursor(XrmValuePtr args, Cardinal *num_args, XrmValuePtr fromVal, XrmValuePtr toVal) { static Cursor cursor; /* static for cvt magic */ char *name = (char *)fromVal->addr; Screen *screen; register int i; char maskname[PATH_MAX]; Pixmap source, mask = 0; /* XXX - make fg/bg resources */ static XColor bgColor = {0, 0xffff, 0xffff, 0xffff}; static XColor fgColor = {0, 0, 0, 0}; int xhot, yhot; int len; if (*num_args != 1) XtErrorMsg("wrongParameters","cvtStringToCursor","XtToolkitError", "String to cursor conversion needs screen argument", (String *)NULL, (Cardinal *)NULL); if (XmuCompareISOLatin1(name, "None") == 0) { cursor = None; done(&cursor, Cursor); return; } screen = *((Screen **) args[0].addr); if (0 == strncmp(FONTSPECIFIER, name, strlen(FONTSPECIFIER))) { char source_name[PATH_MAX], mask_name[PATH_MAX]; int source_char, mask_char, fields = 0; Font source_font, mask_font; XrmValue fromString, toFont; XrmValue cvtArg; Boolean success; Display *dpy = DisplayOfScreen(screen); char *strspec = NULL; int strspeclen; #ifdef XMU_KLUDGE Cardinal num; #endif strspeclen = strlen("FONT %s %d %s %d") + 21; strspec = XtMalloc(strspeclen); if (strspec != NULL) { snprintf(strspec, strspeclen, "FONT %%%lds %%d %%%lds %%d", (unsigned long)sizeof(source_name) - 1, (unsigned long)sizeof(mask_name) - 1); fields = sscanf(name, strspec, source_name, &source_char, mask_name, &mask_char); XtFree(strspec); } if (fields < 2) { XtStringConversionWarning(name, XtRCursor); return; } fromString.addr = source_name; fromString.size = strlen(source_name) + 1; toFont.addr = (XPointer) &source_font; toFont.size = sizeof(Font); cvtArg.addr = (XPointer) &dpy; cvtArg.size = sizeof(Display *); /* XXX using display of screen argument as message display */ #ifdef XMU_KLUDGE /* XXX Sacrifice caching */ num = 1; success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString, &toFont, NULL); #else success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg, (Cardinal)1, &fromString, &toFont, NULL); #endif if (!success) { XtStringConversionWarning(name, XtRCursor); return; } switch (fields) { case 2: /* defaulted mask font & char */ mask_font = source_font; mask_char = source_char; break; case 3: /* defaulted mask font */ mask_font = source_font; mask_char = atoi(mask_name); break; case 4: /* specified mask font & char */ fromString.addr = mask_name; fromString.size = strlen(mask_name) + 1; toFont.addr = (XPointer) &mask_font; toFont.size = sizeof(Font); /* XXX using display of screen argument as message display */ #ifdef XMU_KLUDGE /* XXX Sacrifice caching */ num = 1; success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString, &toFont, NULL); #else success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg, (Cardinal)1, &fromString, &toFont, NULL); #endif if (!success) { XtStringConversionWarning(name, XtRCursor); return; } } cursor = XCreateGlyphCursor( DisplayOfScreen(screen), source_font, mask_font, source_char, mask_char, &fgColor, &bgColor ); done(&cursor, Cursor); return; } i = XmuCursorNameToIndex (name); if (i != -1) { cursor = XCreateFontCursor (DisplayOfScreen(screen), i); done(&cursor, Cursor); return; } if ((source = XmuLocateBitmapFile (screen, name, maskname, (sizeof maskname) - 4, NULL, NULL, &xhot, &yhot)) == None) { XtStringConversionWarning (name, XtRCursor); cursor = None; done(&cursor, Cursor); return; } len = strlen (maskname); for (i = 0; i < 2; i++) { strcpy (maskname + len, i == 0 ? "Mask" : "msk"); if ((mask = XmuLocateBitmapFile (screen, maskname, NULL, 0, NULL, NULL, NULL, NULL)) != None) break; } cursor = XCreatePixmapCursor( DisplayOfScreen(screen), source, mask, &fgColor, &bgColor, xhot, yhot ); XFreePixmap( DisplayOfScreen(screen), source ); if (mask != None) XFreePixmap( DisplayOfScreen(screen), mask ); done(&cursor, Cursor); }
/* * Function: * InitStringOrFile * * Parameters: * src - AsciiSource * * Description: * Initializes the string or file. */ static FILE * InitStringOrFile(AsciiSrcObject src, Bool newString) { mode_t open_mode = 0; const char *fdopen_mode = NULL; int fd; FILE *file; if (src->ascii_src.type == XawAsciiString) { if (src->ascii_src.string == NULL) src->ascii_src.length = 0; else if (!src->ascii_src.use_string_in_place) { src->ascii_src.string = XtNewString(src->ascii_src.string); src->ascii_src.allocated_string = True; src->ascii_src.length = strlen(src->ascii_src.string); } if (src->ascii_src.use_string_in_place) { if (src->ascii_src.string != NULL) src->ascii_src.length = strlen(src->ascii_src.string); /* In case the length resource is incorrectly set */ if (src->ascii_src.length > src->ascii_src.ascii_length) src->ascii_src.ascii_length = src->ascii_src.length; if (src->ascii_src.ascii_length == MAGIC_VALUE) src->ascii_src.piece_size = src->ascii_src.length; else src->ascii_src.piece_size = src->ascii_src.ascii_length + 1; } return (NULL); } /* * type is XawAsciiFile */ src->ascii_src.is_tempfile = False; switch (src->text_src.edit_mode) { case XawtextRead: if (src->ascii_src.string == NULL) XtErrorMsg("NoFile", "asciiSourceCreate", "XawError", "Creating a read only disk widget and no file specified.", NULL, 0); open_mode = O_RDONLY; fdopen_mode = "r"; break; case XawtextAppend: case XawtextEdit: if (src->ascii_src.string == NULL) { src->ascii_src.string = "*ascii-src*"; src->ascii_src.is_tempfile = True; } else { /* O_NOFOLLOW is a FreeBSD & Linux extension */ #ifdef O_NOFOLLOW open_mode = O_RDWR | O_NOFOLLOW; #else open_mode = O_RDWR; /* unsafe; subject to race conditions */ #endif /* O_NOFOLLOW */ fdopen_mode = "r+"; } break; default: XtErrorMsg("badMode", "asciiSourceCreate", "XawError", "Bad editMode for ascii source; must be Read, " "Append or Edit.", NULL, NULL); } /* If is_tempfile, allocate a private copy of the text * Unlikely to be changed, just to set allocated_string */ if (newString || src->ascii_src.is_tempfile) { src->ascii_src.string = XtNewString(src->ascii_src.string); src->ascii_src.allocated_string = True; } if (!src->ascii_src.is_tempfile) { if ((fd = open(src->ascii_src.string, open_mode, 0666)) != -1) { if ((file = fdopen(fd, fdopen_mode))) { (void)fseek(file, 0, SEEK_END); src->ascii_src.length = (XawTextPosition)ftell(file); return (file); } } { String params[2]; Cardinal num_params = 2; params[0] = src->ascii_src.string; params[1] = strerror(errno); XtAppWarningMsg(XtWidgetToApplicationContext((Widget)src), "openError", "asciiSourceCreate", "XawWarning", "Cannot open file %s; %s", params, &num_params); } } src->ascii_src.length = 0; return (NULL); }
void XtInitializeWidgetClass(WidgetClass wc) { XtEnum inited; LOCK_PROCESS; if (wc->core_class.class_inited) { UNLOCK_PROCESS; return; } inited = 0x01; { WidgetClass pc; #define LeaveIfClass(c, d) if (pc == c) { inited = d; break; } for (pc = wc; pc; pc = pc->core_class.superclass) { LeaveIfClass(rectObjClass, 0x01 | RectObjClassFlag); LeaveIfClass(coreWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag); LeaveIfClass(compositeWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag); LeaveIfClass(constraintWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ConstraintClassFlag); LeaveIfClass(shellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag); LeaveIfClass(wmShellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag | WMShellClassFlag); LeaveIfClass(topLevelShellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag | WMShellClassFlag | TopLevelClassFlag); } #undef LeaveIfClass } if (wc->core_class.version != XtVersion && wc->core_class.version != XtVersionDontCheck) { String param[3]; String mismatch = "Widget class %s version mismatch (recompilation needed):\n widget %d vs. intrinsics %d."; String recompile = "Widget class %s must be re-compiled."; Cardinal num_params; param[0] = wc->core_class.class_name; param[1] = (String) wc->core_class.version; param[2] = (String) XtVersion; if (wc->core_class.version == (11 * 1000 + 5) || /* MIT X11R5 */ wc->core_class.version == (11 * 1000 + 4)) { /* MIT X11R4 */ if ((inited & WMShellClassFlag) && (sizeof(Boolean) != sizeof(char) || sizeof(Atom) != sizeof(Widget) || sizeof(Atom) != sizeof(String))) { num_params=3; XtWarningMsg("versionMismatch","widget",XtCXtToolkitError, mismatch, param, &num_params); num_params=1; XtErrorMsg("R4orR5versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } else if (wc->core_class.version == (11 * 1000 + 3)) { /* MIT X11R3 */ if (inited & ShellClassFlag) { num_params=1; XtWarningMsg("r3versionMismatch","widget",XtCXtToolkitError, "Shell Widget class %s binary compiled for R3", param,&num_params); XtErrorMsg("R3versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } else { num_params=3; XtWarningMsg("versionMismatch","widget",XtCXtToolkitError, mismatch, param, &num_params); if (wc->core_class.version == (2 * 1000 + 2)) /* MIT X11R2 */ { num_params=1; XtErrorMsg("r2versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } } if ((wc->core_class.superclass != NULL) && (!(wc->core_class.superclass->core_class.class_inited))) XtInitializeWidgetClass(wc->core_class.superclass); if (wc->core_class.class_initialize != NULL) (*(wc->core_class.class_initialize))(); CallClassPartInit(wc, wc); wc->core_class.class_inited = inited; UNLOCK_PROCESS; }