为什么 xmodmap 在使用它来禁用按下的鼠标按钮时挂起?

问题描述 投票:0回答:0

上下文:

我试图让Qt在按下右键时单独接收鼠标左键事件,这似乎是不可能的,所以我尝试使用xmodmap禁用

鼠标右键
然后按下它并使用鼠标左键,这很有效。

我正在使用 Linux Fedora、X11 和 C++。

问题:

但是我需要禁用它之后我按下它而不是之前,但这会导致

xmodmap
挂起,直到我释放鼠标右键,然后发送按下它时发生的每个鼠标事件。

这是我用来禁用

鼠标右键
xmodmap命令:

xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\"

这是我在 Qt 中使用它的方式:

QProcess disable_right;

disable_right.start("/bin/sh", QStringList()<< "-c" <<"xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\" && xdotool click 1");
disable_right.waitForFinished();

这是使用安装在

eventFilter
上的
QWidget
完成的,这里是:

bool MouseEventEater::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() ==  QEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);

        //this will detect left button press while right button is pressed,
        //which will result mouseEvent->buttons() to be equal to 3. 
        if(mouseEvent->buttons() >= 3)
        {
            fprintf(stderr,"3 Buttons\n");

            QProcess disable_right;

            disable_right.start("/bin/sh", QStringList()<< "-c" <<"xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\"");
            //it will hang here until right mouse button is released
            disable_right.waitForFinished();

        }
    }
    else
    {
        if(event->type() ==  QEvent::MouseButtonRelease)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);

            if(mouseEvent->button() == Qt::LeftButton)
            {
                fprintf(stderr,"Left Button Released\n");
            }
            if(mouseEvent->button() == Qt::RightButton)
            {
                fprintf(stderr,"Right Button Released\n");
            }

        }
    }
    return QObject::eventFilter(obj, event);
}

这正是发生的事情:

  • 鼠标右键。

  • 然后我click鼠标左键。

  • 我显示“3个按钮”。

  • 即使我反复单击鼠标左键,只要我仍然按下鼠标右键,什么也不会发生。

  • 当我释放鼠标右键时,需要几秒钟然后我得到“释放鼠标左键”(以防我按下鼠标左键一次)和“释放鼠标右键”。

我认为我正在使用的命令在按下鼠标右键时不起作用,所以我在

xmodmap
命令之前使用以下命令以编程方式释放它(因为我需要物理按下它):

xdotool mouseup 3

我是这样用的:

QProcess disable_right;

disable_right.start("/bin/sh", QStringList()<< "-c" <<"xdotool mouseup 3 && xmodmap -e \"pointer = 1 2 0 4 5 0 0 0 0 0\" && xdotool click 1");
disable_right.waitForFinished();

但这没有效果。

我想了解为什么

xmodmap
不能禁用按下的鼠标按钮,以及如何解决这个问题。

感谢您的时间和精力!

qt mouseevent xdotool mousepress xmodmap
© www.soinside.com 2019 - 2023. All rights reserved.