Skip to content

Commit 991ae22

Browse files
authored
Window.softinput_mode fix for "pan" and "below_target" modes when using kivy virtual keyboard. (kivy#7726)
* Softinput_mode fix for pan and below target modes Fixes issues related to correct Kivy virtual keyboard display for soft_input modes: `pan` and `bellow_target` * Refactoring * Removal of unreachable code. * refactoring and fixes * pep8
1 parent 3130818 commit 991ae22

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

kivy/core/window/__init__.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -629,12 +629,30 @@ def _get_android_kheight(self):
629629
import android
630630
return android.get_keyboard_height()
631631

632+
def _get_kivy_vkheight(self):
633+
mode = Config.get('kivy', 'keyboard_mode')
634+
if (
635+
mode in ['dock', 'systemanddock']
636+
and self._vkeyboard_cls is not None
637+
):
638+
for w in self.children:
639+
if isinstance(w, VKeyboard):
640+
vkeyboard_height = w.height * w.scale
641+
if self.softinput_mode == 'pan':
642+
return vkeyboard_height
643+
elif (
644+
self.softinput_mode == 'below_target'
645+
and w.target.y < vkeyboard_height
646+
):
647+
return vkeyboard_height - w.target.y
648+
return 0
649+
632650
def _get_kheight(self):
633651
if platform == 'android':
634652
return self._get_android_kheight()
635-
if platform == 'ios':
653+
elif platform == 'ios':
636654
return self._get_ios_kheight()
637-
return 0
655+
return self._get_kivy_vkheight()
638656

639657
keyboard_height = AliasProperty(_get_kheight, bind=('_keyboard_changed',))
640658
'''Returns the height of the softkeyboard/IME on mobile platforms.
@@ -1611,7 +1629,7 @@ def update_viewport(self):
16111629
w2, h2 = w / 2., h / 2.
16121630
r = radians(self.rotation)
16131631

1614-
x, y = 0, 0
1632+
y = 0
16151633
_h = h
16161634
if smode == 'pan':
16171635
y = kheight
@@ -1621,7 +1639,7 @@ def update_viewport(self):
16211639
_h -= kheight
16221640

16231641
# prepare the viewport
1624-
glViewport(x, y, w, _h)
1642+
glViewport(0, 0, w, _h)
16251643

16261644
# do projection matrix
16271645
projection_mat = Matrix()
@@ -1633,7 +1651,7 @@ def update_viewport(self):
16331651
modelview_mat = modelview_mat.multiply(Matrix().rotate(r, 0, 0, 1))
16341652

16351653
w, h = self.size
1636-
w2, h2 = w / 2., h / 2.
1654+
w2, h2 = w / 2., h / 2. - y
16371655
modelview_mat = modelview_mat.multiply(Matrix().translate(-w2, -h2, 0))
16381656
self.render_context['modelview_mat'] = modelview_mat
16391657
frag_modelview_mat = Matrix()
@@ -2132,6 +2150,12 @@ def request_keyboard(
21322150
keyboard.widget.docked = self.docked_vkeyboard
21332151
keyboard.widget.setup_mode()
21342152

2153+
# sets vkeyboard position according to Window.softinput_mode
2154+
if self.softinput_mode == 'pan':
2155+
keyboard.widget.top = 0
2156+
elif self.softinput_mode == 'below_target':
2157+
keyboard.widget.top = keyboard.target.y
2158+
21352159
else:
21362160
# system keyboard, just register the callback.
21372161
keyboard = self._system_keyboard

kivy/input/motionevent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ def scale_for_screen(self, w, h, p=None, rotation=0,
406406
self.pz = self.psz * z_max
407407
if smode:
408408
# Adjust y for keyboard height
409-
if smode == 'pan':
409+
if smode == 'pan' or smode == 'below_target':
410410
self.y -= kheight
411411
self.oy -= kheight
412412
self.py -= kheight

0 commit comments

Comments
 (0)