- 第三栏内容工厂:按拖入类型展示动作,动作按钮本身可接收 drop - 链接分类:http(s) 按扩展名判定图片/音视频/文档/压缩包/网页 - http 链接动作:打开、下载、另存为、复制、Markdown、复制文件名、待办、问小埃 - 非标准 scheme:尝试打开、复制;thunder 解析 base64 真实地址,magnet 解析 dn - 文字动作:ICU 分词、正则提取链接、朗读(spd-say)、复制、待办 - 文件/图片动作:打开、提取文字(占位)、生成描述、保存图片、复制路径、待办 - Downloader:异步下载到 XDG 下载目录 / 另存为,面板 toast 提示 - TodoModel:持久化到 todo.json,供「添加到待办」使用 - 无头自测 gxde-ai-see-selftest:链接分类/分词/提取链接/动作匹配 - 合成器 portal 自测脚本 tests/portal(虚拟指针 + GTK 源/目标)
42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-FileCopyrightText: 2026 GXDE OS Team
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
"""GTK3 drop target used by the portal integration test.
|
|
|
|
GtkTextView accepts text drops out of the box; every insertion is printed as
|
|
``DROP <text> at <offset>`` so the orchestrator can assert that the *native*
|
|
drop landed in this window.
|
|
"""
|
|
|
|
import gi
|
|
|
|
gi.require_version("Gtk", "3.0")
|
|
|
|
from gi.repository import Gtk # noqa: E402
|
|
|
|
|
|
class Target(Gtk.Window):
|
|
def __init__(self):
|
|
super().__init__(title="PortalDropTarget")
|
|
self.set_default_size(420, 280)
|
|
self.set_position(Gtk.WindowPosition.CENTER)
|
|
|
|
view = Gtk.TextView()
|
|
view.set_wrap_mode(Gtk.WrapMode.WORD)
|
|
self.buffer = view.get_buffer()
|
|
self.buffer.connect("insert-text", self.on_insert)
|
|
|
|
scroller = Gtk.ScrolledWindow()
|
|
scroller.add(view)
|
|
self.add(scroller)
|
|
|
|
self.connect("destroy", Gtk.main_quit)
|
|
self.show_all()
|
|
|
|
def on_insert(self, buffer, location, text, length):
|
|
print("DROP", repr(text), "at", location.get_offset(), flush=True)
|
|
|
|
|
|
Target()
|
|
Gtk.main()
|