示例#1
0
int main(int argc, char **argv)
{
int x, y;

    if ((IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0))) 
    {
	if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0))) 
        {
	    if ((DOSBase = (struct DosLibrary *) OpenLibrary("dos.library",0)))
	    {
	      struct Window *w1;

		w1 = openwindow(100, 100, 100, 100);

		if (w1)
		{
		    printf( "MoveWindow()...\n" );
		    for( x=0 ; x<50 ; x++ )
		    {
			MoveWindow(w1,1,0);
//			RefreshWindowFrame(w1);
		    }
		    for( y=0 ; y<50 ; y++ )
		    {
			MoveWindow(w1,0,1);
//			RefreshWindowFrame(w1);
		    }

		    printf( "ChangeWindowBox()...\n" );
		    for( x=0 ; x<50 ; x++ )
		    {
			ChangeWindowBox(w1,150-x,150-x,100+x,100+x);
			RefreshWindowFrame(w1);
		    }

		    printf( "SizeWindow()...\n" );
		    for( y=0 ; y<50 ; y++ )
		    {
			SizeWindow(w1,-1,-1);
			RefreshWindowFrame(w1);
		    }

		    printf( "Done!\nPress a key or click closegadget to quit.\n" );

		    Wait(1L<<w1->UserPort->mp_SigBit);
		    msg = (struct IntuiMessage *)GetMsg(w1->UserPort);
		    /* Catch any message to quit */
		    ReplyMsg((struct Message *)msg);

		    CloseWindow(w1);
		}
              CloseLibrary((struct Library *)DOSBase);
	  }
	  CloseLibrary((struct Library *)GfxBase);
	}
	CloseLibrary((struct Library *) IntuitionBase);
    }
    return 0;
} /* main */
示例#2
0
static void resizeWindow(FrameworkWindow *window) {
  if(window->gadgets) {
    RemoveGList(window->intuitionWindow, window->gadgets->glist, -1);
    (*window->kind->freeGadgets)(window->gadgets);
    SetRast(window->intuitionWindow->RPort, 0);
    window->gadgets = (*window->kind->buildGadgets)(window->intuitionWindow->Width, window->intuitionWindow->Height, window->data);
    if(!window->gadgets) {
      fprintf(stderr, "resizeWindow: couldn't create gadgets\n");
      goto error;
    }
    AddGList(window->intuitionWindow, window->gadgets->glist, (UWORD)~0, -1, NULL);
    RefreshWindowFrame(window->intuitionWindow);
    RefreshGList(window->gadgets->glist, window->intuitionWindow, NULL, -1);
    GT_RefreshWindow(window->intuitionWindow, NULL);
  }

  return;

error:
  return;
}
示例#3
0
static BOOL LayOutReq (struct AHIAudioModeRequesterExt *req, struct TextAttr *TextAttr)
{
  struct Gadget *gad;
  struct NewGadget ng;

  struct TextAttr *gadtextattr;
  struct TextFont *font;
  LONG   fontwidth,buttonheight,buttonwidth,pixels;
  struct IntuiText intuitext = {1,0,JAM1,0,0,NULL,NULL,NULL};
  LONG  sliderlevels,sliderlevel;
  LONG  selected;

  selected=GetSelected(req);
  GetSliderAttrs(req,&sliderlevels,&sliderlevel);

// Calculate gadget area
  req->gx=req->Window->BorderLeft+4;
  req->gy=req->Window->BorderTop+2;
  req->gw=req->Window->Width-req->gx-(req->Window->BorderRight+4);
  req->gh=req->Window->Height-req->gy-(req->Window->BorderBottom+2);

  if(req->Gadgets)
  {
    RemoveGList(req->Window,req->Gadgets,-1);
    FreeGadgets(req->Gadgets);
    SetAPen(req->Window->RPort,0);
    SetDrMd(req->Window->RPort,JAM1);
    EraseRect(req->Window->RPort, req->Window->BorderLeft, req->Window->BorderTop,
        req->Window->Width-req->Window->BorderRight-1,req->Window->Height-req->Window->BorderBottom-1);
    RefreshWindowFrame(req->Window);
  }
  req->Gadgets=NULL;
  if((gad=CreateContext(&req->Gadgets)))
  {
    if(TextAttr)
      gadtextattr=TextAttr;
    else
      gadtextattr=req->Window->WScreen->Font;

    if((font=OpenFont(gadtextattr)))
    {
      fontwidth=font->tf_XSize;
      CloseFont(font);
    }
    else
      return FALSE;

    buttonheight=gadtextattr->ta_YSize+6;
    intuitext.ITextFont=gadtextattr;
    intuitext.IText=req->PositiveText;
    buttonwidth=IntuiTextLength(&intuitext);
    intuitext.IText=req->NegativeText;
    pixels=IntuiTextLength(&intuitext);
    buttonwidth=max(pixels,buttonwidth);
    buttonwidth+=4+fontwidth;

// Create gadgets and check if they fit
    // Do the two buttons fit?
    if(2*buttonwidth > req->gw)
      return FALSE;
    ng.ng_TextAttr=gadtextattr;
    ng.ng_VisualInfo=req->vi;
    ng.ng_UserData=req;
// OK button
    ng.ng_LeftEdge=req->gx;
    ng.ng_TopEdge=req->gy+req->gh-buttonheight;
    ng.ng_Width=buttonwidth;
    ng.ng_Height=buttonheight;
    ng.ng_GadgetText=req->PositiveText;
    ng.ng_GadgetID=OKBUTTON;
    ng.ng_Flags=PLACETEXT_IN;
    gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_END);
// Cancel button
    ng.ng_LeftEdge=req->gx+req->gw-ng.ng_Width;
    ng.ng_GadgetText=req->NegativeText;
    ng.ng_GadgetID=CANCELBUTTON;
    gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_END);
