void FlameParticleEmitter::emit()
{
	if (!on)
		return;

	Particle *p = objects[NextObject()];

	p->alive = true;
	p->age = 0.0f;
	p->lifespan = 0.6f;
	p->halfSize = 0.06f;

	p->color->r() = 1.0f;
	p->color->g() = (float)(((rand() % 40) + 50) / 100.0f);
	p->color->b() = 0.0f;
	p->color->a() = 0.8f;

	p->colorDecay->g() = 2.0f;
	p->colorDecay->a() = 1.5f;

	p->position->x() = this->position->x() + 0.3f * (facingRight ? 1.0f : -1.0f);
	p->position->y() = this->position->y();
	p->position->z() = this->position->z();

	p->velocity->x() = velocity->x() + (2.5f + ((rand() % 100) / 100.0f)) * (facingRight ? 1.0f : -1.0f);
	p->velocity->y() = ((rand() % 100) / 100.0f) - 0.5f;
	p->velocity->z() = ((rand() % 100) / 100.0f) - 0.5f;

	p->acceleration->y() = 2.0f;
}
Exemplo n.º 2
0
LONGLONG CCpuUsage::CPerfCounters::GetCounterValue(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex, DWORD dwCounterIndex, LPCTSTR pInstanceName)
{
	QueryPerformanceData(pPerfData, dwObjectIndex, dwCounterIndex);

	PPERF_OBJECT_TYPE pPerfObj = NULL;
	LONGLONG lnValue = {0};

	// Get the first object type.
	pPerfObj = FirstObject( *pPerfData );

	// Look for the given object index

	for( DWORD i=0; i < (*pPerfData)->NumObjectTypes; i++ )
	{

		if (pPerfObj->ObjectNameTitleIndex == dwObjectIndex)
		{
			lnValue = GetCounterValue(pPerfObj, dwCounterIndex, pInstanceName);
			break;
		}

		pPerfObj = NextObject( pPerfObj );
	}
	return lnValue;
}
Exemplo n.º 3
0
IPTR ModelClass__OM_UPDATE(Class *cl, Object *o, struct opUpdate *msg)
{
    struct ModelData *data = (struct ModelData *)INST_DATA(cl, o);
    
    /* send OM_UPDATE to all members without mapping the tags! */

    if (!IsListEmpty((struct List *)&data->memberlist))
    {
	STACKULONG method = ICM_CHECKLOOP;

	if (DoMethodA(o, (Msg)&method) == 0) /* avoid loops */
	{
	    struct TagItem *clonetags;

	    if ((clonetags = CloneTagItems(msg->opu_AttrList)))
	    {
		struct opUpdate  opu = *msg;
		Object          *member, *objstate;

		opu.MethodID     = OM_UPDATE; /* not OM_NOTIFY! */
		opu.opu_AttrList = clonetags;

		method = ICM_SETLOOP;
		DoMethodA(o, (Msg)&method);

		objstate = (Object *)data->memberlist.mlh_Head;
		while((member = NextObject(&objstate)))
		{
		    DoMethodA(member, (Msg)&opu);

		    /* in case the member object poked around in the taglist: */
		    RefreshTagItemClones(clonetags, msg->opu_AttrList);
		}

		method = ICM_CLEARLOOP;
		DoMethodA(o, (Msg)&method);

		FreeTagItems(clonetags);
	    }

	} /* if (DoMethod(o, ICM_CHECKLOOP) == 0) */

    } /* if (!IsListEmpty(&data->memberlist)) */

    /* modelclass is a superclass of icclass so not only the members are targets,
     * but possibly also the modelclass object itself could have an ICA_Target.
     * This is handled by the superclass */

    return DoSuperMethodA(cl, o, (Msg)msg);
}
Exemplo n.º 4
0
void SavePerfInfo(const Char_t *filename)
{
   // Save PROOF timing information from TPerfStats to file 'filename' 

   if (!gProof) {
      cout << "PROOF must be run to save output performance information" << endl;
      return;
   }
   
   TFile f(filename, "UPDATE");
   if (f.IsZombie()) {
      cout << "Could not open file " << filename << " for writing" << endl;
   } else {
      f.cd();
      
      TIter NextObject(gProof->GetOutputList());
      TObject* obj = 0;
      while (obj = NextObject()) {
         TString objname = obj->GetName();
         if (objname.Contains(TRegexp("^PROOF_"))) {
            // must list the objects since other PROOF_ objects exist
            // besides timing objects
            if (objname == "PROOF_PerfStats" ||
                objname == "PROOF_PacketsHist" ||
                objname == "PROOF_EventsHist" ||
                objname == "PROOF_NodeHist" ||
                objname == "PROOF_LatencyHist" ||
                objname == "PROOF_ProcTimeHist" ||
                objname == "PROOF_CpuTimeHist")
               obj->Write();
         }
      }

      f.Close();
   }

}
Exemplo n.º 5
0
//*********************************************************************
//
//  FindObject
//
//      Returns pointer to object with TitleIndex.  If not found, NULL
//      is returned.
//
PPERF_OBJECT FindObject (PPERF_DATA pData, DWORD TitleIndex)
{
PPERF_OBJECT pObject;
DWORD        i = 0;

    if (pObject = FirstObject (pData))
        while (i < pData->NumObjectTypes)
            {
            if (pObject->ObjectNameTitleIndex == TitleIndex)
                return pObject;

            pObject = NextObject (pObject);
            i++;
            }

    return NULL;
}
void SnowmanManager::UpdateAll(float deltaTime)
{
	spawnTimer += deltaTime;
	if (spawnTimer > spawnFrequency)
	{
		if (leftToSpawn-- > 0)
			objects[NextObject()]->Respawn(&zValues);

		spawnTimer = 0.0f;

		// Don't let it go negative
		leftToSpawn = (leftToSpawn < 0 ? 0 : leftToSpawn);
	}

	for (int i=0; i<objectCount; i++)
		objects[i]->Update(deltaTime);
}
Exemplo n.º 7
0
static Object *findWinObjByAttr(Object *app, ULONG attr, IPTR val)
{
    struct List *winlist;
    Object      *obj;
    Object      *state;

    /* return the window object which supports OM_GET on attr, and
       whose value of attr == val */

    winlist = (struct List *)xget(app,MUIA_Application_WindowList);
    state = (Object *)winlist->lh_Head;

    while((obj = NextObject(&state)) != NULL)
    {
        IPTR value;

        if((value = xget(obj,attr)) != 0 && (value == val))
          break;
    }

    return obj;
}
void SnowfallParticleEmitter::emit()
{
	if (!on)
		return;

	Particle *p = objects[NextObject()];

	p->alive = true;
	p->age = 0.0f;
	p->lifespan = 5.0f;
	p->halfSize = 0.02f;

	p->color->r() = 1.0f;
	p->color->g() = 1.0f;
	p->color->b() = 1.0f;
	p->color->a() = 0.5f;

	p->position->x() = (float)((((rand() % 100) / 100.0f) * 16.0f) - 3.0f);
	p->position->y() = 2.8f;
	p->position->z() = (float)((rand() % 200) / 100.0f);
	
	p->velocity->y() = ((rand() % 100) / 100.0f) - 1.5f;
}
Exemplo n.º 9
0
static void closeAllWindows(Object *app)
{
  BOOL loop;

  ENTER();

  do
  {
    struct List *list;
    Object *mstate;
    Object *win;

    loop = FALSE;

    list = (struct List *)xget(app, MUIA_Application_WindowList);
    mstate = (Object *)list->lh_Head;

    while((win = NextObject(&mstate)) != NULL)
    {
      ULONG ok = FALSE;

      ok = xget(win, MUIA_App_IsSubWin);
      if(ok)
      {
        set(win, MUIA_Window_Open, FALSE);
        DoMethod(app, OM_REMMEMBER, (IPTR)win);
        MUI_DisposeObject(win);
        loop = TRUE;
        break;
      }
    }
  }
  while(loop == TRUE);

  LEAVE();
}
Exemplo n.º 10
0
IPTR ModelClass__OM_DISPOSE(Class *cl, Object *o, Msg msg)
{
    struct ModelData *data = (struct ModelData *)INST_DATA(cl, o);

    for(;;)
    {
	/* free all member objects */

	Object *member, *objstate;
	ULONG method;

	objstate = (Object *)data->memberlist.mlh_Head;
	member = NextObject(&objstate);
	if (!member) break;

	method = OM_REMOVE;
	DoMethodA(member, (Msg)&method);

	DisposeObject(member);
	
    }
    
    return DoSuperMethodA(cl, o, msg);
}
Exemplo n.º 11
0
/**
 * Accept the current filter settings.
 */
