void QWidget::setMicroFocusHint(int x, int y, int width, int height, bool text, QFont *) { if (QRect(x, y, width, height) != microFocusHint()) { d->createExtra(); d->extra->micro_focus_hint.setRect(x, y, width, height); } #ifndef QT_NO_QWS_INPUTMETHODS if (text) { QWidget *tlw = window(); int winid = tlw->internalWinId(); QPoint p(x, y + height); QPoint gp = mapToGlobal(p); QRect r = QRect(mapToGlobal(QPoint(0,0)), size()); r.setBottom(tlw->geometry().bottom()); //qDebug("QWidget::setMicroFocusHint %d %d %d %d", r.x(), // r.y(), r.width(), r.height()); QInputContext::setMicroFocusWidget(this); qwsDisplay()->setIMInfo(winid, gp.x(), gp.y(), r); //send font info, ###if necessary qwsDisplay()->setInputFont(winid, font()); } #endif }
void QWidget::activateWindow() { QWidget *tlw = window(); if (tlw->isVisible()) { Q_ASSERT(tlw->testAttribute(Qt::WA_WState_Created)); qwsDisplay()->requestFocus(tlw->internalWinId(), true); } }
void QWSInputContext::setFocusWidget( QWidget *w ) { QWidget *oldFocus = focusWidget(); if (oldFocus == w) return; if (w) { QWSInputContext::updateImeStatus(w, true); } else { if (oldFocus) QWSInputContext::updateImeStatus(oldFocus, false); } if (oldFocus) { QWidget *tlw = oldFocus->window(); int winid = tlw->internalWinId(); int widgetid = oldFocus->internalWinId(); QPaintDevice::qwsDisplay()->sendIMUpdate(QWSInputMethod::FocusOut, winid, widgetid); } QInputContext::setFocusWidget(w); if (!w) return; QWidget *tlw = w->window(); int winid = tlw->winId(); int widgetid = w->winId(); QPaintDevice::qwsDisplay()->sendIMUpdate(QWSInputMethod::FocusIn, winid, widgetid); //setfocus ??? update(); }
void qt_qpa_set_cursor(QWidget *w, bool force) { if (!w->testAttribute(Qt::WA_WState_Created)) return; static QPointer<QWidget> lastUnderMouse = 0; if (force) { lastUnderMouse = w; } else if (lastUnderMouse) { const WId lastWinId = lastUnderMouse->effectiveWinId(); const WId winId = w->effectiveWinId(); if (lastWinId && lastWinId == winId) w = lastUnderMouse; } else if (!w->internalWinId()) { return; // The mouse is not under this widget, and it's not native, so don't change it. } while (!w->internalWinId() && w->parentWidget() && !w->isWindow() && !w->testAttribute(Qt::WA_SetCursor)) w = w->parentWidget(); QWidget *nativeParent = w; if (!w->internalWinId()) nativeParent = w->nativeParentWidget(); if (!nativeParent || !nativeParent->internalWinId()) return; if (w->isWindow() || w->testAttribute(Qt::WA_SetCursor)) { if (w->isEnabled()) applyCursor(nativeParent, w->cursor()); else // Enforce the windows behavior of clearing the cursor on // disabled widgets. unsetCursor(nativeParent); } else { unsetCursor(nativeParent); } }
QVariant QX11Data::motifdndObtainData(const char *mimeType) { QByteArray result; if (Dnd_selection == 0 || !dropWidget) return result; // try to convert the selection to the requested property // qDebug("trying to convert to '%s'", mimeType); int n=0; QByteArray f; do { f = motifdndFormat(n); if (f.isEmpty()) return result; n++; } while(qstricmp(mimeType, f.data())); Atom conversion_type = XNone; if (f == "text/plain;charset=ISO-8859-1") { conversion_type = XA_STRING; } else if (f == "text/plain;charset=UTF-8") { conversion_type = ATOM(UTF8_STRING); } else if (f == (QByteArray("text/plain;charset=") + QTextCodec::codecForLocale()->name())) { conversion_type = ATOM(COMPOUND_TEXT); } else if (f == "text/plain") { conversion_type = ATOM(TEXT); } else if (f.startsWith("x-motif-dnd/")) { // strip off the "x-motif-dnd/" prefix conversion_type = X11->xdndStringToAtom(f.remove(0, 12)); } if (XGetSelectionOwner(X11->display, Dnd_selection) == XNone) { return result; // should never happen? } QWidget* tw = dropWidget; if ((dropWidget->windowType() == Qt::Desktop)) { tw = new QWidget; } // convert selection to the appropriate type XConvertSelection (X11->display, Dnd_selection, conversion_type, Dnd_selection, tw->internalWinId(), Dnd_selection_time); XFlush(X11->display); XEvent xevent; bool got=X11->clipboardWaitForEvent(tw->internalWinId(), SelectionNotify, &xevent, 5000); if (got) { Atom type; if (X11->clipboardReadProperty(tw->internalWinId(), Dnd_selection, true, &result, 0, &type, 0)) { } } // we have to convert selection in order to indicate success to the initiator XConvertSelection (X11->display, Dnd_selection, ATOM(XmTRANSFER_SUCCESS), Dnd_selection, tw->internalWinId(), Dnd_selection_time); // wait again for SelectionNotify event X11->clipboardWaitForEvent(tw->internalWinId(), SelectionNotify, &xevent, 5000); if ((dropWidget->windowType() == Qt::Desktop)) { delete tw; } return result; }
void QAccessible::updateAccessibility(QObject *o, int who, Event reason) { Q_ASSERT(o); if (updateHandler) { updateHandler(o, who, reason); return; } QString soundName; switch (reason) { case PopupMenuStart: soundName = QLatin1String("MenuPopup"); break; case MenuCommand: soundName = QLatin1String("MenuCommand"); break; case Alert: { #ifndef QT_NO_MESSAGEBOX QMessageBox *mb = qobject_cast<QMessageBox*>(o); if (mb) { switch (mb->icon()) { case QMessageBox::Warning: soundName = QLatin1String("SystemExclamation"); break; case QMessageBox::Critical: soundName = QLatin1String("SystemHand"); break; case QMessageBox::Information: soundName = QLatin1String("SystemAsterisk"); break; default: break; } } else #endif // QT_NO_MESSAGEBOX { soundName = QLatin1String("SystemAsterisk"); } } break; default: break; } if (soundName.size()) { #ifndef QT_NO_SETTINGS QSettings settings(QLatin1String("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\.Default\\") + soundName, QSettings::NativeFormat); QString file = settings.value(QLatin1String(".Current/.")).toString(); #else QString file; #endif if (!file.isEmpty()) { PlaySound(reinterpret_cast<const wchar_t *>(soundName.utf16()), 0, SND_ALIAS | SND_ASYNC | SND_NODEFAULT | SND_NOWAIT); } } if (!isActive()) return; typedef void (WINAPI *PtrNotifyWinEvent)(DWORD, HWND, LONG, LONG); #if defined(Q_WS_WINCE) // ### TODO: check for NotifyWinEvent in CE 6.0 // There is no user32.lib nor NotifyWinEvent for CE return; #else static PtrNotifyWinEvent ptrNotifyWinEvent = 0; static bool resolvedNWE = false; if (!resolvedNWE) { ptrNotifyWinEvent = (PtrNotifyWinEvent)QSystemLibrary::resolve(QLatin1String("user32"), "NotifyWinEvent"); resolvedNWE = true; } if (!ptrNotifyWinEvent) return; // An event has to be associated with a window, // so find the first parent that is a widget. QWidget *w = 0; QObject *p = o; do { if (p->isWidgetType()) { w = static_cast<QWidget*>(p); if (w->internalWinId()) break; } if (QGraphicsObject *gfxObj = qobject_cast<QGraphicsObject*>(p)) { QGraphicsItem *parentItem = gfxObj->parentItem(); if (parentItem) { p = parentItem->toGraphicsObject(); } else { QGraphicsView *view = 0; if (QGraphicsScene *scene = gfxObj->scene()) { QWidget *fw = QApplication::focusWidget(); const QList<QGraphicsView*> views = scene->views(); for (int i = 0 ; i < views.count() && view != fw; ++i) { view = views.at(i); } } p = view; } } else { p = p->parent(); } } while (p); //qDebug() << "updateAccessibility(), hwnd:" << w << ", object:" << o << "," << eventString(reason); if (!w) { if (reason != QAccessible::ContextHelpStart && reason != QAccessible::ContextHelpEnd) w = QApplication::focusWidget(); if (!w) { w = QApplication::activeWindow(); if (!w) return; // ### Fixme // if (!w) { // w = qApp->mainWidget(); // if (!w) // return; // } } } WId wid = w->internalWinId(); if (reason != MenuCommand) { // MenuCommand is faked if (w != o) { // See comment "SENDING EVENTS TO OBJECTS WITH NO WINDOW HANDLE" if (reason != QAccessible::ObjectDestroyed) { /* In some rare occasions, the server (Qt) might get a ::get_accChild call with a childId that references an entry in the cache where there was a dangling QObject-pointer. Previously we crashed on this. There is no point in actually notifying the AT client that the object got destroyed, because the AT client won't query for get_accChild if the event is ObjectDestroyed anyway, and we have no other way of mapping the eventId argument to the actual child/descendant object. (Firefox seems to simply completely ignore EVENT_OBJECT_DESTROY). We therefore guard each QObject in the cache with a QPointer, and only notify the AT client if the type is not ObjectDestroyed. */ eventNum %= 50; //[0..49] int eventId = - eventNum - 1; qAccessibleRecentSentEvents()->insert(eventId, qMakePair(QPointer<QObject>(o), who)); ptrNotifyWinEvent(reason, wid, OBJID_CLIENT, eventId ); ++eventNum; } } else { ptrNotifyWinEvent(reason, wid, OBJID_CLIENT, who); } } #endif // Q_WS_WINCE }