// return a bitmask: &SNM_MARKER_MASK: marker update, &SNM_REGION_MASK: region update int UpdateMarkerRegionCache() { int updateFlags=0; int i=0, x=0, num, col; double pos, rgnend; const char* name; bool isRgn; // added/updated markers/regions? while ((x = EnumProjectMarkers3(NULL, x, &isRgn, &pos, &rgnend, &name, &num, &col))) { MarkerRegion* m = g_mkrRgnCache.Get(i); if (!m || (m && !m->Compare(isRgn, pos, rgnend, name, num, col))) { if (m) g_mkrRgnCache.Delete(i, true); g_mkrRgnCache.Insert(i, new MarkerRegion(isRgn, pos, rgnend, name, num, col)); updateFlags |= (isRgn ? SNM_REGION_MASK : SNM_MARKER_MASK); } i++; } // removed markers/regions? for (int j=g_mkrRgnCache.GetSize()-1; j>=i; j--) { if (MarkerRegion* m = g_mkrRgnCache.Get(j)) updateFlags |= (m->IsRegion() ? SNM_REGION_MASK : SNM_MARKER_MASK); g_mkrRgnCache.Delete(j, true); } // project time mode update? static int sPrevTimemode = *(int*)GetConfigVar("projtimemode"); if (updateFlags != (SNM_MARKER_MASK|SNM_REGION_MASK)) if (int* timemode = (int*)GetConfigVar("projtimemode")) if (*timemode != sPrevTimemode) { sPrevTimemode = *timemode; return SNM_MARKER_MASK|SNM_REGION_MASK; } return updateFlags; }
int TrackPopupMenu(HMENU hMenu, int flags, int xpos, int ypos, int resvd, HWND hwnd, const RECT *r) { if (!hMenu || m_trackingMenus.GetSize()) return 0; ReleaseCapture(); m_trackingPar=hwnd; m_trackingFlags=flags; m_trackingRet=-1; m_trackingPt.x=xpos; m_trackingPt.y=ypos; submenuWndProc(new HWND__(NULL,0,NULL,"menu",false,submenuWndProc,NULL),WM_CREATE,0,(LPARAM)hMenu); printf("enter trackpopupmenu loop\n"); while (m_trackingRet<0 && m_trackingMenus.GetSize()) { void SWELL_RunMessageLoop(); SWELL_RunMessageLoop(); Sleep(10); } printf("leave trackpopupmenu loop\n"); int x=m_trackingMenus.GetSize()-1; while (x>=0) { HWND h = m_trackingMenus.Get(x); m_trackingMenus.Delete(x); if (h) DestroyWindow(h); x--; } if (!(flags&TPM_NONOTIFY) && m_trackingRet>0) SendMessage(hwnd,WM_COMMAND,m_trackingRet,0); return m_trackingRet>0?m_trackingRet:0; }
// Returns: // -1 = action does not belong to this extension, or does not toggle // 0 = action belongs to this extension and is currently set to "off" // 1 = action belongs to this extension and is currently set to "on" int toggleActionHook(int iCmd) { static WDL_PtrList<const char> sReentrantCmds; if (COMMAND_T* cmd = SWSGetCommandByID(iCmd)) { if (cmd->accel.accel.cmd==iCmd && cmd->getEnabled && cmd->doCommand!=SWS_NOOP) { if (sReentrantCmds.Find(cmd->id) == -1) { sReentrantCmds.Add(cmd->id); int state = cmd->getEnabled(cmd); sReentrantCmds.Delete(sReentrantCmds.Find(cmd->id)); return state; } #ifdef ACTION_DEBUG else { OutputDebugString("toggleActionHook - recursive action: "); OutputDebugString(cmd->id); OutputDebugString("\n"); } #endif } } return -1; }
void UnregisterToMarkerRegionUpdates(SNM_MarkerRegionListener* _listener) { #ifdef _SNM_MUTEX SWS_SectionLock lock(&g_mkrRgnListenersMutex); #endif int idx = _listener ? g_mkrRgnListeners.Find(_listener) : -1; if (idx >= 0) g_mkrRgnListeners.Delete(idx, false); }
void Remove(LICE_IBitmap* bitmap) { WDL_MutexLock lock(&m_mutex); int i, n = m_bitmaps.GetSize(); for (i = 0; i < n; ++i) { if (m_bitmaps.Get(i)->bitmap == bitmap) { m_bitmaps.Delete(i, true); delete(bitmap); break; } } }
int SWELL_DialogBox(SWELL_DialogResourceIndex *reshead, const char *resid, HWND parent, DLGPROC dlgproc, LPARAM param) { SWELL_DialogResourceIndex *p=resById(reshead,resid); if (resid) // allow modal dialogs to be created without template { if (!p||(p->windowTypeFlags&SWELL_DLG_WS_CHILD)) return -1; } int ret=-1; HWND hwnd = SWELL_CreateDialog(reshead,resid,parent,dlgproc,param); // create dialog if (hwnd) { ReleaseCapture(); // force end of any captures WDL_PtrList<HWND__> enwnds; extern HWND__ *SWELL_topwindows; HWND a = SWELL_topwindows; while (a) { if (a->m_enabled && a != hwnd) { EnableWindow(a,FALSE); enwnds.Add(a); } a = a->m_next; } modalDlgRet r = { hwnd,false, -1 }; s_modalDialogs.Add(&r); ShowWindow(hwnd,SW_SHOW); while (s_modalDialogs.Find(&r)>=0 && !r.has_ret) { void SWELL_RunMessageLoop(); SWELL_RunMessageLoop(); Sleep(10); } ret=r.ret; s_modalDialogs.Delete(s_modalDialogs.Find(&r)); a = SWELL_topwindows; while (a) { if (!a->m_enabled && a != hwnd && enwnds.Find(a)>=0) EnableWindow(a,TRUE); a = a->m_next; } } // while in list, do something return ret; }
bool hookCommandProc(int iCmd, int flag) { static WDL_PtrList<const char> sReentrantCmds; // for Xen extensions g_KeyUpUndoHandler=0; // "Hack" to make actions will #s less than 1000 work with SendMessage (AHK) // no recursion check here: handled by REAPER if (iCmd < 1000) return KBD_OnMainActionEx(iCmd, 0, 0, 0, g_hwndParent, NULL) ? true : false; // C4800 // Special case for checking recording if (iCmd == 1013 && !RecordInputCheck()) return true; // Ignore commands that don't have anything to do with us from this point forward if (COMMAND_T* cmd = SWSGetCommandByID(iCmd)) { if (cmd->accel.accel.cmd==iCmd && cmd->doCommand && cmd->doCommand!=SWS_NOOP) { if (sReentrantCmds.Find(cmd->id) == -1) { sReentrantCmds.Add(cmd->id); cmd->fakeToggle = !cmd->fakeToggle; #ifndef DEBUG_PERFORMANCE_TIME cmd->doCommand(cmd); #else CommandTimer(cmd); #endif sReentrantCmds.Delete(sReentrantCmds.Find(cmd->id)); return true; } #ifdef ACTION_DEBUG else { OutputDebugString("hookCommandProc - recursive action: "); OutputDebugString(cmd->id); OutputDebugString("\n"); } #endif } } return false; }
int TrackPopupMenu(HMENU hMenu, int flags, int xpos, int ypos, int resvd, HWND hwnd, const RECT *r) { if (!hMenu || m_trackingMenus.GetSize()) return 0; ReleaseCapture(); m_trackingPar=hwnd; m_trackingFlags=flags; m_trackingRet=-1; m_trackingPt.x=xpos; m_trackingPt.y=ypos; // HWND oldFoc = GetFocus(); // bool oldFoc_child = oldFoc && (IsChild(hwnd,oldFoc) || oldFoc == hwnd || oldFoc==GetParent(hwnd)); HWND hh; submenuWndProc(hh=new HWND__(NULL,0,NULL,"menu",false,submenuWndProc,NULL),WM_CREATE,0,(LPARAM)hMenu); SetProp(hh,"SWELL_MenuOwner",(HANDLE)hwnd); while (m_trackingRet<0 && m_trackingMenus.GetSize()) { void SWELL_RunMessageLoop(); SWELL_RunMessageLoop(); Sleep(10); } int x=m_trackingMenus.GetSize()-1; while (x>=0) { HWND h = m_trackingMenus.Get(x); m_trackingMenus.Delete(x); if (h) DestroyWindow(h); x--; } // if (oldFoc_child) SetFocus(oldFoc); if (!(flags&TPM_NONOTIFY) && m_trackingRet>0) SendMessage(hwnd,WM_COMMAND,m_trackingRet,0); return m_trackingRet>0?m_trackingRet:0; }
void OscQuit(OscHandler* osc) { if (osc) { int i=s_osc_handlers.Find(osc); if (i >= 0) { KillOscThread(); s_osc_handlers.Delete(i); if (s_osc_handlers.GetSize()) { StartOscThread(); } } } else { KillOscThread(); s_osc_handlers.Empty(); } }
static LRESULT WINAPI submenuWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { const int itemheight = 12, lcol=12, rcol=12, mcol=10; switch (uMsg) { case WM_CREATE: m_trackingMenus.Add(hwnd); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); if (m_trackingPar && !(m_trackingFlags&TPM_NONOTIFY)) SendMessage(m_trackingPar,WM_INITMENUPOPUP,(WPARAM)lParam,0); { HDC hdc = GetDC(hwnd); HMENU__ *menu = (HMENU__*)lParam; int ht = menu->items.GetSize()*itemheight, wid=100,wid2=0; int xpos=m_trackingPt.x; int ypos=m_trackingPt.y; int x; for (x=0; x < menu->items.GetSize(); x++) { MENUITEMINFO *inf = menu->items.Get(x); if (inf->fType == MFT_STRING && inf->dwTypeData) { RECT r={0,}; const char *pt2 = strstr(inf->dwTypeData,"\t"); DrawText(hdc,inf->dwTypeData,pt2 ? pt2-inf->dwTypeData : -1,&r,DT_CALCRECT|DT_SINGLELINE); if (r.right > wid) wid=r.right; if (pt2) { r.right=r.left; DrawText(hdc,pt2+1,-1,&r,DT_CALCRECT|DT_SINGLELINE); if (r.right > wid2) wid2=r.right; } } } wid+=lcol+rcol + (wid2?wid2+mcol:0); ReleaseDC(hwnd,hdc); RECT tr={xpos,ypos,xpos+wid,ypos+ht},vp; SWELL_GetViewPort(&vp,&tr,true); if (tr.bottom > vp.bottom) { tr.top += vp.bottom-tr.bottom; tr.bottom=vp.bottom; } if (tr.right > vp.right) { tr.left += vp.right-tr.right; tr.right=vp.right; } if (tr.left < vp.left) { tr.right += vp.left-tr.left; tr.left=vp.left; } if (tr.top < vp.top) { tr.bottom += vp.top-tr.top; tr.top=vp.top; } SetWindowPos(hwnd,NULL,tr.left,tr.top,tr.right-tr.left,tr.bottom-tr.top,SWP_NOZORDER); } SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)&~WS_CAPTION); ShowWindow(hwnd,SW_SHOW); SetFocus(hwnd); SetTimer(hwnd,1,250,NULL); break; case WM_PAINT: { PAINTSTRUCT ps; if (BeginPaint(hwnd,&ps)) { RECT cr; GetClientRect(hwnd,&cr); HBRUSH br=CreateSolidBrush(GetSysColor(COLOR_3DFACE)); HPEN pen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW)); HGDIOBJ oldbr = SelectObject(ps.hdc,br); HGDIOBJ oldpen = SelectObject(ps.hdc,pen); Rectangle(ps.hdc,cr.left,cr.top,cr.right-1,cr.bottom-1); SetBkMode(ps.hdc,TRANSPARENT); int cols[2]={ GetSysColor(COLOR_BTNTEXT),GetSysColor(COLOR_3DHILIGHT)}; HMENU__ *menu = (HMENU__*)GetWindowLongPtr(hwnd,GWLP_USERDATA); int x; for (x=0; x < menu->items.GetSize(); x++) { MENUITEMINFO *inf = menu->items.Get(x); RECT r={lcol,x*itemheight,cr.right,(x+1)*itemheight}; bool dis = !!(inf->fState & MF_GRAYED); SetTextColor(ps.hdc,cols[dis]); if (inf->fType == MFT_STRING && inf->dwTypeData) { const char *pt2 = strstr(inf->dwTypeData,"\t"); DrawText(ps.hdc,inf->dwTypeData,pt2 ? pt2-inf->dwTypeData : -1,&r,DT_VCENTER|DT_SINGLELINE); if (pt2) { RECT tr=r; tr.right-=rcol; DrawText(ps.hdc,pt2+1,-1,&tr,DT_VCENTER|DT_SINGLELINE|DT_RIGHT); } } else { MoveToEx(ps.hdc,r.left - lcol/2,(r.top+r.bottom)/2,NULL); LineTo(ps.hdc,r.right - rcol*3/2,(r.top+r.bottom)/2); } if (inf->hSubMenu) { RECT r2=r; r2.left = r2.right - rcol; DrawText(ps.hdc,">",-1,&r2,DT_VCENTER|DT_RIGHT|DT_SINGLELINE); } if (inf->fState&MF_CHECKED) { RECT r2=r; r2.left = 0; r2.right=lcol; DrawText(ps.hdc,"X",-1,&r2,DT_VCENTER|DT_CENTER|DT_SINGLELINE); } } SelectObject(ps.hdc,oldbr); SelectObject(ps.hdc,oldpen); DeleteObject(br); DeleteObject(pen); EndPaint(hwnd,&ps); } } break; case WM_TIMER: if (wParam==1) { HWND h = GetFocus(); if (h!=hwnd) { int a = h ? m_trackingMenus.Find(h) : -1; if (a<0 || a < m_trackingMenus.Find(hwnd)) DestroyWindow(hwnd); } } break; case WM_DESTROY: { int a = m_trackingMenus.Find(hwnd); m_trackingMenus.Delete(a); if (m_trackingMenus.Get(a)) DestroyWindow(m_trackingMenus.Get(a)); } break; case WM_LBUTTONUP: case WM_RBUTTONUP: { RECT r; GetClientRect(hwnd,&r); if (GET_X_LPARAM(lParam)>=r.left && GET_X_LPARAM(lParam)<r.right) { int which = GET_Y_LPARAM(lParam)/itemheight; HMENU__ *menu = (HMENU__*)GetWindowLongPtr(hwnd,GWLP_USERDATA); MENUITEMINFO *inf = menu->items.Get(which); if (inf) { if (inf->fState&MF_GRAYED){ } else if (inf->hSubMenu) { int a = m_trackingMenus.Find(hwnd); HWND next = m_trackingMenus.Get(a+1); if (next) DestroyWindow(next); m_trackingPt.x=r.right; m_trackingPt.y=r.top + which*itemheight; ClientToScreen(hwnd,&m_trackingPt); submenuWndProc(new HWND__(NULL,0,NULL,"menu",false,submenuWndProc,NULL),WM_CREATE,0,(LPARAM)inf->hSubMenu); } else if (inf->wID) m_trackingRet = inf->wID; } else DestroyWindow(hwnd); } else DestroyWindow(hwnd); } break; } return DefWindowProc(hwnd,uMsg,wParam,lParam); }
static BOOL WINAPI RemoteChannelListProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static WDL_PtrList<struct HWND__> m_children; switch (uMsg) { case WM_INITDIALOG: { } break; case WM_LCUSER_VUUPDATE: { HWND hwnd=GetWindow(hwndDlg,GW_CHILD); while (hwnd) { SendMessage(hwnd,uMsg,0,0); hwnd=GetWindow(hwnd,GW_HWNDNEXT); } } break; case WM_RCUSER_UPDATE: { int pos=0; int us; int did_sizing=0; RECT lastr={0,0,0,0}; g_client_mutex.Enter(); for (us = 0; us < g_client->GetNumUsers(); us ++) { // add/update a user divider { HWND h=NULL; if (pos < m_children.GetSize() && GetWindowLong(h=m_children.Get(pos),GWL_USERDATA) < 0) { // this is our wnd } else { if (h) DestroyWindow(h); h=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_REMOTEUSER),hwndDlg,RemoteUserItemProc); if (pos < m_children.GetSize()) m_children.Set(pos,h); else m_children.Add(h); ShowWindow(h,SW_SHOWNA); did_sizing=1; } SendMessage(h,WM_RCUSER_UPDATE,(WPARAM)us,0); RECT r; GetWindowRect(h,&r); ScreenToClient(hwndDlg,(LPPOINT)&r); if (r.top != lastr.bottom) { SetWindowPos(h,0, 0,lastr.bottom, 0,0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); GetWindowRect(h,&lastr); } else lastr=r; ScreenToClient(hwndDlg,(LPPOINT)&lastr + 1); pos++; } int ch=0; for (;;) { int i=g_client->EnumUserChannels(us,ch++); if (i < 0) break; HWND h=NULL; if (pos < m_children.GetSize() && GetWindowLong(h=m_children.Get(pos),GWL_USERDATA) >= 0) { } else { if (h) DestroyWindow(h); h=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_REMOTECHANNEL),hwndDlg,RemoteChannelItemProc); if (pos < m_children.GetSize()) m_children.Set(pos,h); else m_children.Add(h); did_sizing=1; ShowWindow(h,SW_SHOWNA); } RECT r; GetWindowRect(h,&r); ScreenToClient(hwndDlg,(LPPOINT)&r); if (r.top != lastr.bottom) { SetWindowPos(h,0,0,lastr.bottom,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE); GetWindowRect(h,&lastr); } else lastr=r; SendMessage(h,WM_RCUSER_UPDATE,(WPARAM)us,(LPARAM)i); ScreenToClient(hwndDlg,(LPPOINT)&lastr + 1); pos++; } } g_client_mutex.Leave(); for (; pos < m_children.GetSize(); ) { DestroyWindow(m_children.Get(pos)); m_children.Delete(pos); did_sizing=1; } if (did_sizing) { SetWindowPos(hwndDlg,NULL,0,0,lastr.right,lastr.bottom,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); // size ourself } } // update channel list, creating and destroying window as necessary break; } return 0; }