fontsel.c

来自「nedit 是一款linux下的开发源码的功能强大的编辑器」· C语言 代码 · 共 1,313 行 · 第 1/4 页

C
1,313
字号
        tempStr = XmStringCreate("Show Proportional Width Fonts",                                  XmSTRING_DEFAULT_CHARSET);        XtSetArg(args[n], XmNlabelString, tempStr); n++;        XtSetArg(args[n], XmNmnemonic, 'W'); n++;        XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;         XtSetArg(args[n], XmNtopAttachment,                         XmATTACH_OPPOSITE_WIDGET); n++;         XtSetArg(args[n], XmNbottomAttachment,                         XmATTACH_OPPOSITE_WIDGET); n++;         XtSetArg(args[n], XmNrightPosition, 98); n++;         XtSetArg(args[n], XmNtopWidget, sizeToggle); n++;        XtSetArg(args[n], XmNbottomWidget, sizeToggle); n++;        XtSetArg(args[n], XmNtopOffset, 1); n++;        propFontToggle = XtCreateManagedWidget("propfonttoggle",                             xmToggleButtonWidgetClass, form, args, n);        XmStringFree(tempStr);    }    /*  create scroll list widgets */    /*  "Font" list */    n = 0;    tempStr = XmStringCreate("Font:", XmSTRING_DEFAULT_CHARSET);    XtSetArg(args[n], XmNlabelString, tempStr); n++;    XtSetArg(args[n], XmNmnemonic, 'F'); n++;     XtSetArg(args[n], XmNtopOffset, 2); n++;    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++;    XtSetArg(args[n], XmNleftPosition, 1); n++;    nameLabel = XtCreateManagedWidget("Font:", xmLabelWidgetClass, form,                                       args, n);    XmStringFree(tempStr);    n = 0;    XtSetArg(args[n], XmNvisibleItemCount, 15); n++;    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++;    XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;    XtSetArg(args[n], XmNbottomWidget, sizeToggle); n++;    XtSetArg(args[n], XmNtopWidget, nameLabel); n++;    XtSetArg(args[n], XmNleftWidget, nameLabel); n++;    XtSetArg(args[n], XmNrightPosition, 52); n++;    fontList = XmCreateScrolledList(form, "fontlist", args, n);    AddMouseWheelSupport(fontList);    XtManageChild(fontList);    XtVaSetValues(nameLabel, XmNuserData, fontList, NULL);    /* "Style" list */    n = 0;    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;    XtSetArg(args[n], XmNtopWidget, nameLabel); n++;    XtSetArg(args[n], XmNleftOffset, 5); n++;    XtSetArg(args[n], XmNleftWidget, XtParent(fontList)); n++;    XtSetArg(args[n], XmNbottomWidget, XtParent(fontList)); n++;    XtSetArg(args[n], XmNrightPosition, 85); n++;    styleList = XmCreateScrolledList(form, "stylelist", args, n);    AddMouseWheelSupport(styleList);    XtManageChild(styleList);    n = 0;    tempStr = XmStringCreate("Style:", XmSTRING_DEFAULT_CHARSET);    XtSetArg(args[n], XmNmnemonic, 'y'); n++;     XtSetArg(args[n], XmNuserData, styleList); n++;    XtSetArg(args[n], XmNlabelString, tempStr); n++;    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++;    XtSetArg(args[n], XmNbottomWidget, XtParent(styleList)); n++;    XtSetArg(args[n], XmNleftWidget, XtParent(styleList)); n++;    XtCreateManagedWidget("Style:", xmLabelWidgetClass, form, args, n);    XmStringFree(tempStr);    /*  "Size" list */    n = 0;    XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++;    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++;    XtSetArg(args[n], XmNtopWidget, nameLabel); n++;    XtSetArg(args[n], XmNleftWidget, XtParent(styleList)); n++;    XtSetArg(args[n], XmNbottomWidget, XtParent(fontList)); n++;    XtSetArg(args[n], XmNleftOffset, 5); n++;    XtSetArg(args[n], XmNrightPosition, 99); n++;    sizeList = XmCreateScrolledList(form, "sizelist", args, n);    AddMouseWheelSupport(sizeList);    XtManageChild(sizeList);    n = 0;    tempStr = XmStringCreate("Size:", XmSTRING_DEFAULT_CHARSET);    XtSetArg(args[n], XmNlabelString, tempStr); n++;    XtSetArg(args[n], XmNmnemonic, 'z'); n++;     XtSetArg(args[n], XmNuserData, sizeList); n++;    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;    XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++;    XtSetArg(args[n], XmNbottomWidget, XtParent(sizeList)); n++;    XtSetArg(args[n], XmNleftWidget, XtParent(sizeList)); n++;    XtCreateManagedWidget("Size:", xmLabelWidgetClass, form, args, n);    XmStringFree(tempStr);    /*  update form widgets cancel button */    n = 0;    XtSetArg(args[n], XmNcancelButton, cancelButton); n++;    XtSetValues(form, args, n);    /*  update application's control block structure */    ctrlBlk.form            = form;    ctrlBlk.okButton        = okButton;    ctrlBlk.cancelButton    = cancelButton;    ctrlBlk.fontList        = fontList;    ctrlBlk.styleList       = styleList;    ctrlBlk.sizeList        = sizeList;    ctrlBlk.fontNameField   = fontName;    ctrlBlk.sizeToggle      = sizeToggle;    if (showPropFonts != ONLY_FIXED)        ctrlBlk.propFontToggle  = propFontToggle;    ctrlBlk.dispField       = dispField;    ctrlBlk.exitFlag        = FALSE;    ctrlBlk.destroyedFlag   = FALSE;    ctrlBlk.showPropFonts   = showPropFonts;    ctrlBlk.showSizeInPixels = TRUE;    ctrlBlk.sel1            = NULL;    ctrlBlk.sel2            = NULL;    ctrlBlk.sel3            = NULL;    ctrlBlk.fontName        = NULL;    setupScrollLists(NONE, ctrlBlk);    /* update scroll lists */     if (showPropFonts == PREF_PROP)        XmToggleButtonSetState(propFontToggle, TRUE, FALSE);             /*  Register callback functions */    if (showPropFonts != ONLY_FIXED)        XtAddCallback(propFontToggle, XmNvalueChangedCallback,                 (XtCallbackProc)propFontToggleAction, (char *)&ctrlBlk);    XtAddCallback(sizeToggle, XmNvalueChangedCallback,            (XtCallbackProc)sizeToggleAction, (char *)&ctrlBlk);    XtAddCallback(fontList, XmNbrowseSelectionCallback,            (XtCallbackProc)fontAction, (char *)&ctrlBlk);    XtAddCallback(styleList, XmNbrowseSelectionCallback,            (XtCallbackProc)styleAction, (char *)&ctrlBlk);    XtAddCallback(sizeList, XmNbrowseSelectionCallback,            (XtCallbackProc)sizeAction, (char *)&ctrlBlk);    XtAddCallback(okButton, XmNactivateCallback,            (XtCallbackProc)okAction, (char *)&ctrlBlk);    XtAddCallback(cancelButton, XmNactivateCallback,            (XtCallbackProc)cancelAction, (char *)&ctrlBlk);    /* add event handler to setup input focus at start to scroll list */    XtAddEventHandler(fontList, FocusChangeMask, FALSE,            (XtEventHandler)setFocus, (char *)&ctrlBlk);    XmProcessTraversal(fontList, XmTRAVERSE_CURRENT);    /*  setup tabgroups */    XmAddTabGroup(fontList);    XmAddTabGroup(styleList);    XmAddTabGroup(sizeList);    XmAddTabGroup(sizeToggle);    if (showPropFonts != ONLY_FIXED)        XmAddTabGroup(propFontToggle);    XmAddTabGroup(fontName);    XmAddTabGroup(okButton);    XmAddTabGroup(cancelButton);    /* Make sure that we don't try to access the dialog if the user       destroyed it (possibly indirectly, by destroying the parent). */    XtAddCallback(dialog, XmNdestroyCallback,            (XtCallbackProc)destroyCB, (char *)&ctrlBlk);            /*  Link Motif Close option to cancel action */    AddMotifCloseCallback(dialog, (XtCallbackProc)cancelAction, &ctrlBlk);    /*  Handle dialog mnemonics  */    AddDialogMnemonicHandler(form, FALSE);    /*  Realize Widgets  */    ManageDialogCenteredOnPointer(form);    /* set up current font parameters */    if (currFont[0] != '\0')        startupFont(&ctrlBlk, currFont);     /* Make sure that we can still access the display in case the form       gets destroyed */    theDisplay = XtDisplay(form);    /*  enter event loop */    while (! ctrlBlk.exitFlag && ! ctrlBlk.destroyedFlag)        XtAppProcessEvent(XtWidgetToApplicationContext(form), XtIMAll);    if (! ctrlBlk.destroyedFlag) {        /* Don't let the callback destroy the font name */        XtRemoveCallback(dialog, XmNdestroyCallback,                (XtCallbackProc)destroyCB, (char *)&ctrlBlk);        XtDestroyWidget(dialog);    }    if (ctrlBlk.oldFont != NULL)    {        XFreeFont(theDisplay, ctrlBlk.oldFont);        XmFontListFree(ctrlBlk.oldFontList);    }    return(ctrlBlk.fontName);}/*  gets a specific substring from a string */static void getStringComponent(const char *inStr, int pos, char *outStr){    int i, j;    *outStr = '\0';    if (pos > NUM_COMPONENTS_FONT_NAME)    {        fprintf(stderr, "Warning: getStringComponent being used for ");        fprintf(stderr, "pos > %d\nIf such ", NUM_COMPONENTS_FONT_NAME);        fprintf(stderr, "use is intended remove these warning lines\n");    }        for (i = 0; (pos > 0) && (inStr[i] != '\0'); i++)        if (inStr[i] == DELIM)            pos--;        if (inStr[i] == '\0')        return;    for (j = 0; (inStr[i] != DELIM) && (inStr[i] != '\0'); i++, j++)        outStr[j] = inStr[i];    outStr[j] = '\0';}/* parse through the fontlist data and set up the three scroll lists */static void setupScrollLists(int dontChange, xfselControlBlkType ctrlBlk){    char        *itemBuf1[MAX_ENTRIES_IN_LIST];    char        *itemBuf2[MAX_ENTRIES_IN_LIST];    char        *itemBuf3[MAX_ENTRIES_IN_LIST];    int         itemCount1, itemCount2, itemCount3;    char        buff1[TEMP_BUF_SIZE];    XmString    items[MAX_ENTRIES_IN_LIST];    int         i;    itemCount1 = 0;    itemCount2 = 0;    itemCount3 = 0;    for (i = 0; i < ctrlBlk.numFonts && i < MAX_ENTRIES_IN_LIST; i++)    {        if ((dontChange != FONT) &&            (styleMatch(&ctrlBlk, ctrlBlk.fontData[i])) &&            (sizeMatch (&ctrlBlk, ctrlBlk.fontData[i])) &&            ((ctrlBlk.showPropFonts == PREF_PROP) ||              (notPropFont(ctrlBlk.fontData[i]))))        {            getFontPart(ctrlBlk.fontData[i], buff1);            addItemToList(itemBuf1, buff1, &itemCount1);        }        if ((dontChange != STYLE) &&            (fontMatch(&ctrlBlk, ctrlBlk.fontData[i])) &&            (sizeMatch (&ctrlBlk, ctrlBlk.fontData[i])) &&            ((ctrlBlk.showPropFonts == PREF_PROP) ||              (notPropFont(ctrlBlk.fontData[i]))))        {            getStylePart(ctrlBlk.fontData[i], buff1);            addItemToList(itemBuf2, buff1, &itemCount2);        }        if ((dontChange != SIZE) &&            (fontMatch(&ctrlBlk, ctrlBlk.fontData[i])) &&            (styleMatch (&ctrlBlk, ctrlBlk.fontData[i])) &&            ((ctrlBlk.showPropFonts == PREF_PROP) ||              (notPropFont(ctrlBlk.fontData[i]))))        {            getSizePart(ctrlBlk.fontData[i], buff1, ctrlBlk.showSizeInPixels);            addItemToList(itemBuf3, buff1, &itemCount3);        }    }   /* end - for (i = 0; i < ctrlBlk.numFonts; i++) */    /*  recreate all three scroll lists where necessary */    if (dontChange != FONT)    {        for (i = 0; i < itemCount1; i++)        {            items[i] = XmStringCreate(itemBuf1[i], XmSTRING_DEFAULT_CHARSET);            XtFree(itemBuf1[i]);        }        XmListDeleteAllItems(ctrlBlk.fontList);        XmListAddItems(ctrlBlk.fontList, items, itemCount1, 1);        if (ctrlBlk.sel1 != NULL)        {            XmStringFree(items[0]);            items[0] = XmStringCreate(ctrlBlk.sel1, XmSTRING_DEFAULT_CHARSET);            XmListSelectItem(ctrlBlk.fontList, items[0], FALSE);            XmListSetBottomItem(ctrlBlk.fontList, items[0]);        }        for (i = 0; i < itemCount1; i++)            XmStringFree(items[i]);    }    if (dontChange != STYLE)    {        for (i = 0; i < itemCount2; i++)        {            items[i] = XmStringCreate(itemBuf2[i], XmSTRING_DEFAULT_CHARSET);            XtFree(itemBuf2[i]);        }        XmListDeleteAllItems(ctrlBlk.styleList);        XmListAddItems(ctrlBlk.styleList, items, itemCount2, 1);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?