// Frequency
    if(req->Flags & freqgad)
    {
      intuitext.IText = GetString(msgReqFrequency, req->Catalog);
      pixels=IntuiTextLength(&intuitext)+INTERWIDTH;
      if(pixels+MINSLIDERWIDTH+INTERWIDTH+FREQLEN2*fontwidth > req->gw)
        return FALSE;
      ng.ng_Width=req->gw-pixels-INTERWIDTH-FREQLEN2*fontwidth;
      ng.ng_LeftEdge=req->gx+pixels;
      ng.ng_TopEdge-=2+buttonheight;
      ng.ng_GadgetText = GetString(msgReqFrequency, req->Catalog);
      ng.ng_GadgetID=FREQSLIDER;
      ng.ng_Flags=PLACETEXT_LEFT;
      gad=CreateGadget(SLIDER_KIND,gad,&ng,
          GTSL_Min,0,
          GTSL_Max,sliderlevels-1,
          GTSL_Level,sliderlevel,
          GTSL_LevelFormat, (ULONG) FREQTEXT2,
          GTSL_MaxLevelLen,FREQLEN2,
          GTSL_LevelPlace,PLACETEXT_RIGHT,
          GTSL_DispFunc, (ULONG) m68k_IndexToFrequency,
          GA_RelVerify,TRUE,
          GA_Disabled,!sliderlevels || (req->tempAudioID == AHI_DEFAULT_ID),
          TAG_DONE);
      req->slidergadget=gad;   // Save for HadleReq()...
    }
