home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / source.lha / src / RSysIconify.c < prev    next >
C/C++ Source or Header  |  1995-01-09  |  8KB  |  384 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *    RSysIconify.c
  6. *
  7. * Inhalt:
  8. *    int LookTypeOfFile(long lock, char *fname, int num, int totalnum);
  9. *    void Iconify(void);
  10. *
  11. * Bemerkungen:
  12. *    Enthält die Routinen für das Application Icon und das
  13. *    aufsetzende Actioning.
  14. *
  15. * Erstellungsdatum:
  16. *    20-Jan-93    Rolf Böhme
  17. *
  18. * Änderungen:
  19. *    20-Jan-93    Rolf Böhme    Erstellung
  20. *
  21. ***************************************************************************
  22. */
  23.  
  24. #include "RSysDebug.h"
  25. #include "RSysFunc.h"
  26.  
  27. extern struct Image AppIconI1, AppIconI2;
  28.  
  29. struct DiskObject *ProgramIcon;
  30. struct AppIcon *appicon = NULL;
  31.  
  32.    /*
  33.     * LookTypeOfFile() ermittelt den Typen einer Datei und
  34.     * startet entsprechend das Action-Window
  35.     */
  36. int
  37. LookTypeOfFile(BPTR lock, char *fname, int num, int totalnum)
  38. {
  39.    char  filename[MAXFULLNAME+1];
  40.    int   ft = 0;
  41.    BOOL  lastentry;
  42.  
  43.    DPOS;
  44.  
  45.    NameFromLock(lock, (UBYTE *) filename, MAXFULLNAME);
  46.  
  47.    AddPart((UBYTE *) filename, (UBYTE *) fname, MAXFULLNAME);
  48.  
  49.    if (strlen(fname) != 0)
  50.       ft = filetype(filename);
  51.  
  52.    lastentry = ((num == totalnum) ? TRUE : FALSE);
  53.  
  54.    return (StartAction(ft, filename, lastentry));
  55. }
  56.  
  57.  
  58.     /* GetProgramIcon():
  59.      *
  60.      *    Try to find the icon of the program.
  61.      */
  62.  
  63. static struct DiskObject *
  64. GetProgramIcon(void)
  65. {
  66.     struct DiskObject *Icon = NULL;
  67.  
  68.    DPOS;
  69.     if(Icon = GetDiskObjectNew((STRPTR)RSysName))
  70.     {
  71.         if(Icon -> do_Type != WBTOOL)
  72.         {
  73.             FreeDiskObject(Icon);
  74.  
  75.             Icon = NULL;
  76.         }
  77.     }
  78.  
  79.    DPOS;
  80.     if(!Icon)
  81.     {
  82.         BPTR NewLock;
  83.  
  84.             /* Move to the directory the
  85.              * program was run from.
  86.              */
  87.  
  88.         if(NewLock = Lock((STRPTR)"PROGDIR:",ACCESS_READ))
  89.         {
  90.             BPTR OldLock;
  91.  
  92.             OldLock = CurrentDir(NewLock);
  93.  
  94.                 /* Try to fetch the icon, use the
  95.                  * default name if necessary.
  96.                  */
  97.  
  98.             if(Icon = GetDiskObjectNew((STRPTR)RSysName))
  99.             {
  100.                 if(Icon -> do_Type != WBTOOL)
  101.                 {
  102.                     FreeDiskObject(Icon);
  103.  
  104.                     Icon = NULL;
  105.                 }
  106.             }
  107.  
  108.             if(!Icon)
  109.             {
  110.                 if(Icon = GetDiskObjectNew((STRPTR)"RSys"))
  111.                 {
  112.                     if(Icon -> do_Type != WBTOOL)
  113.                     {
  114.                         FreeDiskObject(Icon);
  115.  
  116.                         Icon = NULL;
  117.                     }
  118.                 }
  119.             }
  120.  
  121.             CurrentDir(OldLock);
  122.  
  123.             UnLock(NewLock);
  124.         }
  125.     }
  126.  
  127.     if(!Icon)
  128.     {
  129.             /* Use the default names. */
  130.  
  131.         if(Icon = GetDiskObjectNew((STRPTR)"RSys"))
  132.         {
  133.             if(Icon -> do_Type != WBTOOL)
  134.             {
  135.                 FreeDiskObject(Icon);
  136.  
  137.                 Icon = NULL;
  138.             }
  139.         }
  140.  
  141.         if(!Icon)
  142.         {
  143.             if(Icon = GetDiskObjectNew((STRPTR)"PROGDIR:RSys"))
  144.             {
  145.                 if(Icon -> do_Type != WBTOOL)
  146.                 {
  147.                     FreeDiskObject(Icon);
  148.  
  149.                     Icon = NULL;
  150.                 }
  151.             }
  152.         }
  153.     }
  154.  
  155.     return(Icon);
  156. }
  157.  
  158.    /*
  159.     * Iconify() schließt das Hauptfenster von RSys und
  160.     * erzeugt auf der Workbench ein Application-Icon. Werden
  161.     * WorkBench-Objekte auf dieses Icon gelegt, werden
  162.     * entsprechende Aktionen gestartet. Die Nachrichten vom
  163.     * Broker werden ebenfalls behandelt
  164.     */
  165. static int
  166. IconifyWithIcon(void)
  167. {
  168.    struct MsgPort *msgport;
  169.    struct AppMessage *appmsg;
  170.    SysMsg *arrived_mess;
  171.    ULONG mask;
  172.    BOOL  broker_sig = FALSE,
  173.          show_dropped = TRUE,
  174.          refresh = FALSE;
  175.    int   ID = LastID,
  176.          i;
  177.    struct WBArg *argptr;
  178.    extern struct Screen *lastpubscreen;
  179.     extern int ReopenWindow;
  180.  
  181.    DPOS;
  182.  
  183.    Flags.quit_iconify = 0;
  184.  
  185.    if (msgport = CreateMsgPort())
  186.    {
  187.       DisableSysRequest(TRUE);
  188.  
  189.       ProgramIcon = GetProgramIcon();
  190.  
  191.       if (appicon = AddAppIcon(1L, NULL, (UBYTE *) "", msgport, NULL, ProgramIcon, NULL))
  192.       {
  193.          do
  194.          {
  195.             mask = Wait(SIGBREAKF_CTRL_C |
  196.                         (1 << msgport->mp_SigBit) |
  197.                         (1 << SysIdPort->mp_SigBit) |
  198.                         (1 << broker_mp->mp_SigBit));
  199.  
  200.             if (mask & SIGBREAKF_CTRL_C)
  201.                Flags.quit_iconify = 1;
  202.  
  203.             if (mask & (1 << broker_mp->mp_SigBit))
  204.             {
  205.                HandleBrokerPort();
  206.  
  207.                if (SysWnd)
  208.                {
  209.                   Flags.quit_iconify = 1;
  210.                   ReopenWindow = TRUE;
  211.                }
  212.             }
  213.  
  214.             if (mask & (1 << msgport->mp_SigBit))
  215.                while (appmsg = (struct AppMessage *) GetMsg(msgport))
  216.                {
  217.                   if (appmsg->am_NumArgs == NULL)
  218.                   {
  219.                      strcpy((char *)namebuffer, "Workbench");
  220.  
  221.                      Flags.quit_iconify = 1;
  222.                      refresh = TRUE;
  223.                   }
  224.                   else
  225.                   {
  226.                      argptr = appmsg->am_ArgList;
  227.  
  228.                      for (i = 0; show_dropped && (i < appmsg->am_NumArgs); i++)
  229.                      {
  230.                         show_dropped = LookTypeOfFile(argptr->wa_Lock,
  231.                                                       (char *)argptr->wa_Name,
  232.                                                       i + 1, appmsg->am_NumArgs);
  233.                         argptr++;
  234.                      }
  235.  
  236.                      show_dropped = TRUE;
  237.                   }
  238.  
  239.                   ReplyMsg((struct Message *) appmsg);
  240.                }
  241.  
  242.             if (mask & (1 << SysIdPort->mp_SigBit))
  243.             {
  244.                while (arrived_mess = (SysMsg *)GetMsg(SysIdPort))
  245.                {
  246.                   ID = arrived_mess->sm_newtype;
  247.                   ReplyMsg((struct Message *) arrived_mess);
  248.  
  249.                   refresh = TRUE;
  250.                }
  251.  
  252.                Flags.quit_iconify = 1;
  253.             }
  254.          }
  255.          while (NOT(Flags.quit_iconify));
  256.  
  257.          RemoveAppIcon(appicon);
  258.          appicon = NULL;
  259.  
  260.          FreeDiskObject(ProgramIcon);
  261.          ProgramIcon = NULL;
  262.  
  263.          if (mask & SIGBREAKF_CTRL_C)
  264.          {
  265.             DisableSysRequest(FALSE);
  266.             DeleteMsgPort(msgport);
  267.             CloseAll();
  268.          }
  269.       }
  270.       else
  271.       {
  272.          DisableSysRequest(FALSE);
  273.          ErrorHandle(ICON_ERR, CREATE_FAIL, KILL);
  274.       }
  275.  
  276.       DisableSysRequest(FALSE);
  277.       DeleteMsgPort(msgport);
  278.    }
  279.    else
  280.       ErrorHandle(PORT_ERR, CREATE_FAIL, KILL);
  281.  
  282.    return(ID);
  283. }
  284.  
  285.    /*
  286.     * IconifyWithoutIcon() schließt das Hauptfenster von RSys
  287.     * Die Nachrichten vom Broker werden behandelt
  288.     */
  289. static int
  290. IconifyWithoutIcon(void)
  291. {
  292.    SysMsg *arrived_mess;
  293.    ULONG mask;
  294.    BOOL  broker_sig = FALSE,
  295.          refresh = FALSE;
  296.    int   ID = LastID;
  297.    extern struct Screen *lastpubscreen;
  298.    extern int ReopenWindow;
  299.  
  300.    DPOS;
  301.  
  302.    Flags.quit_iconify = 0;
  303.  
  304.    do
  305.    {
  306.       mask = Wait(SIGBREAKF_CTRL_C |
  307.                   (1 << SysIdPort->mp_SigBit) |
  308.                   (1 << broker_mp->mp_SigBit));
  309.  
  310.       if (mask & SIGBREAKF_CTRL_C)
  311.          Flags.quit_iconify = 1;
  312.  
  313.       if (mask & (1 << broker_mp->mp_SigBit))
  314.       {
  315.          HandleBrokerPort();
  316.  
  317.          if (SysWnd)
  318.             Flags.quit_iconify = 1;
  319.       }
  320.  
  321.       if (mask & (1 << SysIdPort->mp_SigBit))
  322.       {
  323.          while (arrived_mess = (SysMsg *)GetMsg(SysIdPort))
  324.          {
  325.             ID = arrived_mess->sm_newtype;
  326.             ReplyMsg((struct Message *) arrived_mess);
  327.  
  328.             refresh = TRUE;
  329.          }
  330.  
  331.          Flags.quit_iconify = 1;
  332.       }
  333.    }
  334.    while (NOT(Flags.quit_iconify));
  335.  
  336.    if (mask & SIGBREAKF_CTRL_C)
  337.       CloseAll();
  338.  
  339.    return(ID);
  340. }
  341.  
  342.    /*
  343.     * Iconify() ist die Frontend-Routine für IconifyWithIcon()
  344.     * und IconifyWithoutIcon(), je nachdem, ob der Benutzer ein Icon wünscht
  345.     * oder nicht
  346.     */
  347. void
  348. Iconify(void)
  349. {
  350.    int ID;
  351.  
  352.    DPOS;
  353.  
  354.    if (SysWnd)
  355.    {
  356.       lastpubscreen = SysWnd->WScreen;
  357.  
  358.       CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
  359.       CloseDownScreen();
  360.    }
  361.  
  362.    if(Flags.appicon)
  363.       ID = IconifyWithIcon();
  364.    else
  365.       ID = IconifyWithoutIcon();
  366.  
  367.    if (NOT(SysWnd))
  368.    {
  369.       OpenMainWindow();
  370.  
  371.       MakeWindowRefresh(SysWnd);
  372.  
  373.       ClearIntuiMsgPort(SysWnd);
  374.  
  375.       if (ID != LastID)
  376.          LastID = ID;
  377.  
  378.       RefreshList(LastID);
  379.       ReopenWindow = TRUE;
  380.    }
  381.  
  382.    return;
  383. }
  384.