void *WinDockPlugin::processEvent(Event *e) { if (e->type() == EventQuit) uninit(); if (e->type() == EventCommandExec){ CommandDef *cmd = (CommandDef*)(e->param()); if (cmd->id == CmdAutoHide){ dock->setAutoHide(cmd->flags & COMMAND_CHECKED); bAutoHideVisible = true; setBarState(); return cmd; } } if (e->type() == EventCheckState){ CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->id == CmdAutoHide) && (dock->getState() != ABE_FLOAT)){ cmd->flags &= ~COMMAND_CHECKED; if (dock->getAutoHide()) cmd->flags |= COMMAND_CHECKED; return cmd; } } if ((e->type() == EventInit) && !m_bInit) init(); if (e->type() == EventInTaskManager){ if ((dock->getState() != ABE_FLOAT) && e->param()){ Event eMy(EventInTaskManager, (void*)false); eMy.process(); return e->param(); } } return NULL; }
void WinDockPlugin::init() { pMain = getMainWindow(); if (pMain){ if (IsWindowUnicode(pMain->winId())){ oldProc = (WNDPROC)SetWindowLongW(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); if (oldProc == 0) oldProc = (WNDPROC)SetWindowLongA(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); } appBarMessage(ABM_NEW); m_bInit = true; setBarState(); } }
void WinDockPlugin::init() { if (m_bInit) return; pMain = getMainWindow(); if (pMain){ if (IsWindowUnicode(pMain->winId())){ oldProc = (WNDPROC)SetWindowLongW(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); }else{ oldProc = (WNDPROC)SetWindowLongA(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); } appBarMessage(ABM_NEW); m_bInit = true; setBarState(); pMain->installEventFilter(this); } }
void WinDockPlugin::slotAutoHide() { if (pMain->isActiveWindow()) return; DWORD pos = GetMessagePos(); int x = GET_X_LPARAM(pos); int y = GET_Y_LPARAM(pos); RECT rc; GetWindowRect(pMain->winId(), &rc); rc.left -= GetSystemMetrics(SM_CXDOUBLECLK) * 2; rc.right += GetSystemMetrics(SM_CXDOUBLECLK) * 2; if ((x >= rc.left) && (x <= rc.right) && (y >= rc.top) && (y <= rc.bottom)) return; if ((getState() != ABE_FLOAT) && getAutoHide() && bAutoHideVisible){ bAutoHideVisible = false; setBarState(true); enableAutoHide(false); } }
void barCmd(int fd, int cmd) { if(setBarState(fd, cmd) != SB_OK) printf("Error setting bar state\n"); }
LRESULT CALLBACK dockWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT res; log(L_DEBUG, "Msg %04X %04X", msg, wParam); if (msg == WM_APPBAR){ switch (wParam){ case ABN_FULLSCREENAPP: bFullScreen = (lParam != 0); setBarState(); break; case ABN_POSCHANGED: if (dock->getState() != ABE_FLOAT) setBarState(); break; } } unsigned type; RECT *prc; RECT rcWnd; QRect rc; switch (msg){ case WM_ACTIVATE: if (dock->getState() != ABE_FLOAT){ if ((wParam == WA_INACTIVE) && dock->getAutoHide() && bAutoHideVisible){ bAutoHideVisible = false; setBarState(); } appBarMessage(ABM_ACTIVATE); } break; case WM_NCMOUSEMOVE: if ((dock->getState() != ABE_FLOAT) && dock->getAutoHide() && !bAutoHideVisible){ bAutoHideVisible = true; setBarState(true); } break; case WM_ENTERSIZEMOVE: bMoving = true; bSizing = true; if (dock->getState() == ABE_FLOAT){ bSizing = false; GetWindowRect(hWnd, &rcWnd); dock->setHeight(rcWnd.bottom - rcWnd.top); } return DefWindowProc(hWnd, msg, wParam, lParam); case WM_EXITSIZEMOVE: bMoving = false; dock->setState(getEdge()); setBarState(true); return DefWindowProc(hWnd, msg, wParam, lParam); case WM_MOVING: case WM_SIZING: if (!bMoving) break; prc = (RECT*)lParam; type = getEdge(prc); if (type == ABE_FLOAT){ if (bSizing){ prc->bottom = prc->top + dock->getHeight(); bSizing = false; } }else{ getBarRect(type, rc, prc); prc->left = rc.left(); prc->top = rc.top(); prc->right = rc.right(); prc->bottom = rc.bottom(); bSizing = true; } return 1; case WM_WINDOWPOSCHANGED: res = oldProc(hWnd, msg, wParam, lParam); if (dock->getState() != ABE_FLOAT) appBarMessage(ABM_WINDOWPOSCHANGED); return res; } return oldProc(hWnd, msg, wParam, lParam); }
void WinDockPlugin::slotSetState() { setBarState(); }
LRESULT CALLBACK dockWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT res; if (msg == WM_APPBAR){ switch (wParam){ case ABN_FULLSCREENAPP: if ((lParam != 0) == bFullScreen) break; bFullScreen = (lParam != 0); setBarState(); break; case ABN_POSCHANGED: if (dock->getState() != ABE_FLOAT) setBarState(); break; } } unsigned type; RECT *prc; RECT rcWnd; QRect rc; unsigned oldState; switch (msg){ case WM_DESTROY: res = oldProc(hWnd, msg, wParam, lParam); appBarMessage(ABM_REMOVE); WNDPROC p; p = (WNDPROC)SetWindowLongW(hWnd, GWL_WNDPROC, (LONG)oldProc); if (p == 0) p = (WNDPROC)SetWindowLongA(hWnd, GWL_WNDPROC, (LONG)oldProc); oldProc = NULL; return res; case WM_SHOWWINDOW: res = oldProc(hWnd, msg, wParam, lParam); if (dock->getState() != ABE_FLOAT) QTimer::singleShot(0, dock, SLOT(slotSetState())); return res; case WM_ACTIVATE: if (dock->getState() != ABE_FLOAT){ if ((wParam == WA_INACTIVE) && dock->getAutoHide() && bAutoHideVisible){ bAutoHideVisible = false; setBarState(); dock->enableAutoHide(false); } appBarMessage(ABM_ACTIVATE); } break; case WM_NCMOUSEMOVE: if ((dock->getState() != ABE_FLOAT) && dock->getAutoHide() && !bAutoHideVisible){ bAutoHideVisible = true; setBarState(true); dock->enableAutoHide(true); } break; case WM_ENTERSIZEMOVE: bMoving = true; bSizing = true; if (dock->getState() == ABE_FLOAT){ bSizing = false; GetWindowRect(hWnd, &rcWnd); dock->setHeight(rcWnd.bottom - rcWnd.top); } return DefWindowProc(hWnd, msg, wParam, lParam); case WM_EXITSIZEMOVE: bMoving = false; oldState = dock->getState(); dock->setState(getEdge()); GetWindowRect(hWnd, &rcWnd); if ((dock->getState() == ABE_FLOAT) && (oldState != ABE_FLOAT)){ rcWnd.bottom = rcWnd.top + dock->getHeight(); SetWindowPos(pMain->winId(), NULL, rcWnd.left, rcWnd.top, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME); } dock->setWidth(rcWnd.right - rcWnd.left); setBarState(true); return DefWindowProc(hWnd, msg, wParam, lParam); case WM_MOVING: case WM_SIZING: if (!bMoving) break; prc = (RECT*)lParam; type = getEdge(prc); if (type == ABE_FLOAT){ if (bSizing){ prc->bottom = prc->top + dock->getHeight(); bSizing = false; } }else{ getBarRect(type, rc, prc); prc->left = rc.left(); prc->top = rc.top(); prc->right = rc.right(); prc->bottom = rc.bottom(); bSizing = true; } return 1; case WM_WINDOWPOSCHANGED: res = oldProc(hWnd, msg, wParam, lParam); if (dock->getState() != ABE_FLOAT) appBarMessage(ABM_WINDOWPOSCHANGED); return res; } return oldProc(hWnd, msg, wParam, lParam); }