Merge branch 'Plasma/5.12'

This commit is contained in:
Martin Flöser 2018-02-05 21:22:05 +01:00
commit 477d79b16a
5 changed files with 71 additions and 13 deletions

View file

@ -32,6 +32,7 @@ Name[hu]=Csúsztatott váltás
Name[ia]=Glissa
Name[is]=Renna til
Name[it]=Scivola
Name[ja]=
Name[kk]=Сырғанату
Name[km]=
Name[kn]=

View file

@ -56,12 +56,38 @@ WindowSelector::~WindowSelector()
void WindowSelector::start(std::function<void(KWin::Toplevel*)> callback, const QByteArray &cursorName)
{
xcb_cursor_t cursor = createCursor(cursorName);
if (m_active) {
callback(nullptr);
return;
}
m_active = activate(cursorName);
if (!m_active) {
callback(nullptr);
return;
}
m_callback = callback;
}
void WindowSelector::start(std::function<void (const QPoint &)> callback)
{
if (m_active) {
callback(QPoint(-1, -1));
return;
}
m_active = activate();
if (!m_active) {
callback(QPoint(-1, -1));
return;
}
m_pointSelectionFallback = callback;
}
bool WindowSelector::activate(const QByteArray &cursorName)
{
xcb_cursor_t cursor = createCursor(cursorName);
xcb_connection_t *c = connection();
ScopedCPointer<xcb_grab_pointer_reply_t> grabPointer(xcb_grab_pointer_reply(c, xcb_grab_pointer_unchecked(c, false, rootWindow(),
XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
@ -70,17 +96,15 @@ void WindowSelector::start(std::function<void(KWin::Toplevel*)> callback, const
XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE,
cursor, XCB_TIME_CURRENT_TIME), NULL));
if (grabPointer.isNull() || grabPointer->status != XCB_GRAB_STATUS_SUCCESS) {
callback(nullptr);
return;
return false;
}
m_active = grabXKeyboard();
if (!m_active) {
const bool grabbed = grabXKeyboard();
if (grabbed) {
grabXServer();
} else {
xcb_ungrab_pointer(connection(), XCB_TIME_CURRENT_TIME);
callback(nullptr);
return;
}
grabXServer();
m_callback = callback;
return grabbed;
}
xcb_cursor_t WindowSelector::createCursor(const QByteArray &cursorName)
@ -136,12 +160,16 @@ bool WindowSelector::event(xcb_generic_event_t *event)
void WindowSelector::handleButtonRelease(xcb_button_t button, xcb_window_t window)
{
if (button == XCB_BUTTON_INDEX_3) {
m_callback(nullptr);
cancelCallback();
release();
return;
}
if (button == XCB_BUTTON_INDEX_1 || button == XCB_BUTTON_INDEX_2) {
selectWindowId(window);
if (m_callback) {
selectWindowId(window);
} else if (m_pointSelectionFallback) {
m_pointSelectionFallback(Cursor::pos());
}
release();
return;
}
@ -173,11 +201,15 @@ void WindowSelector::handleKeyPress(xcb_keycode_t keycode, uint16_t state)
}
Cursor::setPos(Cursor::pos() + QPoint(mx, my));
if (returnPressed) {
selectWindowUnderPointer();
if (m_callback) {
selectWindowUnderPointer();
} else if (m_pointSelectionFallback) {
m_pointSelectionFallback(Cursor::pos());
}
}
if (returnPressed || escapePressed) {
if (escapePressed) {
m_callback(nullptr);
cancelCallback();
}
release();
}
@ -199,6 +231,7 @@ void WindowSelector::release()
ungrabXServer();
m_active = false;
m_callback = std::function<void(KWin::Toplevel*)>();
m_pointSelectionFallback = std::function<void(const QPoint&)>();
}
void WindowSelector::selectWindowId(xcb_window_t window_to_select)
@ -228,4 +261,13 @@ void WindowSelector::selectWindowId(xcb_window_t window_to_select)
}
}
void WindowSelector::cancelCallback()
{
if (m_callback) {
m_callback(nullptr);
} else if (m_pointSelectionFallback) {
m_pointSelectionFallback(QPoint(-1, -1));
}
}
} // namespace

View file

@ -29,6 +29,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <functional>
class QPoint;
namespace KWin
{
class Toplevel;
@ -41,6 +43,7 @@ public:
~WindowSelector();
void start(std::function<void(KWin::Toplevel*)> callback, const QByteArray &cursorName);
void start(std::function<void (const QPoint &)> callback);
bool isActive() const {
return m_active;
}
@ -55,8 +58,11 @@ private:
void handleKeyPress(xcb_keycode_t keycode, uint16_t state);
void handleButtonRelease(xcb_button_t button, xcb_window_t window);
void selectWindowId(xcb_window_t window_to_kill);
bool activate(const QByteArray &cursorName = QByteArray());
void cancelCallback();
bool m_active;
std::function<void(KWin::Toplevel*)> m_callback;
std::function<void(const QPoint &)> m_pointSelectionFallback;
};
} // namespace

View file

@ -318,6 +318,14 @@ void X11StandalonePlatform::startInteractiveWindowSelection(std::function<void(K
m_windowSelector->start(callback, cursorName);
}
void X11StandalonePlatform::startInteractivePositionSelection(std::function<void (const QPoint &)> callback)
{
if (m_windowSelector.isNull()) {
m_windowSelector.reset(new WindowSelector);
}
m_windowSelector->start(callback);
}
void X11StandalonePlatform::setupActionForGlobalAccel(QAction *action)
{
connect(action, &QAction::triggered, kwinApp(), [action] {

View file

@ -54,6 +54,7 @@ public:
bool openGLCompositingIsBroken() const override;
void createOpenGLSafePoint(OpenGLSafePoint safePoint) override;
void startInteractiveWindowSelection(std::function<void (KWin::Toplevel *)> callback, const QByteArray &cursorName = QByteArray()) override;
void startInteractivePositionSelection(std::function<void (const QPoint &)> callback) override;
PlatformCursorImage cursorImage() const override;