f31522130f
Build system (5 gaps hardened): - COOKBOOK_OFFLINE defaults to true (fork-mode) - normalize_patch handles diff -ruN format - New 'repo validate-patches' command (25/25 relibc patches) - 14 patched Qt/Wayland/display recipes added to protected list - relibc archive regenerated with current patch chain Boot fixes (fixable): - Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset) - D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped) - redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped) - daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch) - udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async) - relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs - greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait) - greeter-ui: built and linked (header guard unification, sem_compat stubs removed) - mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps - greeter config: removed stale keymapd dependency from display/greeter services - prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified Unfixable (diagnosed, upstream): - i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort - kded6/greeter-ui: page fault 0x8 — Qt library null deref - Thread panics fd != -1 — Rust std library on Redox - DHCP timeout / eth0 MAC — QEMU user-mode networking - hwrngd/thermald — no hardware RNG/thermal in VM - live preload allocation — BIOS memory fragmentation, continues on demand
250 lines
6.8 KiB
C++
250 lines
6.8 KiB
C++
// Copyright (C) 2017 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
// Qt-Security score:significant reason:default
|
|
|
|
#include "qquickmenubaritem_p.h"
|
|
#include "qquickmenubaritem_p_p.h"
|
|
#include "qquickmenubar_p.h"
|
|
#include "qquickmenu_p.h"
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
/*!
|
|
\qmltype MenuBarItem
|
|
\inherits AbstractButton
|
|
//! \nativetype QQuickMenuBarItem
|
|
\inqmlmodule QtQuick.Controls
|
|
\since 5.10
|
|
\ingroup qtquickcontrols-menus
|
|
\brief Presents a drop-down menu within a MenuBar.
|
|
|
|
MenuBarItem presents a Menu within a MenuBar. The respective drop-down menu
|
|
is shown when a MenuBarItem is \l triggered via keyboard, mouse, or touch.
|
|
|
|
\image qtquickcontrols-menubar.png
|
|
{Menu bar with File, Edit, and View menus}
|
|
|
|
MenuBarItem is used as a default \l {MenuBar::}{delegate} type for MenuBar.
|
|
Notice that it is not necessary to declare MenuBarItem instances by hand when
|
|
using MenuBar. It is sufficient to declare Menu instances as children of the
|
|
MenuBar and the respective items are created automatically.
|
|
|
|
\sa {Customizing MenuBar}, MenuBar, {Menu Controls}
|
|
*/
|
|
|
|
/*!
|
|
\qmlsignal void QtQuick.Controls::MenuBarItem::triggered()
|
|
|
|
This signal is emitted when the menu bar item is triggered by the user.
|
|
*/
|
|
|
|
void QQuickMenuBarItemPrivate::setMenuBar(QQuickMenuBar *newMenuBar)
|
|
{
|
|
Q_Q(QQuickMenuBarItem);
|
|
if (menuBar == newMenuBar)
|
|
return;
|
|
|
|
menuBar = newMenuBar;
|
|
emit q->menuBarChanged();
|
|
}
|
|
|
|
void QQuickMenuBarItemPrivate::accessiblePressAction()
|
|
{
|
|
// This is inspired by the code in keyReleaseEvent
|
|
|
|
Q_Q(QQuickMenuBarItem);
|
|
|
|
// We override these event functions so that we can emit triggered here.
|
|
// We can't just connect clicked to triggered, because that would cause mouse clicks
|
|
// to open the menu, when only presses should.
|
|
emit q->triggered();
|
|
}
|
|
|
|
bool QQuickMenuBarItemPrivate::handlePress(const QPointF &point, ulong timestamp)
|
|
{
|
|
Q_Q(QQuickMenuBarItem);
|
|
const bool handled = QQuickAbstractButtonPrivate::handlePress(point, timestamp);
|
|
if (!handled)
|
|
return false;
|
|
|
|
const bool wasTouchPress = touchId != -1;
|
|
if (!wasTouchPress) {
|
|
// Open the menu when it's a mouse press.
|
|
emit q->triggered();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool QQuickMenuBarItemPrivate::handleRelease(const QPointF &point, ulong timestamp)
|
|
{
|
|
Q_Q(QQuickMenuBarItem);
|
|
const bool wasTouchPress = touchId != -1;
|
|
const bool handled = QQuickAbstractButtonPrivate::handleRelease(point, timestamp);
|
|
if (!handled)
|
|
return false;
|
|
|
|
if (wasDoubleClick || !wasTouchPress) {
|
|
// Don't open the menu on mouse release, as it should be done on press.
|
|
return handled;
|
|
}
|
|
|
|
if (wasTouchPress) {
|
|
// Open the menu.
|
|
emit q->triggered();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
QPalette QQuickMenuBarItemPrivate::defaultPalette() const
|
|
{
|
|
return QQuickTheme::palette(QQuickTheme::MenuBar);
|
|
}
|
|
|
|
QQuickMenuBarItem::QQuickMenuBarItem(QQuickItem *parent)
|
|
: QQuickAbstractButton(*(new QQuickMenuBarItemPrivate), parent)
|
|
{
|
|
setFocusPolicy(Qt::NoFocus);
|
|
d_func()->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Fixed);
|
|
}
|
|
|
|
/*!
|
|
\qmlproperty Menu QtQuick.Controls::MenuBarItem::menuBar
|
|
\readonly
|
|
|
|
This property holds the menu bar that contains this item,
|
|
or \c null if the item is not in a menu bar.
|
|
*/
|
|
QQuickMenuBar *QQuickMenuBarItem::menuBar() const
|
|
{
|
|
Q_D(const QQuickMenuBarItem);
|
|
return d->menuBar;
|
|
}
|
|
|
|
/*!
|
|
\qmlproperty Menu QtQuick.Controls::MenuBarItem::menu
|
|
|
|
This property holds the menu that this item presents in a
|
|
menu bar, or \c null if this item does not have a menu.
|
|
*/
|
|
QQuickMenu *QQuickMenuBarItem::menu() const
|
|
{
|
|
Q_D(const QQuickMenuBarItem);
|
|
return d->menu;
|
|
}
|
|
|
|
void QQuickMenuBarItem::setMenu(QQuickMenu *menu)
|
|
{
|
|
Q_D(QQuickMenuBarItem);
|
|
if (d->menu == menu)
|
|
return;
|
|
|
|
if (d->menu)
|
|
disconnect(d->menu, &QQuickMenu::titleChanged, this, &QQuickAbstractButton::setText);
|
|
|
|
if (menu) {
|
|
setText(menu->title());
|
|
menu->setY(height());
|
|
menu->setParentItem(this);
|
|
menu->setClosePolicy(QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent);
|
|
connect(menu, &QQuickMenu::titleChanged, this, &QQuickAbstractButton::setText);
|
|
}
|
|
|
|
d->menu = menu;
|
|
emit menuChanged();
|
|
}
|
|
|
|
/*!
|
|
\qmlproperty bool QtQuick.Controls::MenuBarItem::highlighted
|
|
|
|
This property holds whether the menu bar item is highlighted by the user.
|
|
|
|
A menu bar item can be highlighted by mouse hover or keyboard navigation.
|
|
|
|
The default value is \c false.
|
|
*/
|
|
bool QQuickMenuBarItem::isHighlighted() const
|
|
{
|
|
Q_D(const QQuickMenuBarItem);
|
|
return d->highlighted;
|
|
}
|
|
|
|
void QQuickMenuBarItem::setHighlighted(bool highlighted)
|
|
{
|
|
Q_D(QQuickMenuBarItem);
|
|
if (highlighted == d->highlighted)
|
|
return;
|
|
|
|
d->highlighted = highlighted;
|
|
emit highlightedChanged();
|
|
}
|
|
|
|
bool QQuickMenuBarItem::event(QEvent *event)
|
|
{
|
|
#if QT_CONFIG(shortcut)
|
|
Q_D(QQuickMenuBarItem);
|
|
if (event->type() == QEvent::Shortcut) {
|
|
auto *shortcutEvent = static_cast<QShortcutEvent *>(event);
|
|
if (shortcutEvent->shortcutId() == d->shortcutId) {
|
|
d->trigger();
|
|
emit triggered();
|
|
return true;
|
|
}
|
|
}
|
|
#endif
|
|
return QQuickControl::event(event);
|
|
}
|
|
|
|
void QQuickMenuBarItem::keyPressEvent(QKeyEvent *event)
|
|
{
|
|
Q_D(QQuickMenuBarItem);
|
|
QQuickControl::keyPressEvent(event);
|
|
if (d->acceptKeyClick(static_cast<Qt::Key>(event->key()))) {
|
|
d->setPressPoint(d->centerPressPoint());
|
|
setPressed(true);
|
|
emit pressed();
|
|
event->accept();
|
|
}
|
|
}
|
|
|
|
void QQuickMenuBarItem::keyReleaseEvent(QKeyEvent *event)
|
|
{
|
|
Q_D(QQuickMenuBarItem);
|
|
QQuickControl::keyReleaseEvent(event);
|
|
if (d->pressed && d->acceptKeyClick(static_cast<Qt::Key>(event->key()))) {
|
|
setPressed(false);
|
|
emit released();
|
|
d->trigger();
|
|
// We override these event functions so that we can emit triggered here.
|
|
// We can't just connect clicked to triggered, because that would cause mouse clicks
|
|
// to open the menu, when only presses should.
|
|
emit triggered();
|
|
event->accept();
|
|
}
|
|
}
|
|
|
|
void QQuickMenuBarItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
|
|
{
|
|
Q_D(QQuickMenuBarItem);
|
|
QQuickAbstractButton::geometryChange(newGeometry, oldGeometry);
|
|
if (d->menu)
|
|
d->menu->setY(newGeometry.height());
|
|
}
|
|
|
|
QFont QQuickMenuBarItem::defaultFont() const
|
|
{
|
|
return QQuickTheme::font(QQuickTheme::MenuBar);
|
|
}
|
|
|
|
#if QT_CONFIG(accessibility)
|
|
QAccessible::Role QQuickMenuBarItem::accessibleRole() const
|
|
{
|
|
return QAccessible::MenuBar;
|
|
}
|
|
#endif
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
#include "moc_qquickmenubaritem_p.cpp"
|