fontsel.c

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

C
1,313
字号
        if (ctrlBlk.sel2 != NULL)        {            XmStringFree(items[0]);            items[0] = XmStringCreate(ctrlBlk.sel2, XmSTRING_DEFAULT_CHARSET);            XmListSelectItem(ctrlBlk.styleList, items[0], FALSE);            XmListSetBottomItem(ctrlBlk.styleList, items[0]);        }        for (i = 0; i < itemCount2; i++)            XmStringFree(items[i]);    }    if (dontChange != SIZE)    {        for (i = 0; i < itemCount3; i++)        {            items[i] = XmStringCreate(itemBuf3[i],                              XmSTRING_DEFAULT_CHARSET);            XtFree(itemBuf3[i]);        }        XmListDeleteAllItems(ctrlBlk.sizeList);        XmListAddItems(ctrlBlk.sizeList, items, itemCount3, 1);        if (ctrlBlk.sel3 != NULL)        {            XmStringFree(items[0]);            items[0] = XmStringCreate(ctrlBlk.sel3, XmSTRING_DEFAULT_CHARSET);            XmListSelectItem(ctrlBlk.sizeList, items[0], FALSE);            XmListSetBottomItem(ctrlBlk.sizeList, items[0]);        }        for (i = 0; i < itemCount3; i++)            XmStringFree(items[i]);    }}/*  returns TRUE if argument is not name of a proportional font */static int  notPropFont(const char *font){    char    buff1[TEMP_BUF_SIZE];    getStringComponent(font, 11, buff1);    if ((strcmp(buff1, "p") == 0) || (strcmp(buff1, "P") == 0))        return(FALSE);    else        return(TRUE);}/*  returns TRUE if the style portion of the font matches the currently    selected style */static int  styleMatch(xfselControlBlkType *ctrlBlk, const char *font){    char    buff[TEMP_BUF_SIZE];    if (ctrlBlk->sel2 == NULL)        return(TRUE);    getStylePart(font, buff);    if (strcmp(buff, ctrlBlk->sel2) == 0)        return(TRUE);    else        return(FALSE);}/*  returns TRUE if the size portion of the font matches the currently    selected size */static int  sizeMatch(xfselControlBlkType *ctrlBlk, const char *font){    char    buff[TEMP_BUF_SIZE];    if (ctrlBlk->sel3 == NULL)        return(TRUE);    getSizePart(font, buff, ctrlBlk->showSizeInPixels);    if (strcmp(buff, ctrlBlk->sel3) == 0)        return(TRUE);    else        return(FALSE);}/*  returns TRUE if the font portion of the font matches the currently    selected font */static int  fontMatch(xfselControlBlkType *ctrlBlk, const char *font){    char    buff[TEMP_BUF_SIZE];    if (ctrlBlk->sel1 == NULL)        return(TRUE);    getFontPart(font, buff);    if (strcmp(buff, ctrlBlk->sel1) == 0)        return(TRUE);    else        return(FALSE);}/*  inserts a string into correct sorted position in a list */static void addItemToList(char **buf, const char *item, int *count){    int i, j;    if (*count == MAX_ENTRIES_IN_LIST)    {        fprintf(stderr, "Trying to add more than MAX_ENTRIES_IN_LIST ");        fprintf(stderr, "(%d) entries to array\n", MAX_ENTRIES_IN_LIST);        return;    }       for (i = 0; i < *count; i++)    {        if (strcmp(buf[i], item) == 0)            return;        if (strcmp(buf[i], item) > 0)            break;    }    for (j = *count; j > i; j--)        buf[j] = buf[j-1];    buf[i] = XtMalloc(strlen(item) + 1);    strcpy(buf[i], item);    (*count)++;}/*  given a font name this function returns the part used in the first     scroll list */static void getFontPart(const char *font, char *buff1){    char    buff2[TEMP_BUF_SIZE], buff3[TEMP_BUF_SIZE];    char    buff4[TEMP_BUF_SIZE];    getStringComponent(font, 2, buff1);    getStringComponent(font, 1, buff2);    sprintf(buff3, "%s (%s", buff1, buff2);    getStringComponent(font, 13, buff1);    getStringComponent(font, 14, buff4);    if (((strncmp(buff1, "iso8859", 7) == 0) ||          (strncmp(buff1, "ISO8859", 7) == 0)) && (strcmp(buff4, "1") == 0))        sprintf(buff1, "%s)", buff3);    else    {        sprintf(buff2, "%s, %s,", buff3, buff1);        sprintf(buff1, "%s %s)", buff2, buff4);    }}/*  given a font name this function returns the part used in the second     scroll list */static void getStylePart(const char *font, char *buff1){    char    buff2[TEMP_BUF_SIZE], buff3[TEMP_BUF_SIZE];    getStringComponent(font, 3, buff3);    getStringComponent(font, 5, buff2);    if ((strcmp(buff2, "normal") != 0) && (strcmp(buff2, "Normal") != 0) &&        (strcmp(buff2, "NORMAL") != 0))        sprintf(buff1, "%s %s", buff3, buff2);    else        strcpy(buff1, buff3);    getStringComponent(font, 6, buff2);    if (buff2[0] != '\0')        sprintf(buff3, "%s %s", buff1, buff2);    else        strcpy(buff3, buff1);    getStringComponent(font, 4, buff2);    if ((strcmp(buff2, "o") == 0) || (strcmp(buff2, "O") == 0))        sprintf(buff1, "%s oblique", buff3);    else if ((strcmp(buff2, "i") == 0) || (strcmp(buff2, "I") == 0))        sprintf(buff1, "%s italic", buff3);    if (strcmp(buff1, " ") == 0)        strcpy(buff1, "-");}/*  given a font name this function returns the part used in the third     scroll list */static void getSizePart(const char *font, char *buff1, int inPixels){    int size;    if (inPixels)    {        getStringComponent(font, 7, buff1);        size = atoi(buff1);        sprintf(buff1, "%2d", size);    }    else    {        double temp;        getStringComponent(font, 8, buff1);        size = atoi(buff1);        temp = (double)size / 10.0;        if (buff1[strlen(buff1) - 1] == '0')        {            size = (int)floor(temp+0.5);            sprintf(buff1, "%2d", size);        }        else            sprintf(buff1, "%4.1f", temp);    }}/*  Call back functions start from here - suffix Action in the function name    is for the callback function for the corresponding widget */static void propFontToggleAction(Widget widget,                      xfselControlBlkType *ctrlBlk,                      XmToggleButtonCallbackStruct *call_data){    if (call_data->reason == XmCR_VALUE_CHANGED)    {        if (ctrlBlk->showPropFonts == PREF_FIXED)            ctrlBlk->showPropFonts = PREF_PROP;        else            ctrlBlk->showPropFonts = PREF_FIXED;        if (ctrlBlk->sel1 != NULL)            XtFree(ctrlBlk->sel1);        ctrlBlk->sel1 = NULL;        if (ctrlBlk->sel2 != NULL)            XtFree(ctrlBlk->sel2);        ctrlBlk->sel2 = NULL;        if (ctrlBlk->sel3 != NULL)            XtFree(ctrlBlk->sel3);        ctrlBlk->sel3 = NULL;        setupScrollLists(NONE, *ctrlBlk);        XmTextSetString(ctrlBlk->fontNameField, "");        enableSample(ctrlBlk, False, NULL);    }}static void sizeToggleAction(Widget widget,                 xfselControlBlkType *ctrlBlk,                  XmToggleButtonCallbackStruct *call_data){    int         i, makeSelection;    char        newSize[10];    XmString    str;    if (call_data->reason == XmCR_VALUE_CHANGED)    {        makeSelection = (ctrlBlk->sel3 != NULL);        for (i = 0; (makeSelection) && (i < ctrlBlk->numFonts); i++)            if ((fontMatch(ctrlBlk, ctrlBlk->fontData[i])) &&                (styleMatch(ctrlBlk, ctrlBlk->fontData[i])) &&                (sizeMatch(ctrlBlk, ctrlBlk->fontData[i])))            {                getSizePart(ctrlBlk->fontData[i], newSize,                             !ctrlBlk->showSizeInPixels);                break;            }                        if (ctrlBlk->showSizeInPixels)            ctrlBlk->showSizeInPixels = FALSE;        else            ctrlBlk->showSizeInPixels = TRUE;        if (ctrlBlk->sel3 != NULL)            XtFree(ctrlBlk->sel3);        ctrlBlk->sel3 = NULL;        setupScrollLists(NONE, *ctrlBlk);        if (makeSelection)        {            str = XmStringCreate(newSize, XmSTRING_DEFAULT_CHARSET);            XmListSelectItem(ctrlBlk->sizeList, str, TRUE);            XmListSetBottomItem(ctrlBlk->sizeList, str);            XmStringFree(str);        }    }}static void enableSample(xfselControlBlkType *ctrlBlk, Bool turn_on,         XmFontList *fontList){    int n=0;    Arg args[4];    XtSetArg(args[n], XmNeditable, turn_on); n++;    XtSetArg(args[n], XmNcursorPositionVisible, turn_on); n++;    if( turn_on ) {        if( !fontList ) {            fprintf(stderr, "nedit: Internal error in fontsel.c, line %i\n", \                    __LINE__);        } else {            XtSetArg(args[n], XmNfontList, *fontList); n++;        }        XtSetArg(args[n], XmNforeground, ctrlBlk->sampleFG); n++;    } else {        XtSetArg(args[n], XmNforeground, ctrlBlk->sampleBG); n++;    }    XtSetValues(ctrlBlk->dispField, args, n);    /* Make sure the sample area gets resized if the font size changes */    XtUnmanageChild(ctrlBlk->dispField);    XtManageChild(ctrlBlk->dispField);}

⌨️ 快捷键说明

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