BOOL __stdcall ProcessRequest(HWND hwnd, LPARAM param) { char szBuf[MAX_PATH]; TEnumData *lParam = (TEnumData*)param; DWORD pid = 0; GetWindowThreadProcessId(hwnd, &pid); if (pid != 0) { // old system would get a window's pid and the module handle that created it // and try to OpenEvent() a event object name to it (prefixed with a string) // this was fine for most Oses (not the best way) but now actually compares // the class string (a bit slower) but should get rid of those bugs finally. HANDLE hMirandaWorkEvent = OpenEventA(EVENT_ALL_ACCESS, false, CreateProcessUID(pid, szBuf, sizeof(szBuf))); if (hMirandaWorkEvent != 0) { GetClassNameA(hwnd, szBuf, sizeof(szBuf)); if ( lstrcmpA(szBuf, MIRANDACLASS) != 0) { // opened but not valid. logA("ProcessRequest(%d, %p): class %s differs from %s\n", pid, hwnd, szBuf, MIRANDACLASS); CloseHandle(hMirandaWorkEvent); return true; } } // if the event object exists, a shlext.dll running in the instance must of created it. if (hMirandaWorkEvent != 0) { logA("ProcessRequest(%d, %p): window found\n", pid, hwnd); // prep the request ipcPrepareRequests(IPC_PACKET_SIZE, lParam->ipch, REQUEST_ICONS | REQUEST_GROUPS | REQUEST_CONTACTS | REQUEST_NEWICONS); // slots will be in the order of icon data, groups contacts, the first // slot will contain the profile name DWORD replyBits = ipcSendRequest(hMirandaWorkEvent, lParam->hWaitFor, lParam->ipch, 1000); // replyBits will be REPLY_FAIL if the wait timed out, or it'll be the request // bits as sent or a series of *_NOTIMPL bits where the request bit were, if there are no // contacts to speak of, don't bother showing this instance of Miranda } if (replyBits != REPLY_FAIL && lParam->ipch->ContactsBegin != NULL) { logA("ProcessRequest(%d, %p): IPC succeeded\n", pid, hwnd); // load the address again, the server side will always overwrite it lParam->ipch->pClientBaseAddress = lParam->ipch; // fixup all the pointers to be relative to the memory map // the base pointer of the client side version of the mapped file ipcFixupAddresses(lParam->ipch); // store the PID used to create the work event object // that got replied to -- this is needed since each contact // on the final menu maybe on a different instance and another OpenEvent() will be needed. lParam->pid = pid; // check out the user options from the server lParam->bShouldOwnerDraw = (lParam->ipch->dwFlags & HIPC_NOICONS) == 0; // process the icons BuildSkinIcons(lParam); // process other replies BuildMenus(lParam); } // close the work object CloseHandle(hMirandaWorkEvent); } } return true; }
ResView::ResView(const BRect &frame, const char *name, const int32 &resize, const int32 &flags, const entry_ref *ref) : BView(frame, name, resize, flags), fRef(NULL), fSaveStatus(FILE_INIT), fOpenPanel(NULL), fSavePanel(NULL) { SetViewUIColor(B_PANEL_BACKGROUND_COLOR); if (ref) { fRef = new entry_ref; *fRef = *ref; fFileName = fRef->name; } else { fFileName = "Untitled "; fFileName << sUntitled; sUntitled++; } BRect r(Bounds()); r.bottom = 16; fBar = new BMenuBar(r, "bar"); AddChild(fBar); BuildMenus(fBar); r = Bounds(); r.top = fBar->Frame().bottom + 4; fListView = new ResListView(r, "gridview", B_FOLLOW_ALL, B_WILL_DRAW, B_FANCY_BORDER); AddChild(fListView); rgb_color white = { 255, 255, 255, 255 }; fListView->SetColor(B_COLOR_BACKGROUND, white); fListView->SetColor(B_COLOR_SELECTION, ui_color(B_MENU_BACKGROUND_COLOR)); float width = be_plain_font->StringWidth("00000") + 20; fListView->AddColumn(new BStringColumn("ID", width, width, 100, B_TRUNCATE_END), 0); fListView->AddColumn(new BStringColumn("Type", width, width, 100, B_TRUNCATE_END), 1); fListView->AddColumn(new BStringColumn("Name", 150, 50, 300, B_TRUNCATE_END), 2); fListView->AddColumn(new PreviewColumn("Data", 150, 50, 300), 3); // Editing is disabled for now fListView->SetInvocationMessage(new BMessage(M_EDIT_RESOURCE)); width = be_plain_font->StringWidth("1000 bytes") + 20; fListView->AddColumn(new BSizeColumn("Size", width, 10, 100), 4); fOpenPanel = new BFilePanel(B_OPEN_PANEL); if (ref) OpenFile(*ref); fSavePanel = new BFilePanel(B_SAVE_PANEL); }
GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); memset(activeTools, 0, sizeof(activeTools)); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } } catch(json::Exception & e) { } //Load config into simulation sim->SetEdgeMode(Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0)); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); BuildQuickOptionMenu(); //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); }
GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), currentFile(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f), activeColourPreset(-1), activeMenu(-1), edgeMode(0) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); activeTools = regularToolset; std::fill(decoToolset, decoToolset+4, (Tool*)NULL); std::fill(regularToolset, regularToolset+4, (Tool*)NULL); //Default render prefs std::vector<unsigned int> tempArray; tempArray.push_back(RENDER_FIRE); tempArray.push_back(RENDER_EFFE); tempArray.push_back(RENDER_BASC); ren->SetRenderMode(tempArray); tempArray.clear(); ren->SetDisplayMode(tempArray); ren->SetColourMode(0); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } ren->gravityFieldEnabled = Client::Ref().GetPrefBool("Renderer.GravityField", false); ren->decorations_enable = Client::Ref().GetPrefBool("Renderer.Decorations", true); } catch(json::Exception & e) { } //Load config into simulation edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0); sim->SetEdgeMode(edgeMode); int ngrav_enable = Client::Ref().GetPrefInteger("Simulation.NewtonianGravity", 0); if (ngrav_enable) sim->grav->start_grav_async(); sim->aheat_enable = Client::Ref().GetPrefInteger("Simulation.AmbientHeat", 0); sim->pretty_powder = Client::Ref().GetPrefInteger("Simulation.PrettyPowder", 0); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); //Set default brush palette brushList.push_back(new EllipseBrush(ui::Point(4, 4))); brushList.push_back(new Brush(ui::Point(4, 4))); brushList.push_back(new TriangleBrush(ui::Point(4, 4))); //Load more from brushes folder std::vector<string> brushFiles = Client::Ref().DirectorySearch(BRUSH_DIR, "", ".ptb"); for(int i = 0; i < brushFiles.size(); i++) { std::vector<unsigned char> brushData = Client::Ref().ReadFile(brushFiles[i]); if(!brushData.size()) { std::cout << "Brushes: Skipping " << brushFiles[i] << ". Could not open" << std::endl; continue; } int dimension = std::sqrt((float)brushData.size()); if(dimension * dimension != brushData.size()) { std::cout << "Brushes: Skipping " << brushFiles[i] << ". Invalid bitmap size" << std::endl; continue; } brushList.push_back(new BitmapBrush(brushData, ui::Point(dimension, dimension))); } //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); colourPresets.push_back(ui::Colour(255, 255, 255)); colourPresets.push_back(ui::Colour(0, 255, 255)); colourPresets.push_back(ui::Colour(255, 0, 255)); colourPresets.push_back(ui::Colour(255, 255, 0)); colourPresets.push_back(ui::Colour(255, 0, 0)); colourPresets.push_back(ui::Colour(0, 255, 0)); colourPresets.push_back(ui::Colour(0, 0, 255)); colourPresets.push_back(ui::Colour(0, 0, 0)); }
GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), currentFile(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f), activeColourPreset(-1), activeMenu(NULL), edgeMode(0) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); activeTools = regularToolset; std::fill(decoToolset, decoToolset+3, (Tool*)NULL); std::fill(regularToolset, regularToolset+3, (Tool*)NULL); //Default render prefs std::vector<unsigned int> tempArray; tempArray.push_back(RENDER_FIRE); tempArray.push_back(RENDER_EFFE); tempArray.push_back(RENDER_BASC); ren->SetRenderMode(tempArray); tempArray.clear(); ren->SetDisplayMode(tempArray); ren->SetColourMode(0); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } ren->gravityFieldEnabled = Client::Ref().GetPrefBool("Renderer.GravityField", false); ren->decorations_enable = Client::Ref().GetPrefBool("Renderer.Decorations", true); } catch(json::Exception & e) { } //Load config into simulation edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0); sim->SetEdgeMode(edgeMode); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); colourPresets.push_back(ui::Colour(255, 255, 255)); colourPresets.push_back(ui::Colour(0, 255, 255)); colourPresets.push_back(ui::Colour(255, 0, 255)); colourPresets.push_back(ui::Colour(255, 255, 0)); colourPresets.push_back(ui::Colour(255, 0, 0)); colourPresets.push_back(ui::Colour(0, 255, 0)); colourPresets.push_back(ui::Colour(0, 0, 255)); }