home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / rsyssrc.lha / RSysIconify.c < prev    next >
C/C++ Source or Header  |  1993-09-19  |  6KB  |  303 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *      RSysIconify.c
  6. *
  7. * Inhalt:
  8. *
  9. *      --- Globale Routinen ---
  10. *
  11. *    int LookTypeOfFile ( BPTR lock , char *fname , int num , int totalnum );
  12. *    void Iconify ( void );
  13. *
  14. *      --- Lokale  Routinen ---
  15. *
  16. *    static int IconifyWithIcon ( void );
  17. *    static int IconifyWithoutIcon ( void );
  18. *    static void ClearSetIconPos ( long x , long y , int kill );
  19. *
  20. * Bemerkungen:
  21. *      Enthält die Routinen für das Application Icon und das
  22. *      aufsetzende Actioning.
  23. *
  24. * Erstellungsdatum:
  25. *      20-Jan-93     Rolf Böhme
  26. *
  27. * Änderungen:
  28. *      20-Jan-93     Rolf Böhme      Erstellung
  29. *
  30. ***************************************************************************
  31. */
  32.  
  33. #include "RSys.h"
  34.  
  35. struct DiskObject *ProgramIcon;
  36. struct AppIcon *appicon = NULL;
  37.  
  38.     /*
  39.      * LookTypeOfFile() ermittelt den Typen einer Datei und
  40.      * startet entsprechend das Action-Window
  41.      */
  42. int
  43. LookTypeOfFile(BPTR lock, char *fname, int num, int totalnum)
  44. {
  45.     char    filename[MAXFULLNAME+1];
  46.     int    ft = 0;
  47.     BOOL    lastentry;
  48.  
  49.     DPOS;
  50.  
  51.     NameFromLock(lock, (UBYTE *) filename, MAXFULLNAME);
  52.  
  53.     AddPart((UBYTE *) filename, (UBYTE *) fname, MAXFULLNAME);
  54.  
  55.     if (strlen(fname) != 0) ft = filetype(filename);
  56.  
  57.     lastentry = ((num == totalnum) ? TRUE : FALSE);
  58.  
  59.     return StartAction(ft, filename, lastentry);
  60. }
  61.  
  62. static void
  63. ClearSetIconPos(long x, long y, int kill)
  64. {
  65.    ProgramIcon->do_CurrentX = x;
  66.    ProgramIcon->do_CurrentY = y;
  67.  
  68.    if(kill == KILL)
  69.    {
  70.       FreeDiskObject(ProgramIcon);
  71.       ProgramIcon = NULL;
  72.    }
  73.  
  74.    return;
  75. }
  76.  
  77.     /*
  78.      * Iconify() schließt das Hauptfenster von RSys und
  79.      * erzeugt auf der Workbench ein Application-Icon. Werden
  80.      * WorkBench-Objekte auf dieses Icon gelegt, werden
  81.      * entsprechende Aktionen gestartet. Die Nachrichten vom
  82.      * Broker werden ebenfalls behandelt
  83.      */
  84. static int
  85. IconifyWithIcon(void)
  86. {
  87.     struct MsgPort *msgport;
  88.     struct AppMessage *appmsg;
  89.     SysMsg *arrived_mess;
  90.     ULONG mask;
  91.     BOOL    broker_sig = FALSE,
  92.             show_dropped = TRUE,
  93.             refresh = FALSE;
  94.     int    ID = LastID,
  95.             i;
  96.     struct WBArg *argptr;
  97.     extern struct Screen *lastpubscreen;
  98.     extern int ReopenWindow;
  99.    long posx, posy;
  100.  
  101.     DPOS;
  102.  
  103.     if (msgport = CreateMsgPort())
  104.     {
  105.         DisableSysRequest(TRUE);
  106.  
  107.         ProgramIcon = GetProgramIcon();
  108.  
  109.       posx = ProgramIcon->do_CurrentX;
  110.       posy = ProgramIcon->do_CurrentY;
  111.  
  112.       ProgramIcon->do_Type     = NULL;
  113.  
  114.       ClearSetIconPos(iconx, icony, NO_KILL);
  115.  
  116.         if (appicon = AddAppIcon(1L, NULL, (UBYTE *) "", msgport, NULL, ProgramIcon, TAG_DONE))
  117.         {
  118.             do
  119.             {
  120.                 mask = Wait(SIGBREAKF_CTRL_C | (1 << msgport->mp_SigBit) |
  121.                         (1 << SysIdPort->mp_SigBit) | (1 << broker_mp->mp_SigBit));
  122.  
  123.                 if (mask & SIGBREAKF_CTRL_C) Flags.quit_iconify = 1;
  124.  
  125.                 if (mask & (1 << broker_mp->mp_SigBit))
  126.                 {
  127.                     HandleBrokerPort();
  128.  
  129.                     if (SysWnd)
  130.                     {
  131.                         Flags.quit_iconify = 1;
  132.                         ReopenWindow = TRUE;
  133.                     }
  134.                 }
  135.  
  136.                 if (mask & (1 << msgport->mp_SigBit))
  137.                     while (appmsg = (struct AppMessage *) GetMsg(msgport))
  138.                     {
  139.                         if (appmsg->am_NumArgs == NULL)
  140.                         {
  141.                             strcpy((char *)namebuffer, "Workbench");
  142.  
  143.                             Flags.quit_iconify = 1;
  144.                             refresh = TRUE;
  145.                         }
  146.                         else
  147.                         {
  148.                             argptr = appmsg->am_ArgList;
  149.  
  150.                             for (i = 0; show_dropped && (i < appmsg->am_NumArgs); i++)
  151.                             {
  152.                                 show_dropped = LookTypeOfFile(argptr->wa_Lock,
  153.                                                                         (char *)argptr->wa_Name,
  154.                                                                         i + 1, appmsg->am_NumArgs);
  155.                                 argptr++;
  156.                             }
  157.  
  158.                             show_dropped = TRUE;
  159.                         }
  160.  
  161.                         ReplyMsg((struct Message *) appmsg);
  162.                     }
  163.  
  164.                 if (mask & (1 << SysIdPort->mp_SigBit))
  165.                 {
  166.                     while (arrived_mess = (SysMsg *)GetMsg(SysIdPort))
  167.                     {
  168.                         ID = arrived_mess->sm_newtype;
  169.                         ReplyMsg((struct Message *) arrived_mess);
  170.  
  171.                         refresh = TRUE;
  172.                     }
  173.  
  174.                     Flags.quit_iconify = 1;
  175.                 }
  176.             } while (NOT(Flags.quit_iconify));
  177.  
  178.             RemoveAppIcon(appicon);
  179.             appicon = NULL;
  180.  
  181.             if (mask & SIGBREAKF_CTRL_C)
  182.             {
  183.             ClearSetIconPos(posx, posy, KILL);
  184.  
  185.                 DisableSysRequest(FALSE);
  186.                 DeleteMsgPort(msgport);
  187.                 CloseAll();
  188.             }
  189.         }
  190.         else
  191.         {
  192.          ClearSetIconPos(posx, posy, KILL);
  193.  
  194.             DisableSysRequest(FALSE);
  195.             ErrorHandle("AddAppIcon()", ICON_ERR, CREATE_FAIL, KILL);
  196.         }
  197.  
  198.       ClearSetIconPos(posx, posy, KILL);
  199.  
  200.         DisableSysRequest(FALSE);
  201.         DeleteMsgPort(msgport);
  202.     }
  203.     else ErrorHandle("CreateMsgPort()", PORT_ERR, CREATE_FAIL, KILL);
  204.  
  205.     return(ID);
  206. }
  207.  
  208.     /*
  209.      * IconifyWithoutIcon() schließt das Hauptfenster von RSys
  210.      * Die Nachrichten vom Broker werden behandelt
  211.      */
  212. static int
  213. IconifyWithoutIcon(void)
  214. {
  215.     SysMsg *arrived_mess;
  216.     ULONG mask;
  217.     BOOL    broker_sig = FALSE,
  218.             refresh = FALSE;
  219.     int    ID = LastID;
  220.     extern struct Screen *lastpubscreen;
  221.     extern int ReopenWindow;
  222.  
  223.     DPOS;
  224.  
  225.     do
  226.     {
  227.         mask = Wait(SIGBREAKF_CTRL_C |
  228.                         (1 << SysIdPort->mp_SigBit) |
  229.                         (1 << broker_mp->mp_SigBit));
  230.  
  231.         if (mask & SIGBREAKF_CTRL_C) Flags.quit_iconify = 1;
  232.  
  233.         if (mask & (1 << broker_mp->mp_SigBit))
  234.         {
  235.             HandleBrokerPort();
  236.  
  237.             if (SysWnd) Flags.quit_iconify = 1;
  238.         }
  239.  
  240.         if (mask & (1 << SysIdPort->mp_SigBit))
  241.         {
  242.             while (arrived_mess = (SysMsg *)GetMsg(SysIdPort))
  243.             {
  244.                 ID = arrived_mess->sm_newtype;
  245.                 ReplyMsg((struct Message *) arrived_mess);
  246.  
  247.                 refresh = TRUE;
  248.             }
  249.  
  250.             Flags.quit_iconify = 1;
  251.         }
  252.     } while (NOT(Flags.quit_iconify));
  253.  
  254.     if (mask & SIGBREAKF_CTRL_C) CloseAll();
  255.  
  256.     return ID;
  257. }
  258.  
  259.     /*
  260.      * Iconify() ist die Frontend-Routine für IconifyWithIcon()
  261.      * und IconifyWithoutIcon(), je nachdem, ob der Benutzer ein Icon wünscht
  262.      * oder nicht.
  263.      */
  264. void
  265. Iconify(void)
  266. {
  267.     int ID;
  268.  
  269.     DPOS;
  270.  
  271.    HandleHelp(MN_Iconify);
  272.  
  273.     if (SysWnd)
  274.     {
  275.         lastpubscreen = SysWnd->WScreen;
  276.  
  277.         CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
  278.         CloseDownScreen();
  279.     }
  280.  
  281.     Flags.quit_iconify = 0;
  282.  
  283.     if(Flags.appicon) ID = IconifyWithIcon();
  284.     else
  285.       ID = IconifyWithoutIcon();
  286.  
  287.     if (NOT(SysWnd))
  288.     {
  289.         OpenMainWindow();
  290.  
  291.         MakeWindowRefresh(SysWnd);
  292.         ClearIntuiMsgPort(SysWnd);
  293.  
  294.         if (ID != LastID) LastID = ID;
  295.  
  296.         RefreshList(LastID);
  297.     }
  298.  
  299.    ReopenWindow = TRUE;
  300.  
  301.     return;
  302. }
  303.