forwarding build fix when MUIA_Scrollgroup_AutoBars is defined (NicJA).
[AROS-Contrib.git] / scalos / main / idcmp.c
blob2f5029cb0d03b7ad80666b00bf8d9a0ae3fd8234
1 // idcmp.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <graphics/rastport.h>
8 #include <utility/hooks.h>
9 #include <intuition/gadgetclass.h>
10 #include <intuition/newmouse.h>
11 #include <workbench/workbench.h>
12 #include <workbench/startup.h>
13 #include <libraries/gadtools.h>
14 #include <libraries/iffparse.h>
15 #include <datatypes/pictureclass.h>
16 #include <dos/dostags.h>
17 #include <guigfx/guigfx.h>
19 #define __USE_SYSBASE
21 #include <proto/dos.h>
22 #include <proto/exec.h>
23 #include <proto/layers.h>
24 #include <proto/intuition.h>
25 #include <proto/graphics.h>
26 #include <proto/utility.h>
27 #include <proto/icon.h>
28 #include <proto/iconobject.h>
29 #include <proto/guigfx.h>
30 #include <proto/datatypes.h>
31 #include "debug.h"
32 #include <proto/scalos.h>
34 #include <clib/alib_protos.h>
36 #include <defs.h>
37 #include <datatypes/iconobject.h>
38 #include <scalos/palette.h>
39 #include <scalos/pattern.h>
40 #include <scalos/scalos.h>
42 #include <stdlib.h>
43 #include <stdio.h>
44 #include <string.h>
46 #include "scalos_structures.h"
47 #include "functions.h"
48 #include "Variables.h"
50 #include "IconImageClass.h"
51 #include "CycleGadgetClass.h"
53 //----------------------------------------------------------------------------
55 // local data structures
57 //----------------------------------------------------------------------------
59 // local functions
61 static ULONG IDCMPMouseButtons(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
62 static ULONG IDCMPMouseMove(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
63 static ULONG IDCMPGadgetDown(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
64 static ULONG IDCMPGadgetUp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
65 static ULONG IDCMPMenuPick(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
66 static ULONG IDCMPDiskRemoved(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
67 static ULONG IDCMPActiveWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
68 static ULONG IDCMPInactiveWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
69 static ULONG IDCMPRawKey(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
70 static ULONG IDCMPUpdate(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
71 static ULONG IDCMPIntuiTicks(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
72 static ULONG IDCMPChangeWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
73 static ULONG IDCMPNewSize(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
74 static ULONG IDCMPGadgetHelp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
75 #if defined(IDCMP_EXTENDEDMOUSE)
76 static ULONG IDCMPExtendedMouse(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
77 #endif //defined(IDCMP_EXTENDEDMOUSE)
79 static void ArrowRight(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
80 static void ArrowLeft(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
81 static void ArrowDown(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
82 static void ArrowUp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
83 static void SetPropBottom(struct internalScaWindowTask *iwt);
84 static void SetPropSide(struct internalScaWindowTask *iwt);
85 static void MousePress(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
86 static void MouseRelease(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
87 static void OldIconsOff(struct internalScaWindowTask *iwt, Object *IconObj,
88 LONG XOffset, LONG YOffset, UWORD Qualifier, BOOL keepSelected);
89 static LONG SafeStrCmp(CONST_STRPTR str1, CONST_STRPTR str2);
90 static void IDCMPBeginDrag(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg);
92 //----------------------------------------------------------------------------
94 // local data items
96 //----------------------------------------------------------------------------
98 // public data items
100 const struct IDCMPTableEntry IDCMPFuncTable[] =
102 // Attention: entries MUST be kept in ascending order, due to use of bsearch()
103 // { IDCMP_SIZEVERIFY, NULL },
104 { IDCMP_NEWSIZE, IDCMPNewSize },
105 { IDCMP_REFRESHWINDOW, IDCMPRefreshWindow },
106 { IDCMP_MOUSEBUTTONS, IDCMPMouseButtons },
107 { IDCMP_MOUSEMOVE, IDCMPMouseMove },
108 { IDCMP_GADGETDOWN, IDCMPGadgetDown },
109 { IDCMP_GADGETUP, IDCMPGadgetUp },
110 // { IDCMP_REQSET, NULL },
111 { IDCMP_MENUPICK, IDCMPMenuPick },
112 // { IDCMP_CLOSEWINDOW, NULL },
113 { IDCMP_RAWKEY, IDCMPRawKey },
114 // { IDCMP_REQVERIFY, NULL },
115 // { IDCMP_REQCLEAR, NULL },
116 // { IDCMP_MENUVERIFY, NULL },
117 // { IDCMP_NEWPREFS, NULL },
118 { IDCMP_DISKINSERTED, IDCMPDiskInserted },
119 { IDCMP_DISKREMOVED, IDCMPDiskRemoved },
120 // { IDCMP_WBENCHMESSAGE, NULL },
121 { IDCMP_ACTIVEWINDOW, IDCMPActiveWindow },
122 { IDCMP_INACTIVEWINDOW, IDCMPInactiveWindow },
123 // { IDCMP_DELTAMOVE, NULL },
124 // { IDCMP_VANILLAKEY, NULL },
125 { IDCMP_INTUITICKS, IDCMPIntuiTicks },
126 { IDCMP_IDCMPUPDATE, IDCMPUpdate },
127 // { IDCMP_MENUHELP, NULL },
128 { IDCMP_CHANGEWINDOW, IDCMPChangeWindow },
129 { IDCMP_GADGETHELP, IDCMPGadgetHelp },
130 // { IDCMP_LONELYMESSAGE, NULL },
131 #if defined(IDCMP_EXTENDEDMOUSE)
132 { IDCMP_EXTENDEDMOUSE, IDCMPExtendedMouse },
133 #endif //defined(IDCMP_EXTENDEDMOUSE)
136 const size_t IDCMPFuncTableSize = Sizeof(IDCMPFuncTable); // number of entries in IDCMPFuncTable[
138 //----------------------------------------------------------------------------
140 ULONG IDCMPRefreshWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
142 d1(KPrintF("%s/%s/%ld: START iwt=%08lx <%s> IDCMPWindow=%08lx\n", \
143 __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle, iMsg->IDCMPWindow));
145 if (iwt->iwt_DragFlags & DRAGFLAGF_WindowLocked)
147 iwt->iwt_DragFlags |= DRAGFLAGF_UpdatePending;
149 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
150 return 0;
153 BeginRefresh(iwt->iwt_WindowTask.wt_Window);
155 if (iwt->iwt_TextGadFlag)
156 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_TextWin_DrawColumnHeaders);
158 if (iwt->iwt_WindowTask.wt_IconList)
160 struct Rectangle winRect;
162 winRect.MinX = winRect.MaxX = iwt->iwt_InnerLeft;
163 winRect.MaxX += iwt->iwt_InnerWidth - 1;
164 winRect.MinY = winRect.MaxY = iwt->iwt_InnerTop;
165 winRect.MaxY += iwt->iwt_InnerHeight - 1;
167 d1(kprintf("%s/%s/%ld: WinRect MinX=%ld MinY=%ld MaxX=%ld MaxY=%ld\n", \
168 __FILE__, __FUNC__, __LINE__, winRect.MinX, winRect.MinY, winRect.MaxX, winRect.MaxY));
170 if (NULL == iwt->iwt_DamagedRegion)
171 iwt->iwt_DamagedRegion = NewRegion();
173 if (iwt->iwt_DamagedRegion)
175 OrRegionRegion(iwt->iwt_WindowTask.wt_Window->WLayer->DamageList, iwt->iwt_DamagedRegion);
176 AndRectRegion(iwt->iwt_DamagedRegion, &winRect);
178 d1(KPrintF("%s/%s/%ld: iwt=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt));
180 if (ScalosAttemptLockIconListShared(iwt))
182 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags &= ~WSV_FlagF_RefreshPending;
184 RefreshIcons(iwt, iwt->iwt_DamagedRegion);
186 DisposeRegion(iwt->iwt_DamagedRegion);
187 iwt->iwt_DamagedRegion = NULL;
189 ScalosUnLockIconList(iwt);
191 else
193 // Postpone refresh until next SCCM_Ping
194 d1(KPrintF("%s/%s/%ld: postpone refresh iwt=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt));
195 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags |= WSV_FlagF_RefreshPending;
200 d1(KPrintF("%s/%s/%ld: WLayer=%08lx Flags=%04lx\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_WindowTask.wt_Window->WLayer,
201 iwt->iwt_WindowTask.wt_Window->WLayer->Flags));
203 #if defined(__MORPHOS__)
204 if (!iInfos.xii_Layers3D)
205 RefreshWindowFrame(iwt->iwt_WindowTask.wt_Window);
206 #endif /* __MORPHOS__ */
208 EndRefresh(iwt->iwt_WindowTask.wt_Window, TRUE);
210 d1(kprintf("%s/%s/%ld: END iwt=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle));
212 return 0;
216 static ULONG IDCMPMouseButtons(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
218 iwt->iwt_LockCount.tv_secs = iMsg->Seconds;
219 iwt->iwt_LockCount.tv_micro = iMsg->Micros;
221 d1(KPrintF("%s/%s/%ld: START Code=%04lx\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
223 ResetToolTips(iwt);
225 switch (iMsg->Code)
227 case SELECTDOWN:
228 d1(KPrintF("%s/%s/%ld: SELECTDOWN\n", __FILE__, __FUNC__, __LINE__));
229 MousePress(iwt, iMsg);
230 break;
232 case SELECTUP:
233 d1(KPrintF("%s/%s/%ld: SELECTUP\n", __FILE__, __FUNC__, __LINE__));
234 MouseRelease(iwt, iMsg);
235 break;
237 case MIDDLEDOWN:
238 d1(KPrintF("%s/%s/%ld: MIDDLEDOWN\n", __FILE__, __FUNC__, __LINE__));
239 if (CurrentPrefs.pref_MMBMoveFlag)
241 AbortFunctions(iwt);
243 if (!iwt->iwt_BackDrop)
245 iwt->iwt_MoveGadId = VGADGETID_MMBMOUSEMOVE;
247 iwt->iwt_OldMouse.X = iMsg->MouseX;
248 iwt->iwt_OldMouse.Y = iMsg->MouseY;
250 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_MOUSEMOVE);
253 break;
255 case MIDDLEUP:
256 d1(KPrintF("%s/%s/%ld: MIDDLEUP\n", __FILE__, __FUNC__, __LINE__));
257 if (CurrentPrefs.pref_MMBMoveFlag)
259 iwt->iwt_MoveGadId = VGADGETID_IDLE;
261 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags);
263 break;
266 d1(KPrintF("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
268 return 0;
272 static ULONG IDCMPMouseMove(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
274 ResetToolTips(iwt);
276 iInfos.xii_GlobalGadgetUnderPointer.ggd_iwt = NULL;
277 iInfos.xii_GlobalGadgetUnderPointer.ggd_Gadget = NULL;
278 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_unknown;
279 iInfos.xii_GlobalGadgetUnderPointer.ggd_cgy = NULL;
280 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetTextHook = NULL;
282 switch (iwt->iwt_MoveGadId)
284 case VGADGETID_WAITFORDRAG:
285 IDCMPBeginDrag(iwt, iMsg);
286 break;
288 case VGADGETID_DRAGMOUSEMOVE:
289 IDCMPDragMouseMove(iwt, iMsg);
290 break;
292 case VGADGETID_MMBMOUSEMOVE:
293 IDCMPMMBMouseMove(iwt);
294 break;
296 case GADGETID_HORIZSLIDER:
297 SetPropBottom(iwt);
298 break;
300 case GADGETID_VERTSLIDER:
301 SetPropSide(iwt);
302 break;
304 case VGADGETID_LASSO:
305 if (iwt->iwt_LassoFlag)
307 Lasso(iwt->iwt_OldMouse.X, iwt->iwt_OldMouse.Y, LASSOX_FollowLasso, iwt);
309 else
311 WORD deltaX, deltaY;
313 deltaX = iMsg->MouseX - iwt->iwt_OldMouse.X;
314 deltaY = iMsg->MouseY - iwt->iwt_OldMouse.Y;
316 if (abs(deltaX) > 8 || abs(deltaY) > 8)
317 BeginLasso(iwt, iMsg->Qualifier);
319 break;
322 return 0;
326 static ULONG IDCMPGadgetDown(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
328 struct ExtGadget *gad;
329 d1(UWORD Code);
331 ResetToolTips(iwt);
333 if (NULL == iwt->iwt_WindowTask.wt_IconList)
335 iwt->iwt_MoveGadId = VGADGETID_IDLE;
336 return 0;
339 gad = (struct ExtGadget *) iMsg->IAddress;
340 iwt->iwt_MoveGadId = gad->GadgetID;
342 switch (iwt->iwt_MoveGadId)
344 case GADGETID_HORIZSLIDER:
345 case GADGETID_VERTSLIDER:
346 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_MOUSEMOVE | IDCMP_INTUITICKS);
347 break;
349 case GADGETID_RIGHTBUTTON:
350 ArrowRight(iwt, iMsg);
351 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS);
352 break;
354 case GADGETID_LEFTBUTTON:
355 ArrowLeft(iwt, iMsg);
356 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS);
357 break;
359 case GADGETID_UPBUTTON:
360 ArrowUp(iwt, iMsg);
361 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS);
362 break;
364 case GADGETID_DOWNBUTTON:
365 ArrowDown(iwt, iMsg);
366 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS);
367 break;
369 case GADGETID_CONTROLBAR:
370 d1(Code = StatusBarQueryGadgetID(iwt, gad, iMsg->MouseX, iMsg->MouseY));
371 d1(KPrintF("%s/%s/%ld: GADGETID_CONTROLBAR Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
372 break;
374 case GADGETID_STATUSBAR:
375 d1(Code = StatusBarQueryGadgetID(iwt, gad, iMsg->MouseX, iMsg->MouseY));
376 d1(KPrintF("%s/%s/%ld: GADGETID_STATUSBAR Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
377 break;
380 default:
381 d1(KPrintF("%s/%s/%ld: unknown GadgetID=%ld\n", __FILE__, __FUNC__, __LINE__, gad->GadgetID));
382 break;
385 return 0;
389 static ULONG IDCMPGadgetUp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
391 struct ExtGadget *gad = (struct ExtGadget *) iMsg->IAddress;
392 UWORD Code;
394 ResetToolTips(iwt);
396 d1(KPrintF("%s/%s/%ld: >GadgetID=%ld\n", __FILE__, __FUNC__, __LINE__, gad->GadgetID));
398 switch (gad->GadgetID)
400 case GADGETID_HORIZSLIDER:
401 d1(KPrintF("%s/%s/%ld: GADGETID_HORIZSLIDER\n", __FILE__, __FUNC__, __LINE__));
402 SetPropBottom(iwt);
403 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustBottomSlider);
404 break;
406 case GADGETID_VERTSLIDER:
407 d1(KPrintF("%s/%s/%ld: GADGETID_VERTSLIDER\n", __FILE__, __FUNC__, __LINE__));
408 SetPropSide(iwt);
409 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustRightSlider);
410 break;
412 case GADGETID_ICONIFY:
413 case ETI_Iconify:
414 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags);
415 ReplyMsg(&iMsg->ExecMessage);
416 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_Iconify);
418 iwt->iwt_MoveGadId = VGADGETID_IDLE;
420 return 1;
421 break;
423 case GADGETID_CONTROLBAR:
424 d1(KPrintF("%s/%s/%ld: GADGETID_CONTROLBAR\n", __FILE__, __FUNC__, __LINE__));
425 Code = ControlBarQueryGadgetType(iwt, gad);
426 d1(KPrintF("%s/%s/%ld: code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
427 switch (Code)
429 case SCPGadgetType_BrowseButton:
430 d1(KPrintF("%s/%s/%ld: SCPGadgetType_BrowseButton\n", __FILE__, __FUNC__, __LINE__));
431 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_Browse);
432 break;
433 case SCPGadgetType_UpButton:
434 d1(KPrintF("%s/%s/%ld: SCPGadgetType_UpButton\n", __FILE__, __FUNC__, __LINE__));
435 if (!(iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags & WSV_FlagF_RootWindow)
436 && iwt->iwt_WindowTask.mt_WindowStruct->ws_Lock)
438 BPTR parentLock;
440 parentLock = ParentDir(iwt->iwt_WindowTask.mt_WindowStruct->ws_Lock);
441 debugLock_d1(parentLock);
442 if (parentLock)
444 STRPTR ParentName;
446 ParentName = AllocPathBuffer();
447 d1(KPrintF("%s/%s/%ld: ParentName=%08lx\n", __FILE__, __FUNC__, __LINE__, ParentName));
448 if (ParentName)
450 if (NameFromLock(parentLock, ParentName, Max_PathLen - 1))
452 d1(KPrintF("%s/%s/%ld: ParentName=<%s>\n", __FILE__, __FUNC__, __LINE__, ParentName));
453 WindowNewPath(iwt, ParentName);
456 FreePathBuffer(ParentName);
459 UnLock(parentLock);
462 break;
463 case SCPGadgetType_BackButton:
464 d1(KPrintF("%s/%s/%ld: SCPGadgetType_BackButton\n", __FILE__, __FUNC__, __LINE__));
465 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_History_Back);
466 break;
467 case SCPGadgetType_ForwardButton:
468 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ForwardButton\n", __FILE__, __FUNC__, __LINE__));
469 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_History_Forward);
470 break;
471 case SCPGadgetType_ViewBy:
472 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ViewBy Code=%ld\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
473 ViewWindowBy(iwt, ControlBarViewModeFromCode(iMsg->Code));
474 break;
475 case SCPGadgetType_ShowMode:
476 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ShowMode Code=%ld\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
477 SetAttrs(iwt->iwt_WindowTask.mt_MainObject,
478 SCCA_IconWin_ShowType, (0 == iMsg->Code) ? DDFLAGS_SHOWICONS : DDFLAGS_SHOWALL,
479 TAG_END);
480 break;
481 case SCPGadgetType_History:
482 d1(KPrintF("%s/%s/%ld: SCPGadgetType_History Code=%ld\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
483 ControlBarSwitchHistoryEntry(iwt);
484 break;
485 case SCPGadgetType_ActionButton:
486 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ActionButton Code=%ld\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
487 ControlBarActionButton(iwt, gad);
488 break;
489 default:
490 d1(KPrintF("%s/%s/%ld: GADGETID_CONTROLBAR unknown Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
491 break;
493 break;
495 case GADGETID_STATUSBAR:
496 //Code = StatusBarQueryGadgetID(iwt, gad, iMsg->MouseX, iMsg->MouseY);
497 d1(KPrintF("%s/%s/%ld: GADGETID_STATUSBAR Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
498 break;
500 default:
501 d1(KPrintF("%s/%s/%ld: unknown GadgetID=%ld Code=%ld\n", __FILE__, __FUNC__, __LINE__, gad->GadgetID, iMsg->Code));
502 break;
505 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags);
506 iwt->iwt_MoveGadId = VGADGETID_IDLE;
508 return 0;
512 static ULONG IDCMPMenuPick(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
514 WORD code = iMsg->Code;
516 d1(KPrintF("%s/%s/%ld: iwt=%08lx iMsg=%08lx code=%04lx\n", \
517 __FILE__, __FUNC__, __LINE__, iwt, iMsg, code));
519 ReplyMsg(&iMsg->ExecMessage);
521 while ((WORD) MENUNULL != code)
523 struct MenuItem *mItem = ItemAddress(MainMenu, code);
524 struct SCALOS_MENUTREE *mTree;
526 if (NULL == mItem)
527 break;
529 mTree = (struct SCALOS_MENUTREE *) GTMENUITEM_USERDATA(mItem);
530 if (mTree)
532 struct AppObject *appo = (struct AppObject *) mTree;
534 if (ID_SC == appo->appo_Kennung)
536 struct AppMessage *appMsg;
537 ULONG NumberOfWbArgs;
538 ULONG MsgSize;
540 NumberOfWbArgs = SCA_CountWBArgs(NULL);
541 MsgSize = sizeof(struct AppMessage) + NumberOfWbArgs * sizeof(struct WBArg);
543 appMsg = AllocVec(MsgSize, MEMF_CLEAR | MEMF_PUBLIC);
544 if (appMsg)
546 appMsg->am_Message.mn_ReplyPort = iInfos.xii_iinfos.ii_MainMsgPort;
547 appMsg->am_Message.mn_Length = MsgSize;
548 appMsg->am_Type = AMTYPE_APPMENUITEM;
549 appMsg->am_UserData = appo->appo_userdata;
550 appMsg->am_ID = appo->appo_id;
551 appMsg->am_Version = AM_VERSION;
552 appMsg->am_MouseX = iwt->iwt_WindowTask.wt_Window->MouseX;
553 appMsg->am_MouseY = iwt->iwt_WindowTask.wt_Window->MouseY;
554 CurrentTime(&appMsg->am_Seconds, &appMsg->am_Micros);
555 appMsg->am_Reserved[0] = ID_APPM;
556 appMsg->am_ArgList = (struct WBArg *) (appMsg + 1); // follows directly after appMsg
558 appMsg->am_NumArgs = SCA_MakeWBArgs(appMsg->am_ArgList, NULL, NumberOfWbArgs);
560 if (0 == appMsg->am_NumArgs)
561 appMsg->am_ArgList = NULL;
563 PutMsg(appo->appo_msgport, &appMsg->am_Message);
566 else
568 RunMenuCommand(iwt, mTree, NULL, (mItem->Flags & CHECKED) ? 1 : 0);
572 code = mItem->NextSelect;
575 return 1;
579 ULONG IDCMPDiskInserted(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
581 d1(KPrintF("%s/%s/%ld: START iwt_DevListObject=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_DevListObject));
583 if (iwt->iwt_DevListObject)
585 struct ScaDeviceIcon *nodeList = NULL;
586 struct ScaDeviceIcon *di, *diNext;
587 struct ScaIconNode *iconList = NULL;
588 BOOL IsReadOnly;
590 DoMethod(iwt->iwt_DevListObject, SCCM_DeviceList_Generate, &nodeList);
592 for (di=iwt->iwt_DevIconList; di; di = (struct ScaDeviceIcon *) di->di_Node.mln_Succ)
594 di->di_Flags |= DIBF_Remove;
597 for (di = nodeList; di; di = diNext)
599 struct ScaDeviceIcon *di2, *diNext2;
601 diNext = (struct ScaDeviceIcon *) di->di_Node.mln_Succ;
603 d1(kprintf("%s/%s/%ld: di=%08lx <%s> diNext=%08lx di_Flags=%08lx\n", __FILE__, __FUNC__, __LINE__, di, di->di_Device, diNext, di->di_Flags));
605 for (di2 = iwt->iwt_DevIconList; di2; di2 = diNext2)
607 diNext2 = (struct ScaDeviceIcon *) di2->di_Node.mln_Succ;
609 if (di->di_Handler == di2->di_Handler)
611 d1(kprintf("%s/%s/%ld: di2=%08lx <%s> DiskType=%08lx di_Flags=%08lx\n", \
612 __FILE__, __FUNC__, __LINE__, di2, di2->di_Device, di2->di_Info->id_DiskType, di2->di_Flags));
614 if (di->di_Flags & DIBF_DontDisplay)
616 // device di2 is no longer valid
617 // DIBF_Remove stays set
618 d1(kprintf("%s/%s/%ld: invalid di2=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, di2, di2->di_Device));
620 else if (di2->di_Flags & DIBF_DontDisplay && !(di->di_Flags & DIBF_DontDisplay))
622 d1(kprintf("%s/%s/%ld: Add di2=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, di2, di2->di_Device));
624 di2->di_Flags &= ~(DIBF_DontDisplay | DIBF_Remove);
625 RemoveDeviceIcon(iwt, di2, &iconList);
627 DoMethod(iwt->iwt_DevListObject, SCCM_DeviceList_FreeDevNode, di2);
628 SCA_FreeNode((struct ScalosNodeList *)(APTR) &iwt->iwt_DevIconList, &di2->di_Node);
630 else
632 if (0 == SafeStrCmp(di->di_Volume, di2->di_Volume)
633 && di->di_Info->id_DiskType == di2->di_Info->id_DiskType)
635 // device is already present in iwt_DevIconList
636 // and there are no changes.
637 // remove new devicenode from nodeList
639 di2->di_Flags &= ~DIBF_Remove;
641 d1(kprintf("%s/%s/%ld: Remove di=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, di, di->di_Device));
643 DoMethod(iwt->iwt_DevListObject, SCCM_DeviceList_FreeDevNode, di);
644 SCA_FreeNode((struct ScalosNodeList *)(APTR) &nodeList, &di->di_Node);
646 d1(kprintf("%s/%s/%ld: di=%08lx diNext=%08lx\n", __FILE__, __FUNC__, __LINE__, di, diNext));
647 break;
649 else
651 // device seems to have changed
652 // move devicenode to iconlist and remember it for re-reading
654 d1(kprintf("%s/%s/%ld: Remove di2=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, di2, di2->di_Device));
655 RemoveDeviceIcon(iwt, di2, &iconList);
657 d1(kprintf("%s/%s/%ld: di=%08lx diNext=%08lx\n", __FILE__, __FUNC__, __LINE__, di, diNext));
661 d1(kprintf("%s/%s/%ld: di=%08lx diNext=%08lx\n", __FILE__, __FUNC__, __LINE__, di, diNext));
665 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
667 for (di = iwt->iwt_DevIconList; di; di = diNext)
669 diNext = (struct ScaDeviceIcon *) di->di_Node.mln_Succ;
671 d1(kprintf("%s/%s/%ld: di=%08lx <%s> diNext=%08lx di_Flags=%08lx\n", __FILE__, __FUNC__, __LINE__, di, di->di_Device, diNext, di->di_Flags));
673 if (di->di_Flags & DIBF_Remove)
675 d1(kprintf("%s/%s/%ld: Remove icon <%s>\n", __FILE__, __FUNC__, __LINE__, di->di_Device));
676 RemoveDeviceIcon(iwt, di, &iconList);
680 d1(kprintf("%s/%s/%ld: iconList=%08lx\n", __FILE__, __FUNC__, __LINE__, iconList));
682 if (iconList)
684 RemoveIcons(iwt, &iconList);
685 FreeIconList(iwt, &iconList);
688 d1(\
690 struct ScaIconNode *in;
692 kprintf("%s/%s/%ld: --------start----------\n", __FILE__, __FUNC__, __LINE__);
694 for (in=iwt->iwt_WindowTask.wt_IconList; in; in=(struct ScaIconNode *) in->in_Node.mln_Succ)
695 kprintf("%s/%s/%ld: in=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in, GetIconName(in));
697 kprintf("%s/%s/%ld: ---------end----------\n", __FILE__, __FUNC__, __LINE__);
700 d1(kprintf("%s/%s/%ld: nodeList=%08lx\n", __FILE__, __FUNC__, __LINE__, nodeList));
702 if (nodeList)
704 for (di = nodeList; di; di = diNext)
706 diNext = (struct ScaDeviceIcon *) di->di_Node.mln_Succ;
708 d1(kprintf("%s/%s/%ld: di=%08lx <%s> diNext=%08lx di_Flags=%08lx\n", __FILE__, __FUNC__, __LINE__, di, di->di_Device, diNext, di->di_Flags));
710 if (!(di->di_Flags & (DIBF_DontDisplay | DIBF_InfoPending)))
712 d1(kprintf("%s/%s/%ld: add icon di=%08lx <%s> disktype=%08lx\n", \
713 __FILE__, __FUNC__, __LINE__, di, di->di_Device, di->di_Info->id_DiskType));
714 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_DeviceWin_ReadIcon, di);
716 SCA_MoveDevIconNode(&nodeList, &iwt->iwt_DevIconList, di);
720 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_CleanUp);
723 // Now remove all unused entries from nodeList
724 while (nodeList)
726 d1(kprintf("%s/%s/%ld: free entry nodeList=%08lx <%s> di_Flags=%08lx\n", __FILE__, __FUNC__, __LINE__, nodeList, nodeList->di_Device, nodeList->di_Flags));
727 DoMethod(iwt->iwt_DevListObject, SCCM_DeviceList_FreeDevNode, nodeList);
728 SCA_FreeNode((struct ScalosNodeList *)(APTR) &nodeList, &nodeList->di_Node);
731 if (WSV_Type_DeviceWindow != iwt->iwt_WindowTask.mt_WindowStruct->ws_WindowType)
733 struct FileLock *fLock = BADDR(iwt->iwt_WindowTask.mt_WindowStruct->ws_Lock);
735 iwt->iwt_OldFileSys = SetFileSysTask(fLock->fl_Task);
737 IsReadOnly = !ClassIsDiskWritable(iwt->iwt_WindowTask.mt_WindowStruct->ws_Lock);
739 if (IsReadOnly != iwt->iwt_ReadOnly)
741 SetIconWindowReadOnly(iwt, IsReadOnly);
742 iwt->iwt_ReadOnly = IsReadOnly;
747 d1(kprintf("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
749 return 0;
753 static ULONG IDCMPDiskRemoved(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
755 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
757 if (!iwt->iwt_BackDrop)
759 iwt->iwt_WinTitle = (STRPTR) DoMethod(iwt->iwt_TitleObject, SCCM_Title_Generate);
760 DoMethod(iwt->iwt_TitleObject, SCCM_Window_SetTitle, iwt->iwt_WinTitle);
763 return 0;
767 static ULONG IDCMPActiveWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
769 ULONG Result = 0;
771 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags & WSV_FlagF_ActivatePending)
773 d1(kprintf("%s/%s/%ld: iwt_PopupMenuPending=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_PopupMenuPending));
775 if (iwt->iwt_PopupMenuPending)
777 ReplyMsg(&iMsg->ExecMessage);
778 Result = 1;
780 // Now show pending popup menu
781 DoMethodA(iwt->iwt_WindowTask.mt_MainObject, (Msg) iwt->iwt_PopupMenuPending);
783 ScalosFree(iwt->iwt_PopupMenuPending);
784 iwt->iwt_PopupMenuPending = NULL;
788 SetAttrs(iwt->iwt_WindowTask.mt_WindowObject,
789 SCCA_Window_Transparency, iwt->iwt_WindowTask.mt_WindowStruct->ws_WindowOpacityActive,
790 TAG_END);
792 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags &= ~WSV_FlagF_ActivatePending;
794 SetMenuOnOff(iwt);
796 return Result;
800 static ULONG IDCMPInactiveWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
802 SetAttrs(iwt->iwt_WindowTask.mt_WindowObject,
803 SCCA_Window_Transparency, iwt->iwt_WindowTask.mt_WindowStruct->ws_WindowOpacityInactive,
804 TAG_END);
806 return 0;
810 static ULONG IDCMPRawKey(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
812 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_RawKey, iMsg);
814 return 0;
818 static ULONG IDCMPUpdate(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
820 ULONG GadgetID;
821 struct ControlBarGadgetEntry *cgy;
823 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%ld IAddress=%08lx\n", \
824 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->IAddress));
826 GadgetID = GetTagData(GA_ID, 0, iMsg->IAddress);
827 d1(KPrintF("%s/%s/%ld: GadgetID=%ld Code=%ld\n", __FILE__, __FUNC__, __LINE__, GadgetID, iMsg->Code));
829 cgy = ControlBarFindGadgetByID(iwt, GadgetID);
830 d1(KPrintF("%s/%s/%ld: cgy=%08lx cgy_GadgetType=%ld\n", __FILE__, __FUNC__, __LINE__, cgy, cgy ? cgy->cgy_GadgetType : 0));
831 if (cgy)
833 ULONG Code;
835 Code = GetTagData(SCACYCLE_Active, 0, iMsg->IAddress);
837 switch (cgy->cgy_GadgetType)
839 case SCPGadgetType_ViewBy:
840 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ViewBy Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
841 ViewWindowBy(iwt, ControlBarViewModeFromCode(Code));
842 break;
843 case SCPGadgetType_ShowMode:
844 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ShowMode Code=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
845 SetAttrs(iwt->iwt_WindowTask.mt_MainObject,
846 SCCA_IconWin_ShowType, (0 == Code) ? DDFLAGS_SHOWICONS : DDFLAGS_SHOWALL,
847 TAG_END);
848 break;
849 default:
850 d1(KPrintF("%s/%s/%ld: unknown GadgetID=%ld Code=%ld\n", __FILE__, __FUNC__, __LINE__, GadgetID, Code));
851 break;
856 return 0;
860 // IntuiTicks are issued about 10 times per second
861 static ULONG IDCMPIntuiTicks(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
863 iwt->iwt_LockCount.tv_secs = iMsg->Seconds;
864 iwt->iwt_LockCount.tv_micro = iMsg->Micros;
866 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%ld IAddress=%08lx\n", \
867 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->IAddress));
869 switch (iwt->iwt_MoveGadId)
871 case VGADGETID_WAITFORDRAG:
872 break;
874 case VGADGETID_DRAGMOUSEMOVE:
875 d1(KPrintF("%s/%s/%ld: iwt=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt));
876 if (iMsg->Qualifier & (IEQUALIFIER_RBUTTON | IEQUALIFIER_MIDBUTTON))
878 AbortFunctions(iwt);
880 else
882 IDCMPDragIntuiTicks(iwt, iMsg);
884 break;
886 case VGADGETID_LASSO:
887 if (iwt->iwt_LassoFlag)
888 Lasso(iwt->iwt_OldMouse.X, iwt->iwt_OldMouse.Y, LASSOX_CrawlLasso, iwt);
889 break;
891 default:
892 if (iMsg->Qualifier & IEQUALIFIER_LEFTBUTTON)
894 struct Gadget *gad = NULL;
896 if (iwt->iwt_MoveGadId > VGADGETID_IDLE)
898 gad = iwt->iwt_WindowTask.wt_Window->FirstGadget;
899 while (gad && gad->GadgetID != iwt->iwt_MoveGadId)
900 gad = gad->NextGadget;
903 if (gad)
905 WORD gadLeft, gadTop, gadWidth, gadHeight;
907 gadLeft = gad->LeftEdge;
908 if (gad->Flags & GFLG_RELRIGHT)
909 gadLeft += iwt->iwt_WindowTask.wt_Window->Width;
911 gadTop = gad->TopEdge;
912 if (gad->Flags & GFLG_RELBOTTOM)
913 gadTop += iwt->iwt_WindowTask.wt_Window->Height;
915 gadWidth = gad->Width;
916 if (gad->Flags & GFLG_RELWIDTH)
917 gadWidth += iwt->iwt_WindowTask.wt_Window->Width;
919 gadHeight = gad->Height;
920 if (gad->Flags & GFLG_RELHEIGHT)
921 gadHeight += iwt->iwt_WindowTask.wt_Window->Height;
923 if (iwt->iwt_WindowTask.wt_Window->MouseX >= gadLeft
924 && iwt->iwt_WindowTask.wt_Window->MouseX < gadLeft + gadWidth
925 && iwt->iwt_WindowTask.wt_Window->MouseY >= gadTop
926 && iwt->iwt_WindowTask.wt_Window->MouseY < gadTop + gadHeight)
928 switch (iwt->iwt_MoveGadId)
930 case GADGETID_RIGHTBUTTON:
931 ArrowRight(iwt, iMsg);
932 break;
933 case GADGETID_LEFTBUTTON:
934 ArrowLeft(iwt, iMsg);
935 break;
936 case GADGETID_DOWNBUTTON:
937 ArrowDown(iwt, iMsg);
938 break;
939 case GADGETID_UPBUTTON:
940 ArrowUp(iwt, iMsg);
941 break;
946 else
948 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags);
950 break;
953 return 0;
957 static ULONG IDCMPChangeWindow(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
959 d1(KPrintF("%s/%s/%ld: START iwt=%08lx <%s> IDCMPWindow=%08lx\n", \
960 __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle, iMsg->IDCMPWindow));
961 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%ld IAddress=%08lx\n", \
962 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->IAddress));
964 if (CWCODE_MOVESIZE == iMsg->Code)
966 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_ChangeWindow);
968 #if defined(__MORPHOS__)
969 else if (2 == iMsg->Code)
971 // MorphOS 2.3 "Enhanced Display Engine" special
972 // dynmic window resizing generates tons of this msg
973 // and application is reponsible to actually change the window size
974 WORD WinX = ((ULONG) iMsg->IAddress) >> 16;
975 WORD WinY = ((ULONG) iMsg->IAddress) & 0x0000ffff;
976 UWORD NewWidth, NewHeight;
978 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%ld IAddress=%08lx MouseX=%ld MouseY=%ld\n", \
979 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->IAddress,\
980 iMsg->MouseX, iMsg->MouseY));
982 NewWidth = iMsg->MouseX - WinX;
983 NewHeight = iMsg->MouseY - WinY;
985 d1(KPrintF("%s/%s/%ld: NewWidth=%ld NewHeight=%ld\n", __FILE__, __FUNC__, __LINE__, NewWidth, NewHeight));
987 if ((abs(NewWidth - iwt->iwt_WindowTask.wt_Window->Width) > 2) ||
988 (abs(NewHeight - iwt->iwt_WindowTask.wt_Window->Height) > 2) )
990 ChangeWindowBox(iwt->iwt_WindowTask.wt_Window,
991 WinX, WinY,
992 NewWidth,
993 NewHeight);
996 else if (3 == iMsg->Code)
998 // MorphOS 2.3 "Enhanced Display Engine" special
999 // LMB has been released - end of window sizing
1000 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%ld IAddress=%08lx MouseX=%ld MouseY=%ld\n", \
1001 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->IAddress,\
1002 iMsg->MouseX, iMsg->MouseY));
1004 #endif //defined(__MORPHOS__)
1006 return 0;
1010 static ULONG IDCMPNewSize(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1012 d1(KPrintF("%s/%s/%ld: START iwt=%08lx <%s> IDCMPWindow=%08lx Code=%04lx\n", \
1013 __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle, iMsg->IDCMPWindow, iMsg->Code));
1015 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_Width != iMsg->IDCMPWindow->Width ||
1016 iwt->iwt_WindowTask.mt_WindowStruct->ws_Height != iMsg->IDCMPWindow->Height)
1018 WORD OldInnerWidth = iwt->iwt_InnerWidth;
1019 WORD OldInnerHeight = iwt->iwt_InnerHeight;
1021 d1(KPrintF("%s/%s/%ld: iw=%ld ih=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerWidth, iwt->iwt_InnerHeight));
1023 RefreshWindowFrame(iwt->iwt_WindowTask.wt_Window);
1025 // Calculate new inner window sizes
1026 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_SetInnerSize);
1028 d1(KPrintF("%s/%s/%ld: iw=%ld ih=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerWidth, iwt->iwt_InnerHeight));
1030 RedrawResizedWindow(iwt, OldInnerWidth, OldInnerHeight);
1032 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_DynamicResize);
1035 d1(KPrintF("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
1037 return 0;
1041 static ULONG IDCMPGadgetHelp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1043 struct Gadget *gg = (struct Gadget *) iMsg->IAddress;
1045 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%04lx Qual=%04lx IAddress=%08lx\n", \
1046 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->Qualifier, iMsg->IAddress));
1048 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetTextHook = NULL;
1049 iInfos.xii_GlobalGadgetUnderPointer.ggd_iwt = iwt;
1050 iInfos.xii_GlobalGadgetUnderPointer.ggd_Gadget = gg;
1052 if (NULL == gg)
1054 d1(KPrintF("%s/%s/%ld: GadgetHelp Window\n", __FILE__, __FUNC__, __LINE__));
1055 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_unknown;
1057 else if (gg == iwt->iwt_PropBottom)
1059 d1(KPrintF("%s/%s/%ld: GadgetHelp PropBottom\n", __FILE__, __FUNC__, __LINE__));
1060 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_BottomScroller;
1062 else if (gg == iwt->iwt_PropSide)
1064 d1(KPrintF("%s/%s/%ld: GadgetHelp PropSide\n", __FILE__, __FUNC__, __LINE__));
1065 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_RightScroller;
1067 else if (gg == iwt->iwt_GadgetRightArrow)
1069 d1(KPrintF("%s/%s/%ld: GadgetHelp GadgetRightArrow\n", __FILE__, __FUNC__, __LINE__));
1070 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_RightArrow;
1072 else if (gg == iwt->iwt_GadgetLeftArrow)
1074 d1(KPrintF("%s/%s/%ld: GadgetHelp GadgetLeftArrow\n", __FILE__, __FUNC__, __LINE__));
1075 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_LeftArrow;
1077 else if (gg == iwt->iwt_GadgetDownArrow)
1079 d1(KPrintF("%s/%s/%ld: GadgetHelp GadgetDownArrow\n", __FILE__, __FUNC__, __LINE__));
1080 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_DownArrow;
1082 else if (gg == iwt->iwt_GadgetUpArrow)
1084 d1(KPrintF("%s/%s/%ld: GadgetHelp GadgetUpArrow\n", __FILE__, __FUNC__, __LINE__));
1085 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_UpArrow;
1087 else if (gg == iwt->iwt_IconifyGadget)
1089 d1(KPrintF("%s/%s/%ld: GadgetHelp Iconify\n", __FILE__, __FUNC__, __LINE__));
1090 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_Iconify;
1092 else if (gg == iwt->iwt_StatusBar)
1094 UWORD Code = iMsg->Code;
1096 d1(KPrintF("%s/%s/%ld: GadgetHelp StatusBar Code=%04lx\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
1098 if (GADGETID_STATUSBAR == Code)
1100 Code = StatusBarQueryGadgetID(iwt, (struct ExtGadget *) gg, iMsg->MouseX, iMsg->MouseY);
1101 d1(KPrintF("%s/%s/%ld: Code=%04lx\n", __FILE__, __FUNC__, __LINE__, Code));
1104 switch (Code)
1106 case SBAR_GadgetID_Text:
1107 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar Text\n", __FILE__, __FUNC__, __LINE__));
1108 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_Text;
1109 break;
1110 case SBAR_GadgetID_PadLock:
1111 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar Padlock\n", __FILE__, __FUNC__, __LINE__));
1112 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_ReadOnly;
1113 break;
1114 case SBAR_GadgetID_Reading:
1115 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar Reading\n", __FILE__, __FUNC__, __LINE__));
1116 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_Reading;
1117 break;
1118 case SBAR_GadgetID_Typing:
1119 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar Typing\n", __FILE__, __FUNC__, __LINE__));
1120 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_Typing;
1121 break;
1122 case SBAR_GadgetID_ShowAll:
1123 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar ShowAll\n", __FILE__, __FUNC__, __LINE__));
1124 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_ShowAll;
1125 break;
1126 case SBAR_GadgetID_ThumbnailsAlways:
1127 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar ThumbnailsAlways\n", __FILE__, __FUNC__, __LINE__));
1128 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_ThumbnailsAlways;
1129 break;
1130 case SBAR_GadgetID_ThumbnailsAsDefault:
1131 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar ThumbnailsAsDefault\n", __FILE__, __FUNC__, __LINE__));
1132 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_ThumbnailsAsDefault;
1133 break;
1134 case SBAR_GadgetID_ThumbnailsGenerate:
1135 d1(kprintf("%s/%s/%ld: GadgetHelp StatusBar ThumbnailsGenerate\n", __FILE__, __FUNC__, __LINE__));
1136 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_StatusBar_ThumbnailsGenerate;
1137 break;
1139 default:
1140 d1(KPrintF("%s/%s/%ld: unknown StatusBar GadgetID=%ld\n", __FILE__, __FUNC__, __LINE__, Code));
1141 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_unknown;
1142 break;
1145 else if (gg == iwt->iwt_ControlBar)
1147 UWORD Code = iMsg->Code;
1149 d1(KPrintF("%s/%s/%ld: GadgetHelp ControlBar Code=%04lx\n", __FILE__, __FUNC__, __LINE__, iMsg->Code));
1151 if (GADGETID_CONTROLBAR == Code)
1153 iInfos.xii_GlobalGadgetUnderPointer.ggd_cgy = ControlBarFindGadgetByID(iwt,
1154 StatusBarQueryGadgetID(iwt, (struct ExtGadget *)gg, iMsg->MouseX, iMsg->MouseY));
1155 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_ControlBar;
1156 d1(KPrintF("%s/%s/%ld: Code=%04lx\n", __FILE__, __FUNC__, __LINE__, Code));
1159 else
1161 d1(KPrintF("%s/%s/%ld: Reading=%08lx Typing=%08lx Text=%08lx ReadAll=%08lx\n", \
1162 __FILE__, __FUNC__, __LINE__, iwt->iwt_StatusBarMembers[STATUSBARGADGET_Reading], \
1163 iwt->iwt_StatusBarMembers[STATUSBARGADGET_Typing],\
1164 iwt->iwt_StatusBarMembers[STATUSBARGADGET_StatusText], \
1165 iwt->iwt_StatusBarMembers[STATUSBARGADGET_ShowAll]));
1167 d1(KPrintF("%s/%s/%ld: GadgetHelp gg=%08lx\n", __FILE__, __FUNC__, __LINE__));
1169 iInfos.xii_GlobalGadgetUnderPointer.ggd_GadgetID = SGTT_GADGETID_unknown;
1172 return 0;
1176 #if defined(IDCMP_EXTENDEDMOUSE)
1177 static ULONG IDCMPExtendedMouse(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1179 const struct IntuiWheelData *iwd;
1180 ULONG n;
1181 struct IntuiMessage imc;
1183 d1(KPrintF("%s/%s/%ld: Class=%08lx Code=%04lx Qual=%04lx IAddress=%08lx\n", \
1184 __FILE__, __FUNC__, __LINE__, iMsg->Class, iMsg->Code, iMsg->Qualifier, iMsg->IAddress));
1186 iwd = (const struct IntuiWheelData *) iMsg->IAddress;
1188 d1(KPrintF("%s/%s/%ld: WheelX=%ld WheelY=%ld\n", \
1189 __FILE__, __FUNC__, __LINE__, iwd->WheelX, iwd->WheelY));
1191 imc.Class = IDCMP_RAWKEY;
1192 imc.Qualifier = iMsg->Qualifier;
1193 imc.IAddress = NULL;
1194 imc.MouseX = iMsg->MouseX;
1195 imc.MouseY = iMsg->MouseY;
1197 if (iwd->WheelX < 0)
1199 imc.Code = NM_WHEEL_LEFT;
1200 for (n = 0; n < -iwd->WheelX; n++)
1202 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_RawKey, &imc);
1205 else if (iwd->WheelX > 0)
1207 imc.Code = NM_WHEEL_RIGHT;
1208 for (n = 0; n < iwd->WheelX; n++)
1210 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_RawKey, &imc);
1213 if (iwd->WheelY < 0)
1215 imc.Code = NM_WHEEL_UP;
1216 for (n = 0; n < -iwd->WheelY; n++)
1218 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_RawKey, &imc);
1221 else if (iwd->WheelY > 0)
1223 imc.Code = NM_WHEEL_DOWN;
1224 for (n = 0; n < iwd->WheelY; n++)
1226 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_RawKey, &imc);
1230 return 0;
1232 #endif //defined(IDCMP_EXTENDEDMOUSE)
1235 static void ArrowRight(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1237 LONG deltaX;
1239 if (iMsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1240 deltaX = 1;
1241 else
1242 // deltaX = (iwt->iwt_InnerWidth + 11) / 12;
1243 deltaX = 10;
1245 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, deltaX, 0);
1246 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustBottomSlider);
1250 static void ArrowLeft(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1252 LONG deltaX;
1254 if (iMsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1255 deltaX = -1;
1256 else
1257 // deltaX = -(iwt->iwt_InnerWidth + 11) / 12;
1258 deltaX = -10;
1260 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, deltaX, 0);
1261 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustBottomSlider);
1265 static void ArrowDown(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1267 LONG deltaY;
1269 if (iMsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1270 deltaY = 1;
1271 else
1272 // deltaY = (iwt->iwt_InnerHeight + 11) / 12;
1273 deltaY = 10;
1275 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, 0, deltaY);
1276 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustRightSlider);
1280 static void ArrowUp(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1282 LONG deltaY;
1284 if (iMsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1285 deltaY = -1;
1286 else
1287 // deltaY = -(iwt->iwt_InnerHeight + 11) / 12;
1288 deltaY = -10;
1290 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, 0, deltaY);
1291 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, SETVIRTF_AdjustRightSlider);
1295 static void SetPropBottom(struct internalScaWindowTask *iwt)
1297 IPTR Top;
1299 GetAttr(PGA_Top, (Object *) iwt->iwt_PropBottom, &Top);
1301 Top = (Top << iwt->iwt_BottomScrollerScale) + iwt->iwt_MinX;
1303 if (Top != iwt->iwt_WindowTask.wt_XOffset)
1305 if (ScalosAttemptLockIconListShared(iwt))
1307 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, Top - iwt->iwt_WindowTask.wt_XOffset, 0);
1308 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, 0);
1309 ScalosUnLockIconList(iwt);
1311 else
1313 struct SM_DeltaMove *smdm;
1315 smdm = (struct SM_DeltaMove *) SCA_AllocMessage(MTYP_DeltaMove, 0);
1317 if (smdm)
1319 smdm->smdm_DeltaX = Top - iwt->iwt_WindowTask.wt_XOffset;
1320 smdm->smdm_DeltaY = 0;
1321 smdm->smdm_AdjustSlider = 0;
1323 PutMsg(iwt->iwt_WindowTask.mt_WindowStruct->ws_MessagePort, &smdm->ScalosMessage.sm_Message);
1330 static void SetPropSide(struct internalScaWindowTask *iwt)
1332 IPTR Top;
1334 GetAttr(PGA_Top, (Object *) iwt->iwt_PropSide, &Top);
1336 Top = (Top << iwt->iwt_SideScrollerScale) + iwt->iwt_MinY;
1338 if (Top != iwt->iwt_WindowTask.wt_YOffset)
1340 if (ScalosAttemptLockIconListShared(iwt))
1342 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DeltaMove, 0, Top - iwt->iwt_WindowTask.wt_YOffset);
1343 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_SetVirtSize, 0);
1344 ScalosUnLockIconList(iwt);
1346 else
1348 struct SM_DeltaMove *smdm;
1350 smdm = (struct SM_DeltaMove *) SCA_AllocMessage(MTYP_DeltaMove, 0);
1352 if (smdm)
1354 smdm->smdm_DeltaX = 0;
1355 smdm->smdm_DeltaY = Top - iwt->iwt_WindowTask.wt_YOffset;
1356 smdm->smdm_AdjustSlider = 0;
1358 PutMsg(iwt->iwt_WindowTask.mt_WindowStruct->ws_MessagePort, &smdm->ScalosMessage.sm_Message);
1365 static void MousePress(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1367 d1(KPrintF("%s/%s/%ld: START iwt_MoveGadId=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_MoveGadId));
1369 if (VGADGETID_IDLE == iwt->iwt_MoveGadId)
1371 struct ScaIconNode *in;
1373 ResetToolTips(iwt);
1375 SCA_ScreenTitleMsg(NULL, NULL);
1377 if (ScalosAttemptLockIconListShared(iwt))
1379 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1381 in = CheckMouseIcon(&iwt->iwt_WindowTask.wt_IconList, iwt,
1382 iMsg->MouseX - iwt->iwt_InnerLeft + iwt->iwt_WindowTask.wt_XOffset,
1383 iMsg->MouseY - iwt->iwt_InnerTop + iwt->iwt_WindowTask.wt_YOffset);
1385 d1(KPrintF("%s/%s/%ld: in=%08lx\n", __FILE__, __FUNC__, __LINE__, in));
1386 if (in)
1388 struct ExtGadget *gg = (struct ExtGadget *) in->in_Icon;
1389 struct ExtGadget *ggLast = (struct ExtGadget *) iwt->iwt_LastIcon;
1391 if (gg == ggLast
1392 && gg->LeftEdge == iwt->iwt_LastPos.X
1393 && gg->TopEdge == iwt->iwt_LastPos.Y
1394 && DoubleClick(iwt->iwt_LastTime.tv_secs, iwt->iwt_LastTime.tv_micro,
1395 iMsg->Seconds, iMsg->Micros))
1397 // double-click on icon
1398 iwt->iwt_LastIcon = NULL;
1400 d1(KPrintF("%s/%s/%ld: double-click on icon\n", __FILE__, __FUNC__, __LINE__));
1402 // icon doesn' stay selected after double click
1403 OldIconsOff(iwt, NULL, iwt->iwt_WindowTask.wt_XOffset,
1404 iwt->iwt_WindowTask.wt_YOffset, iMsg->Qualifier, CurrentPrefs.pref_EasyMultiselectFlag);
1406 ScalosUnLockIconList(iwt);
1407 SetMenuOnOff(iwt);
1409 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_Open, in, 0L);
1411 else
1413 BOOL select = TRUE;
1415 d1(KPrintF("%s/%s/%ld: iwt=%08lx <%s> wt_Window=%08lx\n", \
1416 __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle, iwt->iwt_WindowTask.wt_Window));
1418 if (CurrentPrefs.pref_EasyMultiselectFlag || (iMsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
1420 // +jl+ 20010318 toggle selection
1421 select = !(gg->Flags & GFLG_SELECTED);
1424 if (!CurrentPrefs.pref_EasyMultiselectFlag)
1426 OldIconsOff(iwt, in->in_Icon, iwt->iwt_WindowTask.wt_XOffset,
1427 iwt->iwt_WindowTask.wt_YOffset, iMsg->Qualifier, CurrentPrefs.pref_EasyMultiDragFlag);
1430 ClassSelectIcon(iwt->iwt_WindowTask.mt_WindowStruct, in, select);
1431 AdjustIconActive(iwt);
1433 iwt->iwt_LastIcon = in->in_Icon;
1435 iwt->iwt_LastPos.X = gg->LeftEdge;
1436 iwt->iwt_LastPos.Y = gg->TopEdge;
1438 iwt->iwt_LastTime.tv_secs = iMsg->Seconds;
1439 iwt->iwt_LastTime.tv_micro = iMsg->Micros;
1441 iwt->iwt_OldMouse.X = iMsg->MouseX;
1442 iwt->iwt_OldMouse.Y = iMsg->MouseY;
1444 iwt->iwt_MoveGadId = VGADGETID_WAITFORDRAG;
1445 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_MOUSEMOVE);
1447 ScalosUnLockIconList(iwt);
1448 SetMenuOnOff(iwt);
1451 else
1453 struct Region *oldClipRegion;
1455 iwt->iwt_LastIcon = NULL;
1457 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1459 oldClipRegion = (struct Region *) DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_InitClipRegion);
1461 OldIconsOff(iwt, NULL, iwt->iwt_WindowTask.wt_XOffset,
1462 iwt->iwt_WindowTask.wt_YOffset, iMsg->Qualifier, CurrentPrefs.pref_EasyMultiselectFlag);
1464 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_RemClipRegion, oldClipRegion);
1466 iwt->iwt_MoveGadId = VGADGETID_LASSO;
1468 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS | IDCMP_MOUSEMOVE);
1470 iwt->iwt_LockFlag = TRUE;
1471 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags |= WSV_FlagF_NeedsTimerMsg;
1473 iwt->iwt_OldMouse.X = iMsg->MouseX;
1474 iwt->iwt_OldMouse.Y = iMsg->MouseY;
1476 ScalosUnLockIconList(iwt);
1477 SetMenuOnOff(iwt);
1481 d1(KPrintF("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
1485 static void MouseRelease(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1487 d1(KPrintF( "%s/%s/%ld: START iwt_MoveGadId=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_MoveGadId));
1489 if (iwt->iwt_MoveGadId)
1491 BOOL DragDrop = FALSE;
1492 T_TIMEVAL ClickDelay;
1494 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags);
1496 switch (iwt->iwt_MoveGadId)
1498 case VGADGETID_WAITFORDRAG:
1499 d1(KPrintF( "%s/%s/%ld: VGADGETID_WAITFORDRAG\n", __FILE__, __FUNC__, __LINE__));
1500 break;
1502 case VGADGETID_DRAGMOUSEMOVE:
1503 EndDrag(iwt);
1505 ClickDelay.tv_secs = iMsg->Seconds - iwt->iwt_LastTime.tv_secs;
1506 ClickDelay.tv_micro = iMsg->Micros - iwt->iwt_LastTime.tv_micro;
1507 if (iMsg->Micros < iwt->iwt_LastTime.tv_micro)
1509 ClickDelay.tv_micro += 1000000;
1510 ClickDelay.tv_secs += 1;
1513 if (((ClickDelay.tv_secs > CurrentPrefs.pref_ClickDelay.tv_secs) ||
1514 (((ClickDelay.tv_secs == CurrentPrefs.pref_ClickDelay.tv_secs) && (ClickDelay.tv_micro > CurrentPrefs.pref_ClickDelay.tv_micro))
1515 && (iwt->iwt_OldMouse.X != iMsg->MouseX || iwt->iwt_OldMouse.Y != iMsg->MouseY))))
1517 struct Layer *MouseLayer;
1519 MouseLayer = WhichLayer(iwt->iwt_WindowTask.wt_Window->WLayer->LayerInfo,
1520 iMsg->MouseX + iwt->iwt_WindowTask.wt_Window->LeftEdge,
1521 iMsg->MouseY + iwt->iwt_WindowTask.wt_Window->TopEdge);
1523 if (MouseLayer && MouseLayer->Window)
1525 DragDrop = TRUE;
1526 DoMethod(iwt->iwt_WindowTask.mt_MainObject, SCCM_IconWin_DragDrop,
1527 MouseLayer->Window, iMsg->MouseX, iMsg->MouseY, iMsg->Qualifier);
1531 if (!DragDrop)
1533 IconWin_EndDrag(iwt);
1534 RestoreDragIcons(iwt);
1537 EndDragUnlock(iwt);
1538 break;
1540 case VGADGETID_LASSO:
1541 d1(KPrintF( "%s/%s/%ld: VGADGETID_LASSO\n", __FILE__, __FUNC__, __LINE__));
1542 EndLasso(iwt);
1543 d1(KPrintF( "%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1544 SetMenuOnOff(iwt);
1545 d1(KPrintF( "%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1548 iwt->iwt_MoveGadId = VGADGETID_IDLE;
1549 iwt->iwt_LockFlag = FALSE;
1551 if (!iwt->iwt_NeedsTimerFlag)
1552 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags &= ~WSV_FlagF_NeedsTimerMsg;
1554 d1(KPrintF( "%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
1558 void AbortFunctions(struct internalScaWindowTask *iwt)
1560 d1(kprintf("%s/%s/%ld: iwt_MoveGadId=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_MoveGadId));
1562 switch (iwt->iwt_MoveGadId)
1564 case VGADGETID_DRAGMOUSEMOVE:
1565 ClosePopupWindows(TRUE);
1566 EndDrag(iwt);
1567 IconWin_EndDrag(iwt);
1568 RestoreDragIcons(iwt);
1570 EndDragUnlock(iwt);
1572 if (iwt->iwt_LastIcon)
1574 ClassSelectIconObj(iwt->iwt_WindowTask.mt_WindowStruct, iwt->iwt_LastIcon, FALSE);
1575 iwt->iwt_LastIcon = NULL;
1577 break;
1579 case VGADGETID_LASSO:
1580 EndLasso(iwt);
1581 break;
1583 default:
1584 break;
1587 iwt->iwt_MoveGadId = VGADGETID_IDLE;
1588 iwt->iwt_LockFlag = FALSE;
1590 if (iwt->iwt_NeedsTimerFlag)
1591 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags &= ~WSV_FlagF_NeedsTimerMsg;
1593 AdjustIconActive(iwt);
1594 SetMenuOnOff(iwt);
1596 d1(kprintf("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
1600 void RemoveDeviceIcon(struct internalScaWindowTask *iwt, struct ScaDeviceIcon *di,
1601 struct ScaIconNode **DeleteableIconList)
1603 struct ScaIconNode *in, *inNext;
1605 ScalosLockIconListExclusive(iwt);
1607 d1(kprintf("%s/%s/%ld: Remove DeviceIcon <%s>\n", __FILE__, __FUNC__, __LINE__, di->di_Device));
1609 d1(\
1611 struct ScaIconNode *in;
1613 kprintf("%s/%s/%ld: --------start----------\n", __FILE__, __FUNC__, __LINE__);
1615 for (in=iwt->iwt_WindowTask.wt_IconList; in; in=(struct ScaIconNode *) in->in_Node.mln_Succ)
1616 kprintf("%s/%s/%ld: in=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in, GetIconName(in));
1618 kprintf("%s/%s/%ld: ---------end----------\n", __FILE__, __FUNC__, __LINE__);
1621 d1(kprintf("%s/%s/%ld:\n", __FILE__, __FUNC__, __LINE__));
1623 for (in = iwt->iwt_WindowTask.wt_IconList; in; in = inNext)
1625 inNext = (struct ScaIconNode *) in->in_Node.mln_Succ;
1627 if (in->in_Icon == di->di_Icon)
1629 struct ScaBackdropIcon *sbi;
1631 d1(kprintf("%s/%s/%ld: Found in=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in, GetIconName(in)));
1632 d1(kprintf("%s/%s/%ld: innext=%08lx IconList=%08lx\n", __FILE__, __FUNC__, __LINE__, inNext, in->in_IconList));
1634 SCA_MoveIconNode(&iwt->iwt_WindowTask.wt_IconList, DeleteableIconList, in);
1636 for (sbi=in->in_IconList; sbi; sbi = (struct ScaBackdropIcon *) sbi->sbi_Node.mln_Succ)
1638 struct ScaIconNode *in2, *in2Next;
1640 d1(kprintf("%s/%s/%ld: sbi=%08lx\n", __FILE__, __FUNC__, __LINE__, sbi));
1642 for (in2=iwt->iwt_WindowTask.wt_IconList; in2; in2=in2Next)
1644 in2Next = (struct ScaIconNode *) in2->in_Node.mln_Succ;
1646 if (in2->in_Icon == sbi->sbi_Icon)
1648 // move <in2> to <DeleteableIconList>
1649 d1(kprintf("%s/%s/%ld: in2next=%08lx\n", __FILE__, __FUNC__, __LINE__, in2Next));
1651 if (in2 == inNext)
1652 inNext = (struct ScaIconNode *) in2->in_Node.mln_Succ;
1654 d1(kprintf("%s/%s/%ld: Found in2=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in2, GetIconName(in2)));
1655 SCA_MoveIconNode(&iwt->iwt_WindowTask.wt_IconList, DeleteableIconList, in2);
1656 break;
1661 in->in_DeviceIcon = NULL;
1663 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1665 FreeBackdropIconList(&in->in_IconList);
1667 DoMethod(iwt->iwt_DevListObject, SCCM_DeviceList_FreeDevNode, di);
1669 SCA_FreeNode((struct ScalosNodeList *) &iwt->iwt_DevIconList, &di->di_Node);
1673 d1(\
1675 struct ScaIconNode *in;
1677 kprintf("%s/%s/%ld: --------start----------\n", __FILE__, __FUNC__, __LINE__);
1679 for (in=iwt->iwt_WindowTask.wt_IconList; in; in=(struct ScaIconNode *) in->in_Node.mln_Succ)
1680 kprintf("%s/%s/%ld: in=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in, GetIconName(in));
1682 kprintf("%s/%s/%ld: ---------end----------\n", __FILE__, __FUNC__, __LINE__);
1685 ScalosUnLockIconList(iwt);
1689 static void OldIconsOff(struct internalScaWindowTask *iwt, Object *IconObj,
1690 LONG XOffset, LONG YOffset, UWORD Qualifier, BOOL KeepSelected)
1692 struct ExtGadget *gg = (struct ExtGadget *) IconObj;
1693 struct ScaWindowStruct *ws;
1695 d1(KPrintF("%s/%s/%ld: START\n", __FILE__, __FUNC__, __LINE__));
1697 if (Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1698 return;
1700 if (KeepSelected && gg && (gg->Flags & GFLG_SELECTED))
1701 return;
1703 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1705 SCA_LockWindowList(SCA_LockWindowList_Shared);
1707 for (ws=winlist.wl_WindowStruct; ws; ws = (struct ScaWindowStruct *) ws->ws_Node.mln_Succ)
1709 struct internalScaWindowTask *iwtx = (struct internalScaWindowTask *) ws->ws_WindowTask;
1711 if (iwtx->iwt_WindowTask.wt_Window)
1713 if (ScalosAttemptLockIconListShared(iwtx))
1715 struct Region *oldClipRegion = NULL;
1716 BOOL ClipRegionSet = FALSE;
1717 struct ScaIconNode *in;
1719 for (in=iwtx->iwt_WindowTask.wt_IconList; in; in = (struct ScaIconNode *) in->in_Node.mln_Succ)
1721 if (in->in_Icon != IconObj)
1723 if (!ClipRegionSet)
1725 oldClipRegion = (struct Region *) DoMethod(iwtx->iwt_WindowTask.mt_WindowObject, SCCM_Window_InitClipRegion);
1726 ClipRegionSet = TRUE;
1729 ClassSelectIcon(ws, in, FALSE);
1733 if (ClipRegionSet)
1734 DoMethod(iwtx->iwt_WindowTask.mt_WindowObject, SCCM_Window_RemClipRegion, oldClipRegion);
1736 ScalosUnLockIconList(iwtx);
1739 AdjustIconActive(iwtx);
1742 SCA_UnLockWindowList();
1744 AdjustIconActive(iwt);
1748 static LONG SafeStrCmp(CONST_STRPTR str1, CONST_STRPTR str2)
1750 if (str1 && str2)
1751 return strcmp(str1, str2);
1753 if (NULL == str1 && NULL == str2)
1754 return 0;
1756 return 1;
1760 static void IDCMPBeginDrag(struct internalScaWindowTask *iwt, struct IntuiMessage *iMsg)
1762 d1(KPrintF("%s/%s/%ld: START\n", __FILE__, __FUNC__, __LINE__));
1764 if (abs(iwt->iwt_OldMouse.X - iMsg->MouseX) +
1765 abs(iwt->iwt_OldMouse.Y - iMsg->MouseY) > 2)
1767 // mouse has been moved with LMB pressed, so we assume user wants to start dragging an icon
1768 d1(KPrintF("%s/%s/%ld: mouse moved\n", __FILE__, __FUNC__, __LINE__));
1770 if (ScalosAttemptLockIconListExclusive(iwt))
1772 struct ScaIconNode *in;
1774 in = CheckMouseIcon(&iwt->iwt_WindowTask.wt_IconList, iwt,
1775 iwt->iwt_OldMouse.X - iwt->iwt_InnerLeft + iwt->iwt_WindowTask.wt_XOffset,
1776 iwt->iwt_OldMouse.Y - iwt->iwt_InnerTop + iwt->iwt_WindowTask.wt_YOffset);
1778 d1(KPrintF("%s/%s/%ld: in=%08lx\n", __FILE__, __FUNC__, __LINE__, in));
1779 if (in)
1781 struct ExtGadget *gg = (struct ExtGadget *) in->in_Icon;
1783 d1(KPrintF("%s/%s/%ld: SelectRender=%08lx\n", __FILE__, __FUNC__, __LINE__, gg->SelectRender));
1784 if (gg->SelectRender)
1786 iwt->iwt_MoveGadId = VGADGETID_DRAGMOUSEMOVE;
1787 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1789 ModifyIDCMP(iwt->iwt_WindowTask.wt_Window, iwt->iwt_IDCMPFlags | IDCMP_INTUITICKS | IDCMP_MOUSEMOVE);
1791 iwt->iwt_LockFlag = TRUE;
1792 iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags |= WSV_FlagF_NeedsTimerMsg;
1794 iwt->iwt_DragFlags = 0;
1796 InitDrag(iMsg, iwt);
1798 // Keep icon list locked (ahared!) until EndDrag()
1799 ScalosUnLockIconList(iwt);
1800 ScalosLockIconListShared(iwt);
1802 else
1804 ScalosUnLockIconList(iwt);
1807 else
1809 // no icon present, leave VGADGETID_WAITFORDRAG state
1810 iwt->iwt_MoveGadId = VGADGETID_IDLE;
1811 ScalosUnLockIconList(iwt);
1815 d1(KPrintF("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));