void DockWnd::setIcon(const char *icon) { #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon){ wharfIcon->set(m_state, bBlink ? m_unread : NULL); repaint(); return; } #endif #endif drawIcon = Pict(icon); #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (!inTray){ repaint(); return; } #endif #endif #ifdef WIN32 QWidget::setIcon(drawIcon); if (IsWindowUnicode(winId())){ __NOTIFYICONDATAW notifyIconData; memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uFlags = NIF_ICON; Shell_NotifyIconW(NIM_MODIFY, (NOTIFYICONDATAW*)¬ifyIconData); }else{ __NOTIFYICONDATAA notifyIconData; memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uFlags = NIF_ICON; Shell_NotifyIconA(NIM_MODIFY, (NOTIFYICONDATAA*)¬ifyIconData); } #else #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon) return; #endif // from PSI: // thanks to Robert Spier for this: // for some reason the repaint() isn't being honored, or isn't for // the icon. So force one on the widget behind the icon erase(); QPaintEvent pe( rect() ); paintEvent(&pe); #endif }
void DockWnd::setTip(const char *text) { m_tip = text; QString tip = m_unreadText; if (tip.isEmpty()){ tip = i18n(text); tip = tip.replace(QRegExp("\\&"), ""); } #ifdef WIN32 if (_Shell_NotifyIconW && IsWindowUnicode(winId())){ NOTIFYICONDATAW notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); memset(notifyIconData.szTip, 0, sizeof(notifyIconData.szTip)); unsigned size = tip.length(); if (size >= sizeof(notifyIconData.szTip) / sizeof(wchar_t)) size = sizeof(notifyIconData.szTip) / sizeof(wchar_t) - 1; memcpy(notifyIconData.szTip, tip.unicode(), size * sizeof(wchar_t)); notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_TIP; notifyIconData.uID = 0; _Shell_NotifyIconW(NIM_MODIFY, ¬ifyIconData); }else{ NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); strncpy(notifyIconData.szTip, tip.local8Bit(), sizeof(notifyIconData.szTip)); notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_TIP; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_MODIFY, ¬ifyIconData); } #else #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon == NULL){ if (isVisible()){ #endif QToolTip::remove(this); QToolTip::add(this, tip); #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) } }else{ if (wharfIcon->isVisible()){ QToolTip::remove(wharfIcon); QToolTip::add(wharfIcon, tip); } } #endif #endif }
void DockWnd::setIcon(const char *icon) { #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon) wharfIcon->set(icon, NULL); #endif #endif drawIcon = Pict(icon); #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (!inTray){ repaint(); return; } #endif #endif #ifdef WIN32 QWidget::setIcon(drawIcon); if (_Shell_NotifyIconW && IsWindowUnicode(winId())){ NOTIFYICONDATAW notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.szTip[0] = 0; notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_ICON; notifyIconData.uID = 0; _Shell_NotifyIconW(NIM_MODIFY, ¬ifyIconData); }else{ NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.szTip[0] = 0; notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_ICON; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_MODIFY, ¬ifyIconData); } #else #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon) return; #endif repaint(); #endif }
void QWidgetPrivate::setWindowOpacity_sys(qreal level) { Q_Q(QWidget); Q_UNUSED(level); createWinId(); QWidget::qwsDisplay()->setOpacity(q->data->winid, topData()->opacity); }
void DockWnd::setTip(const QString &tip) { #ifdef WIN32 NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); strncpy(notifyIconData.szTip, tip.local8Bit(), sizeof(notifyIconData.szTip)); notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_TIP; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_MODIFY, ¬ifyIconData); #else if (wharfIcon == NULL){ if (isVisible()){ QToolTip::remove(this); QToolTip::add(this, tip); } }else{ if (wharfIcon->isVisible()){ QToolTip::remove(wharfIcon); QToolTip::add(wharfIcon, tip); } } #endif }
/*! Creates a QNPWidget. */ QNPWidget::QNPWidget() : pi(next_pi) { if (!next_pi) { qFatal("QNPWidget must only be created within call to newWindow"); } next_pi->widget = this; next_pi = 0; #ifdef Q_WS_WIN clearWFlags( WStyle_NormalBorder | WStyle_Title | WStyle_MinMax | WStyle_SysMenu ); topData()->ftop = 0; topData()->fright = 0; topData()->fleft = 0; topData()->fbottom = 0; #endif }
void DockWnd::setIcon(const char *icon) { #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon) wharfIcon->set(icon, NULL); #endif #endif drawIcon = Pict(icon); #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (!inTray){ repaint(); return; } #endif #endif #ifdef WIN32 QWidget::setIcon(drawIcon); if (IsWindowUnicode(winId())){ __NOTIFYICONDATAW notifyIconData; memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uFlags = NIF_ICON; Shell_NotifyIconW(NIM_MODIFY, (NOTIFYICONDATAW*)¬ifyIconData); }else{ __NOTIFYICONDATAA notifyIconData; memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uFlags = NIF_ICON; Shell_NotifyIconA(NIM_MODIFY, (NOTIFYICONDATAA*)¬ifyIconData); } #else #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) if (wharfIcon) return; #endif repaint(); #endif }
void MyMainWindow::resizeEvent(QResizeEvent *event) { if (event->size().width() != qApp->desktop()->width()) { QSize oldSize = event->size(); QSize newSize = oldSize; newSize.setWidth(qApp->desktop()->width()); QResizeEvent newEvent(newSize, oldSize); QApplication::sendEvent(this, &newEvent); return; } if ((myApplicationWindow->myVerticalDelta == -1) && !myApplicationWindow->myFullScreen) { myApplicationWindow->myVerticalDelta = qApp->desktop()->height() - event->size().height(); } if (myApplicationWindow->myFullScreen && (size() != qApp->desktop()->size())) { int titleHeight = topData()->normalGeometry.top(); if (titleHeight > 0) { myApplicationWindow->myTitleHeight = titleHeight; } topData()->normalGeometry = QRect(0, 0, -1, -1); showNormal(); showFullScreen(); } }
void DockWnd::setIcon(const QPixmap &p) { drawIcon = p; #ifdef WIN32 QWidget::setIcon(p); NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.szTip[0] = 0; notifyIconData.uCallbackMessage = 0; notifyIconData.uFlags = NIF_ICON; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_MODIFY, ¬ifyIconData); #else repaint(); #endif }
DockWnd::DockWnd(QWidget *main) : QWidget(NULL, "dock", WType_TopLevel | WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop) { setMouseTracking(true); connect(this, SIGNAL(toggleWin()), main, SLOT(toggleShow())); connect(this, SIGNAL(showPopup(QPoint)), main, SLOT(showDockPopup(QPoint))); connect(this, SIGNAL(doubleClicked()), main, SLOT(dockDblClicked())); connect(pClient, SIGNAL(event(ICQEvent*)), this, SLOT(processEvent(ICQEvent*))); connect(pMain, SIGNAL(iconChanged()), this, SLOT(reset())); connect(pMain, SIGNAL(msgChanged()), this, SLOT(reset())); m_state = 0; showIcon = State; QTimer *t = new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(timer())); t->start(800); bNoToggle = false; #ifdef WIN32 QWidget::hide(); QWidget::setIcon(Pict(pClient->getStatusIcon())); gDock = this; oldDockProc = (WNDPROC)SetWindowLongW(winId(), GWL_WNDPROC, (LONG)DockWindowProc); if (oldDockProc == 0) oldDockProc = (WNDPROC)SetWindowLongA(winId(), GWL_WNDPROC, (LONG)DockWindowProc); NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.szTip[0] = 0; notifyIconData.uCallbackMessage = WM_DOCK; notifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_ADD, ¬ifyIconData); #else setMinimumSize(22, 22); resize(22, 22); bInit = false; inTray = false; inNetTray = false; Display *dsp = x11Display(); WId win = winId(); if (bEnlightenment){ wharfIcon = NULL; bInit = true; resize(48, 48); setFocusPolicy(NoFocus); move(pMain->getDockX(), pMain->getDockY()); reset(); MWMHints mwm; mwm.flags = MWM_HINTS_DECORATIONS; mwm.functions = 0; mwm.decorations = 0; mwm.inputMode = 0; mwm.status = 0; Atom a = XInternAtom(dsp, "_MOTIF_WM_HINTS", False); XChangeProperty(dsp, win, a, a, 32, PropModeReplace, (unsigned char *)&mwm, sizeof(MWMHints) / 4); XStoreName(dsp, win, "SIM"); XClassHint *xch = XAllocClassHint(); xch->res_name = (char*)"SIM"; xch->res_class = (char*)"Epplet"; XSetClassHint(dsp, win, xch); XFree(xch); XSetIconName(dsp, win, "SIM"); unsigned long val = (1 << 0) /* | (1 << 9) */ ; a = XInternAtom(dsp, "_WIN_STATE", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); val = 2; a = XInternAtom(dsp, "_WIN_LAYER", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); val = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 5); a = XInternAtom(dsp, "_WIN_HINTS", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); win_name = "SIM"; win_version = VERSION; win_info = ""; while (!comms_win) { ECommsSetup(dsp); sleep(1); } char s[256]; snprintf(s, sizeof(s), "set clientname %s", win_name); ECommsSend(s); snprintf(s, sizeof(s), "set version %s", win_version); ECommsSend(s); snprintf(s, sizeof(s), "set info %s", win_info); ECommsSend(s); ESYNC; set_background_properties(this); show(); return; } wharfIcon = new WharfIcon(this); setBackgroundMode(X11ParentRelative); const QPixmap &pict = Pict(pClient->getStatusIcon()); setIcon(pict); XClassHint classhint; classhint.res_name = (char*)"sim"; classhint.res_class = (char*)"Wharf"; XSetClassHint(dsp, win, &classhint); Screen *screen = XDefaultScreenOfDisplay(dsp); int screen_id = XScreenNumberOfScreen(screen); char buf[32]; snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); Atom selection_atom = XInternAtom(dsp, buf, false); XGrabServer(dsp); Window manager_window = XGetSelectionOwner(dsp, selection_atom); if (manager_window != None) XSelectInput(dsp, manager_window, StructureNotifyMask); XUngrabServer(dsp); XFlush(dsp); if (manager_window != None){ inNetTray = true; if (!send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, win, 0, 0)){ inNetTray = false; } } Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); long data[1]; data[0] = 0; XChangeProperty(dsp, win, kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (unsigned char*)data, 1); XWMHints *hints; hints = XGetWMHints(dsp, win); hints->initial_state = WithdrawnState; hints->icon_x = 0; hints->icon_y = 0; hints->icon_window = wharfIcon->winId(); hints->window_group = win; hints->flags = WindowGroupHint | IconWindowHint | IconPositionHint | StateHint; XSetWMHints(dsp, win, hints); XFree( hints ); XSetCommand(dsp, win, _argv, _argc); if (!inNetTray){ move(-21, -21); resize(22, 22); } show(); #endif reset(); }
void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) { Q_Q(QWidget); Q_ASSERT(q->testAttribute(Qt::WA_WState_Created)); if ((q->windowType() == Qt::Desktop)) return; QPoint oldPos(q->pos()); QSize oldSize(q->size()); QRect oldGeom(data.crect); // Lose maximized status if deliberate resize if (w != oldSize.width() || h != oldSize.height()) data.window_state &= ~Qt::WindowMaximized; if (extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); w = qMax(w,extra->minw); h = qMax(h,extra->minh); } if (q->isWindow()) topData()->normalGeometry = QRect(0, 0, -1, -1); else { uint s = data.window_state; s &= ~(Qt::WindowMaximized | Qt::WindowFullScreen); data.window_state = s; } bool isResize = w != oldSize.width() || h != oldSize.height(); if (!isMove && !isResize) return; if (q->isWindow()) { if (w == 0 || h == 0) { q->setAttribute(Qt::WA_OutsideWSRange, true); if (q->isVisible() && q->testAttribute(Qt::WA_Mapped)) hide_sys(); data.crect = QRect(x, y, w, h); data.window_state &= ~Qt::WindowFullScreen; } else if (q->isVisible() && q->testAttribute(Qt::WA_OutsideWSRange)) { q->setAttribute(Qt::WA_OutsideWSRange, false); // put the window in its place and show it q->internalWinId()->SetRect(TRect(TPoint(x, y), TSize(w, h))); data.crect.setRect(x, y, w, h); show_sys(); } else { QRect r = QRect(x, y, w, h); data.crect = r; q->internalWinId()->SetRect(TRect(TPoint(x, y), TSize(w, h))); topData()->normalGeometry = data.crect; } } else { data.crect.setRect(x, y, w, h); QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData(); const bool inTopLevelResize = tlwExtra ? tlwExtra->inTopLevelResize : false; if (q->isVisible() && (!inTopLevelResize || q->internalWinId())) { // Top-level resize optimization does not work for native child widgets; // disable it for this particular widget. if (inTopLevelResize) tlwExtra->inTopLevelResize = false; if (!isResize && maybeBackingStore()) moveRect(QRect(oldPos, oldSize), x - oldPos.x(), y - oldPos.y()); else invalidateBuffer_resizeHelper(oldPos, oldSize); if (inTopLevelResize) tlwExtra->inTopLevelResize = true; } if (q->testAttribute(Qt::WA_WState_Created)) setWSGeometry(); } if (q->isVisible()) { if (isMove && q->pos() != oldPos) { QMoveEvent e(q->pos(), oldPos); QApplication::sendEvent(q, &e); } if (isResize) { bool slowResize = qgetenv("QT_SLOW_TOPLEVEL_RESIZE").toInt(); const bool setTopLevelResize = !slowResize && q->isWindow() && extra && extra->topextra && !extra->topextra->inTopLevelResize; if (setTopLevelResize) extra->topextra->inTopLevelResize = true; QResizeEvent e(q->size(), oldSize); QApplication::sendEvent(q, &e); if (!q->testAttribute(Qt::WA_StaticContents) && q->internalWinId()) q->internalWinId()->DrawDeferred(); if (setTopLevelResize) extra->topextra->inTopLevelResize = false; } } else { if (isMove && q->pos() != oldPos) q->setAttribute(Qt::WA_PendingMoveEvent, true); if (isResize) q->setAttribute(Qt::WA_PendingResizeEvent, true); } }
DockWnd::DockWnd(DockPlugin *plugin, const char *icon, const char *text) : QWidget(NULL, "dock", WType_TopLevel | WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop), EventReceiver(LowPriority) { #ifndef WIN32 #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) wharfIcon = NULL; #endif #endif m_plugin = plugin; setMouseTracking(true); bNoToggle = false; bBlink = false; m_state = icon; blinkTimer = new QTimer(this); connect(blinkTimer, SIGNAL(timeout()), this, SLOT(blink())); #ifdef WIN32 m_bBalloon = false; hShell = NULL; setIcon(icon); QWidget::hide(); gDock = this; WM_DOCK = RegisterWindowMessageA("SIM dock"); if (IsWindowUnicode(winId())){ oldDockProc = (WNDPROC)SetWindowLongW(winId(), GWL_WNDPROC, (LONG)DockWindowProc); /* OSVERSIONINFOA osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionExA(&osvi); if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osvi.dwMajorVersion > 4)) m_bBalloon = true; */ __NOTIFYICONDATAW notifyIconData; if (m_bBalloon){ memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.uVersion = NOTIFYICON_VERSION; Shell_NotifyIconW(NIM_SETVERSION, (NOTIFYICONDATAW*)¬ifyIconData); } memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uCallbackMessage = WM_DOCK; notifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIconW(NIM_ADD, (NOTIFYICONDATAW*)¬ifyIconData); }else{ oldDockProc = (WNDPROC)SetWindowLongA(winId(), GWL_WNDPROC, (LONG)DockWindowProc); __NOTIFYICONDATAA notifyIconData; memset(¬ifyIconData, 0, sizeof(notifyIconData)); notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.uCallbackMessage = WM_DOCK; notifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIconA(NIM_ADD, (NOTIFYICONDATAA*)¬ifyIconData); } #else setMinimumSize(22, 22); resize(22, 22); #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) bInit = false; inTray = false; inNetTray = false; Display *dsp = x11Display(); WId win = winId(); bool bEnlightenment = false; QWidget tmp; Atom enlightenment_desktop = XInternAtom(dsp, "ENLIGHTENMENT_DESKTOP", false); WId w = tmp.winId(); Window p, r; Window *c; unsigned int nc; while (XQueryTree(dsp, w, &r, &p, &c, &nc)){ if (c && nc > 0) XFree(c); if (! p) { log(L_WARN, "No parent"); break; } unsigned char *data_ret = NULL; Atom type_ret; int i_unused; unsigned long l_unused; if ((XGetWindowProperty(dsp, p, enlightenment_desktop, 0, 1, False, XA_CARDINAL, &type_ret, &i_unused, &l_unused, &l_unused, &data_ret) == Success) && (type_ret == XA_CARDINAL)) { if (data_ret) XFree(data_ret); bEnlightenment = true; log(L_DEBUG, "Detect Enlightenment"); break; } if (p == r) break; w = p; } if (bEnlightenment){ bInit = true; resize(48, 48); setFocusPolicy(NoFocus); move(m_plugin->getDockX(), m_plugin->getDockY()); MWMHints mwm; mwm.flags = MWM_HINTS_DECORATIONS; mwm.functions = 0; mwm.decorations = 0; mwm.inputMode = 0; mwm.status = 0; Atom a = XInternAtom(dsp, "_MOTIF_WM_HINTS", False); XChangeProperty(dsp, win, a, a, 32, PropModeReplace, (unsigned char *)&mwm, sizeof(MWMHints) / 4); XStoreName(dsp, win, "SIM"); XClassHint *xch = XAllocClassHint(); xch->res_name = (char*)"SIM"; xch->res_class = (char*)"Epplet"; XSetClassHint(dsp, win, xch); XFree(xch); XSetIconName(dsp, win, "SIM"); unsigned long val = (1 << 0) /* | (1 << 9) */ ; a = XInternAtom(dsp, "_WIN_STATE", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); val = 2; a = XInternAtom(dsp, "_WIN_LAYER", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); val = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 5); a = XInternAtom(dsp, "_WIN_HINTS", False); XChangeProperty(dsp, win, a, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&val, 1); win_name = "SIM"; win_version = VERSION; win_info = ""; while (!comms_win) { ECommsSetup(dsp); sleep(1); } char s[256]; snprintf(s, sizeof(s), "set clientname %s", win_name); ECommsSend(s); snprintf(s, sizeof(s), "set version %s", win_version); ECommsSend(s); snprintf(s, sizeof(s), "set info %s", win_info); ECommsSend(s); ESYNC; set_background_properties(this); setIcon(icon); show(); return; } wharfIcon = new WharfIcon(this); #endif setBackgroundMode(X11ParentRelative); setIcon(icon); #if !defined(QT_MACOSX_VERSION) && !defined(QT_MAC) XClassHint classhint; classhint.res_name = (char*)"sim"; classhint.res_class = (char*)"Wharf"; XSetClassHint(dsp, win, &classhint); Screen *screen = XDefaultScreenOfDisplay(dsp); int screen_id = XScreenNumberOfScreen(screen); char buf[32]; snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); Atom selection_atom = XInternAtom(dsp, buf, false); XGrabServer(dsp); Window manager_window = XGetSelectionOwner(dsp, selection_atom); if (manager_window != None) XSelectInput(dsp, manager_window, StructureNotifyMask); XUngrabServer(dsp); XFlush(dsp); if (manager_window != None){ inNetTray = true; if (!send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, win, 0, 0)){ inNetTray = false; } } Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); long data[1]; data[0] = 0; XChangeProperty(dsp, win, kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (unsigned char*)data, 1); XWMHints *hints; hints = XGetWMHints(dsp, win); hints->initial_state = WithdrawnState; hints->icon_x = 0; hints->icon_y = 0; hints->icon_window = wharfIcon->winId(); hints->window_group = win; hints->flags = WindowGroupHint | IconWindowHint | IconPositionHint | StateHint; XSetWMHints(dsp, win, hints); XFree( hints ); Event eArgc(EventArgc); int argc = (int)eArgc.process(); Event eArgv(EventArgv); char **argv = (char**)eArgv.process(); XSetCommand(dsp, win, argv, argc); if (!inNetTray){ move(-21, -21); resize(22, 22); } #endif show(); #endif setTip(text); reset(); }
void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) { Q_Q(QWidget); if (extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); w = qMax(w,extra->minw); h = qMax(h,extra->minh); } QPoint oldp = q->geometry().topLeft(); QSize olds = q->size(); QRect r(x, y, w, h); bool isResize = olds != r.size(); isMove = oldp != r.topLeft(); //### why do we have isMove as a parameter? // We only care about stuff that changes the geometry, or may // cause the window manager to change its state if (r.size() == olds && oldp == r.topLeft()) return; if (!data.in_set_window_state) { q->data->window_state &= ~Qt::WindowMaximized; q->data->window_state &= ~Qt::WindowFullScreen; if (q->isWindow()) topData()->normalGeometry = QRect(0, 0, -1, -1); } QPoint oldPos = q->pos(); data.crect = r; if ((q->windowType() == Qt::Desktop)) return; if (q->isVisible()) { bool toplevelMove = false; QWSWindowSurface *surface = 0; if (q->isWindow()) { //### ConfigPending not implemented, do we need it? //setAttribute(Qt::WA_WState_ConfigPending); const QWidgetBackingStore *bs = maybeBackingStore(); if (bs) surface = static_cast<QWSWindowSurface*>(bs->windowSurface); if (isMove && !isResize && surface) { const QPoint offset(x - oldp.x(), y - oldp.y()); moveSurface(surface, offset); toplevelMove = true; //server moves window, but we must send moveEvent, which might trigger painting #ifdef Q_BACKINGSTORE_SUBSURFACES QList<QWindowSurface*> surfaces = bs->subSurfaces; for (int i = 0; i < surfaces.size(); ++i) moveSurface(surfaces.at(i), offset); #endif } else { updateFrameStrut(); } } if (!toplevelMove) { if (q->isWindow()) { if (surface) surface->setGeometry(q->frameGeometry()); else invalidateBuffer(q->rect()); //### #ifdef Q_BACKINGSTORE_SUBSURFACES // XXX: should not resize subsurfaces. Children within a layout // will be resized automatically while children with a static // geometry should get a new clip region instead. const QRect clipRect = q->geometry(); QWidgetBackingStore *bs = maybeBackingStore(); QList<QWindowSurface*> surfaces = bs->subSurfaces; for (int i = 0; i < surfaces.size(); ++i) { QWSWindowSurface *s = static_cast<QWSWindowSurface*>(surfaces.at(i)); QRect srect = s->geometry(); s->setGeometry(clipRect & srect); } #endif } #ifdef Q_BACKINGSTORE_SUBSURFACES // XXX: merge this case with the isWindow() case else if (maybeTopData() && maybeTopData()->windowSurface) { QWSWindowSurface *surface; surface = static_cast<QWSWindowSurface*>(q->windowSurface()); if (isMove && !isResize) { moveSurface(surface, QPoint(x - oldp.x(), y - oldp.y())); } else { const QPoint p = q->mapToGlobal(QPoint()); surface->setGeometry(QRect(p, QSize(w, h))); } } #endif else { if (isMove && !isResize) moveRect(QRect(oldPos, olds), x - oldPos.x(), y - oldPos.y()); else invalidateBuffer_resizeHelper(oldPos, olds); } } //### must have frame geometry correct before sending move/resize events if (isMove) { QMoveEvent e(q->pos(), oldPos); QApplication::sendEvent(q, &e); } if (isResize) { QResizeEvent e(r.size(), olds); QApplication::sendEvent(q, &e); } } else { // not visible if (isMove && q->pos() != oldPos) q->setAttribute(Qt::WA_PendingMoveEvent, true); if (isResize) q->setAttribute(Qt::WA_PendingResizeEvent, true); } }
void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyOldWindow) { Q_Q(QWidget); Q_UNUSED(window); Q_UNUSED(initializeWindow); Q_UNUSED(destroyOldWindow); Qt::WindowFlags flags = data.window_flags; if (!q->testAttribute(Qt::WA_NativeWindow) && !q->isWindow()) return; // we only care about real toplevels QWindow *win = topData()->window; // topData() ensures the extra is created but does not ensure 'window' is non-null // in case the extra was already valid. if (!win) { createTLSysExtra(); win = topData()->window; } win->setFlags(data.window_flags); fixPosIncludesFrame(); if (q->testAttribute(Qt::WA_Moved)) win->setGeometry(q->geometry()); else win->resize(q->size()); win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0)); if (q->testAttribute(Qt::WA_TranslucentBackground)) { QSurfaceFormat format; format.setAlphaBufferSize(8); win->setFormat(format); } if (QWidget *nativeParent = q->nativeParentWidget()) { if (nativeParent->windowHandle()) { if (flags & Qt::Window) { win->setTransientParent(nativeParent->windowHandle()); win->setParent(0); } else { win->setTransientParent(0); win->setParent(nativeParent->windowHandle()); } } } qt_window_private(win)->positionPolicy = topData()->posIncludesFrame ? QWindowPrivate::WindowFrameInclusive : QWindowPrivate::WindowFrameExclusive; win->create(); // Enable nonclient-area events for QDockWidget and other NonClientArea-mouse event processing. if ((flags & Qt::Desktop) == Qt::Window) win->handle()->setFrameStrutEventsEnabled(true); data.window_flags = win->flags(); QBackingStore *store = q->backingStore(); if (!store) { if (win && q->windowType() != Qt::Desktop) q->setBackingStore(new QBackingStore(win)); else q->setAttribute(Qt::WA_PaintOnScreen, true); } setWindowModified_helper(); setWinId(win->winId()); // Check children and create windows for them if necessary q_createNativeChildrenAndSetParent(q); if (extra && !extra->mask.isEmpty()) setMask_sys(extra->mask); // If widget is already shown, set window visible, too if (q->isVisible()) win->setVisible(true); }
void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) { Q_Q(QWidget); if (extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); w = qMax(w,extra->minw); h = qMax(h,extra->minh); } if (q->isWindow() && q->windowHandle()) { QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration(); if (!integration->hasCapability(QPlatformIntegration::NonFullScreenWindows)) { x = 0; y = 0; w = q->windowHandle()->width(); h = q->windowHandle()->height(); } } QPoint oldp = q->geometry().topLeft(); QSize olds = q->size(); QRect r(x, y, w, h); bool isResize = olds != r.size(); isMove = oldp != r.topLeft(); //### why do we have isMove as a parameter? // We only care about stuff that changes the geometry, or may // cause the window manager to change its state if (r.size() == olds && oldp == r.topLeft()) return; if (!data.in_set_window_state) { q->data->window_state &= ~Qt::WindowMaximized; q->data->window_state &= ~Qt::WindowFullScreen; if (q->isWindow()) topData()->normalGeometry = QRect(0, 0, -1, -1); } QPoint oldPos = q->pos(); data.crect = r; bool needsShow = false; if (!(data.window_state & Qt::WindowFullScreen) && (w == 0 || h == 0)) { q->setAttribute(Qt::WA_OutsideWSRange, true); if (q->isVisible() && q->testAttribute(Qt::WA_Mapped)) hide_sys(); data.crect = QRect(x, y, w, h); } else if (q->isVisible() && q->testAttribute(Qt::WA_OutsideWSRange)) { q->setAttribute(Qt::WA_OutsideWSRange, false); needsShow = true; } if (q->isVisible()) { if (!q->testAttribute(Qt::WA_DontShowOnScreen) && !q->testAttribute(Qt::WA_OutsideWSRange)) { if (q->windowHandle()) { if (q->isWindow()) { q->windowHandle()->setGeometry(q->geometry()); } else { QPoint posInNativeParent = q->mapTo(q->nativeParentWidget(),QPoint()); q->windowHandle()->setGeometry(QRect(posInNativeParent,r.size())); } const QWidgetBackingStore *bs = maybeBackingStore(); if (bs && bs->store) { if (isResize) bs->store->resize(r.size()); } if (needsShow) show_sys(); } if (!q->isWindow()) { if (isMove && !isResize) moveRect(QRect(oldPos, olds), x - oldPos.x(), y - oldPos.y()); else invalidateBuffer_resizeHelper(oldPos, olds); } } if (isMove) { QMoveEvent e(q->pos(), oldPos); QApplication::sendEvent(q, &e); } if (isResize) { QResizeEvent e(r.size(), olds); QApplication::sendEvent(q, &e); if (q->windowHandle()) q->update(); } } else { // not visible if (isMove && q->pos() != oldPos) q->setAttribute(Qt::WA_PendingMoveEvent, true); if (isResize) q->setAttribute(Qt::WA_PendingResizeEvent, true); } }
void QWidget::create( WId window, bool initializeWindow, bool /*destroyOldWindow*/) { if ( testWState(WState_Created) && window == 0 ) return; setWState( WState_Created ); // set created flag if ( !parentWidget() || parentWidget()->isDesktop() ) setWFlags( WType_TopLevel ); // top-level widget alloc_region_index = -1; alloc_region_revision = -1; isSettingGeometry = FALSE; overlapping_children = -1; bool topLevel = testWFlags(WType_TopLevel); bool popup = testWFlags(WType_Popup); bool dialog = testWFlags(WType_Dialog); bool desktop = testWFlags(WType_Desktop); WId id; QWSDisplay* dpy = qwsDisplay(); if ( !window ) // always initialize initializeWindow = TRUE; if ( popup ) { setWFlags(WStyle_Tool); // a popup is a tool window setWFlags(WStyle_StaysOnTop); // a popup stays on top } if ( topLevel && parentWidget() ) { // if our parent has WStyle_StaysOnTop, so must we QWidget *ptl = parentWidget()->topLevelWidget(); if ( ptl && ptl->testWFlags( WStyle_StaysOnTop ) ) setWFlags(WStyle_StaysOnTop); } int sw = dpy->width(); int sh = dpy->height(); if ( dialog || popup || desktop ) { // these are top-level, too topLevel = TRUE; setWFlags( WType_TopLevel ); } if ( desktop ) { // desktop widget dialog = popup = FALSE; // force these flags off crect.setRect( 0, 0, sw, sh ); } else if ( topLevel ) { // calc pos/size from screen crect.setRect( 0, 0, sw/2, 4*sh/10 ); } else { // child widget crect.setRect( 0, 0, 100, 30 ); } if ( window ) { // override the old window id = window; setWinId( window ); } else if ( desktop ) { // desktop widget id = (WId)-2; // id = root window QWidget *otherDesktop = find( id ); // is there another desktop? if ( otherDesktop && otherDesktop->testWFlags(WPaintDesktop) ) { otherDesktop->setWinId( 0 ); // remove id from widget mapper setWinId( id ); // make sure otherDesktop is otherDesktop->setWinId( id ); // found first } else { setWinId( id ); } } else { id = topLevel ? dpy->takeId() : takeLocalId(); setWinId( id ); // set widget id/handle + hd } if ( !topLevel ) { if ( !testWFlags(WStyle_Customize) ) setWFlags( WStyle_NormalBorder | WStyle_Title | WStyle_MinMax | WStyle_SysMenu ); } else if ( !(desktop || popup) ) { if ( testWFlags(WStyle_Customize) ) { // customize top-level widget if ( testWFlags(WStyle_NormalBorder) ) { // XXX ... } else { if ( !testWFlags(WStyle_DialogBorder) ) { // XXX ... } } if ( testWFlags(WStyle_Tool) ) { // XXX ... } } else { // normal top-level widget setWFlags( WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WStyle_MinMax ); } } alloc_region_dirty=FALSE; paintable_region_dirty=FALSE; if ( !initializeWindow ) { // do no initialization } else if ( popup ) { // popup widget } else if ( topLevel && !desktop ) { // top-level widget QWidget *p = parentWidget(); // real parent if (p) p = p->topLevelWidget(); if ( testWFlags(WStyle_DialogBorder) || testWFlags(WStyle_StaysOnTop) || testWFlags(WStyle_Dialog) || testWFlags(WStyle_Tool) ) { // XXX ... } // find the real client leader, i.e. a toplevel without parent while ( p && p->parentWidget()) { p = p->parentWidget()->topLevelWidget(); } // XXX ... } if ( initializeWindow ) { } setWState( WState_MouseTracking ); setMouseTracking( FALSE ); // also sets event mask if ( desktop ) { setWState( WState_Visible ); } else if ( topLevel ) { // set X cursor //QCursor *oc = QApplication::overrideCursor(); if ( initializeWindow ) { //XXX XDefineCursor( dpy, winid, oc ? oc->handle() : cursor().handle() ); } setWState( WState_OwnCursor ); #ifndef QT_NO_WIDGET_TOPEXTRA qwsDisplay()->nameRegion( winId(), name(""), caption() ); #else qwsDisplay()->nameRegion( winId(), name(""), QString::null ); #endif } if ( topLevel ) { #if !defined(QT_NO_WIDGET_TOPEXTRA) && !defined(QT_NO_QWS_MANAGER) createTLExtra(); #endif #ifndef QT_NO_QWS_MANAGER if ( testWFlags(WStyle_DialogBorder) || testWFlags(WStyle_NormalBorder)) { // get size of wm decoration QRegion r = QApplication::qwsDecoration().region(this, crect); QRect br( r.boundingRect() ); crect.moveBy( crect.x()-br.x(), crect.y()-br.y() ); extra->topextra->fleft = crect.x()-br.x(); extra->topextra->ftop = crect.y()-br.y(); extra->topextra->fright = br.right()-crect.right(); extra->topextra->fbottom = br.bottom()-crect.bottom(); topData()->qwsManager = new QWSManager(this); } else if ( topData()->qwsManager ) { delete topData()->qwsManager; topData()->qwsManager = 0; crect.moveBy( -extra->topextra->fleft, -extra->topextra->ftop ); extra->topextra->fleft = extra->topextra->ftop = extra->topextra->fright = extra->topextra->fbottom = 0; } #endif // declare the widget's object name as window role qt_fbdpy->addProperty(id,QT_QWS_PROPERTY_WINDOWNAME); qt_fbdpy->setProperty(id,QT_QWS_PROPERTY_WINDOWNAME,0,name()); // If we are session managed, inform the window manager about it if ( extra && !extra->mask.isNull() ) { req_region = extra->mask; req_region.translate(crect.x(),crect.y()); req_region &= crect; //??? this is optional } else { req_region = crect; } req_region = qt_screen->mapToDevice( req_region, QSize(qt_screen->width(), qt_screen->height()) ); } else { if ( extra && extra->topextra ) { // already allocated due to reparent? extra->topextra->fleft = 0; extra->topextra->ftop = 0; extra->topextra->fright = 0; extra->topextra->fbottom = 0; } //updateRequestedRegion( mapToGlobal(QPoint(0,0)) ); } }
void QWidget::setWindowState(uint newstate) { in_show_maximized = 1; bool resized = testWFlags( WState_Resized ); uint oldstate = effectiveState(widget_state); widget_state &= ~(WState_Minimized | WState_Maximized | WState_FullScreen); if (newstate & WindowMinimized) widget_state |= WState_Minimized; if (newstate & WindowMaximized) widget_state |= WState_Maximized; if (newstate & WindowFullScreen) widget_state |= WState_FullScreen; uint state = effectiveState(widget_state); bool needShow = FALSE; if (isTopLevel() && state != oldstate) { createTLExtra(); if ( oldstate == 0 ) { //normal topData()->normalGeometry = geometry(); } else if ( oldstate == WState_FullScreen ) { reparent( 0, topData()->savedFlags, QPoint(0,0) ); needShow = isVisible(); } else if ( oldstate == WState_Minimized ) { needShow = TRUE; } if ( state == WState_Minimized ) { //### not ideal... hide(); needShow = FALSE; } else if ( state == WState_FullScreen ) { needShow = needShow || isVisible(); topData()->savedFlags = getWFlags(); reparent( 0, WType_TopLevel | WStyle_Customize | WStyle_NoBorder | // preserve some widget flags (getWFlags() & 0xffff0000), QPoint( 0, 0)); const QRect screen = qApp->desktop()->screenGeometry( qApp->desktop()->screenNumber( this ) ); move( screen.topLeft() ); resize( screen.size() ); if ( !resized ) clearWState( WState_Resized ); raise(); } else if ( state == WState_Maximized ) { #ifndef QT_NO_QWS_MANAGER if ( extra && extra->topextra && extra->topextra->qwsManager ) extra->topextra->qwsManager->maximize(); else #endif setGeometry( qt_maxWindowRect ); if ( !resized ) clearWState( WState_Resized ); } else { //normal QRect r = topData()->normalGeometry; if ( r.width() >= 0 ) { topData()->normalGeometry = QRect(0,0,-1,-1); setGeometry( r ); } } } in_show_maximized = 0; if (needShow) show(); if (newstate & WindowActive) setActiveWindow(); QEvent e(QEvent::WindowStateChange); QApplication::sendEvent(this, &e); }
void QWidget::internalSetGeometry( int x, int y, int w, int h, bool isMove ) { if ( extra ) { // any size restrictions? w = QMIN(w,extra->maxw); h = QMIN(h,extra->maxh); w = QMAX(w,extra->minw); h = QMAX(h,extra->minh); } if ( w < 1 ) // invalid size w = 1; if ( h < 1 ) h = 1; QPoint oldp = geometry().topLeft(); QSize olds = size(); QRect r( x, y, w, h ); bool isResize = olds != r.size(); // We only care about stuff that changes the geometry, or may // cause the window manager to change its state if ( r.size() == olds && oldp == r.topLeft() ) return; QRegion oldAlloc; if ( !isTopLevel() && isMove && ( w==olds.width() && h==olds.height() ) ) { oldAlloc = allocatedRegion(); } if (!in_show_maximized) { clearWState(WState_Maximized); clearWState(WState_FullScreen); if (isTopLevel()) topData()->normalGeometry = QRect(0, 0, -1, -1); } QPoint oldPos = pos(); crect = r; if ( testWFlags(WType_Desktop) ) return; if ( isTopLevel() ) { //### ConfigPending not implemented, do we need it? //setWState( WState_ConfigPending ); if ( isMove && ( w==olds.width() && h==olds.height() ) ) { // just need to translate current region QSize s( qt_screen->width(), qt_screen->height() ); QPoint td1 = qt_screen->mapToDevice( QPoint(0,0), s ); QPoint td2 = qt_screen->mapToDevice( QPoint(x - oldp.x(),y - oldp.y()), s ); QPoint dd = QPoint( td2.x()-td1.x(), td2.y()-td1.y() ); req_region.translate( dd.x(), dd.y() ); } else { if ( extra && !extra->mask.isNull() ) { req_region = extra->mask; req_region.translate(crect.x(),crect.y()); req_region &= crect; //??? this is optional } else { req_region = crect; } req_region = qt_screen->mapToDevice( req_region, QSize(qt_screen->width(), qt_screen->height()) ); } if ( isVisible() ) { if ( isMove && !isResize && alloc_region_index >= 0 ) { qwsDisplay()->moveRegion(winId(), x - oldp.x(), y - oldp.y()); setChildrenAllocatedDirty(); } else { QRegion rgn( req_region ); #ifndef QT_NO_QWS_MANAGER if ( extra && extra->topextra && extra->topextra->qwsManager ) { QRegion wmr = extra->topextra->qwsManager->region(); wmr = qt_screen->mapToDevice( wmr, QSize(qt_screen->width(), qt_screen->height()) ); rgn += wmr; } #endif qwsDisplay()->requestRegion(winId(), rgn); if ( extra && extra->topextra ) { QRect br( rgn.boundingRect() ); br = qt_screen->mapFromDevice( br, QSize(qt_screen->deviceWidth(), qt_screen->deviceHeight()) ); extra->topextra->fleft = crect.x()-br.x(); extra->topextra->ftop = crect.y()-br.y(); extra->topextra->fright = br.right()-crect.right(); extra->topextra->fbottom = br.bottom()-crect.bottom(); } } } } if ( isVisible() ) { isSettingGeometry = TRUE; if ( isMove ) { QMoveEvent e( pos(), oldPos ); QApplication::sendEvent( this, &e ); #ifndef QT_NO_QWS_MANAGER if (extra && extra->topextra && extra->topextra->qwsManager) QApplication::sendEvent( extra->topextra->qwsManager, &e ); #endif } if ( isResize ) { QResizeEvent e( r.size(), olds ); QApplication::sendEvent( this, &e ); #ifndef QT_NO_QWS_MANAGER if (extra && extra->topextra && extra->topextra->qwsManager) { QResizeEvent e( r.size(), olds ); QApplication::sendEvent(topData()->qwsManager, &e); } #endif /* if ( !testWFlags( WStaticContents ) ) { QApplication::postEvent(this,new QPaintEvent(clipRegion(), !testWFlags(WResizeNoErase) ) ); } */ } updateRequestedRegion( mapToGlobal(QPoint(0,0)) ); QWidget *p = parentWidget(); if ( !isTopLevel() || isResize ) { if ( p && !isTopLevel() ) { p->paintable_region_dirty = TRUE; QRegion oldr( QRect(oldp, olds) ); dirtyChildren.translate( x, y ); if ( p->isSettingGeometry ) { if ( oldp != r.topLeft() ) { QRegion upd( (QRegion(r) | oldr) & p->rect() ); dirtyChildren |= upd; } else { dirtyChildren |= QRegion(r) - oldr; QApplication::postEvent( this, new QPaintEvent(rect(), !testWFlags(QWidget::WResizeNoErase)) ); } p->dirtyChildren |= dirtyChildren; } else { QRegion upd( (QRegion(r) | oldr) & p->rect() ); dirtyChildren |= upd; QRegion paintRegion = dirtyChildren; #define FAST_WIDGET_MOVE #ifdef FAST_WIDGET_MOVE if ( isMove && ( w==olds.width() && h==olds.height() ) ) { QSize s( qt_screen->width(), qt_screen->height() ); QPoint td1 = qt_screen->mapToDevice( QPoint(0,0), s ); QPoint td2 = qt_screen->mapToDevice( QPoint(x - oldp.x(),y - oldp.y()), s ); QPoint dd = QPoint( td2.x()-td1.x(), td2.y()-td1.y() ); oldAlloc.translate( dd.x(), dd.y() ); QRegion alloc( allocatedRegion() ); QRegion scrollRegion( alloc & oldAlloc ); if ( !scrollRegion.isEmpty() ) { QGfx * gfx = p->graphicsContext(FALSE); gfx->setClipDeviceRegion( scrollRegion ); gfx->scroll(x,y,w,h,oldp.x(),oldp.y()); delete gfx; QSize ds( qt_screen->deviceWidth(), qt_screen->deviceHeight() ); scrollRegion = qt_screen->mapFromDevice( scrollRegion, ds ); QPoint gp = p->mapToGlobal( QPoint(0,0) ); scrollRegion.translate( -gp.x(), -gp.y() ); paintRegion -= scrollRegion; } } #endif if ( !oldr.isEmpty() ) QApplication::postEvent( p, new QPaintEvent(oldr, TRUE) ); p->setChildrenAllocatedDirty( dirtyChildren, this ); qwsUpdateActivePainters(); paint_children( p, paintRegion, isResize ); } p->overlapping_children = -1; } else { if ( oldp != r.topLeft() ) { qwsUpdateActivePainters(); paint_heirarchy( this, TRUE ); } else { setChildrenAllocatedDirty( dirtyChildren ); qwsUpdateActivePainters(); QApplication::postEvent( this, new QPaintEvent(rect(), !testWFlags(QWidget::WResizeNoErase)) ); paint_children( this, dirtyChildren, TRUE ); } } } else { qwsUpdateActivePainters(); } #ifndef QT_NO_QWS_MANAGER if (isResize && extra && extra->topextra && extra->topextra->qwsManager) { QApplication::postEvent(topData()->qwsManager, new QPaintEvent( clipRegion(), TRUE ) ); } #endif isSettingGeometry = FALSE; dirtyChildren = QRegion(); } else { if ( isMove ) QApplication::postEvent( this, new QMoveEvent( pos(), oldPos ) ); if ( isResize ) QApplication::postEvent( this, new QResizeEvent(crect.size(), olds) ); } }
void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool /*destroyOldWindow*/) { Q_Q(QWidget); Qt::WindowType type = q->windowType(); // Make sure the WindowTitleHint is on if any of the title bar hints are set // Note: This might be moved to cross-platform QWidgetPrivate::adjustFlags() if ( !(data.window_flags & Qt::CustomizeWindowHint) && ( (data.window_flags & Qt::WindowSystemMenuHint) || (data.window_flags & Qt::WindowContextHelpButtonHint) || (data.window_flags & Qt::WindowMinimizeButtonHint) || (data.window_flags & Qt::WindowMaximizeButtonHint) || (data.window_flags & Qt::WindowCloseButtonHint) ) ) { data.window_flags |= Qt::WindowTitleHint; } // Decoration plugins on QWS don't support switching on the close button on its own if (data.window_flags & Qt::WindowCloseButtonHint) data.window_flags |= Qt::WindowSystemMenuHint; Qt::WindowFlags flags = data.window_flags; data.alloc_region_index = -1; // we don't have a "Drawer" window type if (type == Qt::Drawer) { type = Qt::Widget; flags &= ~Qt::WindowType_Mask; } bool topLevel = (flags & Qt::Window); bool popup = (type == Qt::Popup); bool dialog = (type == Qt::Dialog || type == Qt::Sheet || (flags & Qt::MSWindowsFixedSizeDialogHint)); bool desktop = (type == Qt::Desktop); bool tool = (type == Qt::Tool || type == Qt::SplashScreen || type == Qt::ToolTip); #ifndef QT_NO_WARNING_OUTPUT static bool toolWarningShown = false; if (!toolWarningShown && type == Qt::Tool && !(flags & Qt::FramelessWindowHint)) { qWarning("Qt for Embedded Linux " QT_VERSION_STR " does not support tool windows with frames.\n" "This behavior will change in a later release. To ensure compatibility with\n" "future versions, use (Qt::Tool | Qt::FramelessWindowHint)."); toolWarningShown = true; } #endif WId id; QWSDisplay* dpy = QWidget::qwsDisplay(); if (!window) // always initialize initializeWindow = true; // use the size of the primary screen to determine the default window size QList<QScreen *> screens = qt_screen->subScreens(); if (screens.isEmpty()) screens.append(qt_screen); int sw = screens[0]->width(); int sh = screens[0]->height(); if (desktop) { // desktop widget dialog = popup = false; // force these flags off data.crect.setRect(0, 0, sw, sh); } else if (topLevel && !q->testAttribute(Qt::WA_Resized)) { int width = sw / 2; int height = 4 * sh / 10; if (extra) { width = qMax(qMin(width, extra->maxw), extra->minw); height = qMax(qMin(height, extra->maxh), extra->minh); } data.crect.setSize(QSize(width, height)); } if (window) { // override the old window id = window; setWinId(window); } else if (desktop) { // desktop widget id = (WId)-2; // id = root window #if 0 QWidget *otherDesktop = q->find(id); // is there another desktop? if (otherDesktop && otherDesktop->testWFlags(Qt::WPaintDesktop)) { otherDesktop->d_func()->setWinId(0); // remove id from widget mapper setWinId(id); // make sure otherDesktop is otherDesktop->d_func()->setWinId(id); // found first } else #endif { setWinId(id); } } else { id = topLevel ? dpy->takeId() : takeLocalId(); setWinId(id); // set widget id/handle + hd } bool hasFrame = true; if (topLevel) { if (desktop || popup || tool || q->testAttribute(Qt::WA_DontShowOnScreen)) hasFrame = false; else hasFrame = !(flags & Qt::FramelessWindowHint); } if (desktop) { q->setAttribute(Qt::WA_WState_Visible); } else if (topLevel) { // set X cursor //QCursor *oc = QApplication::overrideCursor(); if (initializeWindow) { //XXX XDefineCursor(dpy, winid, oc ? oc->handle() : cursor().handle()); } QWidget::qwsDisplay()->nameRegion(q->internalWinId(), q->objectName(), q->windowTitle()); } if (topLevel) { createTLExtra(); QTLWExtra *topextra = extra->topextra; #ifndef QT_NO_QWS_MANAGER if (hasFrame) { // get size of wm decoration and make the old crect the new frect QRect cr = data.crect; QRegion r = QApplication::qwsDecoration().region(q, cr) | cr; QRect br(r.boundingRect()); topextra->frameStrut.setCoords(cr.x() - br.x(), cr.y() - br.y(), br.right() - cr.right(), br.bottom() - cr.bottom()); if (!q->testAttribute(Qt::WA_Moved) || topextra->posFromMove) data.crect.translate(topextra->frameStrut.left(), topextra->frameStrut.top()); if (!topData()->qwsManager) { topData()->qwsManager = new QWSManager(q); if((q->data->window_state & ~Qt::WindowActive) == Qt::WindowMaximized) topData()->qwsManager->maximize(); } } else if (topData()->qwsManager) { delete topData()->qwsManager; topData()->qwsManager = 0; data.crect.translate(-topextra->frameStrut.left(), -topextra->frameStrut.top()); topextra->frameStrut.setCoords(0, 0, 0, 0); } #endif if (!topextra->caption.isEmpty()) setWindowTitle_helper(topextra->caption); //XXX If we are session managed, inform the window manager about it } else { if (extra && extra->topextra) { // already allocated due to reparent? extra->topextra->frameStrut.setCoords(0, 0, 0, 0); } //updateRequestedRegion(mapToGlobal(QPoint(0,0))); } }
DockWnd::DockWnd(QWidget *main) : QWidget(NULL) { #ifndef WIN32 wharfIcon = NULL; #endif connect(this, SIGNAL(toggleWin()), main, SLOT(toggleShow())); connect(this, SIGNAL(showPopup(QPoint)), main, SLOT(showPopup(QPoint))); connect(pClient, SIGNAL(event(ICQEvent*)), this, SLOT(processEvent(ICQEvent*))); connect(pClient, SIGNAL(messageRead(ICQMessage*)), this, SLOT(messageRead(ICQMessage*))); connect(pClient, SIGNAL(messageReceived(ICQMessage*)), this, SLOT(messageReceived(ICQMessage*))); connect(pMain, SIGNAL(iconChanged()), this, SLOT(reset())); m_state = 0; showIcon = State; QTimer *t = new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(timer())); t->start(800); bool bWMDock = false; #ifndef WIN32 Atom r_type; int r_format; unsigned long count, bytes_remain; unsigned char *prop = NULL, *prop2 = NULL; Atom _XA_WIN_SUPPORTING_WM_CHECK = XInternAtom(qt_xdisplay(), XA_WIN_SUPPORTING_WM_CHECK, False); int p = XGetWindowProperty(qt_xdisplay(), qt_xrootwin(), _XA_WIN_SUPPORTING_WM_CHECK, 0, 1, False, XA_CARDINAL, &r_type, &r_format, &count, &bytes_remain, &prop); if (p == Success && prop && r_type == XA_CARDINAL && r_format == 32 && count == 1) { Window n = *(long *) prop; p = XGetWindowProperty(qt_xdisplay(), n, _XA_WIN_SUPPORTING_WM_CHECK, 0, 1, False, XA_CARDINAL, &r_type, &r_format, &count, &bytes_remain, &prop2); if (p == Success && prop2 && r_type == XA_CARDINAL && r_format == 32 && count == 1) bWMDock = true; } if (prop) XFree(prop); if (prop2) XFree(prop2); #endif #ifdef USE_KDE log(L_DEBUG, "WM props? %u", bWMDock); if (!bWMDock) KWin::setSystemTrayWindowFor( winId(), main->topLevelWidget()->winId()); #endif needToggle = false; #ifdef WIN32 QWidget::hide(); QWidget::setIcon(Pict(pClient->getStatusIcon())); gDock = this; oldDockProc = (WNDPROC)SetWindowLongW(winId(), GWL_WNDPROC, (LONG)DockWindowProc); if (oldDockProc == 0) oldDockProc = (WNDPROC)SetWindowLongA(winId(), GWL_WNDPROC, (LONG)DockWindowProc); NOTIFYICONDATAA notifyIconData; notifyIconData.cbSize = sizeof(notifyIconData); notifyIconData.hIcon = topData()->winIcon; notifyIconData.hWnd = winId(); notifyIconData.szTip[0] = 0; notifyIconData.uCallbackMessage = WM_DOCK; notifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; notifyIconData.uID = 0; Shell_NotifyIconA(NIM_ADD, ¬ifyIconData); #else if (!bWMDock){ setBackgroundMode(X11ParentRelative); setIcon(Pict(pClient->getStatusIcon())); #ifdef USE_KDE show(); #else hide(); #endif }else{ wharfIcon = new WharfIcon(this); Display *dsp = x11Display(); WId win = winId(); XWMHints *hints; XClassHint classhint; classhint.res_name = (char*)"sim"; classhint.res_class = (char*)"sim"; XSetClassHint(dsp, win, &classhint); hints = XGetWMHints(dsp, win); hints->initial_state = WithdrawnState; hints->icon_x = 0; hints->icon_y = 0; hints->icon_window = wharfIcon->winId(); hints->window_group = win; hints->flags = WindowGroupHint | IconWindowHint | IconPositionHint | StateHint; XSetWMHints(dsp, win, hints); XFree( hints ); XSetCommand(dsp, winId(), _argv, _argc); resize(64, 64); show(); } #endif loadUnread(); reset(); }