Added kernel module for starting the usb stack at boot time. It's not activated thoug...
[cake.git] / rom / intuition / propgadgets.c
blobcc2cbef6cb524e4bed3c6641777d8cc85d6d2f0c
1 /*
2 Copyright 1995-2003, The AROS Development Team. All rights reserved.
3 Copyright 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include <proto/graphics.h>
8 #include <proto/intuition.h>
9 #include <proto/cybergraphics.h>
10 #include <proto/layers.h>
11 #include <proto/utility.h>
12 #include <graphics/gfxmacros.h>
13 #include <intuition/cghooks.h>
14 #include <intuition/intuition.h>
15 #include <intuition/imageclass.h>
16 #include <intuition/windecorclass.h>
17 #include <cybergraphx/cybergraphics.h>
18 #include <graphics/rpattr.h>
19 #include "intuition_intern.h"
20 #include "propgadgets.h"
21 #ifdef SKINS
22 #include "intuition_customize.h"
23 #include "intuition_customizesupport.h"
24 #include "morphos/proprender.h"
25 #endif
26 #include "gadgets.h"
28 extern IPTR HookEntry();
30 #undef DEBUG
31 #define DEBUG 0
32 # include <aros/debug.h>
34 // static data moved to intuibase - Piru
35 //static WORD clickoffset_x, clickoffset_y;
36 #define clickoffset_x GetPrivIBase(IntuitionBase)->prop_clickoffset_x
37 #define clickoffset_y GetPrivIBase(IntuitionBase)->prop_clickoffset_y
39 BOOL isonborder(struct Gadget *gadget,struct Window *window);
41 static void RenderPropBackground(struct Gadget *gad, struct Window *win, struct DrawInfo *dri,
42 struct Rectangle *rect, struct Rectangle *proprect,
43 struct Rectangle *knobrect, struct PropInfo *pi,
44 struct RastPort *rp, BOOL onborder,
45 struct IntuitionBase *IntuitionBase)
47 if (onborder)
49 struct wdpDrawBorderPropBack msg;
51 msg.MethodID = WDM_DRAW_BORDERPROPBACK;
53 msg.wdp_Window = win;
54 msg.wdp_TrueColor = (((struct IntScreen *)win->WScreen)->DInfo.dri.dri_Flags & DRIF_DIRECTCOLOR);
55 msg.wdp_UserBuffer = ((struct IntWindow *)win)->DecorUserBuffer;
57 msg.wdp_RPort = rp;
58 msg.wdp_Gadget = gad;
59 msg.wdp_RenderRect = rect;
60 msg.wdp_PropRect = proprect;
61 msg.wdp_KnobRect = knobrect;
62 msg.wdp_Flags = 0;
63 msg.wdp_Dri = dri;
65 DoMethodA(((struct IntScreen *)(win->WScreen))->WinDecorObj, (Msg)&msg);
67 else
69 static UWORD pattern[] = {0x5555,0xAAAA};
70 struct Hook *dhook = NULL;
72 if ((gad->Flags & GFLG_EXTENDED) != 0)
74 if ((((struct ExtGadget *) gad)->MoreFlags & GMORE_BOOPSIGADGET) != 0)
76 GetAttr(PGA_DisplayHook, (Object *) gad, (IPTR *)&dhook);
79 if (dhook) {
81 struct wdpDrawBorderPropBack msg;
83 msg.MethodID = WDM_DRAW_BORDERPROPBACK;
85 msg.wdp_Window = win;
86 msg.wdp_TrueColor = (((struct IntScreen *)win->WScreen)->DInfo.dri.dri_Flags & DRIF_DIRECTCOLOR);
87 msg.wdp_RPort = rp;
88 msg.wdp_Gadget = gad;
89 msg.wdp_RenderRect = rect;
90 msg.wdp_PropRect = proprect;
91 msg.wdp_KnobRect = knobrect;
92 msg.wdp_Flags = 0;
93 msg.wdp_Dri = dri;
95 CallHookPkt(dhook, (Object *) gad, (Msg)&msg);
97 else
99 SetDrMd(rp, JAM2);
101 if (pi->Flags & PROPNEWLOOK)
103 SetAfPt(rp, pattern, 1);
104 SetAPen(rp, dri->dri_Pens[SHADOWPEN]);
105 SetBPen(rp, dri->dri_Pens[BACKGROUNDPEN]);
107 RectFill(rp, rect->MinX, rect->MinY, rect->MaxX, rect->MaxY);
108 SetAfPt(rp, NULL, 0);
110 else
112 SetAPen(rp, dri->dri_Pens[BACKGROUNDPEN]);
113 RectFill(rp, rect->MinX, rect->MinY, rect->MaxX, rect->MaxY);
120 VOID HandlePropSelectDown(struct Gadget *gadget, struct Window *w, struct Requester *req,
121 UWORD mouse_x, UWORD mouse_y, struct IntuitionBase *IntuitionBase)
123 struct BBox knob;
124 struct PropInfo *pi;
125 UWORD dx, dy, flags;
127 pi = (struct PropInfo *)gadget->SpecialInfo;
129 if (!pi)
130 return;
132 CalcBBox (w, req, gadget, &knob);
134 /* This func gets mouse coords relative to gadget box */
136 mouse_x += knob.Left;
137 mouse_y += knob.Top;
139 if (!CalcKnobSize (gadget, &knob))
140 return;
142 clickoffset_x = mouse_x - knob.Left;
143 clickoffset_y = mouse_y - knob.Top;
145 dx = pi->HorizPot;
146 dy = pi->VertPot;
148 if (pi->Flags & FREEHORIZ)
150 if (mouse_x < knob.Left)
152 if (dx > pi->HPotRes)
153 dx -= pi->HPotRes;
154 else
155 dx = 0;
157 else if (mouse_x >= knob.Left + knob.Width)
159 if (dx < MAXPOT - pi->HPotRes)
160 dx += pi->HPotRes;
161 else
162 dx = MAXPOT;
166 if (pi->Flags & FREEVERT)
168 if (mouse_y < knob.Top)
170 if (dy > pi->VPotRes)
171 dy -= pi->VPotRes;
172 else
173 dy = 0;
175 else if (mouse_y >= knob.Top + knob.Height)
177 if (dy < MAXPOT - pi->VPotRes)
178 dy += pi->VPotRes;
179 else
180 dy = MAXPOT;
184 flags = pi->Flags;
186 /* jDc: when clicked on frame, prop gadget also gets activated! */
187 if (!(flags & PROPBORDERLESS))
189 if (pi->Flags & FREEVERT)
191 knob.Left --;
192 knob.Width += 2;
193 } else {
194 knob.Top ++;
195 knob.Height += 2;
199 if (mouse_x >= knob.Left &&
200 mouse_y >= knob.Top &&
201 mouse_x < knob.Left + knob.Width &&
202 mouse_y < knob.Top + knob.Height)
204 flags |= KNOBHIT;
206 else
208 flags &= ~KNOBHIT;
211 gadget->Flags |= GFLG_SELECTED;
213 D(bug("New HPot: %d, new VPot: %d\n", dx, dy));
215 NewModifyProp(gadget, w, req, flags, dx, dy, pi->HorizBody, pi->VertBody, 1);
217 return;
220 VOID HandlePropSelectUp(struct Gadget *gadget, struct Window *w,
221 struct Requester *req, struct IntuitionBase *IntuitionBase)
223 struct PropInfo * pi;
225 pi = (struct PropInfo *)gadget->SpecialInfo;
227 gadget->Flags &= ~GFLG_SELECTED;
228 if (pi) pi->Flags &= ~KNOBHIT;
230 if (pi) RefreshPropGadget (gadget, w, req, IntuitionBase);
232 /* if (pi)
233 NewModifyProp (gadget
235 , req
236 , pi->Flags &= ~KNOBHIT
237 , pi->HorizPot
238 , pi->VertPot
239 , pi->HorizBody
240 , pi->VertBody
242 ); */
244 return;
247 VOID HandlePropMouseMove(struct Gadget *gadget, struct Window *w,struct Requester *req,
248 LONG dx, LONG dy, struct IntuitionBase *IntuitionBase)
250 struct BBox knob;
251 struct PropInfo *pi;
253 pi = (struct PropInfo *)gadget->SpecialInfo;
255 /* Has propinfo and the mouse was over the knob */
256 if (pi && (pi->Flags & KNOBHIT))
258 CalcBBox (w, req, gadget, &knob);
260 if (!CalcKnobSize (gadget, &knob))
261 return;
263 /* Move the knob the same amount, ie.
264 knob.Left += dx; knob.Top += dy;
266 knob.Left = knob.Left
267 + (pi->CWidth - knob.Width)
268 * pi->HorizPot / MAXPOT;
270 ie. dx = (pi->CWidth - knob.Width)
271 * pi->HorizPot / MAXPOT;
275 pi->HorizPot = (dx * MAXPOT) /
276 (pi->CWidth - knob.Width);
279 /* stegerg: dx and dy are not delta values
280 anymore but relative to gadget
281 box */
283 dx = dx - clickoffset_x;
284 dy = dy - clickoffset_y;
286 if (pi->Flags & FREEHORIZ
287 && pi->CWidth != knob.Width)
290 dx = (dx * MAXPOT) / (pi->CWidth - knob.Width);
291 if (dx < 0)
293 dx = 0;
295 else if (dx > MAXPOT)
297 dx = MAXPOT;
300 } /* FREEHORIZ */
302 if (pi->Flags & FREEVERT
303 && pi->CHeight != knob.Height)
305 dy = (dy * MAXPOT) / (pi->CHeight - knob.Height);
307 if (dy < 0)
309 dy = 0;
311 else if (dy > MAXPOT)
313 dy = MAXPOT;
316 } /* FREEVERT */
318 if ( ((pi->Flags & FREEHORIZ) && (dx != pi->HorizPot)) ||
319 ((pi->Flags & FREEVERT) && (dy != pi->VertPot)) )
322 NewModifyProp (gadget, w, req, pi->Flags, dx, dy, pi->HorizBody, pi->VertBody, 1);
325 } /* Has PropInfo and Mouse is over knob */
327 return;
330 int CalcKnobSize (struct Gadget * propGadget, struct BBox * knobbox)
332 struct PropInfo *pi;
333 WORD x, y;
335 pi = (struct PropInfo *)propGadget->SpecialInfo;
337 //dprintf("CalcKnobSize(%lx,%d,%d,%d,%d)\n", propGadget,
338 // propGadget->LeftEdge, propGadget->TopEdge, propGadget->Width, propGadget->Height);
339 //dprintf("knob(%d,%d,%d,%d)\n", knobbox->Left, knobbox->Top, knobbox->Width, knobbox->Height);
341 if (pi->Flags & PROPBORDERLESS)
343 pi->LeftBorder = 0;
344 pi->TopBorder = 0;
346 else
348 x = y = 1;
350 knobbox->Left += x;
351 knobbox->Top += y;
352 knobbox->Width -= x * 2;
353 knobbox->Height -= y * 2;
354 pi->LeftBorder = x;
355 pi->TopBorder = y;
357 //dprintf("knob(%d,%d,%d,%d)\n", knobbox->Left, knobbox->Top, knobbox->Width, knobbox->Height);
359 pi->CWidth = knobbox->Width;
360 pi->CHeight = knobbox->Height;
362 if ((!(pi->Flags & AUTOKNOB)) && propGadget->GadgetRender)
364 struct Image *im = propGadget->GadgetRender;
366 knobbox->Width = im->Width;
367 knobbox->Height = im->Height;
370 if (pi->Flags & FREEHORIZ)
372 if (pi->Flags & AUTOKNOB)
374 knobbox->Width = pi->CWidth * pi->HorizBody / MAXBODY;
375 if (knobbox->Width < KNOBHMIN) knobbox->Width = KNOBHMIN;
378 knobbox->Left = knobbox->Left + (pi->CWidth - knobbox->Width)
379 * pi->HorizPot / MAXPOT;
381 if (pi->HorizBody)
383 if (pi->HorizBody < MAXBODY/2)
384 pi->HPotRes = MAXPOT * 32768 / ((MAXBODY * 32768 / pi->HorizBody) - 32768);
385 else
386 pi->HPotRes = MAXPOT;
388 else
389 pi->HPotRes = 1;
392 if (pi->Flags & FREEVERT)
394 if (pi->Flags & AUTOKNOB)
396 knobbox->Height = pi->CHeight * pi->VertBody / MAXBODY;
397 if (knobbox->Height < KNOBVMIN) knobbox->Height = KNOBVMIN;
400 knobbox->Top = knobbox->Top + (pi->CHeight - knobbox->Height)
401 * pi->VertPot / MAXPOT;
403 if (pi->VertBody)
405 if (pi->VertBody < MAXBODY/2)
406 pi->VPotRes = MAXPOT * 32768 / ((MAXBODY * 32768 / pi->VertBody) - 32768);
407 else
408 pi->VPotRes = MAXPOT;
410 else
411 pi->VPotRes = 1;
413 //dprintf("knob(%d,%d,%d,%d)\n", knobbox->Left, knobbox->Top, knobbox->Width, knobbox->Height);
415 return TRUE;
416 } /* CalcKnobSize */
419 void RefreshPropGadget (struct Gadget * gadget, struct Window * window,
420 struct Requester * req, struct IntuitionBase * IntuitionBase)
422 struct PropInfo *pi;
423 struct DrawInfo *dri;
424 struct GadgetInfo gi;
425 struct RastPort *rp = 0;
426 struct BBox bbox, kbox;
427 BOOL onborder;
429 D(bug("RefreshPropGadget(gad=%p, win=%s, req=%p)\n", gadget, window->Title, req));
431 onborder = (IS_BORDER_GADGET(gadget) || isonborder(gadget,window));
433 if ((dri = GetScreenDrawInfo(window->WScreen)))
436 SetupGInfo(&gi, window, req, gadget, IntuitionBase);
438 if ((rp = ObtainGIRPort(&gi)))
440 for (;;)
442 CalcBBox (window, req, gadget, &bbox);
443 kbox = bbox;
445 if (bbox.Width <= 0 || bbox.Height <= 0)
446 break;
448 if (CalcKnobSize (gadget, &kbox))
450 pi = (struct PropInfo *)gadget->SpecialInfo;
452 if (!pi)
453 break;
455 SetDrMd (rp, JAM2);
457 if (!(pi->Flags & PROPBORDERLESS))
459 SetAPen(rp,dri->dri_Pens[SHADOWPEN]);
460 drawrect(rp,bbox.Left,
461 bbox.Top,
462 bbox.Left + bbox.Width - 1,
463 bbox.Top + bbox.Height - 1,
464 IntuitionBase);
466 bbox.Left ++; bbox.Top ++;
467 bbox.Width -= 2; bbox.Height -= 2;
470 RefreshPropGadgetKnob (gadget, &bbox, &kbox, window, req, IntuitionBase);
472 else
475 pi = (struct PropInfo *)gadget->SpecialInfo;
477 if (!pi)
478 break;
480 SetDrMd (rp, JAM2);
482 if (!(pi->Flags & PROPBORDERLESS))
484 SetAPen(rp,dri->dri_Pens[SHADOWPEN]);
485 drawrect(rp,bbox.Left,
486 bbox.Top,
487 bbox.Left + bbox.Width - 1,
488 bbox.Top + bbox.Height - 1,
489 IntuitionBase);
491 bbox.Left ++; bbox.Top ++;
492 bbox.Width -= 2; bbox.Height -= 2;
497 struct Rectangle tmprect;
499 tmprect.MinX = bbox.Left;
500 tmprect.MaxX = bbox.Left + bbox.Width - 1;
501 tmprect.MinY = bbox.Top;
502 tmprect.MaxY = bbox.Top + bbox.Height - 1;
504 RenderPropBackground(gadget, window, dri, &tmprect, &tmprect, NULL,
505 pi, rp, onborder, IntuitionBase);
507 } // if (CalcKnob
508 break;
511 } /* if ((rp = ObtainGIRPort(&gi))) */
513 if (rp && gadget->Flags & GFLG_DISABLED)
515 CalcBBox (window, req, gadget, &bbox);
517 RenderDisabledPattern(rp, (struct DrawInfo *)dri, bbox.Left,
518 bbox.Top,
519 bbox.Left + bbox.Width - 1,
520 bbox.Top + bbox.Height - 1,
521 IntuitionBase);
524 if (rp) ReleaseGIRPort(rp);
526 FreeScreenDrawInfo(window->WScreen, (struct DrawInfo *)dri);
528 } /* if ((dri = GetScreenDrawInfo(window->WScreen))) */
530 ReturnVoid("RefreshPropGadget");
531 } /* RefreshPropGadget */
534 void RefreshPropGadgetKnob (struct Gadget * gadget, struct BBox * clear,
535 struct BBox * knob, struct Window * window, struct Requester * req,
536 struct IntuitionBase * IntuitionBase)
538 struct DrawInfo *dri;
539 struct RastPort *rp;
540 struct PropInfo *pi;
541 struct GadgetInfo gi;
542 UWORD flags;
543 BOOL onborder;
545 D(bug("RefresPropGadgetKnob(flags=%d, clear=%p, knob = %p, win=%s)\n",
546 flags, clear, knob, window->Title));
548 if ((knob->Width < 1) || (knob->Height < 1)) return;
550 onborder = (IS_BORDER_GADGET(gadget) || isonborder(gadget,window));
552 pi = (struct PropInfo *)gadget->SpecialInfo;
553 flags = pi->Flags;
555 if ((dri = GetScreenDrawInfo(window->WScreen)))
557 SetupGInfo(&gi, window, req, gadget, IntuitionBase);
559 if ((rp = ObtainGIRPort(&gi)))
561 struct BBox bbox;
562 struct Rectangle brect;
563 struct Rectangle krect;
565 CalcBBox (window, req, gadget, &bbox);
567 if ((bbox.Width < 1) || (bbox.Height < 1))
569 ReleaseGIRPort(rp);
570 FreeScreenDrawInfo(window->WScreen, (struct DrawInfo *)dri);
572 return;
575 brect.MinX = bbox.Left;
576 brect.MinY = bbox.Top;
577 brect.MaxX = bbox.Left + bbox.Width - 1;
578 brect.MaxY = bbox.Top + bbox.Height - 1;
580 krect.MinX = knob->Left;
581 krect.MinY = knob->Top;
582 krect.MaxX = knob->Left + knob->Width - 1;
583 krect.MaxY = knob->Top + knob->Height - 1;
585 SetDrMd (rp, JAM2);
587 if (clear)
589 struct Rectangle a, b, clearrects[4];
590 WORD i, nrects;
592 #if (!(PROP_RENDER_OPTIMIZATION))
593 if (!(flags & PROPBORDERLESS))
595 clear->Left ++; clear->Top ++;
596 clear->Width -= 2; clear->Height -= 2;
598 #endif
600 #if 0
601 D(bug("RefresPropGadgetKnob: clear Left %d Top %d Width %d Height %d\n",
602 clear->Left,
603 clear->Top,
604 clear->Width,
605 clear->Height));
607 D(bug("RefresPropGadgetKnob: knob Left %d Top %d Width %d Height %d\n",
608 knob->Left,
609 knob->Top,
610 knob->Width,
611 knob->Height));
612 #endif
614 a.MinX = clear->Left;
615 a.MinY = clear->Top;
616 a.MaxX = clear->Left + clear->Width - 1;
617 a.MaxY = clear->Top + clear->Height - 1;
619 b.MinX = knob->Left;
620 b.MinY = knob->Top;
621 b.MaxX = knob->Left + knob->Width - 1;
622 b.MaxY = knob->Top + knob->Height - 1;
624 #if 0
625 D(bug("RefresPropGadgetKnob: a MinX %d MinY %d MaxX %d MaxY %d\n",
626 a.MinX,
627 a.MinY,
628 a.MaxX,
629 a.MaxY));
631 D(bug("RefresPropGadgetKnob: a MinX %d MinY %d MaxX %d MaxY %d\n",
632 b.MinX,
633 b.MinY,
634 b.MaxX,
635 b.MaxY));
636 #endif
638 nrects = SubtractRectFromRect(&a, &b, clearrects);
640 D(bug("RefresPropGadgetKnob: nrects %d\n",
641 nrects));
642 #if 0
643 D(bug("RefresPropGadgetKnob: clearrects[0] MinX %d MinY %d MaxX %d MaxY %d\n",
644 clearrects[0].MinX,
645 clearrects[0].MinY,
646 clearrects[0].MaxX,
647 clearrects[0].MaxY));
649 D(bug("RefresPropGadgetKnob: clearrects[1] MinX %d MinY %d MaxX %d MaxY %d\n",
650 clearrects[1].MinX,
651 clearrects[1].MinY,
652 clearrects[1].MaxX,
653 clearrects[1].MaxY));
655 D(bug("RefresPropGadgetKnob: clearrects[2] MinX %d MinY %d MaxX %d MaxY %d\n",
656 clearrects[2].MinX,
657 clearrects[2].MinY,
658 clearrects[2].MaxX,
659 clearrects[2].MaxY));
661 D(bug("RefresPropGadgetKnob: clearrects[3] MinX %d MinY %d MaxX %d MaxY %d\n",
662 clearrects[3].MinX,
663 clearrects[3].MinY,
664 clearrects[3].MaxX,
665 clearrects[3].MaxY));
666 #endif
668 /*kprintf("\n=== oldknob = %d,%d-%d,%d newknob = %d,%d-%d,%d\n",
669 a.MinX,
670 a.MinY,
671 a.MaxX,
672 a.MaxY,
673 b.MinX,
674 b.MinY,
675 b.MaxX,
676 b.MaxY);*/
678 for(i = 0; i < nrects; i++)
680 RenderPropBackground(gadget, window, dri, &clearrects[i], &brect, &krect,
681 pi, rp, onborder, IntuitionBase);
684 } /* if (clear) */
686 if (flags & AUTOKNOB)
688 int hit = ((flags & KNOBHIT) != 0);
690 D(bug("RefresPropGadgetKnob: draw knob Left %d Top %d Width %d Height %d\n",
691 knob->Left,
692 knob->Top,
693 knob->Width,
694 knob->Height));
696 if (onborder)
698 struct wdpDrawBorderPropKnob msg;
699 struct Rectangle knobrect;
700 knobrect.MinX = knob->Left;
701 knobrect.MinY = knob->Top;
702 knobrect.MaxX = knob->Left + knob->Width - 1;
703 knobrect.MaxY = knob->Top + knob->Height - 1;
705 msg.MethodID = WDM_DRAW_BORDERPROPKNOB;
706 msg.wdp_TrueColor = (((struct IntScreen *)window->WScreen)->DInfo.dri.dri_Flags & DRIF_DIRECTCOLOR);
707 msg.wdp_UserBuffer = ((struct IntWindow *)window)->DecorUserBuffer;
708 msg.wdp_Window = window;
709 msg.wdp_RPort = rp;
710 msg.wdp_Gadget = gadget;
711 msg.wdp_RenderRect = &knobrect;
712 msg.wdp_PropRect = &brect;
713 msg.wdp_Flags = hit ? WDF_DBPK_HIT : 0;
714 msg.wdp_Dri = dri;
716 DoMethodA(((struct IntScreen *)(window->WScreen))->WinDecorObj, (Msg)&msg);
718 } /* gadget inside window border */
719 else
721 struct Hook *dhook = NULL;
723 if ((gadget->Flags & GFLG_EXTENDED) != 0)
725 if ((((struct ExtGadget *) gadget)->MoreFlags & GMORE_BOOPSIGADGET) != 0)
727 GetAttr(PGA_DisplayHook, (Object *) gadget, (IPTR *)&dhook);
730 if (dhook) {
731 struct wdpDrawBorderPropKnob msg;
732 struct Rectangle knobrect;
733 knobrect.MinX = knob->Left;
734 knobrect.MinY = knob->Top;
735 knobrect.MaxX = knob->Left + knob->Width - 1;
736 knobrect.MaxY = knob->Top + knob->Height - 1;
737 msg.MethodID = WDM_DRAW_BORDERPROPKNOB;
738 msg.wdp_TrueColor = (((struct IntScreen *)window->WScreen)->DInfo.dri.dri_Flags & DRIF_DIRECTCOLOR);
739 msg.wdp_Window = window;
740 msg.wdp_RPort = rp;
741 msg.wdp_Gadget = gadget;
742 msg.wdp_RenderRect = &knobrect;
743 msg.wdp_PropRect = &brect;
744 msg.wdp_Flags = hit ? WDF_DBPK_HIT : 0;
745 msg.wdp_Dri = dri;
747 CallHookPkt(dhook, (Object *) gadget, (Msg)&msg);
749 else
752 BOOL stdlook = TRUE;
754 #ifdef SKINS
755 stdlook = RenderPropKnob(window,dri,rp,pi,knob,hit,IntuitionBase);
756 #endif
758 if (stdlook)
760 if (flags & PROPBORDERLESS)
762 SetAPen(rp,dri->dri_Pens[SHADOWPEN]);
764 /* paint black right and bottom edges */
766 RectFill(rp,knob->Left + knob->Width - 1,
767 knob->Top,
768 knob->Left + knob->Width - 1,
769 knob->Top + knob->Height - 1);
771 RectFill(rp,knob->Left,
772 knob->Top + knob->Height - 1,
773 knob->Left + knob->Width - 2,
774 knob->Top + knob->Height - 1);
776 knob->Width--;
777 knob->Height--;
779 } /* propborderless */
780 else
782 SetAPen(rp,dri->dri_Pens[SHADOWPEN]);
784 if (flags & FREEHORIZ)
786 /* black line at the left and at the right */
788 RectFill(rp,knob->Left,
789 knob->Top,
790 knob->Left,
791 knob->Top + knob->Height - 1);
793 RectFill(rp,knob->Left + knob->Width - 1,
794 knob->Top,
795 knob->Left + knob->Width - 1,
796 knob->Top + knob->Height - 1);
798 knob->Left++,
799 knob->Width -= 2;
801 if (flags & FREEVERT)
803 /* black line at the top and at the bottom */
805 RectFill(rp,knob->Left,
806 knob->Top,
807 knob->Left + knob->Width - 1,
808 knob->Top);
810 RectFill(rp,knob->Left,
811 knob->Top + knob->Height - 1,
812 knob->Left + knob->Width - 1,
813 knob->Top + knob->Height - 1);
815 knob->Top++;
816 knob->Height -= 2;
819 } /* not propborderless */
822 SetAPen(rp, dri->dri_Pens[SHINEPEN]);
824 /* interior */
825 RectFill(rp,knob->Left,
826 knob->Top,
827 knob->Left + knob->Width - 1,
828 knob->Top + knob->Height - 1);
829 } /* stdlook */
830 } /* gadget has no display (render) hook */
831 } /* gadget not inside window border */
833 } /* if (flags & AUTOKNOB) */
834 else
836 struct Image *image = (struct Image *)gadget->GadgetRender;
838 #if 0 /* CHECKME */
839 if (knob->Top + image->Height <= bbox.Top + bbox.Height &&
840 knob->Left + image->Width <= bbox.Left + bbox.Width)
841 #endif
843 #if 1
844 image->LeftEdge = knob->Left - bbox.Left;
845 image->TopEdge = knob->Top - bbox.Top;
846 // image->Width = knob->Width;
847 // image->Height = knob->Height;
849 DrawImageState(rp,
850 image,
851 bbox.Left,
852 bbox.Top,
853 IDS_NORMAL,
854 (struct DrawInfo *)dri);
855 #else
856 image->LeftEdge = 0;
857 image->TopEdge = 0;
859 DrawImageState(rp,
860 image,
861 knob->Left,
862 knob->Top,
863 IDS_NORMAL,
864 (struct DrawInfo *)dri);
865 #endif
869 if (gadget->Flags & GFLG_DISABLED)
871 RenderDisabledPattern(rp, (struct DrawInfo *)dri,
872 brect.MinX, brect.MinY,
873 brect.MaxX, brect.MaxY, IntuitionBase);
876 ReleaseGIRPort(rp);
878 } /* if ((rp = ObtainGIRPort(&gi))) */
880 FreeScreenDrawInfo(window->WScreen, (struct DrawInfo *)dri);
882 } /* if ((dri = GetScreenDrawInfo(window->WScreen))) */
884 ReturnVoid("RefreshPropGadgetKnob");
886 } /* RefreshPropGadgetKnob */
888 BOOL isonborder(struct Gadget *gadget, struct Window *window)
890 if ((window->BorderBottom > 2) && (gadget->Flags & GFLG_RELBOTTOM))
891 if (window->Height + gadget->TopEdge >= window->Height - window->BorderBottom) return TRUE;
893 if ((window->BorderRight > 2) && (gadget->Flags & GFLG_RELRIGHT))
894 if (window->Width + gadget->LeftEdge >= window->Width - window->BorderRight) return TRUE;
896 return FALSE;