init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled

This commit is contained in:
allhaileris
2026-02-16 15:50:16 +03:00
commit afb81b8278
13816 changed files with 3689732 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
---
layout: default
permalink: /404.html
---
![404]({{site.baseurl}}/assets/404.png){:.full.pixels}
# Document Not Found
The requested page could not be found. If you feel this is not normal, then you create an issue on the Gitlab.
[Go Back](<javascript:window.history.go(-1);>){: .inline-button} [File an issue]({{site.issuesurl}})
{: .dialog-buttons}

View File

@@ -0,0 +1,33 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 4.1.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
# gem 'jekyll-feed', '~> 0.13'
# gem 'jekyll-sitemap', '~> 1.4'
# gem 'jekyll-compose', '~> 0.12.0'
# gem 'jekyll-postfiles', '~> 3.1'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
# gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
# Performance-booster for watching directories on Windows
# gem "wdm", "~> 0.1.0" if Gem.win_platform?
gem "webrick", "~> 1.8"

View File

@@ -0,0 +1,69 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
concurrent-ruby (1.1.9)
em-websocket (0.5.2)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
ffi (1.15.4)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (1.8.10)
concurrent-ruby (~> 1.0)
jekyll (4.1.1)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.4.0)
pathutil (~> 0.9)
rouge (~> 3.0)
safe_yaml (~> 1.0)
terminal-table (~> 1.8)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.3.1)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.7.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (4.0.6)
rb-fsevent (0.11.0)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.3.9)
rouge (3.26.1)
safe_yaml (1.0.5)
sassc (2.4.0)
ffi (~> 1.9)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
unicode-display_width (1.8.0)
webrick (1.8.2)
PLATFORMS
x86_64-linux
DEPENDENCIES
jekyll (~> 4.1.0)
webrick (~> 1.8)
BUNDLED WITH
2.2.7

View File

@@ -0,0 +1,121 @@
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.

View File

@@ -0,0 +1,8 @@
# XDG Desktop Portal Website
This is the website for the [XDG Desktop Portal project](https://github.com/flatpak/xdg-desktop-portal).
## Development
The contribution guidelines have been moved to the online documentation:
https://flatpak.github.io/xdg-desktop-portal/docs/for-contributors.html

View File

@@ -0,0 +1,14 @@
# Site settings
title: XDG Desktop Portal
baseurl: "/xdg-desktop-portal" # the subpath of your site, e.g. /blog/
# usually empty. necessary for building absolute URIs
# for metadata header
url: "https://flatpak.github.io" # the base hostname & protocol for your site
sourceurl: "https://github.com/flatpak/xdg-desktop-portal/tree/main/doc/website" # "edit this website" link in the footer
description: ""
issuesurl: "https://github.com/flatpak/xdg-desktop-portal/issues" # issue tracker for website
permalink: /:title/
primary-color: "#26a269" #used in ios theme. further color customization in style.css
# Build settings
markdown: kramdown

View File

@@ -0,0 +1,5 @@
<footer class="site-footer">
<p>&copy; {{ site.title }}, 2023-2025</p>
<p><a href="{{ site.sourceurl }}">Website source</a></p>
</footer>

View File

@@ -0,0 +1,32 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="{{ site.primary-color }}"><!-- primary color -->
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}" />
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
<link rel="stylesheet" href="{{ "/style.css" | prepend: site.baseurl }}" />
<link rel="icon" type="image/png" href="{{ "/favicon.png" | prepend: site.baseurl }}" />
<link rel="apple-touch-icon" sizes="180x180" href="{{ "/apple-touch-icon.png" | prepend: site.baseurl }}" />
<link rel="icon" type="image/png" sizes="32x32" href="{{ "/favicon-32x32.png" | prepend: site.baseurl }}" />
<link rel="icon" type="image/png" sizes="16x16" href="{{ "/favicon-16x16.png" | prepend: site.baseurl }}" />
<link rel="manifest" href="{{ "/site.webmanifest" | prepend: site.baseurl }}" />
<link rel="mask-icon" href="{{ "/safari-pinned-tab.svg" | prepend: site.baseurl }}" color="#5bbad5" />
<!-- Twitter -->
<meta property="twitter:title" content="{{site.title}}" />
<meta property="twitter:image" content="{{ "/assets/card.png" | prepend: site.baseurl | prepend: site.url }}" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:description" content="{{site.description}}" />
<!-- Open Graph -->
<meta property="og:title" content="{{ site.title }}" />
<meta property="og:url" content="{{ site.url }}" />
<meta property="og:description" content="{{ site.description }}" />
<meta property="og:image" content="{{ "/assets/card.png" | prepend: site.baseurl | prepend: site.url }}" />
</head>

