#define DEBUG
#include "MP.h"
#include <debug.h>
#include "patchdata.h"
#include <tagitemmacros.h>

#define ADD_DEBUG_CODE

extern struct MPSem *MPSem;
extern struct Window ASM *(*OldOpenWindow)(REG __a0 struct NewWindow *nw,
                                           REG __a6 struct IntuitionBase *lib);
extern struct Window ASM *(*OldOpenWindowTagList)(REG __a0 struct NewWindow *nw,
                                                  REG __a1 struct TagItem *tags,
                                                  REG __a6 struct IntuitionBase *lib);
extern BOOL ASM *(*OldLayoutMenusA)(REG __a0 struct Menu *fm,
                                    REG __a1 APTR vi, 
                                    REG __a2 struct TagItem *tags,
                                    REG __a6 struct Library *lib);


struct Window __saveds ASM *NewOpenWindow(REG __a0 struct ExtNewWindow *nw,
                                          REG __a6 struct IntuitionBase *IBase)
{
  STRPTR pubname;
  struct Screen *scr=0;
  struct Window *w;
  ULONG oldflags;

  char tnamebuffer[52];
  char *tname;
  ULONG stack1=0xc0de0010;

  DoNothing(&stack1);

  tname=SetupTaskName(tnamebuffer,", OW",50);  
  
DEBUG_CODE( 
            DKP("OpenWindow(%8lx)\n",nw);
            PrintNewWindowData(nw);
          );

  oldflags=nw->Flags;                 // Store orignal flags

  if(nw->Flags & WFLG_NW_EXTENDED)    // order changed 
  {
    /* validate ram *///                                                                               (4.60.1)
    if(((ULONG)nw->Extension & 1)==0 && TypeOfMem(nw->Extension))//                                    (4.60.1)
    {
      if(pubname=(STRPTR)GetTagData(WA_PubScreenName,0,nw->Extension))
      {
        /* Make sure this screen exeist */
        scr=LockPubScreen(pubname);
      }
    }
  }

  if(MPSem->EnabledNLM)  // order changed
  {
    nw->Flags|=WFLG_NEWLOOKMENUS;
  }


  w=OldOpenWindow((struct NewWindow *)nw,IBase);
  
  if(scr)
  {
    UnlockPubScreen(0,scr);
  }
  
  nw->Flags=oldflags;                 // restore orignal flags
  
#ifdef ADD_DEBUG_CODE
  if(MPSem->Debug)
  {
    DKP("  RV=%8lx\n",w);
  }
#endif

  SetTaskName(tname);

  return(w);
}

struct Window __saveds ASM *NewOpenWindowTagList(REG __a0 struct ExtNewWindow *nw,
                                                 REG __a1 struct TagItem *TagList,
                                                 REG __a6 struct IntuitionBase *IBase)
{
  STRPTR pubname;
  struct Screen *scr=0;
  struct Window *w;
  struct TagItem ti[]={WA_NewLookMenus , TRUE , 
                       TAG_DONE , 0};

  char tnamebuffer[52];
  char *tname;
  ULONG stack1=0xc0de0011;

  DoNothing(&stack1);
  
  tname=SetupTaskName(tnamebuffer,", OWTL",50);  

DEBUG_CODE(//                                                                                          (4.56.2)
   DKP("OpenWindowTagList(%8lx,%8lx)\n",nw,TagList);//                                                 (4.56.2)
   PrintNewWindowData(nw);//
   PrintWindowTags(TagList);//                                                                         (4.56.2)
      );  //                                                                                           (4.56.2)

  if(MPSem->EnabledNLM)  
  {
    if(TagList)
    {
      ti[1].ti_Tag =TAG_MORE;
      ti[1].ti_Data=(ULONG)TagList;
    }
    TagList=ti;              
  }

  if(pubname=(STRPTR)GetTagData(WA_PubScreenName,0,TagList))
  {
    /* Make sure this screen exeist */
    scr=LockPubScreen(pubname);
  }

  w=(struct Window *)OldOpenWindowTagList((struct NewWindow *)nw,TagList,IBase);

  if(scr)
  {
    UnlockPubScreen(0,scr);
  }

#ifdef ADD_DEBUG_CODE
  if(MPSem->Debug)
  {
    DKP("  RV=%8lx\n",w);
  }
#endif
  
  SetTaskName(tname);
  
  return(w); 
}

BOOL __saveds ASM NewLayoutMenusA(REG __a0 struct Menu *fm,
                                  REG __a1 APTR vi, 
                                  REG __a2 struct TagItem *tags,
                                  REG __a6 struct Library *GTBase)
{
  BOOL rv;
  struct TagItem ti[]=
  {
    GTMN_NewLookMenus,TRUE,
    TAG_DONE,0
  };

  char tnamebuffer[52];
  char *tname;
  ULONG stack1=0xc0de0012;
  
  DoNothing(&stack1);
  
  tname=SetupTaskName(tnamebuffer,", LMA",50);  


#ifdef ADD_DEBUG_CODE
  if(MPSem->Debug)
  {
    DKP("LayoutMenus(%8lx,%8lx,%8lx) -- %s\n",fm,vi,tags,FindTask(0)->tc_Node.ln_Name);
  }
#endif

//  ObtainSemaphoreShared(&MPSem->ListSem);

  if(MPSem->EnabledNLM)    
  {
    if(tags)
    {
      ti[1].ti_Tag=TAG_MORE;
      ti[1].ti_Data=(ULONG)tags;
    }
    tags=ti;
  }

  rv=(BOOL)OldLayoutMenusA(fm,vi,tags,GTBase);
  
#ifdef ADD_DEBUG_CODE
  if(MPSem->Debug)
  {
    DKP("  RV=%8lx\n",rv);
  }
#endif
  
//  ReleaseSemaphore(&MPSem->ListSem);
  
  SetTaskName(tname);
  
  return(rv); 
}