// ListView
    if((ng.ng_Height=ng.ng_TopEdge-2-req->gy) < buttonheight)
      return FALSE;
    ng.ng_LeftEdge=req->gx;
    ng.ng_TopEdge=req->gy;
    ng.ng_Width=req->gw;
    ng.ng_GadgetText=NULL,
    ng.ng_GadgetID=LISTVIEW;
    ng.ng_Flags=PLACETEXT_ABOVE;
    gad=CreateGadget(LISTVIEW_KIND,gad,&ng,
        GTLV_ScrollWidth,(fontwidth>8 ? fontwidth*2 : 18),
        GTLV_Labels, (ULONG) req->list,
        GTLV_ShowSelected,NULL,
        ((selected == ~0) || (GadToolsBase->lib_Version >= 39) ? TAG_IGNORE : GTLV_Top),selected,
        (selected == ~0 ? TAG_IGNORE : GTLV_MakeVisible),selected,
        GTLV_Selected,selected,
        TAG_DONE);
    req->listviewgadget=gad;   // Save for HadleReq()...

    if(!gad)
      return FALSE;
  }
  else
    return FALSE;

  AddGList(req->Window,req->Gadgets,~0,-1,NULL);
  RefreshGList(req->Gadgets,req->Window,NULL,-1);
  GT_RefreshWindow(req->Window,NULL);

  return TRUE;
}
示例#4
0
// Refresh buttons display
void buttons_refresh(Buttons *buttons,ULONG type)
{
	int x,y;
	Cfg_Button *button;

	// Lock bank
	GetSemaphore(&buttons->bank->lock,SEMF_SHARED,0);

	// Make selector visible
	if (type&BUTREFRESH_SELECTOR)
	{
		if (buttons_visible_select(buttons))
			type|=BUTREFRESH_REFRESH;
	}

	// Font reset
	if (type&BUTREFRESH_FONT)
	{
		// See if font has changed
		if ((strcmp(
			buttons->window->RPort->Font->tf_Message.mn_Node.ln_Name,
			buttons->bank->window.font_name))!=0 ||
			buttons->window->RPort->Font->tf_YSize!=buttons->bank->window.font_size)
		{
			// Get new font
			buttons_get_font(buttons);

			// Do full reset
			type=BUTREFRESH_RESIZE|BUTREFRESH_REFRESH;

			// Clear resized flag
			buttons->flags&=~BUTTONF_RESIZED;
		}
	}

	// Resize event?
	if (type&BUTREFRESH_RESIZE)
	{
		unsigned short min_width,min_height;
		unsigned short max_width,max_height;
		short border_x=0,border_y=0;

		// Borderless window?
		if (buttons->flags&BUTTONF_BORDERLESS)
		{
			ULONG flags;
			short old_width,old_height;
			ULONG old_border;

			// Save drag gadget flags and size
			flags=buttons->drag_gadget.Flags;
			old_width=buttons->drag_gadget.Width;
			old_height=buttons->drag_gadget.Height;
			old_border=buttons->border_type;

			// See if drag bar orientation has changed
			if (buttons_fix_drag(buttons))
			{
				short width,height;

				// Get current width/height
				width=buttons->window->Width;
				height=buttons->window->Height;

				// If bar is now horizontal, it used to be vertical
				if (buttons->drag_gadget.Flags&GFLG_RELWIDTH && flags&GFLG_RELHEIGHT)
				{
					// Adjust accordingly
					width-=old_width;
					height+=buttons->drag_gadget.Height;
				}

				// And vice versa
				else
				if (buttons->drag_gadget.Flags&GFLG_RELHEIGHT && flags&GFLG_RELWIDTH)
				{
					// Adjust
					height-=old_height;
					width+=buttons->drag_gadget.Width;
				}

				// No drag bar
				else
				if (!(buttons->drag_gadget.Flags&(GFLG_RELWIDTH|GFLG_RELHEIGHT)))
				{
					// Adjust size
					if (flags&GFLG_RELHEIGHT)
					{
						if (old_border&BTNWF_RIGHT_BELOW) border_x=old_width;
						width-=old_width;
					}
					else
					if (flags&GFLG_RELWIDTH)
					{
						if (old_border&BTNWF_RIGHT_BELOW) border_y=old_height;
						height-=old_height;
					}
				}

				// State of right/below flag changed
				else
				if (!(old_border&BTNWF_RIGHT_BELOW) && (buttons->bank->window.flags&BTNWF_RIGHT_BELOW))
				{
					// Move window up or right depending on border
					if (buttons->bank->window.flags&BTNWF_HORIZ)
						border_y=-((GUI->screen_info&SCRI_LORES)?DRAG_LO_HEIGHT:DRAG_HI_HEIGHT);
					else
					if (buttons->bank->window.flags&BTNWF_VERT)
						border_x=-DRAG_WIDTH;
				}

				// Is size not changing?
				if (buttons->window->Width==width && buttons->window->Height==height)
				{
					// Refresh buttons display
					type|=BUTREFRESH_REFRESH;
					RefreshGList(&buttons->drag_gadget,buttons->window,0,1);
				}

				// Size is changing so window will be refreshed automatically
				else
				{
					// Resize window
					ChangeWindowBox(
						buttons->window,
						buttons->window->LeftEdge+border_x,buttons->window->TopEdge+border_y,
						width,height);
					buttons->flags|=BUTTONF_RESIZED;
				}

				// Recalculate internal size
				buttons_fix_internal(buttons);
			}

			// Refresh drag gadget
			else
			{
				RefreshGList(&buttons->drag_gadget,buttons->window,0,1);
			}
		}

		// Get the maximum size of a button
		buttons_get_max_size(buttons,&max_width,&max_height);

		// Graphical buttons?
		if (buttons->bank->window.flags&BTNWF_GFX)
		{
			// Maximum is also minimum
			min_width=max_width;
		}

		// Text buttons
		else
		{
			// Get minimum width
			min_width=TextLength(buttons->window->RPort,"a",1)*6;

			// Border?
			if (!(buttons->flags&BUTTONF_BORDERLESS))
			{
				// Calculate button size from window
				max_width=buttons->window->GZZWidth/buttons->bank->window.columns;
			}

			// Is button width less than minimum?
			if (max_width<min_width) max_width=min_width;
		}

		// Store button size
		buttons->button_width=max_width;
		buttons->button_height=max_height;

		// No border or toolbar?
		if (buttons->flags&(BUTTONF_BORDERLESS|BUTTONF_TOOLBAR))
		{
			short side_borders,top_borders;

			// Start with maximum columns/rows
			buttons->button_cols=buttons->bank->window.columns;
			buttons->button_rows=buttons->bank->window.rows;

			// Calculate window size
			max_width=buttons->button_width*buttons->button_cols;
			max_height=buttons->button_height*buttons->button_rows;

			// Calculate border sizes
			side_borders=buttons->window->Width-buttons->internal.Width;
			top_borders=buttons->window->Height-buttons->internal.Height;

			// Too big for screen?
			if (max_width+side_borders>buttons->window->WScreen->Width)
			{
				buttons->button_cols=(buttons->window->WScreen->Width-side_borders)/buttons->button_width;
				max_width=buttons->button_cols*buttons->button_width;
			}
			if (max_height+top_borders>buttons->window->WScreen->Height)
			{
				buttons->button_rows=(buttons->window->WScreen->Height-top_borders)/buttons->button_height;
				max_height=buttons->button_rows*buttons->button_height;
			}

			// Add border size
			max_width+=side_borders;
			max_height+=top_borders;

			// Minimum is the maximum
			min_width=max_width;
			min_height=max_height;
		}

		// Normal borders
		else
		{
			// Get columns/rows
			buttons->button_cols=buttons->window->GZZWidth/buttons->button_width;
			buttons->button_rows=buttons->window->GZZHeight/buttons->button_height;

			// Check columns/rows don't exceed actual number of buttons
			if (buttons->button_cols>buttons->bank->window.columns)
				buttons->button_cols=buttons->bank->window.columns;
			if (buttons->button_rows>buttons->bank->window.rows)
				buttons->button_rows=buttons->bank->window.rows;

			// Get window minimum size
			min_width+=buttons->window->BorderLeft+buttons->window->BorderRight;
			min_height=buttons->window->BorderTop+buttons->window->BorderBottom+buttons->button_height;

			// Get window maximum size
			max_width=(!(buttons->bank->window.flags&BTNWF_GFX))?buttons->window->WScreen->Width:
				buttons->window->BorderLeft+
				buttons->window->BorderRight+
				buttons->bank->window.columns*buttons->button_width;
			max_height=
				buttons->window->BorderTop+
				buttons->window->BorderBottom+
				buttons->button_height*buttons->bank->window.rows;
		}

		// Set window limits
		WindowLimits(buttons->window,0,0,(ULONG)-1,(ULONG)-1);

		// See if window size can be changed
		if (!(buttons->flags&BUTTONF_RESIZED))
		{
			short width,height;

			// No border?
			if (buttons->flags&BUTTONF_BORDERLESS)
			{
				// Get desired size
				width=max_width;
				height=max_height;
			}

			// Normal borders
			else
			{
				// Get initial size
				width=buttons->window->Width;
				height=buttons->window->Height;

				// Is window narrower than minimum?
				if (buttons->window->Width<min_width) width=min_width;

				// Or wider than maximum?
				else
				if (buttons->window->Width>max_width) width=max_width;

				// Otherwise, size to button boundary
				else
				{
					// Drop back to last whole column
					width-=buttons->window->GZZWidth-(buttons->button_cols*buttons->button_width);

					// Size to make window bigger?
					if (buttons->window->Width>buttons->last_position.Width &&
						buttons->button_cols<buttons->bank->window.columns)
					{
						short new_width;

						// Get new width
						new_width=width+buttons->button_width;

						// Would this be legal?
						if (buttons->window->LeftEdge+new_width<=buttons->window->WScreen->Width)
							width=new_width;
					}
				}

				// Is window shorter than minimum?
				if (buttons->window->Height<min_height) height=min_height;

				// Or taller than maximum?
				else
				if (buttons->window->Height>max_height) height=max_height;

				// Otherwise, size to button boundary
				else
				{
					// Drop back to last whole row
					height-=buttons->window->GZZHeight-(buttons->button_rows*buttons->button_height);

					// Size to make window bigger?
					if (buttons->window->Height>buttons->last_position.Height &&
						buttons->button_rows<buttons->bank->window.rows)
					{
						short new_height;

						// Get new height
						new_height=height+buttons->button_height;

						// Would this be legal?
						if (buttons->window->TopEdge+new_height<=buttons->window->WScreen->Height)
							height=new_height;
					}
				}
			}

			// Does window need to be resized?
			if (buttons->window->Width!=width ||
				buttons->window->Height!=height)
			{
				// Resize window
				ChangeWindowBox(
					buttons->window,
					buttons->window->LeftEdge+border_x,buttons->window->TopEdge+border_y,
					width,height);
				buttons->flags|=BUTTONF_RESIZED;

				// Set window limits
				WindowLimits(buttons->window,
					min_width,
					min_height,
					max_width,
					max_height);

				// Unlock bank
				FreeSemaphore(&buttons->bank->lock);
				return;
			}
		}

		// Returned from a resize; refresh frame
		else RefreshWindowFrame(buttons->window);

		// Save window position
		buttons->last_position=*((struct IBox *)&buttons->window->LeftEdge);

		// Set window limits
		WindowLimits(buttons->window,
			min_width,
			min_height,
			max_width,
			max_height);

		// Fix sliders
		if (buttons->vert_scroll)
		{
			SetGadgetAttrs(buttons->vert_scroll,buttons->window,0,
				PGA_Total,buttons->bank->window.rows,
				PGA_Visible,buttons->button_rows,
				TAG_END);
		}
		if (buttons->horiz_scroll)
		{
			SetGadgetAttrs(buttons->horiz_scroll,buttons->window,0,
				PGA_Total,buttons->bank->window.columns,
				PGA_Visible,buttons->button_cols,
				TAG_END);
		}

		// Make sure selector is visible
		if (buttons->editor) buttons_visible_select(buttons);
	}

	// Refresh event
	if (type&BUTREFRESH_REFRESH)
	{
		// Get vertical position
		if (buttons->vert_scroll)
			GetAttr(PGA_Top,buttons->vert_scroll,(ULONG *)&buttons->button_top);
		else buttons->button_top=0;

		// Horizontal
		if (buttons->horiz_scroll)
			GetAttr(PGA_Top,buttons->horiz_scroll,(ULONG *)&buttons->button_left);
		else  buttons->button_left=0;

		// Draw buttons
		button=(Cfg_Button *)buttons->bank->buttons.lh_Head;
		for (y=0;y<buttons->bank->window.rows;y++)
		{
			for (x=0;x<buttons->bank->window.columns;x++)
			{
				// Check button is valid
				if (button && !button->node.ln_Succ) button=0;

				// Is button visible?
				if (y>=buttons->button_top && y<buttons->button_top+buttons->button_rows &&
					x>=buttons->button_left && x<buttons->button_left+buttons->button_cols)
				{
					// Draw button
					buttons_show_button(
						buttons,
						button,
						x-buttons->button_left,
						y-buttons->button_top,
						(button)?button->current:0,0);
				}

				// Get next button
				if (button) button=(Cfg_Button *)button->node.ln_Succ;
			}
		}
	}

	// Clear resized flag
	buttons->flags&=~BUTTONF_RESIZED;

	// Unlock bank
	FreeSemaphore(&buttons->bank->lock);
}
示例#5
0
void WindowSizeHasChanged(struct Window *targetwindow, WORD dx, WORD dy,
                                 BOOL is_sizewindow, struct IntuitionBase *IntuitionBase)
{
    struct IIHData  *iihdata = (struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data;
    struct Layer    *lay;

    D(bug("********* WindowSizeHasChanged ********\n"));

    lay = (BLAYER(targetwindow)) ? BLAYER(targetwindow) : WLAYER(targetwindow);

    /* Fix GadgetInfo domain if there is an active gadget in window
       which was resized */

    if ((iihdata->ActiveGadget) && (targetwindow == iihdata->GadgetInfo.gi_Window))
    {
        GetGadgetDomain(iihdata->ActiveGadget,
                	iihdata->GadgetInfo.gi_Screen,
                	iihdata->GadgetInfo.gi_Window,
                	NULL,
                	&iihdata->GadgetInfo.gi_Domain);
    }

    /* Relayout GFLG_REL??? gadgets */
    DoGMLayout(targetwindow->FirstGadget, targetwindow, NULL, -1, FALSE, IntuitionBase);

    /* Add the new area of all GFLG_REL??? gadgets to the damagelist, but
       don't EraseRect() as the gadgets will be re-rendered at their new
       position anyway */
       
    {
    	struct Rectangle innerrect;
	
	innerrect.MinX = targetwindow->BorderLeft;
	innerrect.MinY = targetwindow->BorderTop;
	innerrect.MaxX = targetwindow->Width - 1 - targetwindow->BorderRight;
	innerrect.MaxY = targetwindow->Height - 1 - targetwindow->BorderBottom;
	
    	EraseRelGadgetArea(targetwindow, AVOID_WINBORDERERASE ? &innerrect : NULL, TRUE, IntuitionBase);
    }

    /* If new size is smaller than old size add right/bottom
       frame to damagelist */
    if ( ((dx < 0) && (targetwindow->BorderRight  > 0)) ||
        ((dx > 0) && (targetwindow->BorderTop > 0)) ||
        ((dy < 0) && (targetwindow->BorderBottom > 0)) )
    {
        struct Rectangle rect;

        LockLayer(0, lay);

        if ((dx < 0) && (targetwindow->BorderRight > 0))
        {
            rect.MinX = targetwindow->Width - targetwindow->BorderRight;
            rect.MinY = 0;
            rect.MaxX = targetwindow->Width - 1;
            rect.MaxY = targetwindow->Height - 1;

            OrRectRegion(lay->DamageList, &rect);
            lay->Flags |= LAYERREFRESH;
        }

        if ((dx > 0) && (targetwindow->BorderTop > 0))
        {
            rect.MinX = 0;
            rect.MinY = 0;
            rect.MaxX = targetwindow->Width - 1;
            rect.MaxY = targetwindow->BorderTop - 1;

            OrRectRegion(lay->DamageList, &rect);
            lay->Flags |= LAYERREFRESH;
        }

        if ((dy < 0) && (targetwindow->BorderBottom > 0))
        {
            rect.MinX = 0;
            rect.MinY = targetwindow->Height - targetwindow->BorderBottom;
            rect.MaxX = targetwindow->Width - 1;
            rect.MaxY = targetwindow->Height - 1;

            OrRectRegion(lay->DamageList, &rect);
            lay->Flags |= LAYERREFRESH;
        }

        UnlockLayer(lay);

    } /* if ( ((dx < 0) && (targetwindow->BorderRight > 0)) || ((dy < 0) && (targetwindow->BorderBottom > 0)) ) */

    ((struct IntWindow *)(targetwindow))->specialflags |= SPFLAG_LAYERRESIZED;

#if 0
    if (IS_GZZWINDOW(targetwindow))
    {
        lay = targetwindow->BorderRPort->Layer;

        if (lay->Flags & LAYERREFRESH)
        {
            Gad_BeginUpdate(lay, IntuitionBase);
            RefreshWindowFrame(targetwindow);
            lay->Flags &= ~LAYERREFRESH;
            Gad_EndUpdate(lay, TRUE, IntuitionBase);
        }

        lay = targetwindow->WLayer;

        if (lay->Flags & LAYERREFRESH)
        {
            Gad_BeginUpdate(lay, IntuitionBase);
            int_refreshglist(targetwindow->FirstGadget, targetwindow, NULL, -1, 0, REFRESHGAD_BORDER, IntuitionBase);
            Gad_EndUpdate(lay, IS_NOCAREREFRESH(targetwindow), IntuitionBase);
        }

    }
    else
    {
        lay = targetwindow->WLayer;

        if (lay->Flags & LAYERREFRESH)
        {
            Gad_BeginUpdate(lay, IntuitionBase);
            RefreshWindowFrame(targetwindow);
            int_refreshglist(targetwindow->FirstGadget, targetwindow, NULL, -1, 0, REFRESHGAD_BORDER, IntuitionBase);
            Gad_EndUpdate(lay, IS_NOCAREREFRESH(targetwindow), IntuitionBase);
        }
    }

    lay = targetwindow->WLayer;

    if (IS_NOCAREREFRESH(targetwindow))
    {
        LockLayer(0, lay);
        lay->Flags &= ~LAYERREFRESH;
        UnlockLayer(lay);
    }
#endif

#if 0
    //if (is_sizewindow)
    {
        /* Send IDCMP_NEWSIZE to resized window */

        ih_fire_intuimessage(targetwindow,
                     IDCMP_NEWSIZE,
                     0,
                     targetwindow,
                     IntuitionBase);
    }

    if (ie = AllocInputEvent(iihdata))
    {
        ie->ie_Class = IECLASS_EVENT;
        ie->ie_Code = IECODE_NEWSIZE;
        ie->ie_EventAddress = targetwindow;
        CurrentTime(&ie->ie_TimeStamp.tv_secs, &ie->ie_TimeStamp.tv_micro);
    }

    /* Send IDCMP_CHANGEWINDOW to resized window */

    ih_fire_intuimessage(targetwindow,
                 IDCMP_CHANGEWINDOW,
                 CWCODE_MOVESIZE,
                 targetwindow,
                 IntuitionBase);
#endif

}
示例#6
0
// Add or remove fuel gauge
void lister_set_gauge(Lister *lister,BOOL refresh)
{
	BOOL want,change=0;

	// If lister is closed, problem is moot
	if (!lister->window ||
		(lister->more_flags&LISTERF_TITLEBARRED)) return;

	// See if lister wants a gauge
	want=lister_want_gauge(lister);

	// Does lister have gauge and we don't want it to?
	if (lister->gauge_gadget && !want)
	{
		// Remove the gadget
		RemoveGList(lister->window,lister->gauge_gadget,1);

		// Free gadget
		DisposeObject((Object *)lister->gauge_gadget);
		lister->gauge_gadget=0;

		// Fix border width
		lister->window->BorderLeft=lister->old_border_left;

		// Free pens
		lister_init_colour(lister,ENVCOL_GAUGE,TRUE);

		// Set change flag
		change=1;
	}

	// Or, do we not have it but want it?
	else
	if (!lister->gauge_gadget && want)
	{
		// Initialise pens
		lister_init_colour(lister,ENVCOL_GAUGE,FALSE);

		// Create gauge
		if ((lister->gauge_gadget=(struct Gadget *)
				NewObject(
					0,
					"dopusgaugeclass",
					GA_ID,GAD_GAUGE,
					GA_Left,0,
					GA_Top,lister->window->BorderTop,
					GA_Width,lister->window->BorderRight,
					GA_RelHeight,-lister->window->BorderTop-lister->window->BorderBottom+3,
					GA_LeftBorder,TRUE,
					DGG_FillPen,lister->lst_Colours[ENVCOL_GAUGE].cr_Pen[0],
					DGG_FillPenAlert,lister->lst_Colours[ENVCOL_GAUGE].cr_Pen[1],
					TAG_END)))
		{
			// Fix border width
			lister->window->BorderLeft=lister->window->BorderRight;

			// Add gauge to window after parent button
			AddGList(lister->window,lister->gauge_gadget,-1,1,0);
			RefreshGList(lister->gauge_gadget,lister->window,0,1);

			// Set change flag
			change=1;
		}

		// Failed
		else
		{
			// Free pens
			lister_init_colour(lister,ENVCOL_GAUGE,TRUE);
		}
	}

	// Changed?
	if (change)
	{
		// Fix left border related things
		lister->window->GZZWidth=lister->window->Width-lister->window->BorderLeft-lister->window->BorderRight;
		lister->parent_button.Width=lister->window->BorderLeft;
	}

	// Changed and need to refresh?
	if (change && refresh)
	{
		// Initialise and refresh
		lister_init_display(lister);
		lister_refresh(lister,LREFRESH_FULL|LREFRESH_FULL_ICON);

		// If the path field is added, refresh it
		if (lister->path_field && lister->flags&LISTERF_PATH_FIELD)
		{
			struct gpResize resize;

			// Fill out resize packet
			resize.MethodID=GM_RESIZE;
			resize.gpr_GInfo=0;
			resize.gpr_RPort=0;
			resize.gpr_Size.Left=lister->window->BorderLeft;
			resize.gpr_Size.Top=-(lister->window->BorderBottom+FIELD_FONT->tf_YSize+4);
			resize.gpr_Size.Width=-(lister->window->BorderLeft+lister->window->BorderRight);
			resize.gpr_Size.Height=FIELD_FONT->tf_YSize+4;
			resize.gpr_Redraw=0;
			resize.gpr_Window=lister->window;
			resize.gpr_Requester=0;

			// Tell string gadget to resize
			DoMethodA((Object *)lister->path_field,(Msg)&resize);

			// Erase behind path field
			SetAPen(lister->window->RPort,3);
			RectFill(
				lister->window->RPort,
				lister->window->BorderLeft,
				lister->window->Height+lister->path_field->TopEdge-2,
				lister->window->Width-lister->window->BorderRight-1,
				lister->window->Height+lister->path_field->TopEdge+lister->path_field->Height+1);

			// Refresh path field
			RefreshGList(lister->path_field,lister->window,0,1);
		}

		// Refresh the window frame
		RefreshWindowFrame(lister->window);

		// Do we have the gauge?
		if (lister->gauge_gadget)
		{
			// Refresh title and gauge
			lister_show_name(lister);
		}
	}
}
示例#7
0
struct Window *lister_open_window(Lister *lister,struct Screen *screen)
{
	struct Gadget *gadget,*lock_gad;
	struct IBox *dims;
	ULONG mode;

	// If lister is already open, return
	if (!lister || lister->window) return lister->window;

	// Is lister meant to be iconified?
	if (lister->flags&LISTERF_ICONIFIED) return 0;

	// Is lister iconified?
	if (lister->appicon)
	{
		// Update icon position
		lister_update_icon(lister);

		// Remove AppIcon
		RemoveAppIcon(lister->appicon);
		lister->appicon=0;

		// Free icon
		if (lister->appicon_icon)
		{
			FreeDiskObjectCopy(lister->appicon_icon);
			lister->appicon_icon=0;
		}
	}

	// If lister was zoomed, swap dimensions around
	if ((lister->dimensions.wd_Flags&(WDF_VALID|WDF_ZOOMED))==(WDF_VALID|WDF_ZOOMED))
	{
		struct IBox temp;

		// Swap dimensions
		temp=lister->dimensions.wd_Zoomed;
		lister->dimensions.wd_Zoomed=lister->dimensions.wd_Normal;
		lister->dimensions.wd_Normal=temp;

		// Clear zoomed flag
		lister->dimensions.wd_Flags&=~WDF_ZOOMED;
	}

	// Get dimensions pointer
	dims=&lister->dimensions.wd_Normal;

	// Get screen font
	AskFont(&screen->RastPort,&lister->screen_font);

	// Calculate minimum size
	lister_calc_limits(lister,screen);

	// Check lister size against minimums
	if (dims->Width<lister->win_limits.Left) dims->Width=lister->win_limits.Left;
	if (dims->Height<lister->win_limits.Top) dims->Height=lister->win_limits.Top;

	// Initialise backfill pattern
	#if defined(__MORPHOS__)
	lister->pattern.hook.h_Entry = (HOOKFUNC)HookEntry;
	lister->pattern.hook.h_SubEntry=(ULONG (*)())PatternBackfill;
	#else
	lister->pattern.hook.h_Entry=(ULONG (*)())PatternBackfill;
	#endif
	lister->pattern.hook.h_Data=lister->backdrop_info;
	lister->pattern.pattern=&GUI->pattern[PATTERN_LISTER];

	// Is pattern initially enabled?
	if (lister->flags&LISTERF_VIEW_ICONS)
		lister->pattern.disabled=FALSE;
	else lister->pattern.disabled=TRUE;

	// Get refresh mode
	if (environment->env->lister_options&LISTEROPTF_SIMPLE) mode=WA_SimpleRefresh;
	else mode=WA_SmartRefresh;

	// Initialise boopsi list
	NewList(&lister->backdrop_info->boopsi_list);

	// Create iconify gadget
	gadget=
		create_iconify_gadget(
			screen,
			&lister->backdrop_info->boopsi_list,
			(lister->flags&LISTERF_LOCK_POS)?TRUE:FALSE);


	// Create lock gadget
	if (!(GUI->flags2&GUIF2_NO_PADLOCK) &&
			(lock_gad=
				CreateTitleGadget(
					screen,
					&lister->backdrop_info->boopsi_list,
					(lister->flags&LISTERF_LOCK_POS)?TRUE:FALSE,
					(gadget)?-gadget->Width+TBGADGETOFFSET:0,
					IM_LOCK,
					GAD_LOCK)))
	{
		// Chain gadgets
		if (gadget) gadget->NextGadget=lock_gad;
		else gadget=lock_gad;

		// Fix selection flags
		lock_gad->Activation|=GACT_TOGGLESELECT;
		if (lister->more_flags&LISTERF_LOCK_FORMAT)
			lock_gad->Flags|=GFLG_SELECTED;
	}

	// Open lister window
	if (!(lister->window=OpenWindowTags(0,
		WA_Left,dims->Left,
		WA_Top,dims->Top,
		WA_Width,dims->Width,
		WA_Height,dims->Height,
		WA_MinWidth,lister->win_limits.Left,
		WA_MinHeight,lister->win_limits.Top,
		WA_MaxWidth,(ULONG)~0,
		WA_MaxHeight,(ULONG)~0,
		(lister->dimensions.wd_Flags&WDF_VALID)?WA_Zoom:TAG_IGNORE,(ULONG)&lister->dimensions.wd_Zoomed,
		WA_IDCMP,
				IDCMP_ACTIVEWINDOW|
				IDCMP_CHANGEWINDOW|
				IDCMP_CLOSEWINDOW|
				IDCMP_GADGETDOWN|
				IDCMP_GADGETUP|
				IDCMP_INACTIVEWINDOW|
				IDCMP_MENUHELP|
				IDCMP_MENUPICK|
				IDCMP_MENUVERIFY|
				IDCMP_MOUSEBUTTONS|
				IDCMP_MOUSEMOVE|
				#ifdef __amigaos4__
				IDCMP_EXTENDEDMOUSE|
				#endif   
				IDCMP_NEWSIZE|
				IDCMP_REFRESHWINDOW|
				IDCMP_RAWKEY,
		WA_AutoAdjust,TRUE,
		WA_CloseGadget,!(lister->flags&LISTERF_LOCK_POS),
		WA_DragBar,!(lister->flags&LISTERF_LOCK_POS),
		WA_DepthGadget,TRUE,
		WA_MenuHelp,TRUE,
		WA_NewLookMenus,TRUE,
		WA_SizeGadget,TRUE,
		WA_SizeBRight,TRUE,
		WA_SizeBBottom,TRUE,
		WA_CustomScreen,screen,
		WA_ScreenTitle,GUI->screen_title,
		WA_WindowName, DOPUS_WIN_NAME,
		WA_Gadgets,gadget,
		mode,TRUE,
		(lister->flags&LISTERF_LOCK_POS)?WA_Title:TAG_IGNORE,"",
		WA_BackFill,&lister->pattern,
		TAG_END))) return 0;

	// Fix title gadgets
	FixTitleGadgets(lister->window);

	// Save left border
	lister->old_border_left=lister->window->BorderLeft;

	// Initialise ID
	SetWindowID(lister->window,&lister->id,WINDOW_LISTER,(struct MsgPort *)lister->ipc);

	// Initialise dimensions
	InitWindowDims(lister->window,&lister->dimensions);

	// Close existing font
	if (lister->font) CloseFont(lister->font);

	// Clear proportional font flag
	lister->more_flags&=~LISTERF_PROP_FONT;

	// Open font
	if ((lister->font=OpenDiskFont(&lister->lister_font)))
	{
		// Proportional	font?
		if (lister->font->tf_Flags&FPF_PROPORTIONAL)
		{
			lister->more_flags|=LISTERF_PROP_FONT;
		}
	}

	// Got a font?
	if (lister->font)
	{
		// Set font in window and text area
		SetFont(lister->window->RPort,lister->font);
		SetFont(&lister->text_area.rast,lister->font);
	}

	// Otherwise, get info on default font
	else
	{
		// Get font info
		AskFont(lister->window->RPort,&lister->lister_font);
	}

	// Get DrawInfo
	lister->drawinfo=GetScreenDrawInfo(lister->window->WScreen);

	// Set menus
	display_get_menu(lister->window);
	display_fix_menu(
		lister->window,
		(lister->flags&LISTERF_VIEW_ICONS)?WINDOW_LISTER_ICONS:WINDOW_LISTER,
		lister);
	lister_fix_menus(lister,0);

	// Initialise backdrop info
	backdrop_init_info(lister->backdrop_info,lister->window,0);

	// Turn on gauge if needed
	lister_set_gauge(lister,FALSE);

	// Fill out size covering gadget
	if ((gadget=FindGadgetType(lister->window->FirstGadget,GTYP_SIZING)))
	{
		// Copy size gadget
		fill_out_cover_gadget(gadget,&lister->size_cover_gadget);

		// Clear image in original gadget if lister is locked
		if (lister->flags&LISTERF_LOCK_POS)
		{
			gadget->Flags&=~GFLG_GADGIMAGE;
			gadget->GadgetRender=0;
		}
	}

	// Fill out zoom covering gadget
	if ((gadget=FindGadgetType(lister->window->FirstGadget,GTYP_WZOOM)))
	{
		// Copy zoom gadget
		fill_out_cover_gadget(gadget,&lister->zoom_cover_gadget);

		// Clear image in original gadget if lister is locked
		if (lister->flags&LISTERF_LOCK_POS)
		{
			// Clear image in original gadget
			gadget->Flags&=~GFLG_GADGIMAGE;
			gadget->GadgetRender=0;
		}

		// Otherwise, change gadget type
		else
		{
			// Clear zoom flag, set ID
			gadget->GadgetType&=~(GTYP_SYSTYPEMASK|GTYP_SYSGADGET);
			gadget->GadgetID=GAD_ZOOM;
		}
	}

	// Is lister locked?
	if (lister->flags&LISTERF_LOCK_POS)
	{
		// Add to window
		lister->size_cover_gadget.NextGadget=0;
		AddGList(lister->window,&lister->size_cover_gadget,0,1,0);
		RefreshWindowFrame(lister->window);
	}

	// Fix next pointer
	else lister->size_cover_gadget.NextGadget=&lister->zoom_cover_gadget;

	// Create edit hook
	lister->path_edit_hook=
		GetEditHookTags(
			0,
			OBJECTF_NO_SELECT_NEXT,
			GTCustom_History,lister->path_history,
			TAG_END);

	// Create path field
	if (!(lister->path_field=(struct Gadget *)
		NewObject(0,"dopusstrgclass",
			GA_ID,GAD_PATH,
			GA_Left,lister->window->BorderLeft,
			GA_RelBottom,-(lister->window->BorderBottom+FIELD_FONT->tf_YSize+4),
			GA_RelWidth,-(lister->window->BorderLeft+lister->window->BorderRight),
			GA_Height,FIELD_FONT->tf_YSize+4,
			GA_RelVerify,TRUE,
			GA_Immediate,TRUE,
			GTCustom_ThinBorders,TRUE,
			GTCustom_NoGhost,TRUE,
			STRINGA_TextVal,(lister->cur_buffer)?lister->cur_buffer->buf_Path:"",
			STRINGA_MaxChars,511,
			STRINGA_Buffer,lister->path_buffer,
			STRINGA_UndoBuffer,GUI->global_undo_buffer,
			STRINGA_WorkBuffer,GUI->global_undo_buffer+512,
			STRINGA_Font,FIELD_FONT,
			STRINGA_EditHook,lister->path_edit_hook,
			TAG_END)))
	{
		lister_close(lister,0);
		return 0;
	}
	DoMethod((Object *)lister->path_field,OM_ADDTAIL,&lister->backdrop_info->boopsi_list);

	// Initialise side parent button
	lister->parent_button.NextGadget=lister->path_field;
	lister->parent_button.TopEdge=lister->window->BorderTop;
	lister->parent_button.Width=lister->window->BorderLeft;
	lister->parent_button.Height=-(lister->window->BorderTop+lister->window->BorderBottom);
	lister->parent_button.Flags=GFLG_GADGHCOMP|GFLG_RELHEIGHT;
	lister->parent_button.Activation=GACT_RELVERIFY;
	lister->parent_button.GadgetType=GTYP_BOOLGADGET;
	lister->parent_button.GadgetID=GAD_PARENT;

	// Try to add AppWindow
	lister->appwindow=AddAppWindowA(
		WINDOW_LISTER,
		(ULONG)lister,
		lister->window,
		lister->app_port,0);

	// Is lister busy?
	if (lister->flags&LISTERF_BUSY || lister->old_flags&LISTERF_BUSY)
	{
		lister->flags&=~(LISTERF_BUSY|LISTERF_LOCK|LISTERF_LOCKED);
		lister_busy(lister,0);
	}
	else
	if (lister->flags&LISTERF_LOCKED || lister->old_flags&LISTERF_LOCKED)
	{
		lister->flags&=~(LISTERF_BUSY|LISTERF_LOCK|LISTERF_LOCKED);
		lister_busy(lister,1);
	}

	// Initialise lister flags
	lister->flags&=
		LISTERF_LOCK_POS|LISTERF_BUSY|
		LISTERF_LOCK|LISTERF_LOCKED|
		LISTERF_VIEW_ICONS|LISTERF_SHOW_ALL|LISTERF_PATH_FIELD|
		LISTERF_STORED_SOURCE|LISTERF_STORED_DEST|LISTERF_ICON_ACTION|
		LISTERF_FIRST_TIME;
	lister->more_flags&=~LISTERF_TITLEBARRED;

	// Update selection count if in icon mode
	if (lister->flags&LISTERF_ICON_ACTION)
		backdrop_fix_count(lister->backdrop_info,0);

	// Initialise cursor setting
	lister->cursor_line=-1;
	lister->edit_type=-1;

	// Setup lister display
	lister_init_display(lister);
	lister_refresh(lister,LREFRESH_FULL);
	lister_refresh_name(lister);

	// Clear old flags
	lister->old_flags=0;

	// Is this our first time open?
	if (lister->flags&LISTERF_FIRST_TIME)
	{
		char buf[16];

		// Build handle string	
		lsprintf(buf,"%ld",lister);

		// Launch script
		RunScript(SCRIPT_OPEN_LISTER,buf);
	}

	// If busy, show progress window
	if (lister->progress_window)
		ShowProgressWindow(lister->progress_window,0,lister->window);

	// Fix current directory
	lister_fix_cd(lister);

	// Initialise things
	lister->title_click=-1;

	// Return window pointer
	return lister->window;
}