File: blocking_choose_file.py

package info (click to toggle)
jeepney 0.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 488 kB
  • sloc: python: 2,605; makefile: 205; xml: 115
file content (38 lines) | stat: -rw-r--r-- 1,345 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from jeepney import DBusAddress, new_method_call
from jeepney.bus_messages import message_bus, MatchRule
from jeepney.io.blocking import open_dbus_connection, Proxy

portal = DBusAddress(
    object_path='/org/freedesktop/portal/desktop',
    bus_name='org.freedesktop.portal.Desktop',
)
filechooser = portal.with_interface('org.freedesktop.portal.FileChooser')

conn = open_dbus_connection()

token = 'file_choice_1'
sender_name = conn.unique_name[1:].replace('.', '_')
handle = f"/org/freedesktop/portal/desktop/request/{sender_name}/{token}"

response_rule = MatchRule(
    type='signal', interface='org.freedesktop.portal.Request', path=handle
)
Proxy(message_bus, conn).AddMatch(response_rule)

with conn.filter(response_rule) as responses:
    # https://flatpak.github.io/xdg-desktop-portal/portal-docs.html#gdbus-method-org-freedesktop-portal-FileChooser.OpenFile
    req = new_method_call(filechooser, 'OpenFile', 'ssa{sv}', (
        # Parent window, title, options
        '', 'Pick a file', {'handle_token': ('s', token)}
    ))
    conn.send_and_get_reply(req)

    # responses is a deque - process messages until one is filtered into it
    response_msg = conn.recv_until_filtered(responses)

response, results = response_msg.body
if response == 0:
    # print(results)
    print("Chose file:", results['uris'][1][0])

conn.close()