Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
QtInputDelegate.java
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4package org.qtproject.qt.android;
5
6import android.app.Activity;
7import android.content.Context;
8import android.graphics.Rect;
9import android.os.Bundle;
10import android.os.Handler;
11import android.os.ResultReceiver;
12import android.text.method.MetaKeyKeyListener;
13import android.util.DisplayMetrics;
14import android.view.InputDevice;
15import android.view.KeyCharacterMap;
16import android.view.KeyEvent;
17import android.view.MotionEvent;
18import android.view.WindowManager;
19import android.view.inputmethod.InputMethodManager;
20
22
24class QtInputDelegate implements QtInputConnection.QtInputConnectionListener {
25
26 // keyboard methods
27 public static native void keyDown(int key, int unicode, int modifier, boolean autoRepeat);
28 public static native void keyUp(int key, int unicode, int modifier, boolean autoRepeat);
29 public static native void keyboardVisibilityChanged(boolean visibility);
30 public static native void keyboardGeometryChanged(int x, int y, int width, int height);
31 // keyboard methods
32
33 // dispatch events methods
34 public static native boolean dispatchGenericMotionEvent(MotionEvent event);
35 public static native boolean dispatchKeyEvent(KeyEvent event);
36 // dispatch events methods
37
38 // handle methods
39 public static native void handleLocationChanged(int id, int x, int y);
40 // handle methods
41
42 private QtEditText m_currentEditText = null;
43 private final InputMethodManager m_imm;
44
45 private boolean m_keyboardIsVisible = false;
46 private boolean m_isKeyboardHidingAnimationOngoing = false;
47 private long m_showHideTimeStamp = System.nanoTime();
48 private int m_portraitKeyboardHeight = 0;
49 private int m_landscapeKeyboardHeight = 0;
50 private int m_probeKeyboardHeightDelayMs = 50;
51 private CursorHandle m_cursorHandle;
52 private CursorHandle m_leftSelectionHandle;
53 private CursorHandle m_rightSelectionHandle;
54 private EditPopupMenu m_editPopupMenu;
55
56 private int m_softInputMode = 0;
57
58 // Values coming from QAndroidInputContext::CursorHandleShowMode
59 private static final int CursorHandleNotShown = 0;
60 private static final int CursorHandleShowNormal = 1;
61 private static final int CursorHandleShowSelection = 2;
62 private static final int CursorHandleShowEdit = 0x100;
63
64 // Handle IDs
65 public static final int IdCursorHandle = 1;
66 public static final int IdLeftHandle = 2;
67 public static final int IdRightHandle = 3;
68
69 private static Boolean m_tabletEventSupported = null;
70
71 private static int m_oldX, m_oldY;
72
73
74 private long m_metaState;
75 private int m_lastChar = 0;
76 private boolean m_backKeyPressedSent = false;
77
78 // Note: because of the circular call to updateFullScreen() from the delegate, we need
79 // a listener to be able to do that call from the delegate, because that's where that
80 // logic lives
84
85 private final KeyboardVisibilityListener m_keyboardVisibilityListener;
86
87 QtInputDelegate(Activity activity, KeyboardVisibilityListener listener)
88 {
89 this.m_keyboardVisibilityListener = listener;
90 m_imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
91 }
92
93 // QtInputConnectionListener methods
94 @Override
95 public void onSetClosing(boolean closing) {
96 if (!closing)
97 setKeyboardVisibility(true, System.nanoTime());
98 }
99
100 @Override
101 public void onHideKeyboardRunnableDone(boolean visibility, long hideTimeStamp) {
102 setKeyboardVisibility(visibility, hideTimeStamp);
103 }
104
105 @Override
106 public void onSendKeyEventDefaultCase() {
107 hideSoftwareKeyboard();
108 }
109 // QtInputConnectionListener methods
110
111 public boolean isKeyboardVisible()
112 {
113 return m_keyboardIsVisible;
114 }
115
116 // Is the keyboard fully visible i.e. visible and no ongoing animation
117 @UsedFromNativeCode
118 public boolean isSoftwareKeyboardVisible()
119 {
120 return isKeyboardVisible() && !m_isKeyboardHidingAnimationOngoing;
121 }
122
123 void setSoftInputMode(int inputMode)
124 {
125 m_softInputMode = inputMode;
126 }
127
128 QtEditText getCurrentQtEditText()
129 {
130 return m_currentEditText;
131 }
132
133 void setEditPopupMenu(EditPopupMenu editPopupMenu)
134 {
135 m_editPopupMenu = editPopupMenu;
136 }
137
138 private void keyboardVisibilityUpdated(boolean visibility)
139 {
140 m_isKeyboardHidingAnimationOngoing = false;
141 QtInputDelegate.keyboardVisibilityChanged(visibility);
142 }
143
144 public void setKeyboardVisibility(boolean visibility, long timeStamp)
145 {
146 if (m_showHideTimeStamp > timeStamp)
147 return;
148 m_showHideTimeStamp = timeStamp;
149
150 if (m_keyboardIsVisible == visibility)
151 return;
152 m_keyboardIsVisible = visibility;
153 keyboardVisibilityUpdated(m_keyboardIsVisible);
154
155 // Hiding the keyboard clears the immersive mode, so we need to set it again.
156 if (!visibility)
157 m_keyboardVisibilityListener.onKeyboardVisibilityChange();
158
159 }
160
161 @UsedFromNativeCode
162 public void resetSoftwareKeyboard()
163 {
164 if (m_imm == null || m_currentEditText == null)
165 return;
166 m_currentEditText.postDelayed(() -> {
167 m_imm.restartInput(m_currentEditText);
168 m_currentEditText.m_optionsChanged = false;
169 }, 5);
170 }
171
172 void setFocusedView(QtEditText currentEditText)
173 {
174 m_currentEditText = currentEditText;
175 }
176
177 public void showSoftwareKeyboard(Activity activity, QtLayout layout,
178 final int x, final int y, final int width, final int height,
179 final int inputHints, final int enterKeyType)
180 {
181 QtNative.runAction(() -> {
182 if (m_imm == null || m_currentEditText == null)
183 return;
184
185 if (updateSoftInputMode(activity, height))
186 return;
187
188 m_currentEditText.setEditTextOptions(enterKeyType, inputHints);
189
190 m_currentEditText.postDelayed(() -> {
191 m_imm.showSoftInput(m_currentEditText, 0, new ResultReceiver(new Handler()) {
192 @Override
193 protected void onReceiveResult(int resultCode, Bundle resultData) {
194 switch (resultCode) {
195 case InputMethodManager.RESULT_SHOWN:
196 QtNativeInputConnection.updateCursorPosition();
197 //FALLTHROUGH
198 case InputMethodManager.RESULT_UNCHANGED_SHOWN:
199 setKeyboardVisibility(true, System.nanoTime());
200 if (m_softInputMode == 0) {
201 probeForKeyboardHeight(layout, activity,
202 x, y, width, height, inputHints, enterKeyType);
203 }
204 break;
205 case InputMethodManager.RESULT_HIDDEN:
206 case InputMethodManager.RESULT_UNCHANGED_HIDDEN:
207 setKeyboardVisibility(false, System.nanoTime());
208 break;
209 }
210 }
211 });
212 if (m_currentEditText.m_optionsChanged) {
213 m_imm.restartInput(m_currentEditText);
214 m_currentEditText.m_optionsChanged = false;
215 }
216 }, 15);
217 });
218 }
219
220 private boolean updateSoftInputMode(Activity activity, int height)
221 {
222 DisplayMetrics metrics = new DisplayMetrics();
223 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
224
225 // If the screen is in portrait mode than we estimate that keyboard height
226 // will not be higher than 2/5 of the screen. Otherwise we estimate that keyboard height
227 // will not be higher than 2/3 of the screen
228 final int visibleHeight;
229 if (metrics.widthPixels < metrics.heightPixels) {
230 visibleHeight = m_portraitKeyboardHeight != 0 ?
231 m_portraitKeyboardHeight : metrics.heightPixels * 3 / 5;
232 } else {
233 visibleHeight = m_landscapeKeyboardHeight != 0 ?
234 m_landscapeKeyboardHeight : metrics.heightPixels / 3;
235 }
236
237 if (m_softInputMode != 0) {
238 activity.getWindow().setSoftInputMode(m_softInputMode);
239 int stateHidden = WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN;
240 return (m_softInputMode & stateHidden) != 0;
241 } else {
242 int stateUnchanged = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED;
243 if (height > visibleHeight) {
244 int adjustResize = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
245 activity.getWindow().setSoftInputMode(stateUnchanged | adjustResize);
246 } else {
247 int adjustPan = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
248 activity.getWindow().setSoftInputMode(stateUnchanged | adjustPan);
249 }
250 }
251 return false;
252 }
253
254 private void probeForKeyboardHeight(QtLayout layout, Activity activity, int x, int y,
255 int width, int height, int inputHints, int enterKeyType)
256 {
257 layout.postDelayed(() -> {
258 if (!m_keyboardIsVisible)
259 return;
260 DisplayMetrics metrics = new DisplayMetrics();
261 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
262 Rect r = new Rect();
263 activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
264 if (metrics.heightPixels != r.bottom) {
265 if (metrics.widthPixels > metrics.heightPixels) { // landscape
266 if (m_landscapeKeyboardHeight != r.bottom) {
267 m_landscapeKeyboardHeight = r.bottom;
268 showSoftwareKeyboard(activity, layout, x, y, width, height,
269 inputHints, enterKeyType);
270 }
271 } else {
272 if (m_portraitKeyboardHeight != r.bottom) {
273 m_portraitKeyboardHeight = r.bottom;
274 showSoftwareKeyboard(activity, layout, x, y, width, height,
275 inputHints, enterKeyType);
276 }
277 }
278 } else {
279 // no luck ?
280 // maybe the delay was too short, so let's make it longer
281 if (m_probeKeyboardHeightDelayMs < 1000)
282 m_probeKeyboardHeightDelayMs *= 2;
283 }
284 }, m_probeKeyboardHeightDelayMs);
285 }
286
287 public void hideSoftwareKeyboard()
288 {
289 m_isKeyboardHidingAnimationOngoing = true;
290 QtNative.runAction(() -> {
291 if (m_imm == null || m_currentEditText == null)
292 return;
293
294 m_imm.hideSoftInputFromWindow(m_currentEditText.getWindowToken(), 0,
295 new ResultReceiver(new Handler()) {
296 @Override
297 protected void onReceiveResult(int resultCode, Bundle resultData) {
298 switch (resultCode) {
299 case InputMethodManager.RESULT_SHOWN:
300 case InputMethodManager.RESULT_UNCHANGED_SHOWN:
301 setKeyboardVisibility(true, System.nanoTime());
302 break;
303 case InputMethodManager.RESULT_HIDDEN:
304 case InputMethodManager.RESULT_UNCHANGED_HIDDEN:
305 setKeyboardVisibility(false, System.nanoTime());
306 break;
307 }
308 }
309 });
310 });
311 }
312
313 @UsedFromNativeCode
314 public void updateSelection(final int selStart, final int selEnd,
315 final int candidatesStart, final int candidatesEnd)
316 {
317 QtNative.runAction(() -> {
318 if (m_imm == null)
319 return;
320
321 m_imm.updateSelection(m_currentEditText, selStart, selEnd, candidatesStart, candidatesEnd);
322 });
323 }
324
325 @UsedFromNativeCode
326 public int getSelectHandleWidth()
327 {
328 int width = 0;
329 if (m_leftSelectionHandle != null && m_rightSelectionHandle != null) {
330 width = Math.max(m_leftSelectionHandle.width(), m_rightSelectionHandle.width());
331 } else if (m_cursorHandle != null) {
332 width = m_cursorHandle.width();
333 }
334 return width;
335 }
336
337 /* called from the C++ code when the position of the cursor or selection handles needs to
338 be adjusted.
339 mode is one of QAndroidInputContext::CursorHandleShowMode
340 */
341 @UsedFromNativeCode
342 public void updateHandles(Activity activity, QtLayout layout, int mode,
343 int editX, int editY, int editButtons,
344 int x1, int y1, int x2, int y2, boolean rtl)
345 {
346 QtNative.runAction(() -> updateHandleImpl(activity, layout, mode, editX, editY, editButtons,
347 x1, y1, x2, y2, rtl));
348 }
349
350 private void updateHandleImpl(Activity activity, QtLayout layout, int mode,
351 int editX, int editY, int editButtons,
352 int x1, int y1, int x2, int y2, boolean rtl)
353 {
354 switch (mode & 0xff)
355 {
356 case CursorHandleNotShown:
357 if (m_cursorHandle != null) {
358 m_cursorHandle.hide();
359 m_cursorHandle = null;
360 }
361 if (m_rightSelectionHandle != null) {
362 m_rightSelectionHandle.hide();
363 m_leftSelectionHandle.hide();
364 m_rightSelectionHandle = null;
365 m_leftSelectionHandle = null;
366 }
367 if (m_editPopupMenu != null)
368 m_editPopupMenu.hide();
369 break;
370
371 case CursorHandleShowNormal:
372 if (m_cursorHandle == null) {
373 m_cursorHandle = new CursorHandle(activity, layout, IdCursorHandle,
374 android.R.attr.textSelectHandle, false);
375 }
376 m_cursorHandle.setPosition(x1, y1);
377 if (m_rightSelectionHandle != null) {
378 m_rightSelectionHandle.hide();
379 m_leftSelectionHandle.hide();
380 m_rightSelectionHandle = null;
381 m_leftSelectionHandle = null;
382 }
383 break;
384
385 case CursorHandleShowSelection:
386 if (m_rightSelectionHandle == null) {
387 m_leftSelectionHandle = new CursorHandle(activity, layout, IdLeftHandle,
388 !rtl ? android.R.attr.textSelectHandleLeft :
389 android.R.attr.textSelectHandleRight,
390 rtl);
391 m_rightSelectionHandle = new CursorHandle(activity, layout, IdRightHandle,
392 !rtl ? android.R.attr.textSelectHandleRight :
393 android.R.attr.textSelectHandleLeft,
394 rtl);
395 }
396 m_leftSelectionHandle.setPosition(x1,y1);
397 m_rightSelectionHandle.setPosition(x2,y2);
398 if (m_cursorHandle != null) {
399 m_cursorHandle.hide();
400 m_cursorHandle = null;
401 }
402 mode |= CursorHandleShowEdit;
403 break;
404 }
405
406 if (!QtClipboardManager.hasClipboardText(activity))
407 editButtons &= ~EditContextView.PASTE_BUTTON;
408
409 if (m_editPopupMenu != null) {
410 if ((mode & CursorHandleShowEdit) == CursorHandleShowEdit && editButtons != 0) {
411 m_editPopupMenu.setPosition(editX, editY, editButtons,
412 m_cursorHandle, m_leftSelectionHandle, m_rightSelectionHandle);
413 } else {
414 m_editPopupMenu.hide();
415 }
416 }
417 }
418
419 public boolean onKeyDown(int keyCode, KeyEvent event)
420 {
421 m_metaState = MetaKeyKeyListener.handleKeyDown(m_metaState, keyCode, event);
422 int metaState = MetaKeyKeyListener.getMetaState(m_metaState) | event.getMetaState();
423 int c = event.getUnicodeChar(metaState);
424 int lc = c;
425 m_metaState = MetaKeyKeyListener.adjustMetaAfterKeypress(m_metaState);
426
427 if ((c & KeyCharacterMap.COMBINING_ACCENT) != 0) {
428 c = c & KeyCharacterMap.COMBINING_ACCENT_MASK;
429 c = KeyEvent.getDeadChar(m_lastChar, c);
430 }
431
432 if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP
433 || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
434 || keyCode == KeyEvent.KEYCODE_MUTE)
435 && System.getenv("QT_ANDROID_VOLUME_KEYS") == null) {
436 return false;
437 }
438
439 m_lastChar = lc;
440 if (keyCode == KeyEvent.KEYCODE_BACK) {
441 m_backKeyPressedSent = !isKeyboardVisible();
442 if (!m_backKeyPressedSent)
443 return true;
444 }
445
446 QtInputDelegate.keyDown(keyCode, c, event.getMetaState(), event.getRepeatCount() > 0);
447
448 return true;
449 }
450
451 public boolean onKeyUp(int keyCode, KeyEvent event)
452 {
453 if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP
454 || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
455 || keyCode == KeyEvent.KEYCODE_MUTE)
456 && System.getenv("QT_ANDROID_VOLUME_KEYS") == null) {
457 return false;
458 }
459
460 if (keyCode == KeyEvent.KEYCODE_BACK && !m_backKeyPressedSent) {
461 hideSoftwareKeyboard();
462 setKeyboardVisibility(false, System.nanoTime());
463 return true;
464 }
465
466 m_metaState = MetaKeyKeyListener.handleKeyUp(m_metaState, keyCode, event);
467 boolean autoRepeat = event.getRepeatCount() > 0;
468 QtInputDelegate.keyUp(keyCode, event.getUnicodeChar(), event.getMetaState(), autoRepeat);
469
470 return true;
471 }
472
473 public boolean handleDispatchKeyEvent(KeyEvent event)
474 {
475 if (event.getAction() == KeyEvent.ACTION_MULTIPLE
476 && event.getCharacters() != null
477 && event.getCharacters().length() == 1
478 && event.getKeyCode() == 0) {
479 keyDown(0, event.getCharacters().charAt(0), event.getMetaState(),
480 event.getRepeatCount() > 0);
481 keyUp(0, event.getCharacters().charAt(0), event.getMetaState(),
482 event.getRepeatCount() > 0);
483 }
484
485 return dispatchKeyEvent(event);
486 }
487
488 public boolean handleDispatchGenericMotionEvent(MotionEvent event)
489 {
490 return dispatchGenericMotionEvent(event);
491 }
492
494 // Mouse and Touch Input //
496
497 // tablet methods
498 public static native boolean isTabletEventSupported();
499 public static native void tabletEvent(int winId, int deviceId, long time, int action,
500 int pointerType, int buttonState, float x, float y,
501 float pressure);
502 // tablet methods
503
504 // pointer methods
505 public static native void mouseDown(int winId, int x, int y, int mouseButtonState);
506 public static native void mouseUp(int winId, int x, int y, int mouseButtonState);
507 public static native void mouseMove(int winId, int x, int y);
508 public static native void mouseWheel(int winId, int x, int y, float hDelta, float vDelta);
509 public static native void touchBegin(int winId);
510 public static native void touchAdd(int winId, int pointerId, int action, boolean primary,
511 int x, int y, float major, float minor, float rotation,
512 float pressure);
513 public static native void touchEnd(int winId, int action);
514 public static native void touchCancel(int winId);
515 public static native void longPress(int winId, int x, int y);
516 // pointer methods
517
518 static private int getAction(int index, MotionEvent event)
519 {
520 int action = event.getActionMasked();
521 if (action == MotionEvent.ACTION_MOVE) {
522 int hsz = event.getHistorySize();
523 if (hsz > 0) {
524 float x = event.getX(index);
525 float y = event.getY(index);
526 for (int h = 0; h < hsz; ++h) {
527 if ( event.getHistoricalX(index, h) != x ||
528 event.getHistoricalY(index, h) != y )
529 return 1;
530 }
531 return 2;
532 }
533 return 1;
534 }
535 if (action == MotionEvent.ACTION_DOWN
536 || action == MotionEvent.ACTION_POINTER_DOWN && index == event.getActionIndex()) {
537 return 0;
538 } else if (action == MotionEvent.ACTION_UP
539 || action == MotionEvent.ACTION_POINTER_UP && index == event.getActionIndex()) {
540 return 3;
541 }
542 return 2;
543 }
544
545 static public void sendTouchEvent(MotionEvent event, int id)
546 {
547 int pointerType = 0;
548
549 if (m_tabletEventSupported == null)
550 m_tabletEventSupported = isTabletEventSupported();
551
552 switch (event.getToolType(0)) {
553 case MotionEvent.TOOL_TYPE_STYLUS:
554 pointerType = 1; // QTabletEvent::Pen
555 break;
556 case MotionEvent.TOOL_TYPE_ERASER:
557 pointerType = 3; // QTabletEvent::Eraser
558 break;
559 }
560
561 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
562 sendMouseEvent(event, id);
563 } else if (m_tabletEventSupported && pointerType != 0) {
564 tabletEvent(id, event.getDeviceId(), event.getEventTime(), event.getActionMasked(),
565 pointerType, event.getButtonState(),
566 event.getX(), event.getY(), event.getPressure());
567 } else {
568 touchBegin(id);
569 for (int i = 0; i < event.getPointerCount(); ++i) {
570 touchAdd(id,
571 event.getPointerId(i),
572 getAction(i, event),
573 i == 0,
574 (int)event.getX(i),
575 (int)event.getY(i),
576 event.getTouchMajor(i),
577 event.getTouchMinor(i),
578 event.getOrientation(i),
579 event.getPressure(i));
580 }
581
582 switch (event.getAction()) {
583 case MotionEvent.ACTION_DOWN:
584 touchEnd(id, 0);
585 break;
586
587 case MotionEvent.ACTION_UP:
588 touchEnd(id, 2);
589 break;
590
591 case MotionEvent.ACTION_CANCEL:
592 touchCancel(id);
593 break;
594
595 default:
596 touchEnd(id, 1);
597 }
598 }
599 }
600
601 static public void sendTrackballEvent(MotionEvent event, int id)
602 {
603 sendMouseEvent(event,id);
604 }
605
606 static public boolean sendGenericMotionEvent(MotionEvent event, int id)
607 {
608 int scrollOrHoverMove = MotionEvent.ACTION_SCROLL | MotionEvent.ACTION_HOVER_MOVE;
609 int pointerDeviceModifier = (event.getSource() & InputDevice.SOURCE_CLASS_POINTER);
610 boolean isPointerDevice = pointerDeviceModifier == InputDevice.SOURCE_CLASS_POINTER;
611
612 if ((event.getAction() & scrollOrHoverMove) == 0 || !isPointerDevice )
613 return false;
614
615 return sendMouseEvent(event, id);
616 }
617
618 static public boolean sendMouseEvent(MotionEvent event, int id)
619 {
620 switch (event.getActionMasked()) {
621 case MotionEvent.ACTION_UP:
622 mouseUp(id, (int) event.getX(), (int) event.getY(), event.getButtonState());
623 break;
624
625 case MotionEvent.ACTION_DOWN:
626 mouseDown(id, (int) event.getX(), (int) event.getY(), event.getButtonState());
627 m_oldX = (int) event.getX();
628 m_oldY = (int) event.getY();
629 break;
630 case MotionEvent.ACTION_HOVER_MOVE:
631 case MotionEvent.ACTION_MOVE:
632 if (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE) {
633 mouseMove(id, (int) event.getX(), (int) event.getY());
634 } else {
635 int dx = (int) (event.getX() - m_oldX);
636 int dy = (int) (event.getY() - m_oldY);
637 if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
638 mouseMove(id, (int) event.getX(), (int) event.getY());
639 m_oldX = (int) event.getX();
640 m_oldY = (int) event.getY();
641 }
642 }
643 break;
644 case MotionEvent.ACTION_SCROLL:
645 mouseWheel(id, (int) event.getX(), (int) event.getY(),
646 event.getAxisValue(MotionEvent.AXIS_HSCROLL),
647 event.getAxisValue(MotionEvent.AXIS_VSCROLL));
648 break;
649 default:
650 return false;
651 }
652 return true;
653 }
654}
Q_CORE_EXPORT QtJniTypes::Activity activity()
GLint GLint GLint GLint GLint x
[0]
GLenum mode
GLuint64 key
GLint GLsizei GLsizei height
GLuint GLfloat GLfloat GLfloat GLfloat y1
GLuint index
[2]
GLboolean r
[2]
GLuint GLfloat GLfloat GLfloat x1
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLint GLsizei width
GLint y
GLfloat GLfloat GLfloat GLfloat h
struct _cl_event * event
const GLubyte * c
GLfixed GLfixed GLfixed y2
GLfixed GLfixed x2
@ Handler
static QPointingDevice::PointerType pointerType(unsigned currentCursor)
QVBoxLayout * layout