home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / fonts / a_q / fontpool / !Ex-C / c / !RunImage
Text File  |  1995-01-11  |  13KB  |  360 lines

  1. /******************************************************************************
  2.    C-Example of FontPool v0.12
  3.  
  4.    Author: Eirik Hansen
  5.  
  6.    All calls available in FontPool v0.12 are demonstrated. (Though to use an
  7.    anti-aliased font on the font-menu itself, you should look at the
  8.    BASIC-Example (PROCDoIChangeMenuFont).) Helpful comments are found whenever a
  9.    FontPool related operation is performed. To facilitate locating them, these
  10.    comments are highlighted by a preceding line like '----> Comment <----'.
  11.  
  12.    To prevent the function-calls from becoming a mile long, most parameters are
  13.    passed by means of a structure. This structure (FontPool_Struct) is
  14.    typedef'ed in the file 'FontPool.h'.
  15.  
  16.    Note that errors are not dealt with, so if the font-menu does not show when
  17.    you click MENU it is probably because the FontManager is not present.
  18.    Alternatively you have a hilarious Font$Path.
  19.  
  20.    Feel free to use this file as a framework for more serious programs. Note
  21.    that libraries such as 'win', 'event' etc. are in this example avoided since
  22.    they tend to limit flexibility, and also add severely to the filesize of the
  23.    final executable. You might find some solutions stupid, but the important
  24.    thing is to demonstrate how to interface with FontPool.
  25. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  26.  
  27. /****************** #includes.. ***********************************************/
  28. #include "wimp.h"
  29. #include "template.h"
  30. #include "menu.h"
  31. #include "os.h"
  32.  
  33. #include <stdlib.h>
  34.  
  35. #include "FontPool.h"
  36.  
  37. /****************** #defines.. ************************************************/
  38. #ifndef FALSE
  39.    #define FALSE 0
  40.    #define TRUE 1
  41. #endif
  42.  
  43. /****************** Global variables.. ****************************************/
  44. BOOL           Quit=FALSE;
  45. wimp_t         *TaskH;
  46. wimp_w         WorkH;
  47. wimp_menustr   *MainM;
  48. wimp_eventstr  RBlock;
  49. char           CurrentFont[48],
  50.                *FontIcon,
  51.                *ConfIcon;
  52. /*-------------------------> The FontPool structure <-------------------------*/
  53. FontPool_Struct   FontPool;   
  54.  
  55. /****************** Setting up! ***********************************************/
  56. /*================> Yes! Setting up.. >=======================================*/
  57. BOOL  ExC_Setup(void)
  58. {
  59.    BOOL  ExC_ReadTemplates(void);
  60.    int   *MItem,
  61.          Version=200;
  62.  
  63.    wimp_taskinit("Ex-C", &Version, TaskH);
  64.  
  65.    ExC_ReadTemplates();
  66.  
  67.    MainM=menu_syshandle(menu_new("FontPool", ">Font, ~>Size, ~>Y-Size, ~>Foreground, ~>Background"));
  68.  
  69.    MItem=(int *) MainM;
  70.    MItem+=7;
  71. /*----------------------------> The next line <-------------------------------*/
  72. /* of code ensures that a Msg_SubmenuWarning is generated when the pointer    */
  73. /* moves over the menu-item. MItem[1]=0 sets the initial item's submenu       */
  74. /* pointer. This pointer is automatically updated by the FontPool_Functions   */
  75. /* since its address is 'remembered' in FontPool.ParentItem (some 25 lines    */
  76. /* below).                                                                    */
  77.    MItem[0]=wimp_MSUBLINKMSG;
  78.    MItem[1]=0;
  79.  
  80. /* The rest of the menu-items are just to illustrate a 'real' font-menu.      */
  81.    MItem+=6;
  82.    MItem[0]=0;             /* No flags */
  83.    MItem[1]=100;           /* Ensure the item gets an arrow '=>' */
  84.    MItem+=6;
  85.    MItem[0]=0;             /* No flags */
  86.    MItem[1]=100;
  87.    MItem+=6;
  88.    MItem[0]=0;             /* No flags */
  89.    MItem[1]=100;
  90.    MItem+=6;
  91.    MItem[0]=wimp_MLAST;    /* Last entry */
  92.    MItem[1]=100;           /* dbox ptr   */
  93.  
  94.    MItem=(int *) MainM;
  95. /*---------------> Setting parameters in the FontPool structure <-------------*/
  96.    FontPool.Config     = 0x800C050B;
  97.    FontPool.x          = 0;
  98.    FontPool.y          = 0;
  99.    FontPool.RootMenu   = MItem;
  100.    FontPool.FontName   = CurrentFont;
  101.    FontPool.ParentItem = MItem+8;
  102.    FontPool.MenuFont   = 0;         /* These parameters are not used in this  */
  103.    FontPool.SizeX      = 0;         /* C-Example. (They all have to do with   */
  104.    FontPool.SizeY      = 0;         /* using an anti-aliased font on the      */
  105.    FontPool.ItemHgt    = 0;         /* font-menu itself.)                     */
  106. /*-------------------------> Initialising FontPool <--------------------------*/
  107.    FontPool_Hello(&FontPool);  
  108.  
  109. /* Open the window... */
  110.    wimp_get_wind_state(WorkH, (wimp_wstate *) &RBlock.data.o);
  111.    wimp_open_wind(&RBlock.data.o);
  112.  
  113.    return TRUE;
  114. }
  115.  
  116. /*=================> Reading in the templates.. >=============================*/
  117. BOOL  ExC_ReadTemplates(void)
  118. {
  119.    template    *Template;
  120.    wimp_icon   Icon;
  121.  
  122.    template_readfile("<Ex-C$Dir>.Templates");
  123.  
  124.    Template=template_find("Work");
  125.    wimp_create_wind(&Template->window, &WorkH);
  126.  
  127.    wimp_get_icon_info(WorkH, 0, &Icon);      /* Extract the pointer to  */
  128.    FontIcon=Icon.data.indirecttext.buffer;   /* the 'Current font' icon */
  129.  
  130.    wimp_get_icon_info(WorkH, 8, &Icon);      /* Extract the pointer to   */
  131.    ConfIcon=Icon.data.indirecttext.buffer;   /* the configuration number */
  132.  
  133.    return TRUE;
  134. }
  135.  
  136. /****************** Poll event handling... ************************************/
  137. /*================> Redraw windows.. >========================================*/
  138. /* This function is never called in this example since the wimp automatically */
  139. /* redraws the window.                                                        */
  140. BOOL  ExC_RedrawWindow(wimp_eventdata *Data)
  141. {
  142.    wimp_redrawstr Window;
  143.    BOOL           More;
  144.  
  145.    Window.w=Data->o.w;
  146.    wimp_redraw_wind(&Window, &More);
  147.    while (More)
  148.    {
  149.       wimp_get_rectangle(&Window, &More);
  150.    }
  151.    return TRUE;
  152. }
  153.  
  154. /*================> Open windows.. >==========================================*/
  155. BOOL  ExC_OpenWindow(wimp_eventdata *Data)
  156. {
  157.    wimp_open_wind(&Data->o);
  158.  
  159.    return TRUE;
  160. }
  161.  
  162. /*================> Closing windows... >======================================*/
  163. /* Actually, in this case we just leave completely.                           */
  164. BOOL  ExC_CloseWindow(wimp_eventdata *Data)
  165. {
  166.    Quit=TRUE;
  167.    return TRUE;
  168. }
  169.  
  170. /*================> Button events.... >=======================================*/
  171. BOOL  ExC_ButtonEvent(wimp_eventdata *Data)
  172. {
  173.    int         x,y;
  174.    wimp_bbits  ClickButton;
  175.  
  176.    ClickButton=Data->but.m.bbits;
  177.    x=Data->but.m.x;
  178.    y=Data->but.m.y;
  179.  
  180.    switch (ClickButton)
  181.    {
  182. /*-----------------------> Show the font-menu directly <----------------------*/
  183. /* FontPool.RootMenu=0 indicates to the function FontPool_MenuSelection that  */
  184. /* the font-menu was in fact the 'root-menu'. FontPool_CreateMenu displays    */
  185. /* the font-menu directly - ie. without having to go via the root-menu.       */
  186.       case wimp_BMID:         
  187.          FontPool.x=x-100;
  188.          FontPool.y=y+76;     
  189.          FontPool.RootMenu=0; 
  190.          FontPool_CreateMenu(&FontPool);
  191.          break;
  192.    
  193. /*----------------------> Show the font-menu indirectly <---------------------*/
  194. /* It is not displayed until you move the mouse over the 'Fonts' item. The    */
  195. /* wimp then generates a Msg_SubmenuWarning and the font-menu is displayed in */
  196. /* the function ExC_CreateASubMenu. FontPool.RootMenu=(int *) MainM (below)   */
  197. /* indicates to the function FontPool_MenuSelection that the font-menu was    */
  198. /* last displayed indirectly.                                                 */
  199.       case wimp_BRIGHT:
  200.          FontPool.RootMenu=(int *) MainM;
  201.          wimp_create_menu(MainM, x-100, y+76);
  202.          break;
  203.  
  204. /*-----------------------> Changing the configuration <-----------------------*/
  205. /* The TRUE (below) informs FontPool to rebuild the menu immediately - ie.    */
  206. /* not waiting for the font-menu to be displayed.. (By the way, the strtoul() */
  207. /* call below generates a compiler warning...)                                */
  208.       case wimp_BLEFT:
  209.          if (Data->but.m.i==7)
  210.          {
  211.             FontPool.Config=strtoul(ConfIcon, 0, 16);
  212.             FontPool_Configure(&FontPool, TRUE);
  213.          }
  214.          break;
  215.    }
  216.  
  217.    return TRUE;
  218. }
  219.  
  220. /*================> Copy the chr<32 terminated string.. >=====================*/
  221. void ExC_CopyString(char *Get, char *Put)
  222. {
  223.    while (*Get>31)
  224.    {
  225.       *Put++=*Get++;
  226.    }
  227.    *Put=0;
  228.  
  229.    return;
  230. }
  231.  
  232. /*================> Menu selection.... >======================================*/
  233. BOOL  ExC_DecodeMenu(wimp_eventdata *Data)
  234. {
  235.    wimp_menustr   *Menu;
  236.    wimp_mousestr  *Mouse;
  237.    int            *Selection;
  238.  
  239.    Mouse=&Data->but.m;
  240.    Selection=(int *) Data;
  241.  
  242.    Menu=MainM;
  243. /*----------------------------------> If <------------------------------------*/
  244. /* the menu-selection results in a font being selected, its name is in this   */
  245. /* example simply copied to the 'current font icon'. (In a serious program,   */
  246. /* this would be a neat place to do some font-operations - such as re-        */
  247. /* selecting the applications current font.) FontPool_MenuSelection returns   */
  248. /* with either NULL or a pointer to the name of the selected font. Since      */
  249. /* this pointer is in this example supplied in the call (by setting           */
  250. /* FontPool.FontName = CurrentFont) this returned pointer will always equal   */
  251. /* CurrentFont or NULL.                                                       */
  252.    if (FontPool_MenuSelection((int *) Data, &FontPool))
  253.    {
  254.       ExC_CopyString(CurrentFont, FontIcon);
  255.    }
  256. /*---------------------------------> Else <-----------------------------------*/
  257. /* when no font-name pointer is returned, the no-font-string (below) is       */
  258. /* copied to the same icon and the 'current font' is set to a 0-string.       */
  259.    else
  260.    {
  261.       ExC_CopyString("No font selected (System font)\0", FontIcon);
  262.       CurrentFont[0]=0;
  263.    }
  264.    wimp_set_icon_state(WorkH, 0, 0, 0);   /* Redraw the current font icon */
  265.  
  266. /*----------------> If ADJUST was clicked re-create the menu <----------------*/
  267.    wimp_get_point_info(Mouse);
  268.    if (Mouse->bbits==wimp_BRIGHT)  FontPool_CreateMenu(&FontPool);
  269.  
  270.    return TRUE;
  271. }
  272.  
  273. /*================> A Msg_SubMenuWarning... >=================================*/
  274. BOOL  ExC_CreateASubMenu(int *Data)
  275. {
  276. /*-----------------> Note the '*' in the comparision below <------------------*/
  277.    if (Data[0]==*FontPool.ParentItem)
  278.    {
  279.       FontPool.x=Data[1];
  280.       FontPool.y=Data[2];
  281.       FontPool_CreateSubMenu(&FontPool);
  282.    }
  283.  
  284.    return TRUE;
  285. }
  286.  
  287. /*================> Receiving messages.... >==================================*/
  288. BOOL  ExC_Messages(wimp_eventdata *Data)
  289. {
  290.    switch (Data->msg.hdr.action)
  291.    {
  292.       case wimp_MCLOSEDOWN:
  293.          Quit=TRUE;
  294.          break;
  295.       case wimp_MMENUWARN:
  296.          ExC_CreateASubMenu((int *) &Data->msg.data.words);
  297.          break;
  298.    }
  299.    return TRUE;
  300. }
  301.  
  302. /****************** Polling.. *************************************************/
  303. /*================> The main poll loop... >===================================*/
  304. BOOL  ExC_Poll(void)
  305. {
  306.    wimp_eventstr  *Result;
  307.    wimp_emask     Mask;
  308.    BOOL           (*FPtr)(),
  309.                   (*FuncPtr[20])() = {
  310.                      0,                   /* wimp_ENULL        */
  311.                      ExC_RedrawWindow,    /* wimp_EREDRAW      */
  312.                      ExC_OpenWindow,      /* wimp_EOPEN        */
  313.                      ExC_CloseWindow,     /* wimp_ECLOSE       */
  314.                      0,                   /* wimp_EPTRLEAVE    */
  315.                      0,                   /* wimp_EPTRENTER    */
  316.                      ExC_ButtonEvent,     /* wimp_EBUT         */
  317.                      0,                   /* wimp_EUSERDRAG    */
  318.                      0,                   /* wimp_EKEY         */
  319.                      ExC_DecodeMenu,      /* wimp_EMENU        */
  320.                      0,                   /* wimp_ESCROLL      */
  321.                      0,                   /* wimp_ELOSECARET   */
  322.                      0,                   /* wimp_EGAINCARET   */
  323.                      0,                   /* 13                */
  324.                      0,                   /* 14                */
  325.                      0,                   /* 15                */
  326.                      0,                   /* 16                */
  327.                      ExC_Messages,        /* wimp_ESEND        */
  328.                      ExC_Messages,        /* wimp_ESENDWANTACK */
  329.                      0                    /* wimp_EACK         */
  330.                   };
  331.  
  332.    /* Setting up poll mask */
  333.    Mask=wimp_EMNULL | wimp_EMPTRLEAVE | wimp_EMPTRENTER | wimp_EMSCROLL | wimp_EMLOSECARET | wimp_EMGAINCARET;
  334.  
  335.    Result=&RBlock;
  336.    do
  337.    {
  338.       wimp_poll(Mask, Result);
  339.       FPtr=FuncPtr[Result->e];
  340.       if (FPtr) FPtr(&Result->data);
  341.    } while (!Quit);
  342.  
  343.    return TRUE;
  344. }
  345.  
  346. /****************** Main entry... *********************************************/
  347. int   main(void)
  348. {
  349.    BOOL  Return;
  350.  
  351.    Return=ExC_Setup();
  352.    if (Return) Return=ExC_Poll();
  353.  
  354. /*-----------------------------> We're history <------------------------------*/
  355.    FontPool_Goodbye();
  356.  
  357.    wimp_closedown();
  358.    return Return;
  359. }
  360.