📄 selfile.c
字号:
(XtPointer) NULL ); i = 0; XtSetArg (arglist[i], XtNwidth, listWidth); i++; XtSetArg (arglist[i], XtNheight, listHeight); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; XtSetArg (arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg (arglist[i], XtNvertDistance, 10); i++; XtSetArg (arglist[i], XtNtop, XtChainTop); i++; XtSetArg (arglist[i], XtNbottom, XtChainTop); i++; XtSetArg (arglist[i], XtNleft, XtChainLeft); i++; XtSetArg (arglist[i], XtNright, XtChainLeft); i++; selFileLists[0] = XtCreateManagedWidget ( "selFileList1", compositeWidgetClass, selFileForm, arglist, i ); i = 0; XtSetArg (arglist[i], XtNwidth, listWidth); i++; XtSetArg (arglist[i], XtNheight, listHeight); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; XtSetArg (arglist[i], XtNfromHoriz, selFileLists[0]); i++; XtSetArg (arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg (arglist[i], XtNhorizDistance, listSpacing); i++; XtSetArg (arglist[i], XtNvertDistance, 10); i++; XtSetArg (arglist[i], XtNtop, XtChainTop); i++; XtSetArg (arglist[i], XtNbottom, XtChainTop); i++; XtSetArg (arglist[i], XtNleft, XtChainLeft); i++; XtSetArg (arglist[i], XtNright, XtChainLeft); i++; selFileLists[1] = XtCreateManagedWidget ( "selFileList2", compositeWidgetClass, selFileForm, arglist, i ); i = 0; XtSetArg (arglist[i], XtNwidth, listWidth); i++; XtSetArg (arglist[i], XtNheight, listHeight); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; XtSetArg (arglist[i], XtNfromHoriz, selFileLists[1]); i++; XtSetArg (arglist[i], XtNfromVert, selFileHScroll); i++; XtSetArg (arglist[i], XtNhorizDistance, listSpacing); i++; XtSetArg (arglist[i], XtNvertDistance, 10); i++; XtSetArg (arglist[i], XtNtop, XtChainTop); i++; XtSetArg (arglist[i], XtNbottom, XtChainTop); i++; XtSetArg (arglist[i], XtNleft, XtChainLeft); i++; XtSetArg (arglist[i], XtNright, XtChainLeft); i++; selFileLists[2] = XtCreateManagedWidget ( "selFileList3", compositeWidgetClass, selFileForm, arglist, i ); for (n = 0; n < 3; n++) { i = 0; XtSetArg (arglist[i], XtNx, vScrollX); i++; XtSetArg (arglist[i], XtNy, vScrollY); i++; XtSetArg (arglist[i], XtNwidth, scrollThickness); i++; XtSetArg (arglist[i], XtNheight, SFvScrollHeight); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; selFileVScrolls[n] = XtCreateManagedWidget ( "selFileVScroll", scrollbarWidgetClass, selFileLists[n], arglist, i ); XtAddCallback ( selFileVScrolls[n], XtNjumpProc, SFvFloatSliderMovedCallback, (XtPointer) n ); XtAddCallback ( selFileVScrolls[n], XtNscrollProc, SFvAreaSelectedCallback, (XtPointer) n ); i = 0; XtSetArg (arglist[i], XtNorientation, XtorientHorizontal); i++; XtSetArg (arglist[i], XtNx, hScrollX); i++; XtSetArg (arglist[i], XtNy, hScrollY); i++; XtSetArg (arglist[i], XtNwidth, SFhScrollWidth); i++; XtSetArg (arglist[i], XtNheight, scrollThickness); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; selFileHScrolls[n] = XtCreateManagedWidget ( "selFileHScroll", scrollbarWidgetClass, selFileLists[n], arglist, i ); XtAddCallback ( selFileHScrolls[n], XtNjumpProc, SFhSliderMovedCallback, (XtPointer) n ); XtAddCallback ( selFileHScrolls[n], XtNscrollProc, SFhAreaSelectedCallback, (XtPointer) n ); } i = 0; XtSetArg (arglist[i], XtNlabel, ok); i++; XtSetArg (arglist[i], XtNresizable, True); i++; XtSetArg (arglist[i], XtNcallback, SFokSelect); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; XtSetArg (arglist[i], XtNfromVert, selFileLists[0]); i++; XtSetArg (arglist[i], XtNvertDistance, 30); i++; XtSetArg (arglist[i], XtNtop, XtChainTop); i++; XtSetArg (arglist[i], XtNbottom, XtChainTop); i++; XtSetArg (arglist[i], XtNleft, XtChainLeft); i++; XtSetArg (arglist[i], XtNright, XtChainLeft); i++; selFileOK = XtCreateManagedWidget ( "selFileOK", commandWidgetClass, selFileForm, arglist, i ); i = 0; XtSetArg (arglist[i], XtNlabel, cancel); i++; XtSetArg (arglist[i], XtNresizable, True); i++; XtSetArg (arglist[i], XtNcallback, SFcancelSelect); i++; XtSetArg (arglist[i], XtNborderColor, SFfore); i++; XtSetArg (arglist[i], XtNfromHoriz, selFileOK); i++; XtSetArg (arglist[i], XtNfromVert, selFileLists[0]); i++; XtSetArg (arglist[i], XtNhorizDistance, 30); i++; XtSetArg (arglist[i], XtNvertDistance, 30); i++; XtSetArg (arglist[i], XtNtop, XtChainTop); i++; XtSetArg (arglist[i], XtNbottom, XtChainTop); i++; XtSetArg (arglist[i], XtNleft, XtChainLeft); i++; XtSetArg (arglist[i], XtNright, XtChainLeft); i++; selFileCancel = XtCreateManagedWidget ( "selFileCancel", commandWidgetClass, selFileForm, arglist, i ); XtSetMappedWhenManaged (selFile, False); XtRealizeWidget (selFile); /* Add WM_DELETE_WINDOW protocol */ SFwmDeleteWindow = XInternAtom (SFdisplay, "WM_DELETE_WINDOW", False); XSetWMProtocols (SFdisplay, XtWindow (selFile), &SFwmDeleteWindow, 1); SFcreateGC (); xtermCursor = XCreateFontCursor (SFdisplay, XC_xterm); sbRightArrowCursor = XCreateFontCursor (SFdisplay, XC_sb_right_arrow); dotCursor = XCreateFontCursor (SFdisplay, XC_dot); XDefineCursor (SFdisplay, XtWindow (selFileForm), xtermCursor); XDefineCursor (SFdisplay, XtWindow (selFileField), xtermCursor); for (n = 0; n < 3; n++) { XDefineCursor ( SFdisplay, XtWindow (selFileLists[n]), sbRightArrowCursor ); } XDefineCursor (SFdisplay, XtWindow (selFileOK), dotCursor); XDefineCursor (SFdisplay, XtWindow (selFileCancel), dotCursor); for (n = 0; n < 3; n++) { XtAddEventHandler ( selFileLists[n], ExposureMask, True, SFexposeList, (XtPointer) n ); XtAddEventHandler ( selFileLists[n], EnterWindowMask, False, SFenterList, (XtPointer) n ); XtAddEventHandler ( selFileLists[n], LeaveWindowMask, False, SFleaveList, (XtPointer) n ); XtAddEventHandler ( selFileLists[n], PointerMotionMask, False, SFmotionList, (XtPointer) n ); XtAddEventHandler ( selFileLists[n], ButtonPressMask, False, SFbuttonPressList, (XtPointer) n ); XtAddEventHandler ( selFileLists[n], ButtonReleaseMask, False, SFbuttonReleaseList, (XtPointer) n ); } XtAddEventHandler ( selFileField, KeyPressMask, False, SFmodVerifyCallback, (XtPointer) NULL ); SFapp = XtWidgetToApplicationContext (selFile);}/* position widget under the cursor */static void SFpositionWidget (Widget w) { Arg args[3]; Cardinal num_args; Dimension width, height, b_width; int x, y, max_x, max_y; Window root, child; int dummyx, dummyy; unsigned int dummymask; XQueryPointer ( XtDisplay (w), XtWindow (w), &root, &child, &x, &y, &dummyx, &dummyy, &dummymask ); num_args = 0; XtSetArg (args[num_args], XtNwidth, &width); num_args++; XtSetArg (args[num_args], XtNheight, &height); num_args++; XtSetArg (args[num_args], XtNborderWidth, &b_width); num_args++; XtGetValues (w, args, num_args); width += 2 * b_width; height += 2 * b_width; x -= ((Position) width / 2); if (x < 0) x = 0; if (x > (max_x = (Position) (XtScreen (w)->width - width))) x = max_x; y -= ((Position) height / 2); if (y < 0) y = 0; if (y > (max_y = (Position) (XtScreen (w)->height - height))) y = max_y; num_args = 0; XtSetArg (args[num_args], XtNx, x); num_args++; XtSetArg (args[num_args], XtNy, y); num_args++; XtSetValues (w, args, num_args);}FILE *SFopenFile (char *name, char *mode, char *prompt, char *failed) { Arg args[1]; FILE *fp; SFchdir (SFstartDir); if ((fp = fopen (name, mode)) == NULL) { char *buf;#ifdef HAVE_STRERROR char *errormsg = strerror (errno); if (errormsg) { buf = XtMalloc ( strlen (failed) + strlen (errormsg) + strlen (prompt) + 2 ); strcpy (buf, failed); strcat (buf, errormsg); strcat (buf, "\n");#else if (errno < sys_nerr) { buf = XtMalloc ( strlen (failed) + strlen (sys_errlist[errno]) + strlen (prompt) + 2 ); strcpy (buf, failed); strcat (buf, sys_errlist[errno]); strcat (buf, "\n"); strcat (buf, prompt);#endif } else { buf = XtMalloc (strlen (failed) + strlen (prompt) + 2); strcpy (buf, failed); strcat (buf, "\n"); strcat (buf, prompt); } XtSetArg (args[0], XtNlabel, buf); XtSetValues (selFilePrompt, args, ONE); XtFree (buf); return NULL; } return fp;}void SFtextChanged (void) { if ((SFtextBuffer[0] == '/') || (SFtextBuffer[0] == '~')) { strcpy (SFcurrentPath, SFtextBuffer); SFtextPos = XawTextGetInsertionPoint (selFileField); } else { strcat (strcpy (SFcurrentPath, SFstartDir), SFtextBuffer); SFtextPos = XawTextGetInsertionPoint ( selFileField ) + strlen (SFstartDir); } if (!SFworkProcAdded) { SFworkProcId = XtAppAddWorkProc (SFapp, SFworkProc, NULL); SFworkProcAdded = 1; } SFupdatePath ();}static void SFprepareToReturn (void) { SFstatus = SEL_FILE_NULL; XtRemoveGrab (selFile); XtUnmapWidget (selFile); XtRemoveTimeOut (SFdirModTimerId); if (SFchdir (SFstartDir)) { XtAppError (SFapp, "XsraSelFile: can't return to current directory"); }}intXsraSelFile ( Widget toplevel, char *prompt, char *ok, char *cancel, char *failed, char *init_path, char *mode, int (*show_entry) (char *, char **, struct stat *), char *name_return, int name_size) { static int firstTime = 1; Cardinal i; Arg arglist[20]; XEvent event; if (!prompt) { prompt = "Pathname:"; } if (!ok) { ok = "OK"; } if (!cancel) { cancel = "Cancel"; } if (firstTime) { firstTime = 0; SFdisplay = XtDisplay (toplevel); SFcreateWidgets (toplevel, prompt, ok, cancel); } else { i = 0; XtSetArg (arglist[i], XtNlabel, prompt); i++; XtSetValues (selFilePrompt, arglist, i); i = 0; XtSetArg (arglist[i], XtNlabel, ok); i++; XtSetValues (selFileOK, arglist, i); i = 0; XtSetArg (arglist[i], XtNlabel, cancel); i++; XtSetValues (selFileCancel, arglist, i); } SFpositionWidget (selFile); XtMapWidget (selFile); if (!getcwd (SFstartDir, MAXPATHLEN)) { XtAppError (SFapp, "XsraSelFile: can't get current directory"); } strcat (SFstartDir, "/"); strcpy (SFcurrentDir, SFstartDir); if (init_path) { if (init_path[0] == '/') { strcpy (SFcurrentPath, init_path); if (strncmp (SFcurrentPath, SFstartDir, strlen (SFstartDir))) { SFsetText (SFcurrentPath); } else { SFsetText (& (SFcurrentPath[strlen (SFstartDir)])); } } else { strcat (strcpy (SFcurrentPath, SFstartDir), init_path); SFsetText (& (SFcurrentPath[strlen (SFstartDir)])); } } else { strcpy (SFcurrentPath, SFstartDir); } SFfunc = show_entry; SFtextChanged (); XtAddGrab (selFile, True, True); SFdirModTimerId = XtAppAddTimeOut ( SFapp, (unsigned long) 1000, SFdirModTimer, (XtPointer) NULL ); while (1) { XtAppNextEvent (SFapp, &event); XtDispatchEvent (&event); switch (SFstatus) { case SEL_FILE_TEXT: SFstatus = SEL_FILE_NULL; SFtextChanged (); break; case SEL_FILE_OK: strncpy (name_return, SFtextBuffer, name_size); SFprepareToReturn (); if (SFworkProcAdded) { XtRemoveWorkProc (SFworkProcId); SFworkProcAdded = 0; } return 1; case SEL_FILE_CANCEL: SFprepareToReturn (); return 0; case SEL_FILE_NULL: break; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -