Skip to content

Commit 2d6143d

Browse files
committed
support multi display, disable framebuffer function
1 parent aa97ff6 commit 2d6143d

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

adbutils/screenshot.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,38 @@ class ScreenshotExtesion(AbstractDevice):
4242
def __init__(self):
4343
self.__framebuffer_ok = True
4444

45-
def screenshot(self) -> Image.Image:
45+
def screenshot(self, display_id: Optional[int] = None) -> Image.Image:
4646
""" Take a screenshot and return PIL.Image.Image object
47-
If capture failed, return a black image
47+
Args:
48+
display_id: int, default None, see "dumpsys SurfaceFlinger --display-id" for valid display IDs
49+
50+
Returns:
51+
PIL.Image.Image object, If capture failed, return a black image
4852
"""
4953
try:
50-
pil_image = self.__screencap()
54+
pil_image = self.__screencap(display_id)
5155
if pil_image.mode == "RGBA":
5256
pil_image = pil_image.convert("RGB")
5357
return pil_image
5458
except UnidentifiedImageError as e:
5559
wsize = self.window_size()
5660
return Image.new("RGB", wsize, (0, 0, 0))
5761

58-
def __screencap(self) -> Image.Image:
59-
if self.__framebuffer_ok:
60-
try:
61-
return self.framebuffer()
62-
except NotImplementedError:
63-
self.__framebuffer_ok = False
64-
except UnidentifiedImageError as e:
65-
logger.warning("framebuffer error: %s", e)
66-
png_bytes = self.shell('screencap -p', encoding=None)
62+
def __screencap(self, display_id: int = None) -> Image.Image:
63+
""" Take a screenshot and return PIL.Image.Image object
64+
"""
65+
# framebuffer is not stable, so we disable it
66+
# MemoryError may occur when using framebuffer
67+
68+
# if self.__framebuffer_ok and display_id is None:
69+
# try:
70+
# return self.framebuffer()
71+
# except NotImplementedError:
72+
# self.__framebuffer_ok = False
73+
# except UnidentifiedImageError as e:
74+
# logger.warning("framebuffer error: %s", e)
75+
cmdargs = ['screencap', '-p']
76+
if display_id is not None:
77+
cmdargs.extend(['-d', str(display_id)])
78+
png_bytes = self.shell(cmdargs, encoding=None)
6779
return Image.open(io.BytesIO(png_bytes))

adbutils/shell.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,19 +152,23 @@ def swipe(self, sx, sy, ex, ey, duration: float = 1.0) -> None:
152152
x1, y1, x2, y2 = map(str, [sx, sy, ex, ey])
153153
self.shell(["input", "swipe", x1, y1, x2, y2, str(int(duration * 1000))])
154154

155-
def click(self, x, y) -> None:
155+
def click(self, x, y, display_id: Optional[int] = None) -> None:
156156
"""
157157
simulate android tap
158158
159159
Args:
160160
x, y: int
161+
display_id: int, default None, see "dumpsys SurfaceFlinger --display-id" for valid display IDs
161162
"""
162163
if any(map(is_percent, [x, y])):
163164
w, h = self.window_size()
164165
x = int(x * w) if is_percent(x) else x
165166
y = int(y * h) if is_percent(y) else y
166167
x, y = map(str, [x, y])
167-
self.shell(["input", "tap", x, y])
168+
cmdargs = ["input"]
169+
if display_id is not None:
170+
cmdargs.extend(['-d', str(display_id)])
171+
self.shell(cmdargs + ["tap", x, y])
168172

169173
def send_keys(self, text: str):
170174
"""

0 commit comments

Comments
 (0)