LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

Надо будет глянуть, как она реализована в зависимости от платформы. Вполне возможно, что уже никак вообще не реализована.

Нет, реализована вроде. В root/src/plugins/platforms/xcb/qxcbwindow.cpp:

void QXcbWindow::setAlertState(bool enabled)
{
    if (m_alertState == enabled)
        return;

    m_alertState = enabled;

    changeNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
}

void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
{
    xcb_client_message_event_t event;

    event.response_type = XCB_CLIENT_MESSAGE;
    event.format = 32;
    event.sequence = 0;
    event.window = m_window;
    event.type = atom(QXcbAtom::_NET_WM_STATE);
    event.data.data32[0] = set ? 1 : 0;
    event.data.data32[1] = one;
    event.data.data32[2] = two;
    event.data.data32[3] = 0;
    event.data.data32[4] = 0;

    xcb_send_event(xcb_connection(), 0, xcbScreen()->root(),
                   XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
                   (const char *)&event);
}

Твой оконный менеджер должне поддерживать NetWM (он же EWMH), чтобы это сработало. Причем поддерживать _NET_WM_STATE_DEMANDS_ATTENTION. Какой у тебя оконный менеджер? И проверь еще случай, когда окно не имеет фокуса, но находится на рабочем столе, а не свернуто, а то, судя по описанию, в Qt как-то странно обрабатывают это все. Получается, что если окно в hide, то оно не будет мигать. Это меня смущает. Так сделано на уровне Qt, а не на уровне иксов.

Исправление Zubok, :

Надо будет глянуть, как она реализована в зависимости от платформы. Вполне возможно, что уже никак вообще не реализована.

Нет, реализована вроде. В root/src/plugins/platforms/xcb/qxcbwindow.cpp:

void QXcbWindow::setAlertState(bool enabled)
{
    if (m_alertState == enabled)
        return;

    m_alertState = enabled;

    changeNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
}

void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
{
    xcb_client_message_event_t event;

    event.response_type = XCB_CLIENT_MESSAGE;
    event.format = 32;
    event.sequence = 0;
    event.window = m_window;
    event.type = atom(QXcbAtom::_NET_WM_STATE);
    event.data.data32[0] = set ? 1 : 0;
    event.data.data32[1] = one;
    event.data.data32[2] = two;
    event.data.data32[3] = 0;
    event.data.data32[4] = 0;

    xcb_send_event(xcb_connection(), 0, xcbScreen()->root(),
                   XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
                   (const char *)&event);
}

Твой оконный менеджер должне поддерживать NetWM (он же EWMH), чтобы это сработало. Причем поддерживать _NET_WM_STATE_DEMANDS_ATTENTION. Какой у тебя оконный менеджер? И проверь еще случай, когда окно не имеет фокуса, но находится на рабочем столе, а не свернуто.

Исходная версия Zubok, :

Надо будет глянуть, как она реализована в зависимости от платформы. Вполне возможно, что уже никак вообще не реализована.

Нет, реализована вроде. В root/src/plugins/platforms/xcb/qxcbwindow.cpp:

void QXcbWindow::setAlertState(bool enabled)
{
    if (m_alertState == enabled)
        return;

    m_alertState = enabled;

    changeNetWmState(enabled, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
}

void QXcbWindow::changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two)
{
    xcb_client_message_event_t event;

    event.response_type = XCB_CLIENT_MESSAGE;
    event.format = 32;
    event.sequence = 0;
    event.window = m_window;
    event.type = atom(QXcbAtom::_NET_WM_STATE);
    event.data.data32[0] = set ? 1 : 0;
    event.data.data32[1] = one;
    event.data.data32[2] = two;
    event.data.data32[3] = 0;
    event.data.data32[4] = 0;

    xcb_send_event(xcb_connection(), 0, xcbScreen()->root(),
                   XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
                   (const char *)&event);
}

Твой оконный менеджер должне поддерживать NetWM (он же EWMH), чтобы это сработало. Причем поддерживать _NET_WM_STATE_DEMANDS_ATTENTION. Какой у тебя оконный менеджер?