View File

@@ -0,0 +1,3 @@
<header class="site-header">
<h1 id="logo"><a href="{{ "/" | prepend: site.baseurl }}">{{ site.title }}</a></h1>
</header>

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
{% include head.html %}
<body>
{% include header.html %}
<div class="container">
{{ content }}
</div>
{% include footer.html %}
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg14"
sodipodi:docname="favicon.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
inkscape:export-filename="favicon.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs18" />
<sodipodi:namedview
id="namedview16"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:current-layer="g12"
inkscape:snap-nodes="false"
inkscape:snap-others="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid20"
originx="0"
originy="0"
spacingy="1"
spacingx="1"
units="px"
visible="false" />
</sodipodi:namedview>
<g
transform="translate(380 -506.52)"
id="g12">
<rect
style="fill:#f6d32d;fill-opacity:1;stroke:none;stroke-width:0.177777;stroke-linecap:round;paint-order:markers stroke fill"
id="rect1"
width="15.999992"
height="15.999992"
x="-380"
y="506.51999"
rx="0.26666722"
ry="0.26666722" />
<g
id="g4-3"
inkscape:label="portal xdg freedesktop aperture science"
transform="matrix(0.99018293,0,0,0.99018293,-1045.3236,142.21168)"
style="fill:#000000">
<title
id="title2">xdg-portal</title>
<rect
y="368"
x="671.99994"
height="16"
width="16"
id="rect2-6"
style="fill:none" />
<path
style="color:#000000;fill:#000000;stroke-linecap:round;-inkscape-stroke:none;paint-order:markers stroke fill"
d="m 743.46875,-221.62109 c -1.92109,0 -3.42383,1.66654 -3.42383,3.61132 v 6.0918 c 0,1.94479 1.50274,3.61133 3.42383,3.61133 h 6.46484 c 1.92109,0 3.42383,-1.66654 3.42383,-3.61133 v -6.0918 c 0,-1.94478 -1.50274,-3.61132 -3.42383,-3.61132 z m 0,2 h 6.46484 c 0.76512,0 1.42383,0.66327 1.42383,1.61132 v 6.0918 c 0,0.94805 -0.65871,1.61133 -1.42383,1.61133 h -6.46484 c -0.76511,0 -1.42383,-0.66328 -1.42383,-1.61133 v -6.0918 c 0,-0.94805 0.65872,-1.61132 1.42383,-1.61132 z"
id="rect8"
transform="rotate(45)" />
<path
style="color:#000000;opacity:1;fill:#000000;fill-rule:evenodd;stroke-width:0.832109;stroke-linecap:round;-inkscape-stroke:none"
d="m 680.29396,371.18645 c -1.30513,-0.0914 -2.63994,0.30838 -3.67623,1.25142 -1.85606,1.68902 -2.10977,4.67185 -0.37217,6.55448 1.53794,1.66631 4.23802,1.8872 5.9304,0.29741 1.47637,-1.38687 1.66557,-3.80461 0.22265,-5.30632 -1.23582,-1.28617 -3.37348,-1.44374 -4.68386,-0.14627 -1.0956,1.08482 -1.22093,2.94343 -0.0666,4.06141 0.93392,0.90452 2.51699,0.99723 3.44058,-0.0179 0.7127,-0.78334 0.76996,-2.09652 -0.11377,-2.82137 -0.31699,-0.26001 -0.7177,-0.38946 -1.1214,-0.36893 -0.4037,0.0205 -0.8255,0.21265 -1.08239,0.59808 -0.16449,0.24681 -0.22985,0.53729 -0.1869,0.83699 0.0429,0.29969 0.25013,0.63735 0.60621,0.75897 0.26803,0.0915 0.42549,0.0409 0.62733,-0.0715 0.10091,-0.0562 0.22585,-0.14782 0.28603,-0.32992 0.0602,-0.1821 -0.007,-0.40468 -0.10726,-0.52982 a 0.41605426,0.41605426 0 0 0 -0.56395,-0.0634 c 0.0106,-0.0527 0.0114,-0.1106 0.0309,-0.13977 0.10126,-0.15192 0.24405,-0.21795 0.43231,-0.22753 0.18826,-0.01 0.40579,0.06 0.55257,0.1804 0.47749,0.39164 0.44098,1.1592 0.0244,1.61709 -0.5816,0.63924 -1.62979,0.57736 -2.24605,-0.0195 -0.79642,-0.77136 -0.70658,-2.0997 0.0731,-2.87175 0.96089,-0.95143 2.57264,-0.83254 3.49908,0.13164 1.10523,1.15027 0.95629,3.04317 -0.1934,4.12317 -1.33952,1.25831 -3.51587,1.07913 -4.74887,-0.25679 -1.41093,-1.52868 -1.20085,-3.98733 0.3218,-5.37295 1.71779,-1.56321 4.45907,-1.32295 5.99703,0.3868 1.49098,1.65753 1.51331,4.23325 0.14789,5.98241 a 0.41605426,0.41605426 0 0 0 0.0731,0.58345 0.41605426,0.41605426 0 0 0 0.58345,-0.0715 c 1.61077,-2.06346 1.58742,-5.08109 -0.18527,-7.0518 -0.92006,-1.02283 -2.19558,-1.60528 -3.5007,-1.69672 z"
id="path8" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,112 @@
---
layout: default
---
<picture class="full pixels">
<source srcset="assets/splash-dark.png" media="(prefers-color-scheme: dark)">
<img src="assets/splash.png">
</picture>
# XDG Desktop Portal
A portal frontend service for [Flatpak](https://flatpak.org) and other
desktop containment frameworks.
xdg-desktop-portal works by exposing a series of D-Bus interfaces known as
_portals_ under a well-known name (`org.freedesktop.portal.Desktop`) and object
path (`/org/freedesktop/portal/desktop`).
The portal interfaces include APIs for file access, opening URIs, printing
and others.
<a href="https://flatpak.github.io/xdg-desktop-portal/docs" class="pixelbutton"><picture>
<source srcset="assets/docs-button-dark.png" media="(prefers-color-scheme: dark)">
<img alt="Documentation for the available D-Bus interfaces" src="assets/docs-button.png">
</picture></a>
## Version Numbering
xdg-desktop-portal uses even minor version numbers for stable versions, and odd
minor version numbers for unstable versions. During an unstable version cycle,
portal APIs can make backward incompatible changes, meaning that applications
should only depend on APIs defined in stable xdg-desktop-portal versions in
production.
## Building xdg-desktop-portal
xdg-desktop-portal depends on GLib and Flatpak. To build the documentation, you
will need xmlto and the docbook stylesheets. For more instructions, please read
[CONTRIBUTING.md](https://github.com/flatpak/xdg-desktop-portal/blob/main/CONTRIBUTING.md).
## Using Portals
Flatpak grants sandboxed applications _talk_ access to names in the
org.freedesktop.portal.\* prefix. One possible way to use the portal APIs
is thus just to make D-Bus calls. For many of the portals, toolkits (e.g.
GTK) are expected to support portals transparently if you use suitable
high-level APIs.
To implement most portals, xdg-desktop-portal relies on a backend
that provides implementations of the org.freedesktop.impl.portal.\* interfaces.
Here are some examples of available backends:
- GTK [xdg-desktop-portal-gtk](http://github.com/flatpak/xdg-desktop-portal-gtk)
- GNOME [xdg-desktop-portal-gnome](https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome/)
- KDE [xdg-desktop-portal-kde](https://invent.kde.org/plasma/xdg-desktop-portal-kde)
- LXQt [xdg-desktop-portal-lxqt](https://github.com/lxqt/xdg-desktop-portal-lxqt)
- Pantheon (elementary OS) [xdg-desktop-portal-pantheon](https://github.com/elementary/portals)
- wlroots [xdg-desktop-portal-wlr](https://github.com/emersion/xdg-desktop-portal-wlr)
- Deepin [xdg-desktop-portal-dde](https://github.com/linuxdeepin/xdg-desktop-portal-dde)
- Xapp (Cinnamon, MATE, Xfce) [xdg-desktop-portal-xapp](https://github.com/linuxmint/xdg-desktop-portal-xapp)
- COSMIC [xdg-desktop-portal-cosmic](https://github.com/pop-os/xdg-desktop-portal-cosmic)
## Design Considerations
There are several reasons for the frontend/backend separation of the portal
code:
- We want to have _native_ portal dialogs that match the session desktop (i.e.
GTK dialogs for GNOME, Qt dialogs for KDE)
- One of the limitations of the D-Bus proxying in flatpak is that allowing a
sandboxed app to talk to a name implicitly also allows it to talk to any other
name owned by the same unique name. Therefore, sandbox-facing D-Bus APIs
should generally be hosted on a dedicated bus connection. For portals, the
frontend takes care of this for us.
- The frontend can handle all the interaction with _portal infrastructure_, such
as the permission store and the document store, freeing the backends to focus
on just providing a user interface.
- The frontend can also handle argument validation, and be strict about only
letting valid requests through to the backend.
The portal apis are all following the pattern of an initial method call, whose
response returns an object handle for an _org.freedesktop.portal.Request_ object
that represents the portal interaction. The end of the interaction is done via a
_Response_ signal that gets emitted on that object. This pattern was chosen over
a simple method call with return, since portal APIs are expected to show dialogs
and interact with the user, which may well take longer than the maximum method
call timeout of D-Bus. Another advantage is that the caller can cancel an
ongoing interaction by calling the _Cancel_ method on the request object.
One consideration for deciding the shape of portal APIs is that we want them to
'hide' behind existing library APIs where possible, to make it as easy as
possible to have apps use them _transparently_. For example, the OpenFile portal
is working well as a backend for the GtkFileChooserNative API.
When it comes to files, we need to be careful to not let portal APIs subvert the
limited filesystem view that apps have in their sandbox. Therefore, files should
only be passed into portal APIs in one of two forms:
- As a document ID referring to a file that has been exported in the document
portal
- As an open fd. The portal can work its way back to a file path from the fd,
and passing an fd proves that the app inside the sandbox has access to the
file to open it.
When it comes to processes, passing PIDs around is not useful in a sandboxed
world where apps are likely in their own PID namespace. And passing PIDs from
inside the sandbox is problematic, since the app can just lie.
## Contributing
XDG Desktop Portals is [Free Software](https://www.gnu.org/philosophy/free-sw.html). Contributions [welcome](https://github.com/flatpak/xdg-desktop-portal/blob/main/CONTRIBUTING.md).

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M3385 6944 c-22 -3 -88 -14 -148 -25 -304 -56 -566 -191 -814 -419
-216 -197 -1977 -1972 -2035 -2050 -331 -447 -421 -986 -248 -1475 42 -116 83
-199 161 -316 55 -84 184 -216 1163 -1195 974 -974 1112 -1108 1194 -1163 162
-106 332 -177 522 -218 67 -14 130 -18 295 -18 182 0 223 3 312 23 253 57 456
149 652 298 117 88 2122 2094 2192 2192 213 300 312 602 312 952 0 240 -40
424 -137 626 -63 130 -113 208 -207 319 -37 44 -535 546 -1106 1116 -966 964
-1045 1041 -1145 1107 -176 116 -363 193 -553 227 -90 16 -334 27 -410 19z
m325 -890 c41 -13 102 -41 135 -63 34 -23 190 -170 365 -346 l305 -306 -85 39
c-196 91 -399 152 -625 189 -170 28 -526 25 -699 -6 -184 -32 -351 -83 -541
-165 -33 -14 5 28 210 234 138 138 273 268 300 290 202 157 419 203 635 134z
m-80 -834 c807 -72 1462 -621 1669 -1401 55 -206 65 -292 65 -539 -1 -187 -4
-245 -22 -344 -39 -211 -106 -416 -195 -591 -38 -77 -64 -104 -626 -668 -324
-325 -612 -607 -645 -629 -137 -95 -266 -132 -426 -125 -117 5 -202 30 -287
85 -26 17 -232 216 -458 443 -386 387 -406 409 -345 376 149 -81 372 -158 560
-193 115 -22 410 -30 541 -14 140 16 341 69 471 123 384 162 703 467 878 839
236 505 204 1111 -84 1553 -261 401 -650 638 -1121 685 -554 55 -1095 -235
-1334 -714 -103 -207 -136 -352 -135 -591 0 -142 4 -185 23 -265 111 -453 439
-772 886 -862 82 -16 125 -19 235 -14 201 7 350 52 497 148 199 130 344 329
404 553 26 96 31 296 10 390 -29 135 -98 268 -188 366 -269 290 -703 319 -958
64 -80 -79 -127 -160 -150 -256 -38 -162 -1 -311 106 -424 68 -72 143 -107
240 -113 67 -4 84 -1 130 21 84 38 134 80 159 133 51 104 15 247 -76 300 -38
22 -53 26 -102 22 -31 -3 -65 -9 -74 -13 -28 -11 -23 28 8 65 95 112 308 96
437 -32 73 -73 109 -158 115 -272 9 -169 -41 -300 -157 -417 -169 -169 -435
-221 -682 -133 -346 123 -555 493 -495 879 30 200 118 377 255 516 124 124
257 202 436 255 112 32 320 44 442 24 462 -74 806 -389 930 -850 35 -131 43
-371 18 -521 -45 -268 -159 -498 -346 -694 -189 -197 -423 -324 -713 -387
-145 -32 -425 -31 -573 0 -409 88 -738 307 -959 639 -417 624 -331 1496 202
2052 372 388 887 579 1434 531z m-2094 -877 c-114 -267 -166 -523 -166 -818 0
-333 62 -605 201 -882 l59 -118 -309 310 c-288 289 -311 315 -344 385 -47 99
-61 176 -55 303 4 81 12 119 36 184 52 141 104 207 365 471 133 133 242 242
244 242 1 0 -13 -35 -31 -77z m4448 -493 c68 -103 88 -166 94 -300 5 -141 -9
-206 -74 -339 -41 -83 -61 -109 -172 -223 -69 -70 -127 -126 -129 -124 -2 2 1
32 6 67 6 35 15 130 20 212 26 384 -51 796 -210 1137 l-50 105 236 -235 c140
-139 254 -262 279 -300z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,18 @@
{
"name": "XDG Desktop Portal",
"short_name": "XDG Desktop Portal",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#F6D32D",
"background_color": "#F6D32D"
}

View File

@@ -0,0 +1,498 @@
/*
OS Component Website
====================
shamelessly stolen CSS from systemd
https://github.com/systemd/systemd/tree/main/docs
*/
/* GNOME Color Palette */
:root {
--rounded-corner: 12px;
--blue1: rgb(153,193,241);
--blue2: rgb(98,160,234);
--blue3: rgb(53,132,228);
--blue4: rgb(28,113,216);
--blue5: rgb(26,95,180);
--green1: rgb(143,240,164);
--green2: rgb(87,227,137);
--green3: rgb(51,209,122);
--green4: rgb(46,194,126);
--green5: rgb(38,162,105);
--yellow1: rgb(249,240,107);
--yellow2: rgb(248,228,92);
--yellow3: rgb(246,211,45);
--yellow4: rgb(245,194,17);
--yellow5: rgb(229,165,10);
--orange1: rgb(255,190,111);
--orange2: rgb(255,163,72);
--orange3: rgb(255,120,0);
--orange4: rgb(230,97,0);
--orange5: rgb(198,70,0);
--red1: rgb(246,97,81);
--red2: rgb(237,51,59);
--red3: rgb(224,27,36);
--red4: rgb(192,28,40);
--red5: rgb(165,29,45);
--purple1: rgb(220,138,221);
--purple2: rgb(192,97,203);
--purple3: rgb(145,65,172);
--purple4: rgb(129,61,156);
--purple5: rgb(97,53,131);
--brown1: rgb(205,171,143);
--brown2: rgb(181,131,90);
--brown3: rgb(152,106,68);
--brown4: rgb(134,94,60);
--brown5: rgb(99,69,44);
--light1: rgb(255,255,255);
--light2: rgb(246,245,244);
--light3: rgb(222,221,218);
--light4: rgb(192,191,188);
--light5: rgb(154,153,150);
--dark1: rgb(119,118,123);
--dark2: rgb(94,92,100);
--dark3: rgb(61,56,70);
--dark4: rgb(36,31,49);
--dark5: rgb(0,0,0);
--primary-color: var(--green5); /* Set your project color */
--borders: var(--light3);
--fg-color: #241f31;
--bg-color: var(--light2);
--term-fg: var(--dark3);
--term-bg: var(--light1);
--term-br: 9px;
}
@media (prefers-color-scheme: dark) {
:root {
color-scheme: dark;
--fg-color: #eee;
--bg-color: #0d2542;
--term-fg: var(--light1);
--term-bg: var(--dark4);
--primary-color: var(--orange1);
}
}
/* Typography */
@font-face {
font-family: 'Inter Var';
font-weight: 100 900;
font-display: swap;
font-style: oblique italic 0deg 10deg;
src: url("fonts/Inter.var.woff2?v=3.19") format("woff2");
}
* {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
html, body {
margin: 0;
padding: 0;
font-size: 16px;
font-family: "Inter Var", sans-serif;
font-weight: 400;
line-height: 1.6;
scroll-behavior: smooth;
}
body {
color: var(--fg-color);
background-color: var(--bg-color);
/* ⇩⇩ put footer at the bottom for short pages, such as the 404 ⇩⇩ */
display: grid;
min-height: 100vh;
grid-template-rows: auto minmax(auto,1fr) auto; /* header, stuff, footer */
}
h1, h2, h3, h4, h5, h6 {
margin: 3rem 0 1rem;
font-weight: 600;
line-height: 1.25;
font-variation-settings: "wght" 600; /* needed for webkit */
}
h1 {
font-size: 1.5rem;
font-weight: 100;
font-style: normal;
margin: 3rem 0 1rem;
}
@media screen and (min-width: 650px) {
h1 {
font-size: 1.6rem;
}
}
h2 {
font-size: 1.2rem;
}
a {
font-weight: 600;
text-decoration: none;
color: var(--primary-color);
cursor: pointer;
font-variation-settings: "wght" 600; /* needed for webkit */
}
a:hover {
text-decoration: underline;
}
b {
font-weight: 600;
}
small {
color: #777;
}
hr {
margin: 3rem auto 4rem;
width: 40%;
opacity: 40%;
}
img {
display: block;
margin: 2rem auto;
max-width: 100%;
}
img.full, picture.full img { width: 100%; }
img.pixels, picture.pixels img {
image-rendering: crisp-edges; /* older firefox browsers */
image-rendering: pixelated;
}
/* Layout */
.container {
width: 80%;
margin-left: auto;
margin-right: auto;
max-width: 720px;
}
/* Singletons */
#logo {
display: block;
width: 251px; height: 26px;
background: url('assets/page-logo.svg') no-repeat center;
padding: 5rem 0 3rem;
margin: 0 auto;
position: relative;
}
#logo a {
display: block;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
color: rgba(0,0,0,0); /* make text transparent */
cursor: pointer;
}
.page-logo > img {
margin: 0 auto;
}
@media (prefers-color-scheme: dark) {
#logo {
background-image: url('assets/page-logo-i.svg');
}
}
.brand-white {
background-color: #fff;
}
.brand-green {
background-color: #30D475;
}
.brand-black {
background-color: #201A26;
color: white;
}
.page-link::after {
content: " ➜";
}
/* Footer */
footer {
text-align: center;
padding: 3em 0 3em;
font-size: 1em;
margin-top: 4rem;
}
/* Make tables vertically aligned to the top */
tbody td {
vertical-align: top;
}
/* Github Code Highlighting */
.highlight table td { padding: 5px; }
.highlight table pre { margin: 0; }
.highlight .cm {
color: #999988;
font-style: italic;
}
.highlight .cp {
color: #999999;
font-weight: bold;
}
.highlight .c1 {
color: #999988;
font-style: italic;
}
.highlight .cs {
color: #999999;
font-weight: bold;
font-style: italic;
}
.highlight .c, .highlight .ch, .highlight .cd, .highlight .cpf {
color: #999988;
font-style: italic;
}
.highlight .err {
color: #a61717;
background-color: #e3d2d2;
}
.highlight .gd {
color: #000000;
background-color: #ffdddd;
}
.highlight .ge {
color: #000000;
font-style: italic;
}
.highlight .gr {
color: #aa0000;
}
.highlight .gh {
color: #999999;
}
.highlight .gi {
color: #000000;
background-color: #ddffdd;
}
.highlight .go {
color: #888888;
}
.highlight .gp {
color: #555555;
}
.highlight .gs {
font-weight: bold;
}
.highlight .gu {
color: #aaaaaa;
}
.highlight .gt {
color: #aa0000;
}
.highlight .kc {
color: #000000;
font-weight: bold;
}
.highlight .kd {
color: #000000;
font-weight: bold;
}
.highlight .kn {
color: #000000;
font-weight: bold;
}
.highlight .kp {
color: #000000;
font-weight: bold;
}
.highlight .kr {
color: #000000;
font-weight: bold;
}
.highlight .kt {
color: #445588;
font-weight: bold;
}
.highlight .k, .highlight .kv {
color: #000000;
font-weight: bold;
}
.highlight .mf {
color: #009999;
}
.highlight .mh {
color: #009999;
}
.highlight .il {
color: #009999;
}
.highlight .mi {
color: #009999;
}
.highlight .mo {
color: #009999;
}
.highlight .m, .highlight .mb, .highlight .mx {
color: #009999;
}
.highlight .sb {
color: #d14;
}
.highlight .sc {
color: #d14;
}
.highlight .sd {
color: #d14;
}
.highlight .s2 {
color: #d14;
}
.highlight .se {
color: #d14;
}
.highlight .sh {
color: #d14;
}
.highlight .si {
color: #d14;
}
.highlight .sx {
color: #d14;
}
.highlight .sr {
color: #009926;
}
.highlight .s1 {
color: #d14;
}
.highlight .ss {
color: #990073;
}
.highlight .s, .highlight .sa, .highlight .dl {
color: #d14;
}
.highlight .na {
color: #008080;
}
.highlight .bp {
color: #999999;
}
.highlight .nb {
color: #0086B3;
}
.highlight .nc {
color: #445588;
font-weight: bold;
}
.highlight .no {
color: #008080;
}
.highlight .nd {
color: #3c5d5d;
font-weight: bold;
}
.highlight .ni {
color: #800080;
}
.highlight .ne {
color: #990000;
font-weight: bold;
}
.highlight .nf, .highlight .fm {
color: #990000;
font-weight: bold;
}
.highlight .nl {
color: #990000;
font-weight: bold;
}
.highlight .nn {
color: #555555;
}
.highlight .nt {
color: #000080;
}
.highlight .vc {
color: #008080;
}
.highlight .vg {
color: #008080;
}
.highlight .vi {
color: #008080;
}
.highlight .nv, .highlight .vm {
color: #008080;
}
.highlight .ow {
color: #000000;
font-weight: bold;
}
.highlight .o {
color: #000000;
font-weight: bold;
}
.highlight .w {
color: #bbbbbb;
}
.highlight {
}
/* Code Blocks */
.highlighter-rouge {
font-size: 80%;
line-height: normal;
padding: 2px 1rem;
border-radius: var(--term-br);
background-color: var(--term-bg);
max-width: 100vw;
overflow-x: auto;
margin: 1rem 0;
}
@media only screen and (max-device-width : 480px) {
/*mobile*/
.highlighter-rouge { max-width: 80vw; }
}
.highlighter-rouge * {
}
/* Inline Code */
code.highlighter-rouge {
padding: 2px 6px;
background-color: var(--term-bg);
}
/* Buttons */
.dialog-buttons {
display: flex;
flex-direction: row;
align-items: baseline;
justify-content: space-between;
margin-top: 6rem;
}
.inline-button {
display: inline-block;
font-weight: 900;
font-size: 90%;
padding: .4rem 1rem;
border-radius: var(--rounded-corner);
background-color: var(--term-bg);
color: var(--fg-color);
}
a.pixelbutton img { transition: all ease-out 300ms; }
a.pixelbutton:hover img {
filter: brightness(1.3) hue-rotate(-2deg) contrast(130%) drop-shadow(0px 2px 2px rgba(0,0,0,0.5));
}
a.pixelbutton:active img {
filter: brightness(0.9) hue-rotate(-2deg) contrast(130%);
translate: 0 2px;
}