static void filter_accept_rule(void)
{
	if (filter_last_selected)
	{
		/* Store the DestFolder */
		free(filter_last_selected->dest_folder); /* Safe to call with NULL */
		filter_last_selected->dest_folder = mystrdup((char*)xget(filter_move_text,MUIA_Text_Contents));
		filter_last_selected->use_dest_folder = xget(filter_move_check,MUIA_Selected);

		/* Store the ARexxfile */
		free(filter_last_selected->arexx_file);
		filter_last_selected->arexx_file = mystrdup((char*)xget(filter_arexx_string,MUIA_String_Contents));
		filter_last_selected->use_arexx_file = xget(filter_arexx_check,MUIA_Selected);

		/* Store the Soundfile */
		free(filter_last_selected->sound_file);
		filter_last_selected->sound_file = mystrdup((char*)xget(filter_sound_string,MUIA_String_Contents));
		filter_last_selected->use_sound_file = xget(filter_sound_check,MUIA_Selected);

		/* Store the flags */
		filter_last_selected->flags = 0;

		if (xget(filter_request_check, MUIA_Selected)) filter_last_selected->flags |= FILTER_FLAG_REQUEST;
		if (xget(filter_new_check, MUIA_Selected)) filter_last_selected->flags |= FILTER_FLAG_NEW;
		if (xget(filter_sent_check, MUIA_Selected)) filter_last_selected->flags |= FILTER_FLAG_SENT;
		if (xget(filter_remote_check, MUIA_Selected)) filter_last_selected->flags |= FILTER_FLAG_REMOTE;

		/* Go though all objects of the rule_rule_group and build a new
       rule list from it */
		{
		  struct List *child_list = (struct List*)xget(filter_rule_group,MUIA_Group_ChildList);
		  Object *cstate = (Object *)child_list->lh_Head;
		  Object *child;

		  while ((child = (Object*)NextObject(&cstate)))
		  {
		  	struct filter_rule *fr = (struct filter_rule*)xget(child,MUIA_UserData);
		  	if (fr)
		  	{
		  		struct filter_rule *new_fr = (struct filter_rule*)xget(child,MUIA_FilterRule_Data);

					/* free all strings of the rule */
					switch (fr->type)
					{
						case	RULE_FROM_MATCH:
						    	array_free(fr->u.from.from);
						    	array_free(fr->u.from.from_pat);
						    	break;
						case	RULE_RCPT_MATCH:
						    	array_free(fr->u.rcpt.rcpt);
						    	array_free(fr->u.rcpt.rcpt_pat);
						    	break;
						case	RULE_SUBJECT_MATCH:
						    	array_free(fr->u.subject.subject);
						    	array_free(fr->u.subject.subject_pat);
						    	break;
						case	RULE_HEADER_MATCH:
						    	if (fr->u.header.name) free(fr->u.header.name);
						    	if (fr->u.header.name_pat) free(fr->u.header.name_pat);
						    	array_free(fr->u.header.contents);
						    	array_free(fr->u.header.contents_pat);
						    	break;
						case	RULE_BODY_MATCH:
						    	if (fr->u.body.body) free(fr->u.body.body);
						    	filter_deinit_rule(&fr->u.body.body_parsed);
						    	break;
					}

					/* clear all the memory. the node it self should not be cleared, so it stays
					   on the same position */
					memset(((char*)fr)+sizeof(struct node),0,sizeof(struct filter_rule)-sizeof(struct node));

					/* now copy over the new settings */
					fr->type = new_fr->type;
					fr->flags = new_fr->flags;
					switch (new_fr->type)
					{
						case	RULE_FROM_MATCH:
									fr->u.from.from = array_duplicate(new_fr->u.from.from);
									break;
						case	RULE_RCPT_MATCH:
									fr->u.rcpt.rcpt = array_duplicate(new_fr->u.rcpt.rcpt);
									break;
						case	RULE_SUBJECT_MATCH:
									fr->u.subject.subject = array_duplicate(new_fr->u.subject.subject);
									break;
						case	RULE_HEADER_MATCH:
									fr->u.header.name = mystrdup(new_fr->u.header.name);
									fr->u.header.contents = array_duplicate(new_fr->u.header.contents);
									break;
						case	RULE_STATUS_MATCH:
									fr->u.status.status = new_fr->u.status.status;
									break;
					}
		  	}
		  }
		}
		filter_parse_filter_rules(filter_last_selected);
	}
}
Exemplo n.º 12
0
static int HostStatsFetchData(void)
{
  DWORD o;
  PPERF_OBJECT_TYPE objPtr = NULL;
  DWORD res;
  DWORD oldBufferSize = BufferSize;
  const char * qstr;
  qstr = LEVEL1_QUERY_STRING;

  while ((res = RegQueryValueEx(HKEY_PERFORMANCE_DATA, qstr,
				NULL, NULL,
				(LPBYTE)PerfData,
				&BufferSize)) == ERROR_MORE_DATA) {
    oldBufferSize += 4096;
    BufferSize = oldBufferSize;
    PerfData = (PPERF_DATA_BLOCK)realloc(PerfData, BufferSize);
    }
  if (res != ERROR_SUCCESS) {
    fprintf(stderr,
        "Can't get Windows performance data. RegQueryValueEx returned %ld, errorno \"%d\"\n",
        GetLastError(),
	res);
    return -1;
    }
#ifdef NTDBG
  fprintf(stderr, "buffersize is %ld\n", BufferSize);
  fflush(stderr);
#endif

  ProcessObj = NULL;
  ProcessorObj = NULL;
  MemoryObj = NULL;
  SystemObj = NULL;
  ObjectsObj = NULL;

  objPtr = FirstObject(PerfData);
  for (o=0; o < PerfData->NumObjectTypes; o++) {
#ifdef NTDBG
    fprintf(stderr, "Object %ld\n", objPtr->ObjectNameTitleIndex);
    fflush(stderr);
#endif
    switch (objPtr->ObjectNameTitleIndex) {
      case PROCESS_OBJ_ID: ProcessObj = objPtr; break;
      case PROCESSOR_OBJ_ID: ProcessorObj = objPtr; break;
      case MEMORY_OBJ_ID: MemoryObj = objPtr; break;
      case SYSTEM_OBJ_ID: SystemObj = objPtr; break;
      case OBJECTS_OBJ_ID: ObjectsObj = objPtr; break;
      case NETWORK_OBJ_ID: NetworkObj = objPtr; break;
      case UDP_OBJ_ID: UdpObj = objPtr; break;
      }
    objPtr = NextObject(objPtr);
    }
  if ( ProcessObj == NULL ||
       ProcessorObj == NULL ||
       MemoryObj == NULL ||
       SystemObj == NULL ||
       ObjectsObj == NULL ||
       NetworkObj == NULL ||
       UdpObj == NULL )
  {
    return -1;
  }
  loadProcessData();
  loadProcessorData();
  loadSystemData();
  loadMemoryData();
  loadObjectData();
  loadUdpData();
  loadCpuData();
  loadNetworkData();
  return 0;
}
Exemplo n.º 13
0
// Listview dispatcher
ULONG LIBFUNC listview_dispatch(
	REG(a0, Class *cl),
	REG(a2, Object *obj),
	REG(a1, Msg msg))
{
	ListViewData *data=0;
	struct Gadget *gadget=0;
	ULONG retval=0;

	// Get gadget and data pointers
	if (obj)
	{
		gadget=(struct Gadget *)obj;
		data=INST_DATA(cl,obj);
	}

	// Look at method
	switch (msg->MethodID)
	{
		// Create a new instance
		case OM_NEW:

			// Create superclass instance
			if ((retval=DoSuperMethodA(cl,obj,msg)))
			{
				struct TagItem *tags,*tag;
				short a;
				struct Image *image;
				struct TextAttr *attr;

				// Get pointer to our gadget and instance data
				gadget=(struct Gadget *)retval;
				data=INST_DATA(cl,(APTR)retval);

				// Initialise data
				data->dims=*(struct IBox *)&gadget->LeftEdge;
				NewList(&data->boopsi_list);
				data->sel=-1;
				data->last_selection=-1;

				// Initialise mapping tags
				data->scroll_map[0].ti_Tag=PGA_Top;
				data->scroll_map[0].ti_Data=DLV_Top;
				data->scroll_map[1].ti_Tag=TAG_END;
				data->arrow_up_map[0].ti_Tag=GA_ID;
				data->arrow_up_map[0].ti_Data=DLV_ScrollUp;
				data->arrow_up_map[1].ti_Tag=TAG_END;
				data->arrow_down_map[0].ti_Tag=GA_ID;
				data->arrow_down_map[0].ti_Data=DLV_ScrollDown;
				data->arrow_down_map[1].ti_Tag=TAG_END;

				// Get taglist
				tags=((struct opSet *)msg)->ops_AttrList;

				// Get width of scroller
				data->scroller_width=GetTagData(DLV_ScrollWidth,16,tags);

				// Flags
				if (FindTagItem(DLV_ShowSelected,tags))
					data->flags|=LVF_SHOW_SELECTED;
				if (GetTagData(DLV_ThinBorder,0,tags))
					data->flags|=LVF_THIN_BORDER;
				if (GetTagData(DLV_MultiSelect,0,tags))
					data->flags|=LVF_MULTI_SELECT;
				else
				if (GetTagData(DLV_Check,0,tags))
					data->flags|=LVF_SELECTED_CHECK;
				else
				if ((a=GetTagData(DLV_ShowChecks,0,tags)))
				{
					data->flags|=LVF_SHOW_CHECKS;
					if (a==2) data->flags|=LVF_NO_HIGHLIGHT;
				}
				if (GetTagData(DLV_Highlight,0,tags))
					data->flags|=LVF_SELECTED_HIGH;
				if (GetTagData(DLV_ReadOnly,0,tags))
					data->flags|=LVF_READ_ONLY;
				if (GetTagData(DLV_NoScroller,0,tags))
				{
					data->flags|=LVF_NO_SCROLLER;
					data->scroller_width=0;
				}
				else
				if (GetTagData(DLV_ScrollLeft,0,tags))
					data->flags|=LVF_SCROLLER_LEFT;
				if (GetTagData(DLV_TopJustify,0,tags))
					data->flags|=LVF_TOP_JUSTIFY;
				if (GetTagData(DLV_RightJustify,0,tags))
					data->flags|=LVF_RIGHT_JUSTIFY;
				if ((a=GetTagData(DLV_DragNotify,0,tags)))
				{
					data->flags|=LVF_DRAG_NOTIFY;
					if (a==2) data->flags|=LVF_NO_VERT_SCROLL;
				}
				data->layout_flags=GetTagData(DLV_Flags,PLACETEXT_ABOVE,tags);
				if (GetTagData(DLV_ShowFilenames,0,tags))
					data->flags|=LVF_SHOW_FILENAMES;
				if (GetTagData(DLV_ShowSeparators,0,tags))
					data->flags|=LVF_SHOW_SEPARATORS;

				// Get title
				if ((tag=FindTagItem(GA_Text,tags)))
				{
					char *ptr;
					short pos=0;

					// Get pointer to title
					if ((ptr=(char *)tag->ti_Data))
					{
						data->title_uscore=-1;

						// Copy title string, look for underscore
						while (*ptr && pos<78)
						{
							// Underscore?
							if (*ptr=='_')
							{
								// Remember position, skip over it
								data->title_uscore=pos;
							}

							// Otherwise, store
							else data->title[pos++]=*ptr;
							++ptr;
						}
						data->title[pos]=0;
					}
				}

				// Get font to use
				if ((attr=(struct TextAttr *)GetTagData(GTCustom_TextAttr,0,tags)))
				{
					if ((data->list_font=OpenFont(attr)))
						data->flags|=LVF_GOT_FONT;
				}
				if (!data->list_font) data->list_font=((struct GfxBase *)GfxBase)->DefaultFont;

				// Arrow height
				data->arrow_height=data->list_font->tf_YSize-2;
				if (data->arrow_height<10) data->arrow_height=10;

				// Fix dimensions
				listview_get_dims(cl,data);
				data->text_height=data->list_font->tf_YSize;

				// Need check mark?
				if (data->flags&(LVF_MULTI_SELECT|LVF_SHOW_CHECKS) ||
					(data->flags&(LVF_SHOW_SELECTED|LVF_SELECTED_CHECK))==(LVF_SHOW_SELECTED|LVF_SELECTED_CHECK))
				{
					// Create check image
					if ((data->check=(struct Image *)NewObject(
						0,"dopusiclass",
						DIA_Type,IM_CHECK,
						IA_Width,13,
						IA_Height,data->text_height-1,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)data->check,OM_ADDTAIL,&data->boopsi_list);
					}
					data->text_offset=23;
				}
				else data->text_offset=2;

				// Scroller needed?
				if (!(data->flags&LVF_NO_SCROLLER))
				{
					// Create scroller
					if ((data->scroller=(struct Gadget *)NewObject(
						0,"propgclass",
						GA_Previous,gadget,
						GA_ID,LVGID_SCROLLER,
						GA_Left,(data->flags&LVF_SCROLLER_LEFT)?data->dims.Left+4:data->dims.Left+data->dims.Width-data->scroller_width+4,
						GA_Top,data->dims.Top+2,
						GA_Width,data->scroller_width-8,
						GA_Height,data->dims.Height-4-(data->arrow_height<<1),
						GA_Disabled,(gadget->Flags&GFLG_DISABLED)?TRUE:FALSE,
						PGA_Freedom,FREEVERT,
						PGA_NewLook, TRUE,
						PGA_Borderless,TRUE,
						PGA_Visible,1,
						PGA_Total,1,
						ICA_TARGET,gadget,
						ICA_MAP,data->scroll_map,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)data->scroller,OM_ADDTAIL,&data->boopsi_list);
					}

					// Create up arrow image
					if ((image=(struct Image *)NewObject(
						0,"dopusiclass",
						IA_Width,data->scroller_dims.Width,
						IA_Height,data->arrow_height,
						DIA_Type,IM_ARROW_UP,
						DIA_ThinBorders,(data->flags&LVF_THIN_BORDER)?TRUE:FALSE,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)image,OM_ADDTAIL,&data->boopsi_list);
					}

					// Create up arrow button
					if ((data->arrows[0]=(struct Gadget *)NewObject(
						0,"buttongclass",
						GA_ID,LVGID_ARROW,
						GA_Previous,data->scroller,
						GA_Left,data->scroller_dims.Left,
						GA_Top,data->scroller_dims.Top+data->scroller_dims.Height,
						GA_Width,data->scroller_dims.Width,
						GA_Height,data->arrow_height,
						GA_Image,image,
						GA_Disabled,(gadget->Flags&GFLG_DISABLED)?TRUE:FALSE,
						ICA_TARGET,gadget,
						ICA_MAP,data->arrow_up_map,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)data->arrows[0],OM_ADDTAIL,&data->boopsi_list);
					}

					// Create down arrow image
					if ((image=(struct Image *)NewObject(
						0,"dopusiclass",
						IA_Width,data->scroller_dims.Width,
						IA_Height,data->arrow_height,
						DIA_Type,IM_ARROW_DOWN,
						DIA_ThinBorders,(data->flags&LVF_THIN_BORDER)?TRUE:FALSE,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)image,OM_ADDTAIL,&data->boopsi_list);
					}

					// Create down arrow button
					if ((data->arrows[1]=(struct Gadget *)NewObject(
						0,"buttongclass",
						GA_ID,LVGID_ARROW,
						GA_Previous,data->arrows[0],
						GA_Left,data->scroller_dims.Left,
						GA_Top,data->scroller_dims.Top+data->scroller_dims.Height+data->arrow_height,
						GA_Width,data->scroller_dims.Width,
						GA_Height,data->arrow_height,
						GA_Image,image,
						GA_Disabled,(gadget->Flags&GFLG_DISABLED)?TRUE:FALSE,
						ICA_TARGET,gadget,
						ICA_MAP,data->arrow_down_map,
						TAG_END)))
					{
						// Add to boopsi list
						DoMethod((Object *)data->arrows[1],OM_ADDTAIL,&data->boopsi_list);
					}
				}
			}
			else break;

		// Fall through to OM_SET


		// Update/Set
		case OM_UPDATE:
		case OM_SET:
			{
				struct TagItem *tag,*tags;
				unsigned short old;
				struct Node *node;
				short item;
				short redraw=0;

				// Get taglist
				tags=((struct opSet *)msg)->ops_AttrList;

				// Make visible?
				if ((tag=FindTagItem(DLV_MakeVisible,tags)))
				{
					short scroll;

					// Remember old top
					old=data->top;

					// Get scroll amount
					scroll=tag->ti_Data-old;

					// Need to scroll?
					if (scroll<0 ||
						scroll>=data->lines)
					{
						// Get scroll amount
						if (scroll>=data->lines)
							scroll-=data->lines-1;

						// Get new top
						data->top+=scroll;

						// Bounds check
						if (data->top>data->count-data->lines)
							data->top=data->count-data->lines;
						if (data->top<0) data->top=0;

						// Redraw?
						if (old!=data->top)
						{
							data->last_sel=-1;
							redraw=2;
						}
					}
				}

				// New top?
				else
				if ((tag=FindTagItem(DLV_Top,tags)))
				{
					// Remember old top
					old=data->top;

					// Get new top
					data->top=tag->ti_Data;

					// Bounds check
					if (data->top>data->count-data->lines)
						data->top=data->count-data->lines;
					if (data->top<0) data->top=0;

					// Redraw?
					if (old!=data->top)
					{
						data->last_sel=-1;
						redraw=2;
					}
				}

				// Scroll up
				else
				if ((tag=FindTagItem(DLV_ScrollUp,tags)))
				{
					// Is this the gadgetup?
					if (msg->MethodID==OM_UPDATE &&
						!(((struct opUpdate *)msg)->opu_Flags&OPUF_INTERIM))
					{
						// Clear scroll count
						data->scroll_count=0;
					}

					// Or is this the second/third scroll (first/second intuitick)?
					else
					if (msg->MethodID==OM_UPDATE &&
						(data->scroll_count==1 || data->scroll_count==2))
					{
						// Throw this away
						++data->scroll_count;
					}

					// Otherwise, check it's valid
					else
					if (tag->ti_Data!=(ULONG)-LVGID_ARROW)
					{
						// Bounds check
						if (data->top>0)
						{
							--data->top;
							data->last_sel=-1;
							redraw=2;
						}

						// Increment scroll count if necessary
						if (msg->MethodID==OM_UPDATE) ++data->scroll_count;
					}
				}

				// Scroll down
				else
				if ((tag=FindTagItem(DLV_ScrollDown,tags)))
				{
					// Is this the gadgetup?
					if (msg->MethodID==OM_UPDATE &&
						!(((struct opUpdate *)msg)->opu_Flags&OPUF_INTERIM))
					{
						// Clear scroll count
						data->scroll_count=0;
					}

					// Or is this the second/third scroll (first/second intuitick)?
					else
					if (msg->MethodID==OM_UPDATE &&
						(data->scroll_count==1 || data->scroll_count==2))
					{
						// Throw this away
						++data->scroll_count;
					}

					// Otherwise, check it's valid
					else
					if (tag->ti_Data!=(ULONG)-LVGID_ARROW)
					{
						// Bounds check
						if (data->top<data->count-data->lines)
						{
							++data->top;
							data->last_sel=-1;
							redraw=2;
						}

						// Increment scroll count if necessary
						if (msg->MethodID==OM_UPDATE) ++data->scroll_count;
					}
				}

				// New labels
				if ((tag=FindTagItem(DLV_Labels,tags)))
				{
					// clear top item
					data->top_item=0;

					// Store new label pointer
					data->labels=(struct List *)tag->ti_Data;

					// Detached list?
					if (data->labels==(struct List *)~0)
						data->flags|=LVF_DETACHED;

					// No list
					else
					if (data->labels==0)
					{
						// Clear detach flag
						data->count=0;
						data->flags&=~LVF_DETACHED;
						redraw=1;
					}

					// Valid list
					else
					{
						// Count items
						for (data->count=0,node=data->labels->lh_Head;
							node->ln_Succ;
							data->count++,node=node->ln_Succ);

						// Bounds check top
						if (data->top+data->lines>data->count)
							data->top=data->count-data->lines;
						if (data->top<0) data->top=0;

						// Check selection for out-of-bounds
						if (data->sel>data->count-1) data->sel=-1;

						// Clear detach flag
						data->flags&=~LVF_DETACHED;
						redraw=1;
					}
				}

				// Selected
				if ((tag=FindTagItem(DLV_Selected,tags)) ||
					(tag=FindTagItem(DLV_SelectPrevious,tags)) ||
					(tag=FindTagItem(DLV_SelectNext,tags)) ||
					(tag=FindTagItem(DLV_PageUp,tags)) ||
					(tag=FindTagItem(DLV_PageDown,tags)) ||
					(tag=FindTagItem(DLV_Home,tags)) ||
					(tag=FindTagItem(DLV_End,tags)))
				{
					// Store old
					old=data->sel;

					// Get new selected
					if (tag->ti_Tag==DLV_Selected)
					{
						data->sel=tag->ti_Data;
					}
					else
					if (tag->ti_Tag==DLV_SelectPrevious)
					{
						if (data->sel>0) --data->sel;
					}
					else
					if (tag->ti_Tag==DLV_SelectNext)
					{
						++data->sel;
					}
					else
					if (tag->ti_Tag==DLV_PageUp)
					{
						if (data->sel==data->top)
							data->sel-=data->lines-1;
						else
							data->sel=data->top;
						if (data->sel<0) data->sel=0;
					}
					else
					if (tag->ti_Tag==DLV_PageDown)
					{
						if (data->sel==data->top+data->lines-1)
							data->sel+=data->lines-1;
						else
							data->sel=data->top+data->lines-1;
					}
					else
					if (tag->ti_Tag==DLV_Home)
					{
						data->sel=0;
					}
					else
					if (tag->ti_Tag==DLV_End)
					{
						data->sel=data->count-1;
					}

					// Bounds check
					if (data->sel>data->count-1) data->sel=data->count-1;
					if (data->sel<0) data->sel=-1;

					// Changed?
					if (data->sel!=old && !(gadget->Flags&GFLG_DISABLED))
					{
						// Save selection
						if (!redraw)
						{
							data->last_sel=data->last_selection;
							redraw=2;
						}
						data->last_selection=data->sel;

						// Send notify
						DoMethod(obj,OM_NOTIFY,0,((struct opSet *)msg)->ops_GInfo,0);
					}
				}

				// Disabled (set only)
				if (msg->MethodID==OM_SET &&
					(tag=FindTagItem(GA_Disabled,tags)))
				{
					// Different to current state?
					if ((tag->ti_Data && !(gadget->Flags&GFLG_DISABLED)) ||
						(!tag->ti_Data && gadget->Flags&GFLG_DISABLED))
					{
						struct TagItem distags[2];
						short a;

						// Fill out disable tags
						distags[0].ti_Tag=GA_Disabled;
						distags[0].ti_Data=tag->ti_Data;
						distags[1].ti_Tag=TAG_DONE;

						// Set state of slider
						if (data->scroller)
						{
							DoMethod(
								(Object *)data->scroller,
								OM_SET,
								distags,
								((struct opSet *)msg)->ops_GInfo);

							// And arrows
							for (a=0;a<2;a++)
								DoMethod(
									(Object *)data->arrows[a],
									OM_SET,
									distags,
									((struct opSet *)msg)->ops_GInfo);

							// Set flag to say disable state changed
							if (!tag->ti_Data)
								data->flags|=LVF_DISABLE_CHANGE;
						}

						// Change disable state and redraw
						gadget->Flags^=GFLG_DISABLED;
						redraw=1;
					}
				}

				// Get top item
				if (!data->labels) data->top_item=0;
				else
				if (!(data->flags&LVF_DETACHED) && data->labels)
				{
					for (node=data->labels->lh_Head,item=0;
						node->ln_Succ && item<data->top;
						node=node->ln_Succ,item++);
					data->top_item=node;
				}

				// Do we need to redraw the list?
				if (msg->MethodID==OM_SET || msg->MethodID==OM_UPDATE)
				{
					if (redraw && !(data->flags&LVF_DETACHED))
					{
						struct RastPort *rp;

						// Get rastport
						if ((rp=ObtainGIRPort(((struct opSet *)msg)->ops_GInfo)))
						{
							// Send redraw
							DoMethod(
								obj,
								GM_RENDER,
								((struct opSet *)msg)->ops_GInfo,
								rp,
								(redraw==2)?GREDRAW_UPDATE:GREDRAW_REDRAW);
							ReleaseGIRPort(rp);
						}
					}
				}
			}
			break;


		// Get an attribute
		case OM_GET:
			{
				struct opGet *get;

				// Get get message
				get=(struct opGet *)msg;

				// Default to ok
				retval=1;

				// Look at attribute
				switch (get->opg_AttrID)
				{
					// Selected
					case DLV_Selected:
						*get->opg_Storage=(ULONG)data->last_selection;
						break;

					// Top
					case DLV_Top:
						*get->opg_Storage=(ULONG)data->top;
						break;

					// Lines
					case DLV_Lines:
						*get->opg_Storage=(ULONG)data->lines;
						break;

					// Labels
					case DLV_Labels:
						*get->opg_Storage=(ULONG)data->labels;
						break;

					// Get line from coordinates
					case DLV_GetLine:
						{
							unsigned short x,y;
							struct gpInput fake;

							// Get coordinates
							x=((*get->opg_Storage)>>16)&0xffff;
							y=(*get->opg_Storage)&0xffff;

							// Fake gpInput
							fake.gpi_Mouse.X=x-gadget->LeftEdge;
							fake.gpi_Mouse.Y=y-gadget->TopEdge;

							// Get selection
							*get->opg_Storage=(ULONG)listview_get_sel(cl,gadget,data,&fake,0);
						}
						break;

					// Draw a line from the listview
					case DLV_DrawLine:
						{
							ListViewDraw *draw=(ListViewDraw *)*get->opg_Storage;

							// Draw line
							listview_draw_item(
								cl,
								gadget,
								draw->rp,
								draw->drawinfo,
								data,
								draw->node,
								draw->line,
								&draw->box);
						}
						break;

					// Other
					default:
						retval=DoSuperMethodA(cl,obj,msg);
						break;
				}
			}
			break;


		// Kill an instance
		case OM_DISPOSE:
			{
				APTR object_ptr;
				Object *object;

 				// Free BOOPSI objects
				object_ptr=data->boopsi_list.lh_Head;
				while ((object=NextObject((APTR)&object_ptr)))
					DisposeObject(object);

				// Free font
				if (data->flags&LVF_GOT_FONT)
					CloseFont(data->list_font);

				retval=DoSuperMethodA(cl,obj,msg);
			}
			break;


		// Render gadget
		case GM_RENDER:

			// Cache DrawInfo
			data->draw_info=((struct gpRender *)msg)->gpr_GInfo->gi_DrInfo;

			// If a full redraw, clear double-click time
			if (((struct gpRender *)msg)->gpr_Redraw==GREDRAW_REDRAW)
				data->seconds=0;

			// Show gadget
			listview_render(cl,gadget,data,(struct gpRender *)msg);
			break;


		// Hit test
		case GM_HITTEST:
			{
				struct gpHitTest *test;

				// Get test pointer
				test=(struct gpHitTest *)msg;

				// See if we're hit
				if (test->gpht_Mouse.X>=data->text_dims.Left-gadget->LeftEdge &&
					test->gpht_Mouse.Y>=data->text_dims.Top-gadget->TopEdge &&
					test->gpht_Mouse.X<data->text_dims.Left+data->text_dims.Width-gadget->LeftEdge &&
					test->gpht_Mouse.Y<data->text_dims.Top+data->text_dims.Height-gadget->TopEdge)
				{
					retval=GMR_GADGETHIT;
				}
			}
			break;


		// Notify
		case OM_NOTIFY:

			// Drag notify?
			if (data->flags&LVF_DRAG_FLAG)
			{
				// Fill out tags
				data->notify_tags[0].ti_Tag=DLV_DragNotify;
				data->notify_tags[0].ti_Data=data->drag_sel;
				data->notify_tags[1].ti_Tag=GA_ID;
				data->notify_tags[1].ti_Data=gadget->GadgetID;
				data->notify_tags[2].ti_Tag=GA_Left;
				data->notify_tags[2].ti_Data=data->text_dims.Left;
				data->notify_tags[3].ti_Tag=GA_Top;
				data->notify_tags[3].ti_Data=data->text_dims.Top+
					UMult32(data->drag_sel-data->top,data->text_height);
				data->notify_tags[4].ti_Tag=GA_Width;
				data->notify_tags[4].ti_Data=data->text_dims.Width;
				data->notify_tags[5].ti_Tag=GA_Height;
				data->notify_tags[5].ti_Data=data->text_height;
				data->notify_tags[6].ti_Tag=GA_RelRight;
				data->notify_tags[6].ti_Data=data->drag_x_position;
				data->notify_tags[7].ti_Tag=GA_RelBottom;
				data->notify_tags[7].ti_Data=data->drag_y_position;
				data->notify_tags[8].ti_Tag=DLV_Top;
				data->notify_tags[8].ti_Data=data->top;
				data->notify_tags[9].ti_Tag=DLV_Object;
				data->notify_tags[9].ti_Data=(ULONG)gadget;
				data->notify_tags[10].ti_Tag=TAG_END;

				// Clear flag
				data->flags&=~LVF_DRAG_FLAG;
			}

			// Otherwise normal notify
			else
			{
				ULONG seconds,micros;

				// Fill out tags
				data->notify_tags[0].ti_Tag=DLV_Selected;
				data->notify_tags[0].ti_Data=data->last_selection;
				data->notify_tags[1].ti_Tag=GA_ID;
				data->notify_tags[1].ti_Data=gadget->GadgetID;
				data->notify_tags[2].ti_Tag=TAG_END;

				// Get current time
				CurrentTime(&seconds,&micros);

				// Double-click?
				if (data->click_sel==data->last_selection &&
					DoubleClick(data->seconds,data->micros,seconds,micros))
				{
					// Set double-click flag
					data->notify_tags[2].ti_Tag=DLV_DoubleClick;
					data->notify_tags[2].ti_Data=TRUE;
					data->notify_tags[3].ti_Tag=TAG_END;

					// Clear double-click
					data->seconds=0;
				}

				// Otherwise
				else
				{
					// Remember double-click
					data->seconds=seconds;
					data->micros=micros;
					data->click_sel=data->last_selection;
				}
			}

			// Send message
			DoSuperMethod(cl,obj,OM_NOTIFY,data->notify_tags,((struct opUpdate *)msg)->opu_GInfo,0);
			break;


		// Go (in)active/Handle input
		case GM_GOACTIVE:
		case GM_GOINACTIVE:
		case GM_HANDLEINPUT:
			{
				struct gpInput *input;
				short redraw=0;

				// Get input pointer
				input=(struct gpInput *)msg;

				// Go active?
				if (input->MethodID==GM_GOACTIVE)
				{
					// Default is not to activate
					retval=GMR_NOREUSE;

					// Ok to go active?
					if (!(gadget->Flags&GFLG_DISABLED) && input->gpi_IEvent)
					{
						// Left button down and valid list?
						if (input->gpi_IEvent->ie_Code==SELECTDOWN &&
							data->labels &&
							!(data->flags&(LVF_READ_ONLY|LVF_DETACHED)))
						{
							short sel;

							// Get selection
							if ((sel=listview_get_sel(cl,gadget,data,input,0))>-1)
							{
								// Ok to activate
								retval=GMR_MEACTIVE;

								// Store current top
								data->last_top=data->top;

								// Remember x and y click-offset
								data->drag_x_position=input->gpi_Mouse.X-
									(data->text_dims.Left-data->dims.Left);
								data->drag_y_position=input->gpi_Mouse.Y-
									(data->text_dims.Top-data->dims.Top)-
									UMult32(sel-data->top,data->text_height);

								// Change?
								if (data->sel!=sel ||
									!(data->flags&LVF_SHOW_SELECTED) ||
									(data->flags&LVF_SELECTED_CHECK))
								{
									// New selection
									data->last_sel=data->last_selection;
									data->sel=sel;
									redraw=1;
								}

								// Set selected flag
								gadget->Flags|=GFLG_SELECTED;
							}
						}
					}
				}

				// Go inactive?
				else
				if (msg->MethodID==GM_GOINACTIVE)
				{
					// Clear selected flag
					gadget->Flags&=~GFLG_SELECTED;

					// If we're showing selection with checks, we need to redraw last selection
					if ((data->flags&(LVF_SHOW_SELECTED|LVF_SELECTED_CHECK))==(LVF_SHOW_SELECTED|LVF_SELECTED_CHECK))
						data->last_sel=data->last_selection;
					redraw=1;

					// Save this selection
					data->last_selection=data->sel;

					// Send notify
					DoMethod(obj,OM_NOTIFY,0,((struct gpInput *)msg)->gpi_GInfo,0);

					// Clear cancel flag
					data->flags&=~LVF_CANCEL;
				}

				// Handle input
				else
				{
					// Default return value
					retval=GMR_MEACTIVE;

					// Is it a mouse event?
					if (input->gpi_IEvent->ie_Class==IECLASS_RAWMOUSE)
					{
						// Look at mouse code
						switch (input->gpi_IEvent->ie_Code)
						{
							// Left button up
							case SELECTUP:
								{
									// Set return code
									*input->gpi_Termination=data->sel;

									// Gadget processing finished
									retval=GMR_NOREUSE|GMR_VERIFY;
									data->flags|=LVF_CANCEL;

									// Multi-selection?
									if (data->flags&LVF_MULTI_SELECT)
									{
										struct Node *node;
										short count;

										// Get this node
										for (node=data->labels->lh_Head,count=0;
											node->ln_Succ && count<data->sel;
											node=node->ln_Succ,count++);

										// Did we get it?
										if (node && node->ln_Succ)
										{
											// Save old selection
											data->last_sel=data->sel;

											// Toggle selection
											node->lve_Flags^=LVEF_SELECTED;
											redraw=1;
										}
									}
								}
								break;

							// No button; mouse moved
							case IECODE_NOBUTTON:
								{
									short sel;

									// Is mouse outside of lister?
									if (input->gpi_Mouse.X<0 ||
										input->gpi_Mouse.X>=data->list_dims.Width)
									{
										// Drag notify?
										if (data->flags&LVF_DRAG_NOTIFY)
										{
											// Valid selection?
											if (data->sel>-1)
											{
												// Notify drag
												data->flags|=LVF_DRAG_FLAG;
												data->drag_sel=data->sel;

												// Will fall through to MENUDOWN (if NO_VERT_SCROLL)
												if (!(data->flags&LVF_NO_VERT_SCROLL))
												{
													retval=GMR_NOREUSE;
													data->flags|=LVF_CANCEL;
													break;
												}
											}
											else break;
										}
										else break;
									}

									// Get selection
									else
									if ((sel=listview_get_sel(cl,gadget,data,input,1))>-1 ||
										(sel==-1 && (data->flags&LVF_NO_VERT_SCROLL)))
									{
										// Change?
										if (data->sel!=sel || sel==-1)
										{
											// Clear double-click
											data->seconds=0;

											// No vertical scroll?
											if (data->flags&LVF_NO_VERT_SCROLL)
											{
												// Drag notify?
												if (data->flags&LVF_DRAG_NOTIFY)
												{
													// Notify drag
													data->flags|=LVF_DRAG_FLAG;
													data->drag_sel=data->sel;

													// Will fall through to MENUDOWN
												}
												else break;
											}

											// Otherwise
											else
											{
												// Save old selection
												data->last_sel=data->sel;

												// New selection
												data->sel=sel;
												redraw=1;
												break;
											}
										}
										else break;
									}

									else break;
								}

							// Right button does cancel
							case MENUDOWN:
								{
									// Gadget processing finished
									retval=GMR_NOREUSE;
									data->flags|=LVF_CANCEL;

									// Show selected?
									if (data->flags&LVF_SHOW_SELECTED)
									{
										// Restore last selection
										data->last_sel=data->sel;
										data->sel=data->last_selection;

										// Does top need to change?
										if (data->top!=data->last_top)
										{
											short item;

											data->top=data->last_top;
											data->last_sel=-1;

											for (data->top_item=data->labels->lh_Head,item=0;
												data->top_item->ln_Succ && item<data->top;
												data->top_item=data->top_item->ln_Succ,item++);
										}

										redraw=1;
									}
								}
								break;
						}
					}

					// Or a timer event
					else
					if (input->gpi_IEvent->ie_Class==IECLASS_TIMER)
					{
						short sel;

						// Get selection
						if ((sel=listview_get_sel(cl,gadget,data,input,2))>-1)
						{
							// Change?
							if (data->sel!=sel)
							{
								// Save old selection
								data->last_sel=data->sel;

								// New selection
								data->sel=sel;

								// Do we have to scroll?
								if (sel<data->top)
								{
									if (data->top>0)
									{
										// Scroll up
										--data->top;
										data->top_item=data->top_item->ln_Pred;

										// Redraw the list
										data->last_sel=-1;
										redraw=1;
									}
								}
								else
								if (sel>=data->top+data->lines)
								{
									if (data->top+data->lines<data->count)
									{
										// Scroll down
										++data->top;
										data->top_item=data->top_item->ln_Succ;

										// Redraw the list
										data->last_sel=-1;
										redraw=1;
									}
								}
								else redraw=1;
							}
						}
					}
				}

				// Redraw needed?
				if (redraw)
				{
					struct RastPort *rp;

					// Get rastport
					if ((rp=ObtainGIRPort(input->gpi_GInfo)))
					{
						// Send redraw
						DoMethod(obj,GM_RENDER,input->gpi_GInfo,rp,GREDRAW_UPDATE);
						ReleaseGIRPort(rp);
					}
				}
			}
			break;


		// Resize
		case GM_RESIZE:

			// Handle the resize
			listview_resize(cl,gadget,data,(struct gpResize *)msg);
			break;


		// Unknown method
		default:
			retval=DoSuperMethodA(cl,obj,msg);
			break;
	}

	return retval;
}
Exemplo n.º 14
0
int main(void)
{
    Object *app, *win, *iconCon, *vert, *horiz;
    Object *strip;
    struct MUI_CustomClass *iconContainerClass;
    BOOL running=TRUE;
    ULONG signals=0;
    struct Screen *screen;
    struct NewMenu *menuDat;
    struct TagItem icTags[6];
    ULONG inputResult;

    MUIMasterBase=OpenLibrary("muimaster.library", 0);
    if(!MUIMasterBase)
        printf("could not open muimaster.library\n");
    DesktopBase=OpenLibrary("desktop.library", 0);
    if(!DesktopBase)
        printf("could not open desktop.library\n");

    menuDat=BuildDesktopMenus();
    if(!menuDat)
        kprintf("EEK! EEKK! Menu ERROR!!!\n");

    screen=LockPubScreen(NULL);

    horiz=PropObject,
        MUIA_Prop_Horiz, TRUE,
        MUIA_Prop_Entries, 0,
        MUIA_Prop_UseWinBorder, MUIV_Prop_UseWinBorder_Bottom,
        End;
    vert=PropObject,
        MUIA_Prop_Horiz, FALSE,
        MUIA_Prop_UseWinBorder, MUIV_Prop_UseWinBorder_Right,
        End;

    icTags[0].ti_Tag=MUIA_InnerLeft;
    icTags[0].ti_Data=0;
    icTags[1].ti_Tag=MUIA_InnerTop;
    icTags[1].ti_Data=0;
    icTags[2].ti_Tag=MUIA_InnerBottom;
    icTags[2].ti_Data=0;
    icTags[3].ti_Tag=MUIA_InnerRight;
    icTags[3].ti_Data=0;
    icTags[4].ti_Tag=MUIA_FillArea;
    icTags[4].ti_Data=FALSE;
//  icTags[1].ti_Tag=ICOA_Directory;
//  icTags[1].ti_Data="C:";
//  icTags[2].ti_Tag=ICA_VertScroller;
//  icTags[2].ti_Data=vert;
//  icTags[3].ti_Tag=ICA_HorizScroller;
//  icTags[3].ti_Data=horiz;
    icTags[5].ti_Tag=TAG_END;
    icTags[5].ti_Data=0;

	kprintf("here1\n");

    app=ApplicationObject,
        SubWindow, win=WindowObject,
            MUIA_Window_Backdrop, TRUE,
            MUIA_Window_Borderless, TRUE,
            MUIA_Window_CloseGadget, FALSE,
            MUIA_Window_DepthGadget, FALSE,
            MUIA_Window_SizeGadget, FALSE,
            MUIA_Window_DragBar, FALSE,
            MUIA_Window_LeftEdge, 0,
            MUIA_Window_TopEdge, screen->BarHeight+1,
            MUIA_Window_Width, screen->Width,
            MUIA_Window_Height, screen->Height-screen->BarHeight-1,
            MUIA_Window_Menustrip, strip=MUI_MakeObject(MUIO_MenustripNM, menuDat, 0),
//          MUIA_Window_UseBottomBorderScroller, TRUE,
//          MUIA_Window_UseRightBorderScroller, TRUE,
            MUIA_Window_EraseArea, FALSE,
            WindowContents, iconCon=CreateDesktopObjectA(CDO_Desktop, icTags),
        End,
    End;


    if(app)
    {
        DoMethod(win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

        // these are here temporarily..
        DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, iconCon, 3, MUIM_Set, ICA_ScrollToVert, MUIV_TriggerValue);
        DoMethod(horiz, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, iconCon, 3, MUIM_Set, ICA_ScrollToHoriz, MUIV_TriggerValue);

        SetAttrs(win, MUIA_Window_Open, TRUE, TAG_DONE);

        while(running)
        {
            inputResult=DoMethod(app, MUIM_Application_Input, &signals);
            switch(inputResult)
            {
                case MUIV_Application_ReturnID_Quit:
                    running=FALSE;
                    break;
                case 2:
                    running=FALSE;
                    break;
                default:
                {
                    // a menuitem was selected...
                    struct MinList *subjects=NULL;
                    Object *member, *ostate;
                    Tag activeSubjectsTag;
                    struct TagItem args[2];

                    if(inputResult & DOC_DESKTOPOP)
                    {
                        args[0].ti_Tag=DDO_Target;
                        args[0].ti_Data=iconCon;
                        args[1].ti_Tag=TAG_END;
                        args[1].ti_Data=0;

                        DoDesktopOperation(inputResult, args);
                    }
                    else if(inputResult & DOC_ICONOP)
                    {
                        GetAttr(AICA_SelectedIcons, iconCon, &subjects);

                        ostate=subjects->mlh_Head;
                        while((member=NextObject(&ostate)))
                        {
                            args[0].ti_Tag=DDO_Target;
                            args[0].ti_Data=member;
                            args[1].ti_Tag=TAG_END;
                            args[1].ti_Data=0;

                            DoDesktopOperation(inputResult, args);
                        }
                    }
                    else if(inputResult & DOC_WINDOWOP)
                    {
                        GetAttr(DA_ActiveWindow, iconCon, &subjects);

                        args[0].ti_Tag=DDO_Target;
                        args[0].ti_Data=subjects;
                        args[1].ti_Tag=TAG_END;
                        args[1].ti_Data=0;

                        DoDesktopOperation(inputResult, args);
                    }
                }
            }

            if(running && signals)
                Wait(signals);
        }

        SetAttrs(win, MUIA_Window_Open, FALSE, TAG_DONE);

        DisposeObject(app);
    }
    else
        kprintf("could not create app\n");


    CloseLibrary(DesktopBase);
    CloseLibrary(MUIMasterBase);

    return 0;
}
Exemplo n.º 15
0
void GetProcessID(LPCTSTR pProcessName, std::vector<DWORD>& SetOfPID)
{
    PPERF_DATA_BLOCK pPerfData = NULL;
    PPERF_OBJECT_TYPE pPerfObj;
    PPERF_INSTANCE_DEFINITION pPerfInst;
    PPERF_COUNTER_DEFINITION pPerfCntr, pCurCntr;
    PPERF_COUNTER_BLOCK PtrToCntr;
    DWORD BufferSize = TOTALBYTES;
    DWORD i, j;
    LONG k;

    // Allocate the buffer for the performance data.

    pPerfData = (PPERF_DATA_BLOCK)malloc(BufferSize);

    wchar_t szKey[32];
    swprintf_s(szKey, L"%d %d", PROCESS_OBJECT_INDEX, PROC_ID_COUNTER);
    LONG lRes;
    while ((lRes = RegQueryValueEx(HKEY_PERFORMANCE_DATA,
                                   szKey,
                                   NULL,
                                   NULL,
                                   (LPBYTE)pPerfData,
                                   &BufferSize)) == ERROR_MORE_DATA)
    {
        // Get a buffer that is big enough.

        BufferSize += BYTEINCREMENT;
        pPerfData = (PPERF_DATA_BLOCK)realloc(pPerfData, BufferSize);
    }

    // Get the first object type.

    pPerfObj = FirstObject(pPerfData);

    // Process all objects.

    for (i = 0; i < pPerfData->NumObjectTypes; i++)
    {

        if (pPerfObj->ObjectNameTitleIndex != PROCESS_OBJECT_INDEX)
        {
            pPerfObj = NextObject(pPerfObj);
            continue;
        }

        SetOfPID.clear();

        // Get the first counter.

        pPerfCntr = FirstCounter(pPerfObj);

        // Get the first instance.

        pPerfInst = FirstInstance(pPerfObj);

        _bstr_t bstrProcessName, bstrInput;

        // Retrieve all instances.
        for (k = 0; k < pPerfObj->NumInstances; k++)
        {
            pCurCntr = pPerfCntr;
            bstrInput = pProcessName;
            bstrProcessName = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset);
            if (!_wcsicmp((LPCTSTR)bstrProcessName, (LPCTSTR)bstrInput))
            {
                // Retrieve all counters.

                for (j = 0; j < pPerfObj->NumCounters; j++)
                {
                    if (pCurCntr->CounterNameTitleIndex == PROC_ID_COUNTER)
                    {
                        PtrToCntr = CounterBlock(pPerfInst);
                        DWORD *pdwValue = (DWORD*)((LPBYTE)PtrToCntr + pCurCntr->CounterOffset);
                        SetOfPID.push_back(*pdwValue);
                        break;
                    }


                    // Get the next counter.

                    pCurCntr = NextCounter(pCurCntr);
                }
            }

            // Get the next instance.

            pPerfInst = NextInstance(pPerfInst);
        }
    }
    free(pPerfData);
    RegCloseKey(HKEY_PERFORMANCE_DATA);
}