home *** CD-ROM | disk | FTP | other *** search
- /*
- ***************************************************************************
- *
- * Datei:
- * RSysModify.c
- *
- * Inhalt:
- * void CountAssocObjects(struct Task *task, int *wins, int *scrs, int *ports);
- * int CheckWindow(struct Window *findwin);
- * void ModifyObject(int TypeID, unsigned long code);
- *
- * Bemerkungen:
- * Enthält die Routinen zum Modifizieren von Objekten.
- *
- * Erstellungsdatum:
- * 07-Jan-93 Rolf Böhme
- *
- * Änderungen:
- * 07-Jan-93 Rolf Böhme Erstellung
- *
- ***************************************************************************
- */
-
- #include "RSysDebug.h"
- #include "RSysFunc.h"
-
- enum
- {
- GD_TaskGad,
- GD_PrioGad,
- GD_OkGad,
- GD_CancelGad,
- GD_PriIntGad
- };
-
- static void KillTask(struct objectid *);
-
- /*
- * CheckObject() prüft, ob ein ausgewähltes Listenelement (Objekt)
- * sich noch in der Liste befindet
- */
- static BOOL
- CheckObject(struct List *list, struct objectid *obj)
- {
- struct Node *node;
-
- Forbid();
-
- for (node = list->lh_Head; node->ln_Succ && (node != obj->address);
- node = node->ln_Succ) ;
-
- Permit();
-
- return ((node == obj->address) ? TRUE : FALSE);
- }
-
- /*
- * CheckTask() prüft, ob ein Task-Objekt sich noch in den Listen
- * befindet, also noch existiert
- */
- static BOOL
- CheckTask(struct objectid *obj)
- {
- if(CheckObject(&(SysBase->TaskWait),obj) ||
- CheckObject(&(SysBase->TaskReady),obj) ||
- ((struct Task *)obj->address == FindTask(NULL)))
- return(TRUE);
- else
- return(FALSE);
- }
-
- /*
- * CountAssocObjects() zählt die zu einem Task gehörenden
- * Windows, Screens und Ports
- */
- void
- CountAssocObjects(struct Task *task, int *wins, int *scrs, int *ports)
- {
- ULONG lock;
- struct Window *win;
- struct Screen *scr;
- struct MsgPort *port;
- struct Node *node;
-
- DPOS;
-
- Forbid();
-
- lock = LockIBase(NULL);
-
- for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
- for (win = scr->FirstWindow; win; win = win->NextWindow)
- {
- if (win->UserPort && win->UserPort->mp_SigTask &&
- (win->UserPort->mp_SigTask == task))
- {
- (*wins)++;
-
- if ((scr->Flags & CUSTOMSCREEN) && NOT(scr->Flags & PUBLICSCREEN))
- (*scrs)++;
- }
- }
-
- UnlockIBase(lock);
-
- for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
- {
- port = (struct MsgPort *) node;
-
- if (port->mp_SigTask && (port->mp_SigTask == task))
- (*ports)++;
- }
-
- Permit();
-
- return;
- }
-
- /*
- * CheckWindow() prüft, ob ein Fenster noch existiert, und zwar
- * auf allen Screens
- */
- int
- CheckWindow(struct Window *findwin)
- {
- ULONG lock;
- struct Window *win;
- struct Screen *scr;
- int ret = FALSE;
-
- DPOS;
-
- lock = LockIBase(NULL);
-
- for (scr = IntuitionBase->FirstScreen; scr && NOT(ret); scr = scr->NextScreen)
- for (win = scr->FirstWindow; win && NOT(ret); win = win->NextWindow)
- if (win == findwin)
- ret = TRUE;
-
- UnlockIBase(lock);
-
- return (ret);
- }
-
- /*
- * CheckScreen() prüft, ob ein Screen noch existiert
- */
- static int
- CheckScreen(struct Screen *findscr)
- {
- ULONG lock;
- struct Screen *scr;
- int ret = FALSE;
-
- lock = LockIBase(NULL);
-
- for (scr = IntuitionBase->FirstScreen; scr && NOT(ret); scr = scr->NextScreen)
- if (scr == findscr)
- ret = TRUE;
-
- UnlockIBase(lock);
-
- return (ret);
- }
-
- /*
- * TaskPort() sucht in der Liste der öffentlichen Ports
- * nach dem ersten Port, der den Task task als Signaltask
- * hat
- */
- static struct MsgPort *
- TaskPort(struct Task *task)
- {
- struct MsgPort *taskport = NULL,
- *port;
- struct Node *node;
-
- Forbid();
-
- for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
- {
- port = (struct MsgPort *) node;
-
- if (port->mp_SigTask && (port->mp_SigTask == task))
- {
- taskport = port;
- break;
- }
- }
-
- Permit();
-
- return (taskport);
- }
-
- /*
- * TaskWindow() sucht in der IntuitionBase nach dem ersten Fenster,
- * dessen UserPort zu dem Task task gehört
- */
- static struct Window *
- TaskWindow(struct Task *task)
- {
- ULONG lock;
- struct Window *win,
- *taskwindow = NULL;
- struct Screen *scr;
-
- lock = LockIBase(NULL);
-
- for (scr = IntuitionBase->FirstScreen; scr && NOT(taskwindow); scr = scr->NextScreen)
- for (win = scr->FirstWindow; win && NOT(taskwindow); win = win->NextWindow)
- if (win->UserPort && (win->UserPort->mp_SigTask) &&
- (win->UserPort->mp_SigTask == task))
- taskwindow = win;
-
- UnlockIBase(lock);
-
- return (taskwindow);
- }
-
- /*
- * ClosingWindows() schließt ein Fenster auf sicherste
- * Weise, wie ich hoffe...
- */
- static void
- ClosingWindows(struct Window *wind)
- {
- if (CheckWindow(wind))
- {
- if((wind->ReqCount != 0) && wind->FirstRequest)
- while(wind->ReqCount != 0)
- EndRequest(wind->FirstRequest,wind);
-
- if(wind->DMRequest)
- ClearDMRequest(wind);
-
- if(wind->Pointer)
- ClearPointer(wind);
-
- if(wind->MenuStrip)
- ClearMenuStrip(wind);
-
- CloseWindow(wind);
- }
- else
- ErrorHandle(WINDOW_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- /*
- * ClosingScreens() schließt einen Screen auf sicherste
- * Weise, wie ich hoffe...
- */
- static void
- ClosingScreens(struct Screen *scr)
- {
- struct Window *win = scr->FirstWindow,
- *markwin;
-
- if (CheckScreen(scr))
- {
- while (win)
- {
- markwin = win->NextWindow;
- ClosingWindows(win);
- win = markwin;
- }
-
- CloseScreen(scr);
-
- if (CheckScreen(scr))
- PrintInfo("Screen not killed!", SPEAK, SEC);
- }
- else
- ErrorHandle(SCREEN_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- /*
- * RemovePortSavely() entfernt eine Port auf sicherste Weise
- */
- static void
- RemovePortSafely(struct MsgPort *p, struct objectid *obj)
- {
- struct Node *MsgNode;
- struct MsgPort *port;
-
- port = (obj ? (struct MsgPort *) obj->address : p);
-
- Forbid();
-
- if (NOT(IsMsgPortEmpty(port)))
- {
- MsgNode = port->mp_MsgList.lh_Head;
-
- while (MsgNode = MsgNode->ln_Succ)
- Remove((struct Node *) MsgNode);
- }
-
- DeletePort(port);
-
- if (CheckObject(&SysBase->PortList, obj))
- RemPort(port);
-
- Permit();
-
- return;
- }
-
- static void
- RemoveFontSafely(struct TextFont *tf)
- {
- if (tf->tf_Flags & FPF_DISKFONT)
- {
- Forbid();
- CloseFont(tf);
- Remove((struct Node *) tf);
- Permit();
- }
- else if (Question(SysWnd,"You attempt to remove a ROM-Font!\n"
- "Remove this Font anyway?", YES))
- {
- Forbid();
- RemFont(tf);
- Remove((struct Node *) tf);
- Permit();
- }
-
- return;
- }
-
- /*
- * KillTask() entfernt einen Task aund alle mit ihm verbundenen
- * Windows, Screens und Ports. Alle anderen Resourcen können
- * nicht mehr eindeutig zugeordnet werden
- */
- static void
- KillTask(struct objectid *obj)
- {
- struct Task *task = (struct Task *) obj->address;
- struct Window *taskwin;
- struct MsgPort *port;
-
- if (Question(SysWnd, "Break signal failed!\n"
- "Do you really want to kill the task harder?", YES))
- if (CheckTask(obj))
- {
- Forbid();
-
- Disable();
- Remove((struct Node *)task);
- Enable();
-
- if (taskwin = TaskWindow(task))
- {
- struct Screen *taskscr = NULL;
- ULONG lock = LockIBase(NULL);
-
- if (taskwin->WScreen && (taskwin->WScreen->Flags & CUSTOMSCREEN))
- taskscr = taskwin->WScreen;
-
- while (taskwin)
- {
- ClosingWindows(taskwin);
- taskwin = TaskWindow(task);
- }
-
- if (taskscr)
- CloseScreen(taskscr);
-
- UnlockIBase(lock);
- }
-
- while(port = TaskPort(obj->address))
- RemovePortSafely(port, NULL);
-
- Disable();
- RemTask(task);
- Enable();
-
- Permit();
- }
- else
- ErrorHandle(TASK_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- /*
- * SignalTask() sendet eine Signal signal an den Task obj
- */
- static void
- SignalTask(struct objectid *obj, ULONG signal)
- {
- struct Task *task;
-
- if (task = FindTask((UBYTE *) obj->fullname))
- Signal(task, signal);
- else
- ErrorHandle(TASK_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- #define ChgPri_CNT 5
-
- static struct Window *ChgPriWnd = NULL;
- static struct Gadget *ChgPriGList = NULL;
- static struct Gadget *ChgPriGadgets[5];
- static UWORD ChgPriLeft = 195;
- static UWORD ChgPriTop = 71;
- static UWORD ChgPriWidth = 228;
- static UWORD ChgPriHeight = 55;
- static UBYTE *ChgPriWdt = (UBYTE *) NAME " " VERSION " - Change priority";
-
- static UWORD ChgPriGTypes[]=
- {
- TEXT_KIND,
- SLIDER_KIND,
- BUTTON_KIND,
- BUTTON_KIND,
- INTEGER_KIND
- };
-
- static struct NewGadget ChgPriNGad[]=
- {
- 52, 5, 169, 13, (UBYTE *) "Task", NULL, GD_TaskGad, PLACETEXT_LEFT, NULL, NULL,
- 52, 21, 129, 13, (UBYTE *) "Prio", NULL, GD_PrioGad, NG_HIGHLABEL, NULL, NULL,
- 8, 37, 69, 13, (UBYTE *) "Ok", NULL, GD_OkGad, PLACETEXT_IN, NULL, NULL,
- 156, 37, 65, 13, (UBYTE *) "Cancel", NULL, GD_CancelGad, PLACETEXT_IN, NULL, NULL,
- 88, 37, 57, 13, NULL, NULL, GD_PriIntGad, 0, NULL, NULL
- };
-
- static ULONG *ChgPriGTags[]=
- {
- (ULONG *) (GTTX_Text), (ULONG *) NULL,
- (ULONG *) (GTTX_Border), (ULONG *) TRUE,
- (ULONG *) (TAG_DONE),
-
- (ULONG *) (GTSL_Min), (ULONG *) (-128),
- (ULONG *) (GTSL_Max), (ULONG *) 128,
- (ULONG *) (GTSL_MaxLevelLen), (ULONG *) 4,
- (ULONG *) (GTSL_LevelFormat), (ULONG *) "%4ld",
- (ULONG *) (GTSL_LevelPlace), (ULONG *) (PLACETEXT_RIGHT),
- (ULONG *) (PGA_Freedom), (ULONG *) LORIENT_HORIZ,
- (ULONG *) (GA_Immediate), (ULONG *) TRUE,
- (ULONG *) (GA_RelVerify), (ULONG *) TRUE,
- (ULONG *) (TAG_DONE),
-
- (ULONG *) (TAG_DONE),
-
- (ULONG *) (TAG_DONE),
-
- (ULONG *) (GTIN_Number), (ULONG *) 0,
- (ULONG *) (GTIN_MaxChars), (ULONG *) 5,
- (ULONG *) (TAG_DONE)
- };
-
- /*
- * OpenChgPriWindow() öffnet ein kleines Fenster, in
- * dem man mit einem Slider die Priorität eines Tasks einstellen
- * kann
- */
- static int
- OpenChgPriWindow(void)
- {
- struct NewGadget ng;
- struct Gadget *g;
- UWORD lc,
- tc;
- UWORD wleft = ChgPriLeft,
- wtop = ChgPriTop,
- ww,
- wh;
- int gl[] = {GD_TaskGad, GD_PriIntGad, GD_PrioGad};
-
- ComputeFont(Scr, ChgPriWidth, ChgPriHeight);
-
- ww = ComputeX(ChgPriWidth);
- wh = ComputeY(ChgPriHeight);
-
- if ((wleft + ww + OffX + Scr->WBorRight) > Scr->Width)
- wleft = Scr->Width - ww;
- if ((wtop + wh + OffY + Scr->WBorBottom) > Scr->Height)
- wtop = Scr->Height - wh;
-
- ww = compute((UWORD) (OffX + Scr->WBorRight), FontX, (int)ChgPriWidth);
- wh = compute((UWORD) (OffY + Scr->WBorBottom), FontY, (int)ChgPriHeight);
-
- CenterWindow(Scr, &wtop, &wleft, ww, wh);
-
- if (!(g = CreateContext(&ChgPriGList)))
- return (1L);
-
- for (lc = 0, tc = 0; lc < ChgPri_CNT; lc++)
- {
- CopyMem((char *)&ChgPriNGad[lc], (char *)&ng, (long)sizeof(struct NewGadget));
-
- ng.ng_VisualInfo = VisualInfo;
- ng.ng_TextAttr = Font;
- ng.ng_LeftEdge = OffX + ComputeX(ng.ng_LeftEdge);
- ng.ng_TopEdge = OffY + ComputeY(ng.ng_TopEdge);
- ng.ng_Width = ComputeX(ng.ng_Width);
- ng.ng_Height = ComputeY(ng.ng_Height);
-
- ChgPriGadgets[lc] = g = CreateGadgetA((ULONG) ChgPriGTypes[lc], g, &ng, (struct TagItem *) & ChgPriGTags[tc]);
-
- makelabelvisible(ChgPriGadgets[lc]);
-
- while (ChgPriGTags[tc])
- tc += 2;
- tc++;
-
- if (NOT g)
- return (2L);
- }
-
- if (!(ChgPriWnd = OpenWindowTags(NULL,
- WA_Left, wleft,
- WA_Top, wtop,
- WA_Width, ww,
- WA_Height, wh,
- WA_IDCMP, TEXTIDCMP |
- SLIDERIDCMP |
- BUTTONIDCMP |
- INTEGERIDCMP |
- IDCMP_CLOSEWINDOW |
- IDCMP_REFRESHWINDOW,
- WA_Flags, WFLG_DRAGBAR |
- WFLG_DEPTHGADGET |
- WFLG_CLOSEGADGET |
- WFLG_SMART_REFRESH |
- WFLG_ACTIVATE |
- WFLG_RMBTRAP,
- WA_Gadgets, ChgPriGList,
- WA_Title, ChgPriWdt,
- WA_PubScreenFallBack,TRUE,
- WA_PubScreen, Scr,
- TAG_DONE)))
- return (4L);
-
- RefreshRastPort(ChgPriWnd,ChgPriGadgets,gl, 3);
-
- return (0L);
- }
-
- /*
- * ChangePri() öffnet ein Fenster und managed das
- * Priority-Handling für ein gewähltes Objekt obj
- */
- static void
- ChangePri(struct objectid *obj)
- {
- struct Task *task = (struct Task *) obj->address;
- int TaskPri = task->tc_Node.ln_Pri,
- OldPri = TaskPri;
- register struct IntuiMessage *message;
- ULONG class,
- code;
- APTR object;
- APTR req;
- extern struct Window *ChgPriWnd;
- extern struct Gadget *ChgPriGadgets[];
-
- Flags.quit_cp = 0;
-
- if (OpenASysWindow(OpenChgPriWindow,NO_KILL))
- {
- req = LockWindow(SysWnd);
-
- GT_SetGadgetAttrs(ChgPriGadgets[GD_TaskGad], ChgPriWnd, NULL,
- GTTX_Text, (UBYTE *) obj->fullname,
- TAG_DONE);
-
- GT_SetGadgetAttrs(ChgPriGadgets[GD_PrioGad], ChgPriWnd, NULL,
- GTSL_Level, (UBYTE *) TaskPri,
- TAG_DONE);
-
- GT_SetGadgetAttrs(ChgPriGadgets[GD_PriIntGad], ChgPriWnd, NULL,
- GTIN_Number, (UBYTE *) TaskPri,
- TAG_DONE);
-
- do
- {
- Wait(1L << ChgPriWnd->UserPort->mp_SigBit);
-
- while ((message = (struct IntuiMessage *)
- GT_GetIMsg(ChgPriWnd->UserPort)) != NULL)
- {
- object = message->IAddress;
- class = message->Class;
- code = message->Code;
-
- GT_ReplyIMsg(message);
-
- switch (class)
- {
- case IDCMP_GADGETUP:
- switch (((struct Gadget *) object)->GadgetID)
- {
- case GD_PrioGad:
- TaskPri = (int)((char)code);
- GT_SetGadgetAttrs(ChgPriGadgets[GD_PriIntGad], ChgPriWnd,
- NULL,
- GTIN_Number, (int)TaskPri,
- TAG_DONE);
-
- break;
-
- case GD_OkGad:
- Flags.quit_cp = 1;
- break;
-
- case GD_CancelGad:
- TaskPri = OldPri;
- Flags.quit_cp = 1;
- break;
-
- case GD_PriIntGad:
- TaskPri = (int)((struct StringInfo *)
- (((struct Gadget *)
- object)->SpecialInfo))->LongInt;
- if ((TaskPri < -128) || (TaskPri > 127))
- GT_SetGadgetAttrs(ChgPriGadgets[GD_PriIntGad],
- ChgPriWnd,
- NULL,
- GTIN_Number, OldPri,
- TAG_DONE);
- else
- GT_SetGadgetAttrs(ChgPriGadgets[GD_PrioGad], ChgPriWnd,
- NULL,
- GTSL_Level, TaskPri,
- TAG_DONE);
- break;
- }
-
- break;
-
- case IDCMP_CLOSEWINDOW:
- TaskPri = OldPri;
- Flags.quit_cp = 1;
- break;
- }
- }
- }
- while (NOT(Flags.quit_cp));
-
- CloseASysWindow(&ChgPriWnd, &ChgPriGList, NULL);
-
- UnlockWindow(req);
-
- if (CheckTask(obj) && (TaskPri != OldPri))
- SetTaskPri(task, TaskPri);
- }
-
- return;
- }
-
- /*
- * FlushLibrary() entfernt eine geschlossene Library aus
- * dem System
- */
- static void
- FlushLibrary(struct objectid *obj)
- {
- struct Library *result;
-
- if (Question(SysWnd, "Do you really want to remove the Library?", YES))
- {
- Forbid();
-
- if ((result = (struct Library *)FindName(&SysBase->LibList, (UBYTE *) obj->fullname)) &&
- (result->lib_OpenCnt == 0))
- RemLibrary(result);
-
- Permit();
-
- if (!result)
- ErrorHandle(LIBRARY_ERR, FIND_FAIL, NO_KILL);
- }
-
- return;
- }
-
- static void
- ModifyTask(int TypeID, struct objectid *obj)
- {
- WORD sel;
- ULONG signals[5] =
- {
- SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_D, SIGBREAKF_CTRL_E, SIGBREAKF_CTRL_F,
- (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F)
- };
-
- if (CheckTask(obj))
- {
- sel = DisplayTaskInfo(obj);
-
- switch (sel)
- {
- case 0:
- if (obj->address != FindTask(NULL))
- {
- SignalTask(obj, signals[4]);
-
- Delay(SEC);
-
- if (CheckTask(obj))
- KillTask(obj);
- else
- PrintInfo("Break signal killed the task!", SPEAK, 2*SEC);
-
- RefreshList(TypeID);
- }
- else
- ErrorHandle(TASK_ERR, KILL_FAIL, NO_KILL);
-
- break;
-
- case 1:
- break;
-
- case 2:
- case 3:
- case 4:
- case 5:
- SignalTask(obj, signals[sel - 2]);
- RefreshList(TypeID);
- break;
-
- case 6:
- if (CheckTask(obj))
- {
- ChangePri(obj);
- RefreshList(TypeID);
- }
- else
- ErrorHandle(TASK_ERR, FIND_FAIL, NO_KILL);
-
- break;
-
- case 7:
- RefreshList(TypeID);
- break;
- }
- }
- else
- ErrorHandle(TASK_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- static void
- ModifyLibrary(int TypeID, struct objectid *obj)
- {
- if (CheckObject(&SysBase->LibList, obj))
- {
- if(!DisplayLibraryInfo(obj))
- FlushLibrary(obj);
- }
- else
- ErrorHandle(LIBRARY_ERR, FIND_FAIL, NO_KILL);
-
- RefreshList(TypeID);
-
- return;
- }
-
- static void
- DisplaySoftDevice(int TypeID, struct objectid *obj)
- {
- if (CheckObject(&SysBase->DeviceList, obj))
- DisplaySoftDevInfo(obj);
- else
- {
- ErrorHandle(DEVICE_ERR, FIND_FAIL, NO_KILL);
- RefreshList(TypeID);
- }
-
- return;
- }
-
- static void
- DisplayResource(int TypeID, struct objectid *obj)
- {
- if (CheckObject(&SysBase->ResourceList, obj))
- DisplayResourceInfo(obj);
- else
- {
- ErrorHandle(DEVICE_ERR, FIND_FAIL, NO_KILL);
- RefreshList(TypeID);
- }
-
- return;
- }
-
- static void
- ModifyPort(int TypeID, struct objectid *obj)
- {
- WORD sel;
-
- if (CheckObject(&SysBase->PortList, obj))
- {
- sel = DisplayPortInfo(obj);
-
- if (!sel && ((obj->address == SysIdPort) || (obj->address == broker_mp)))
- {
- ErrorHandle(PORT_ERR, KILL_FAIL, NO_KILL);
- return;
- }
-
- if (!sel && Question(SysWnd, "Do you want to remove the Port?", YES))
- {
- if (CheckObject(&SysBase->PortList, obj))
- RemovePortSafely(NULL, obj);
- else
- ErrorHandle(PORT_ERR, FIND_FAIL, NO_KILL);
-
- RefreshList(TypeID);
- }
- }
- else
- {
- ErrorHandle(PORT_ERR, FIND_FAIL, NO_KILL);
- RefreshList(TypeID);
- }
-
- return;
- }
-
- static void
- ModifyFont(int TypeID, struct objectid *obj)
- {
- WORD sel;
- struct TextFont *tf = (struct TextFont *) obj->address;
-
- if (CheckObject(&GfxBase->TextFonts, obj))
- sel = DisplayFontInfo(obj);
- else
- {
- ErrorHandle(FONT_ERR, FIND_FAIL, NO_KILL);
- RefreshList(TypeID);
-
- return;
- }
-
- switch(sel)
- {
- case 0:
- if (Question(SysWnd, "Do you want to close and remove this font?", YES))
- {
- if (CheckObject(&GfxBase->TextFonts, obj))
- RemoveFontSafely(tf);
- else
- ErrorHandle(FONT_ERR, FIND_FAIL, NO_KILL);
-
- RefreshList(TypeID);
- }
- break;
-
- case 2:
- if (CheckObject(&GfxBase->TextFonts, obj))
- ShowFont((struct TextFont *) obj->address);
- else
- ErrorHandle(FONT_ERR, FIND_FAIL, NO_KILL);
- break;
- }
-
- return;
- }
-
- static void
- ModifyWindow(int TypeID, struct objectid *obj)
- {
- WORD sel;
-
- sel = DisplayWindowInfo(obj);
-
- if (!sel && ((struct Window *) obj->address == SysWnd))
- {
- ErrorHandle(WINDOW_ERR, FIND_FAIL, NO_KILL);
- return;
- }
-
- if (!sel &&
- Question(SysWnd, "Closing of Windows are very dangerous! The System \n"
- "may be crash, when you close an active Window\n"
- "Do you want to close the Window anyway?", YES))
- ClosingWindows((struct Window *) obj->address);
-
- RefreshList(TypeID);
-
- return;
- }
-
- static void
- ModifyScreen(int TypeID, struct objectid *obj)
- {
- WORD sel;
-
- sel = DisplayScreenInfo(obj);
-
- if (NOT(sel) &&
- (((struct Screen *) obj->address == SysWnd->WScreen) ||
- (((struct Screen *) obj->address)->Flags & WBENCHSCREEN)))
- {
- ErrorHandle(SCREEN_ERR, FIND_FAIL, NO_KILL);
- return;
- }
-
- if (NOT(sel) &&
- Question(SysWnd, "Closing of Screens are very dangerous! The System \n"
- "may be crash, when you close an active Screen with\n"
- "all associated windows!\n"
- "Do you want to close the Screen and Windows anyway?", YES))
- ClosingScreens((struct Screen *) obj->address);
-
- return;
- }
-
- static void
- DisplayTreeDevice(int TypeID, struct objectid *obj)
- {
- WORD sel = DisplayDiskInfo(obj->fullname, TRUE);
-
- if (sel == 0)
- PrintTree(obj);
-
- return;
- }
-
- static void
- DisplayAllFonts(int TypeID, struct Node *ClickedNode)
- {
- struct TextFont *tf;
- struct TextAttr testfont;
- int i,
- j;
- char fontname[MAXSTRLEN],
- size[5];
-
- i = 0;
-
- while (ClickedNode->ln_Name[i] != ' ')
- {
- fontname[i] = ClickedNode->ln_Name[i];
- i++;
- }
-
- fontname[i] = STRINGEND;
-
- testfont.ta_Name = (UBYTE *) fontname;
-
- while (ClickedNode->ln_Name[i] == ' ')
- i++;
- while (ClickedNode->ln_Name[i] != ' ')
- i++;
- while (ClickedNode->ln_Name[i] == ' ')
- i++;
-
- j = 0;
- while (ClickedNode->ln_Name[i] != ' ')
- {
- size[j] = ClickedNode->ln_Name[i];
- i++;
- j++;
- }
-
- size[j] = STRINGEND;
-
- testfont.ta_YSize = atoi(size);
- testfont.ta_Flags = 0;
- testfont.ta_Style = 0;
-
- tf = OpenDiskFont(&testfont);
- if (tf)
- {
- ShowFont(tf);
- CloseFont(tf);
- }
-
- return;
- }
-
- /*
- * ModifyObject() prüft ob ein Element einer Liste im Hauptfenster
- * modifiziert oder angezeigt werden kann und ruft die entsprechenden
- * Routinen auf
- */
- void
- ModifyObject(int TypeID, ULONG code)
- {
- struct Node *ClickedNode;
- struct objectid *obj;
- char out[BUFSIZE];
-
- DPOS;
-
- sprintf(out, "Modify %s", EntryAttr[TypeID].ea_type);
- PrintInfo(out, SPEAK, 0);
-
- if (NOT(ClickedNode = GetNode(&ListeLVList, code)))
- {
- ErrorHandle(LIST_NODE_ERR, FIND_FAIL, NO_KILL);
- return;
- }
-
- obj = &((ScrollEntry *) ClickedNode)->se_obj_id;
-
- switch (TypeID)
- {
- case GD_TasksGad:
- ModifyTask(TypeID, obj);
- break;
-
- case GD_LibrariesGad:
- ModifyLibrary(TypeID, obj);
- break;
-
- case SYSSOFTDEV:
- DisplaySoftDevice(TypeID, obj);
- break;
-
- case GD_ResourcesGad:
- DisplayResource(TypeID, obj);
- break;
-
- case GD_PortsGad:
- ModifyPort(TypeID, obj);
- break;
-
- case GD_FontsGad:
- ModifyFont(TypeID, obj);
- break;
-
- case GD_WindowsGad:
- ModifyWindow(TypeID, obj);
- break;
-
- case GD_ScreensGad:
- ModifyScreen(TypeID, obj);
- break;
-
- case GD_AssignsGad:
- case GD_VolumesGad:
- DisplayTreeDevice(TypeID, obj);
- break;
-
- case ALLFONTS:
- DisplayAllFonts(TypeID, ClickedNode);
- break;
-
- default:
- DisplayBeep(NULL);
- PrintInfo("No modifications possible", SPEAK, SEC);
-
- break;
- }
-
- PrintStatistics();
-
- return;
- }
-
-