Updated PCI IDs to latest snapshot.
[tangerine.git] / rom / intuition / propgclass.c
blobeecc14fcfa0f7615cff0f8a80878d9f4f4bfae69
1 /*
2 Copyright 1995-2005, The AROS Development Team. All rights reserved.
3 Copyright 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include <exec/types.h>
9 #include <proto/intuition.h>
10 #include <proto/graphics.h>
11 #include <proto/utility.h>
12 #include <intuition/intuition.h>
13 #include <intuition/classes.h>
14 #include <intuition/classusr.h>
15 #include <intuition/gadgetclass.h>
16 #include <intuition/cghooks.h>
17 #include <graphics/clip.h>
18 #include <aros/asmcall.h>
19 #include <string.h>
21 #define DEBUG 0
22 #include <aros/debug.h>
24 #include "intuition_intern.h"
25 #include "inputhandler.h"
26 #include "propgadgets.h"
28 #define DEBUG_PROP(x) ;
30 #ifdef PROPHACK
31 void PropRefreshTask(struct IntuitionBase *IntuitionBase,struct Gadget *gadget,struct Window *window,struct Requester *requester)
33 ULONG signals;
35 for (;;)
37 signals = Wait(PSIG_REFRESHALL|PSIG_DIE);
39 //go_inactive refreshes the gadget on it's own, so we do not need to care about queued refreshes!
40 if (signals & PSIG_DIE)
42 Forbid();
43 ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask = 0;
44 Permit();
45 Signal(((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->InputDeviceTask,SIGF_INTUITION);
46 return;
49 if (signals & PSIG_REFRESHALL)
51 RefreshPropGadget (gadget, window, requester, IntuitionBase);
54 //no need to refresh the knob when whole gadget was refreshed already
55 //if ((signals & PSIG_REFRESHKNOB) && (!(signals & PSIG_REFRESHALL)))
56 //{
57 //}
61 #endif
63 /*****************************************************************************************
65 stegerg: Tested behaviour under AmigaOS:
67 propgclass object:
68 renders itself during OM_SET(PGA_Top) : yes, method retval = 0
69 renders itself during OM_UPDATE(PGA_Top) : yes, method retval = 0
70 sends OM_NOTIFY during OM_SET(PGA_Top) : no
71 sends OM_NOTIFY during OM_UPDATE(PGA_Top): no
72 sends OM_NOTIFY when user drags knob : yes
74 -> only when user uses gadget, OM_NOTIFY is sent
76 propgclass subclass object:
77 renders itself during OM_SET(PGA_Top) : no, method retval = 1 [*]
78 renders itself during OM_UPDATE(PGA_Top) : no, method retval = 1 [*]
79 sends OM_NOTIFY during OM_SET(PGA_Top) : no
80 sends OM_NOTIFY during OM_UPDATE(PGA_Top): no
81 sends OM_NOTIFY when user drags knob : yes
83 Here [*], another weird behaviour is, that the ~internal (??) PGA_Top value
84 stays at the old value, so you can click at the knob where you see it
85 (although because of the real PGA_Top it could in reality be in some
86 completely different place) and use it. Only when the gadget is re-rendered
87 (completely?), or you click somewhere in the prop box to cause a ~one page knob
88 move, the ~internal PGA_Top gets updated to the real value. Note, that
89 GetAttr(PGA_Top) will always be correct, so when I say ~internal PGA_Top,
90 this must be some internal variable only for inputhandling of gadget!!
91 BTW: With PGA_Total (and most likely also PGA_Visible) it's exactly the
92 same: imagine before the OM_SET/OM_UPDATE the prop knob was 10 % of the
93 size of the prop box. And after the OM_SET/OM_UPDATE(PGA_Total) the prop knob
94 would be 50 % of the size of the prop box -> again - before a rerendering of
95 the gadget happens, or a jump-one-page click by user - the gadget behaves
96 like it was still having the old PGA_Total value (-> knob size == 10 % of
97 prop box).
99 AROS propgclass at the moment does not copy this behaviour!!!!
101 *****************************************************************************************/
103 #undef IntuitionBase
104 #define IntuitionBase ((struct IntuitionBase *)(cl->cl_UserData))
106 /****************************************************************************************/
108 #define SetGadgetType(gad, type) ((struct Gadget *)gad)->GadgetType &= ~GTYP_GTYPEMASK; \
109 ((struct Gadget *)gad)->GadgetType |= type;
111 #define PRIVFLAG_NICERENDER 1
112 #define PRIVFLAG_NICENOTIFY 2
114 /****************************************************************************************/
116 static VOID FindScrollerValues(UWORD total, UWORD visible, UWORD top,
117 WORD overlap, UWORD *body, UWORD *pot)
119 UWORD hidden;
121 if (total > visible)
122 hidden = total - visible;
123 else
124 hidden = 0;
126 if (top > hidden)
127 top = hidden;
129 *body = (hidden > 0) ?
130 (UWORD)(((ULONG)(visible - overlap) * MAXBODY) / (total - overlap)) :
131 MAXBODY;
133 *pot = (hidden > 0) ? (UWORD)(((ULONG) top * MAXPOT) / hidden) : 0;
135 return;
138 /****************************************************************************************/
140 static UWORD FindScrollerTop(UWORD total, UWORD visible, UWORD pot)
142 UWORD top, hidden;
144 if (total > visible)
145 hidden = total - visible;
146 else
147 hidden = 0;
149 top = (((ULONG) hidden * pot) + (MAXPOT / 2)) / MAXPOT;
151 return (top);
154 /****************************************************************************************/
156 static VOID NotifyTop(Class *cl, struct Gadget *g, struct GadgetInfo *gi, BOOL final)
158 struct PropGData *data = INST_DATA(cl, g);
159 struct opUpdate notifymsg;
160 struct TagItem notifyattrs[3];
162 D(bug("PropGClass: NotifyTop(top=%d, final=%d)\n",
163 data->top, final));
165 notifyattrs[0].ti_Tag = PGA_Top;
166 notifyattrs[0].ti_Data = data->top;
167 notifyattrs[1].ti_Tag = GA_ID;
168 notifyattrs[1].ti_Data = g->GadgetID;
169 notifyattrs[2].ti_Tag = TAG_END;
171 notifymsg.MethodID = OM_NOTIFY;
172 notifymsg.opu_AttrList = notifyattrs;
173 notifymsg.opu_GInfo = gi;
174 notifymsg.opu_Flags = (final != FALSE) ? 0 : OPUF_INTERIM;
176 DoSuperMethodA(cl, (Object *)g, (Msg)&notifymsg);
178 return;
181 /****************************************************************************************/
183 static VOID UpdateTop(Class *cl, struct Gadget *g, struct GadgetInfo *gi, BOOL final)
185 /* Updates the PGA_Top attribute accordin to the Bofy/Pot vars.
186 ** Also triggers notifcation if PGA_Top has changed.
189 struct PropGData *data = (struct PropGData *)INST_DATA(cl, g);
190 UWORD top, pot;
192 D(bug("PropGClass: UpdateTop()\n"));
194 pot = (data->propinfo.Flags & FREEVERT) ? data->propinfo.VertPot :
195 data->propinfo.HorizPot;
197 top = FindScrollerTop(data->total, data->visible, pot);
199 D(bug("PropGClass: Found scroller top: %d, old %d\n", top, data->top));
201 /* PGA_Top changed by user ? */
202 if ((top != data->top) || final)
204 D(bug("PropGClass: top != data->top, calling NotifyTop\n"));
206 data->top = top;
208 NotifyTop(cl, g, gi, final);
211 return;
214 /****************************************************************************************/
216 #define SETFLAG(flagvar, boolvar, flag) \
217 if (boolvar) \
218 flagvar |= flag; \
219 else \
220 flagvar &= ~flag;
222 /****************************************************************************************/
224 IPTR PropGClass__OM_SET(Class *cl, struct Gadget *g, struct opSet *msg)
226 const struct TagItem *tstate;
227 struct TagItem *tag;
228 struct PropGData *data;
229 struct BBox old_knobbox;
230 struct opSet method;
231 UWORD newtop;
232 BOOL set_flag = FALSE;
233 BOOL was_disabled = FALSE;
234 BOOL full_redraw = FALSE;
235 BOOL old_knobbox_ok = FALSE;
236 IPTR retval;
238 data = INST_DATA(cl, g);
239 tstate = msg->ops_AttrList;
241 was_disabled = (g->Flags & GFLG_DISABLED) ? TRUE : FALSE;
243 method.MethodID = OM_SET;
244 method.ops_AttrList = msg->ops_AttrList;
245 method.ops_GInfo = msg->ops_GInfo;
246 retval = DoSuperMethodA(cl, (Object *)g, (Msg)&method);
248 if ( ((g->Flags & GFLG_DISABLED) ? TRUE : FALSE) != was_disabled ) full_redraw = TRUE;
250 if (msg->ops_GInfo)
252 CalcBBox (msg->ops_GInfo->gi_Window, msg->ops_GInfo->gi_Requester, g, &old_knobbox);
253 old_knobbox_ok = CalcKnobSize(g, &old_knobbox);
256 newtop = data->top; /* !! */
258 /* Set to 1 to signal visual changes */
259 while ((tag = NextTagItem(&tstate)) != NULL)
261 switch (tag->ti_Tag)
263 case PGA_Top:
264 newtop = (UWORD)tag->ti_Data;
265 /* This will be poked into data->top later below, because the
266 value might have to be adjusted. It depends on PGA_Total
267 and PGA_Visible which might be also set later in the taglist */
268 set_flag= TRUE;
269 retval += 1UL;
270 break;
272 case PGA_Visible:
273 data->visible = tag->ti_Data;
274 set_flag = TRUE;
275 retval += 1UL;
276 break;
278 case PGA_Total:
279 data->total = tag->ti_Data;
280 set_flag = TRUE;
281 retval += 1UL;
282 break;
284 /* When one of the four next ones is set, what should then happen
285 with PGA_Top, Total and Visible ?
286 For example decreasing Body could mean both a decrease of
287 Visible or an increase in Total. Which of them it is,
288 we cannot know. So we say that the PGA_xxxPot/Body
289 attrs should not be used along with Top, Total and Visible. */
291 case PGA_HorizPot:
292 data->propinfo.HorizPot = (UWORD)tag->ti_Data;
293 retval += 1UL;
294 break;
296 case PGA_HorizBody:
297 data->propinfo.HorizBody= (UWORD)tag->ti_Data;
298 retval += 1UL;
299 break;
301 case PGA_VertPot:
302 data->propinfo.VertPot = (UWORD)tag->ti_Data;
303 retval += 1UL;
304 break;
306 case PGA_VertBody:
307 data->propinfo.VertBody = (UWORD)tag->ti_Data;
308 retval += 1UL;
309 break;
311 case PGA_Freedom:
312 data->propinfo.Flags &= ~(FREEHORIZ|FREEVERT);
313 data->propinfo.Flags |= tag->ti_Data;
314 break;
316 case PGA_NewLook:
317 SETFLAG(data->propinfo.Flags, tag->ti_Data, PROPNEWLOOK);
318 break;
320 case PGA_Borderless:
321 SETFLAG(data->propinfo.Flags, tag->ti_Data, PROPBORDERLESS);
322 break;
324 case GA_Image:
325 break;
327 case GA_Border:
328 break;
330 case GA_Highlight:
331 /* Convert GADGHBOX to GADGHCOMP */
332 if (tag->ti_Data & GFLG_GADGHBOX)
334 /* Clear GADCHBOX */
335 tag->ti_Data &= ~GFLG_GADGHBOX;
336 /* Set GADGHCOMP */
337 tag->ti_Data |= GFLG_GADGHCOMP;
339 break;
342 default:
343 break;
345 } /* switch (tag->ti_Tag) */
347 } /* while ((tag = NextTagItem(&tstate)) != NULL) */
349 /* Top, Visible or Total set? */
351 if (set_flag)
353 UWORD *bodyptr, *potptr;
355 /* fix top value if necessary */
357 if (data->total > data->visible)
359 if (newtop > (data->total - data->visible))
360 newtop = data->total - data->visible;
362 else
364 newtop = 0;
367 if (data->top != newtop)
369 data->top = newtop;
370 if (data->flags & PRIVFLAG_NICENOTIFY)
372 NotifyTop(cl, g, msg->ops_GInfo, TRUE);
376 if (data->propinfo.Flags & FREEVERT)
378 bodyptr = &(data->propinfo.VertBody);
379 potptr = &(data->propinfo.VertPot);
381 else
383 bodyptr = &(data->propinfo.HorizBody);
384 potptr = &(data->propinfo.HorizPot);
387 FindScrollerValues
389 data->total,
390 data->visible,
391 data->top,
393 bodyptr,
394 potptr
399 /* The two last tests below may be redundant */
400 if ((retval || full_redraw) && (NULL != msg->ops_GInfo) &&
401 ((OCLASS(g) == cl) || (data->flags & PRIVFLAG_NICERENDER)))
403 struct RastPort *rp;
405 rp = ObtainGIRPort(msg->ops_GInfo);
406 if (NULL != rp)
408 struct gpRender method;
410 data->old_knobbox = old_knobbox_ok ? &old_knobbox : 0;
412 method.MethodID = GM_RENDER;
413 method.gpr_GInfo = msg->ops_GInfo;
414 method.gpr_RPort = rp;
415 method.gpr_Redraw = full_redraw ? GREDRAW_REDRAW : GREDRAW_UPDATE;
417 DoMethodA((Object *)g, (Msg)&method);
419 ReleaseGIRPort(rp);
421 if (!(data->flags & PRIVFLAG_NICERENDER))
423 /* retval of 1 indicates that user needs to rerender gadget
424 manually, while 0 means he does not need to do so */
425 retval = 0;
429 return (retval);
432 /****************************************************************************************/
434 IPTR PropGClass__OM_NEW(Class *cl, Object *o, struct opSet *msg)
436 struct Gadget *g = (struct Gadget *)DoSuperMethodA(cl, o, (Msg)msg);
438 D(bug("PropGClass: new %p\n", o));
440 if (g)
442 struct PropGData *data = INST_DATA(cl, g);
444 /* A hack to make the functions in propgadgets.c work
445 with this class */
446 g->SpecialInfo = &(data->propinfo);
448 /* Set some default values in the propinfo structure */
450 The instance object is cleared memory!
451 memset(&(data->propinfo), 0, sizeof (struct PropInfo));
453 data->propinfo.Flags = PROPNEWLOOK|AUTOKNOB|FREEVERT;
454 data->propinfo.VertPot = 0;
455 data->propinfo.VertBody = MAXBODY;
456 data->propinfo.HorizPot = 0;
457 data->propinfo.HorizBody = MAXBODY;
458 data->DisplayHook = GetTagData(PGA_DisplayHook, 0, msg->ops_AttrList);
459 data->top = 0;
460 data->visible = 1;
461 data->total = 1;
463 if (GetTagData(PGA_NotifyBehaviour, PG_BEHAVIOUR_COMPATIBLE, msg->ops_AttrList) ==
464 PG_BEHAVIOUR_NICE)
466 data->flags |= PRIVFLAG_NICENOTIFY;
469 if (GetTagData(PGA_RenderBehaviour, PG_BEHAVIOUR_COMPATIBLE, msg->ops_AttrList) ==
470 PG_BEHAVIOUR_NICE)
472 data->flags |= PRIVFLAG_NICERENDER;
475 SetGadgetType(g, GTYP_CUSTOMGADGET);
477 /* Handle our special tags - overrides defaults */
478 PropGClass__OM_SET(cl, g, msg);
480 } /* if (object created) */
482 return (IPTR)g;
485 /****************************************************************************************/
487 IPTR PropGClass__OM_GET(Class *cl, struct Gadget *g,struct opGet *msg)
489 struct PropGData *data;
490 IPTR retval = 1UL;
492 data = INST_DATA(cl, g);
494 switch (msg->opg_AttrID)
496 case PGA_Top:
497 *(msg->opg_Storage) = data->top;
498 break;
500 case PGA_Total:
501 *(msg->opg_Storage) = data->total;
502 break;
504 case PGA_DisplayHook:
505 *(msg->opg_Storage) = (IPTR)data->DisplayHook;
506 break;
508 case PGA_Visible:
509 *(msg->opg_Storage) = data->visible;
510 break;
512 case PGA_HorizPot:
513 *(msg->opg_Storage) = data->propinfo.HorizPot;
514 break;
516 case PGA_HorizBody:
517 *(msg->opg_Storage) = data->propinfo.HorizBody;
518 break;
520 case PGA_VertPot:
521 *(msg->opg_Storage) = data->propinfo.VertPot;
522 break;
524 case PGA_VertBody:
525 *(msg->opg_Storage) = data->propinfo.VertBody;
526 break;
528 case PGA_Freedom:
529 *(msg->opg_Storage) = data->propinfo.Flags & (FREEHORIZ|FREEVERT);
530 break;
532 default:
533 retval = DoSuperMethodA(cl, (Object *)g, (Msg)msg);
534 break;
536 return (retval);
539 /****************************************************************************************/
541 IPTR PropGClass__GM_GOACTIVE(Class *cl, struct Gadget *g, struct gpInput *msg)
543 IPTR retval = GMR_NOREUSE;
545 /* Was GOACTIVE caused by an input event ? */
546 if (msg->gpi_IEvent)
548 struct PropGData *data = INST_DATA(cl, g);
550 /* Fake a standard intuition prop gadget.
551 Of course this is a hack. */
552 SetGadgetType(g, GTYP_PROPGADGET);
554 /* Handle SelectDown event */
555 HandlePropSelectDown
558 msg->gpi_GInfo->gi_Window,
559 msg->gpi_GInfo->gi_Requester,
560 msg->gpi_Mouse.X,
561 msg->gpi_Mouse.Y,
562 IntuitionBase
564 SetGadgetType(g, GTYP_CUSTOMGADGET);
566 if (!(data->propinfo.Flags & KNOBHIT))
568 /* If the knob was not hit, swallow hit-event.
569 (Gadget has allready been updated) */
571 /* Update PGA_Top. Final update. */
572 UpdateTop(cl, g, msg->gpi_GInfo, TRUE);
574 *(msg->gpi_Termination) = data->top;
575 retval = GMR_NOREUSE|GMR_VERIFY;
577 else
579 /* We must remember mousepos for use in GM_HANDLEINPUT */
580 data->last_x = msg->gpi_Mouse.X;
581 data->last_y = msg->gpi_Mouse.Y;
583 retval = GMR_MEACTIVE; /* Stay active */
585 /* enable buffering to speed up refresh */
586 ((struct IntWindow *)(msg->gpi_GInfo->gi_Window))->specialflags |= SPFLAG_WANTBUFFER;
588 #ifdef PROPHACK
589 ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask =
590 NewCreateTask(TASKTAG_CODETYPE, CODETYPE_PPC, TASKTAG_PC, (ULONG)PropRefreshTask,
591 TASKTAG_PRI,0,
592 TASKTAG_PPC_ARG1,(ULONG)IntuitionBase,
593 TASKTAG_PPC_ARG2,(ULONG)g,
594 TASKTAG_PPC_ARG3,(ULONG)msg->gpi_GInfo->gi_Window,
595 TASKTAG_PPC_ARG4,(ULONG)msg->gpi_GInfo->gi_Requester,
596 TAG_DONE);
597 #endif
599 } /* if not knob was hit */
601 } /* if gadget was activated by an input event */
603 return (retval);
606 /****************************************************************************************/
608 IPTR PropGClass__GM_HANDLEINPUT(Class *cl, struct Gadget *g, struct gpInput *msg)
610 struct InputEvent *ie;
611 struct PropGData *data = INST_DATA(cl, g);
613 /* Default: stay active */
614 IPTR retval = GMR_MEACTIVE;
616 ie = msg->gpi_IEvent;
617 if (ie->ie_Class == IECLASS_RAWMOUSE)
619 switch (ie->ie_Code)
621 case IECODE_NOBUTTON:
622 if ((msg->gpi_Mouse.X != data->last_x) || (msg->gpi_Mouse.Y != data->last_y))
624 /* Fake a standard intuition prop gadget */
625 SetGadgetType(g, GTYP_PROPGADGET);
626 HandlePropMouseMove
629 msg->gpi_GInfo->gi_Window,
630 msg->gpi_GInfo->gi_Requester,
631 msg->gpi_Mouse.X, /* - data->last_x, */
632 msg->gpi_Mouse.Y, /* - data->last_y, */
633 IntuitionBase
636 SetGadgetType(g, GTYP_CUSTOMGADGET);
638 data->last_x = msg->gpi_Mouse.X;
639 data->last_y = msg->gpi_Mouse.Y;
641 D(bug("PropGClass: Calling UpdateTop\n"));
643 /* Update PGA_Top. Interim update. */
644 UpdateTop(cl, g, msg->gpi_GInfo, FALSE);
647 break;
649 case SELECTUP:
650 /* User has released the knob. Refresh knob */
652 #ifdef PROPHACK
653 if (((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask)
655 ULONG oldSignals = SetSignal(0,SIGF_INTUITION);
656 struct Task *task = ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask;
657 ULONG signals = 0;
659 Forbid();
660 ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask = 0;
661 Permit();
663 if (task) //small protection
665 Signal(task,PSIG_DIE);
667 signals = Wait(SIGF_INTUITION);
670 SetSignal(oldSignals | (signals & ~SIGF_INTUITION),0xFFFFFFFF);
672 #endif
674 SetGadgetType(g, GTYP_PROPGADGET);
676 HandlePropSelectUp
679 msg->gpi_GInfo->gi_Window,
680 msg->gpi_GInfo->gi_Requester,
681 IntuitionBase
684 SetGadgetType(g, GTYP_CUSTOMGADGET);
686 /* Update PGA_Top. Final update. */
687 UpdateTop(cl, g, msg->gpi_GInfo, TRUE);
689 *(msg->gpi_Termination) = data->top;
690 retval = GMR_NOREUSE|GMR_VERIFY;
691 break;
693 } /* switch (ie->ie_Code) */
695 } /* if (ie->ie_Class == IECLASS_RAWMOUSE) */
697 return (retval);
700 /****************************************************************************************/
702 IPTR PropGClass__GM_RENDER(Class *cl, struct Gadget *g, struct gpRender *msg)
704 struct PropGData *data = INST_DATA(cl, g);
706 DEBUG_PROP(dprintf("render_propgclass:\n"));
708 #ifdef PROPHACK
709 Forbid();
710 if ((g == ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->ActiveGadget) && (FindTask(0) == ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->InputDeviceTask) && ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask)
712 Signal(((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask,PSIG_REFRESHALL);
713 return (IPTR)1;
715 Permit();
716 #endif
718 /* Fake a standard intuition prop gadget */
719 SetGadgetType(g, GTYP_PROPGADGET);
721 if ((msg->gpr_Redraw == GREDRAW_UPDATE) && (data->old_knobbox))
723 struct BBox new_knobbox;
725 CalcBBox (msg->gpr_GInfo->gi_Window, msg->gpr_GInfo->gi_Requester, g, &new_knobbox);
727 DEBUG_PROP(dprintf("render_propgclass: BBox Left %ld Top %ld Width %ld Height %ld\n",
728 new_knobbox.Left,
729 new_knobbox.Width,
730 new_knobbox.Top,
731 new_knobbox.Height));
733 if (CalcKnobSize(g, &new_knobbox))
735 #if PROP_RENDER_OPTIMIZATION
736 RefreshPropGadgetKnob (g, data->old_knobbox, &new_knobbox, msg->gpr_GInfo->gi_Window, msg->gpr_GInfo->gi_Requester, IntuitionBase);
737 #else
738 struct BBox gbox;
740 CalcBBox (msg->gpr_GInfo->gi_Window, msg->gpr_GInfo->gi_Requester, g, &gbox);
741 RefreshPropGadgetKnob (g, &gbox, &new_knobbox, msg->gpr_GInfo->gi_Window, msg->gpr_GInfo->gi_Requester, IntuitionBase);
742 #endif
745 data->old_knobbox = 0;
747 else
749 /* Redraw the whole gadget */
750 RefreshPropGadget
753 msg->gpr_GInfo->gi_Window,
754 msg->gpr_GInfo->gi_Requester,
755 IntuitionBase
759 SetGadgetType(g, GTYP_CUSTOMGADGET);
761 return (IPTR)1;
765 /****************************************************************************************/
767 IPTR PropGClass__GM_GOINACTIVE(Class *cl, struct Gadget *g, struct gpGoInactive *msg)
769 /* Gadget cancelled by intuition ? */
771 if (msg->gpgi_Abort == 1)
774 #ifdef PROPHACK
775 if (((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask)
777 ULONG oldSignals = SetSignal(0,SIGF_INTUITION);
778 struct Task *task = ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask;
779 ULONG signals = 0;
781 Forbid();
782 ((struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data)->PropTask = 0;
783 Permit();
785 if (task) //small protection
787 Signal(task,PSIG_DIE);
789 signals = Wait(SIGF_INTUITION);
792 SetSignal(oldSignals | (signals & ~SIGF_INTUITION),0xFFFFFFFF);
794 #endif
796 SetGadgetType(g, GTYP_PROPGADGET);
798 HandlePropSelectUp
801 msg->gpgi_GInfo->gi_Window,
802 msg->gpgi_GInfo->gi_Requester,
803 IntuitionBase
806 SetGadgetType(g, GTYP_CUSTOMGADGET);
808 ((struct IntWindow *)(msg->gpgi_GInfo->gi_Window ))->specialflags &= ~SPFLAG_WANTBUFFER;
810 /* Update PGA_Top. Final update */
811 UpdateTop(cl, g, msg->gpgi_GInfo, TRUE);
813 return (IPTR)0;
816 /****************************************************************************************/