├── CHANGELOG ├── CMakeLists.txt ├── LICENSE ├── README.md ├── data ├── CMakeLists.txt ├── lxqt-portals.conf ├── lxqt.portal ├── org.freedesktop.impl.portal.desktop.lxqt.desktop.in └── org.freedesktop.impl.portal.desktop.lxqt.service.in └── src ├── CMakeLists.txt ├── desktopportal.cpp ├── desktopportal.h ├── filechooser.cpp ├── filechooser.h ├── filedialoghelper.cpp ├── filedialoghelper.h ├── main.cpp ├── utils.cpp └── utils.h /CHANGELOG: -------------------------------------------------------------------------------- 1 | xdg-desktop-portal-lxqt-1.2.0 / 2025-04-17 2 | ========================================== 3 | * Don't fork a child process in the portal's service. 4 | 5 | xdg-desktop-portal-lxqt-1.1.0 / 2024-11-05 6 | ========================================== 7 | * Added the conf file `lxqt-portals.conf`. 8 | 9 | xdg-desktop-portal-lxqt-1.0.2 / 2024-05-04 10 | ========================================== 11 | * Fixed the initial path (the credit goes to the KDE team for their solution in `xdg-desktop-portal-kde`). 12 | 13 | xdg-desktop-portal-lxqt-1.0.1 / 2024-04-18 14 | ========================================== 15 | * Removed the redundant `qt5x11extra` dependency. 16 | 17 | xdg-desktop-portal-lxqt-1.0.0 / 2024-04-17 18 | ========================================== 19 | * Support `current_folder` when opening files. 20 | * Transfer ownership of options widget. 21 | * Convert mimetype filters to name filters. 22 | * Ported to Qt6. 23 | 24 | xdg-desktop-portal-lxqt-0.5.0 / 2023-11-05 25 | ========================================== 26 | * Made it depending on libfm-qt-1.4.0 and bumped the version. 27 | 28 | xdg-desktop-portal-lxqt-0.4.0 / 2023-04-15 29 | ========================================== 30 | * Bumped the version 31 | 32 | xdg-desktop-portal-lxqt-0.3.0 / 2022-11-05 33 | ========================================== 34 | * Updated and improved `README.md`. 35 | 36 | xdg-desktop-portal-lxqt-0.2.0 / 2022-04-15 37 | ========================================== 38 | * Use Fm:FileDialogHelper (apps using `xdg-portal` will behave like the native Qt apps under LXQt). 39 | 40 | xdg-desktop-portal-lxqt-0.1.0 / 2022-02-03 41 | ========================================== 42 | * Initial release. 43 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.18.0) 2 | 3 | set(PROJECT_VERSION "1.2.0") 4 | 5 | project(xdg-desktop-portal-lxqt VERSION ${PROJECT_VERSION}) 6 | 7 | set(QT_MIN_VERSION "6.6.0") 8 | set(LIBFMQT_MINIMUM_VERSION "2.2.0") 9 | set(KF6_MIN_VERSION "6.0.0") 10 | 11 | set(CMAKE_AUTOMOC on) 12 | 13 | include(FeatureSummary) 14 | include(GNUInstallDirs) 15 | 16 | find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS 17 | Core 18 | DBus 19 | Widgets 20 | ) 21 | find_package(fm-qt6 ${LIBFMQT_MINIMUM_VERSION} REQUIRED) 22 | find_package(KF6WindowSystem ${KF6_MIN_VERSION} REQUIRED) 23 | 24 | add_subdirectory(data) 25 | add_subdirectory(src) 26 | 27 | feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | 3 | Version 2.1, February 1999 4 | 5 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 6 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 7 | 8 | Everyone is permitted to copy and distribute verbatim copies of this license 9 | document, but changing it is not allowed. 10 | 11 | [This is the first released version of the Lesser GPL. It also counts as 12 | the successor of the GNU Library Public License, version 2, hence the version 13 | number 2.1.] 14 | 15 | Preamble 16 | 17 | The licenses for most software are designed to take away your freedom to share 18 | and change it. By contrast, the GNU General Public Licenses are intended to 19 | guarantee your freedom to share and change free software--to make sure the 20 | software is free for all its users. 21 | 22 | This license, the Lesser General Public License, applies to some specially 23 | designated software packages--typically libraries--of the Free Software Foundation 24 | and other authors who decide to use it. You can use it too, but we suggest 25 | you first think carefully about whether this license or the ordinary General 26 | Public License is the better strategy to use in any particular case, based 27 | on the explanations below. 28 | 29 | When we speak of free software, we are referring to freedom of use, not price. 30 | Our General Public Licenses are designed to make sure that you have the freedom 31 | to distribute copies of free software (and charge for this service if you 32 | wish); that you receive source code or can get it if you want it; that you 33 | can change the software and use pieces of it in new free programs; and that 34 | you are informed that you can do these things. 35 | 36 | To protect your rights, we need to make restrictions that forbid distributors 37 | to deny you these rights or to ask you to surrender these rights. These restrictions 38 | translate to certain responsibilities for you if you distribute copies of 39 | the library or if you modify it. 40 | 41 | For example, if you distribute copies of the library, whether gratis or for 42 | a fee, you must give the recipients all the rights that we gave you. You must 43 | make sure that they, too, receive or can get the source code. If you link 44 | other code with the library, you must provide complete object files to the 45 | recipients, so that they can relink them with the library after making changes 46 | to the library and recompiling it. And you must show them these terms so they 47 | know their rights. 48 | 49 | We protect your rights with a two-step method: (1) we copyright the library, 50 | and (2) we offer you this license, which gives you legal permission to copy, 51 | distribute and/or modify the library. 52 | 53 | To protect each distributor, we want to make it very clear that there is no 54 | warranty for the free library. Also, if the library is modified by someone 55 | else and passed on, the recipients should know that what they have is not 56 | the original version, so that the original author's reputation will not be 57 | affected by problems that might be introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of any free 60 | program. We wish to make sure that a company cannot effectively restrict the 61 | users of a free program by obtaining a restrictive license from a patent holder. 62 | Therefore, we insist that any patent license obtained for a version of the 63 | library must be consistent with the full freedom of use specified in this 64 | license. 65 | 66 | Most GNU software, including some libraries, is covered by the ordinary GNU 67 | General Public License. This license, the GNU Lesser General Public License, 68 | applies to certain designated libraries, and is quite different from the ordinary 69 | General Public License. We use this license for certain libraries in order 70 | to permit linking those libraries into non-free programs. 71 | 72 | When a program is linked with a library, whether statically or using a shared 73 | library, the combination of the two is legally speaking a combined work, a 74 | derivative of the original library. The ordinary General Public License therefore 75 | permits such linking only if the entire combination fits its criteria of freedom. 76 | The Lesser General Public License permits more lax criteria for linking other 77 | code with the library. 78 | 79 | We call this license the "Lesser" General Public License because it does Less 80 | to protect the user's freedom than the ordinary General Public License. It 81 | also provides other free software developers Less of an advantage over competing 82 | non-free programs. These disadvantages are the reason we use the ordinary 83 | General Public License for many libraries. However, the Lesser license provides 84 | advantages in certain special circumstances. 85 | 86 | For example, on rare occasions, there may be a special need to encourage the 87 | widest possible use of a certain library, so that it becomes a de-facto standard. 88 | To achieve this, non-free programs must be allowed to use the library. A more 89 | frequent case is that a free library does the same job as widely used non-free 90 | libraries. In this case, there is little to gain by limiting the free library 91 | to free software only, so we use the Lesser General Public License. 92 | 93 | In other cases, permission to use a particular library in non-free programs 94 | enables a greater number of people to use a large body of free software. For 95 | example, permission to use the GNU C Library in non-free programs enables 96 | many more people to use the whole GNU operating system, as well as its variant, 97 | the GNU/Linux operating system. 98 | 99 | Although the Lesser General Public License is Less protective of the users' 100 | freedom, it does ensure that the user of a program that is linked with the 101 | Library has the freedom and the wherewithal to run that program using a modified 102 | version of the Library. 103 | 104 | The precise terms and conditions for copying, distribution and modification 105 | follow. Pay close attention to the difference between a "work based on the 106 | library" and a "work that uses the library". The former contains code derived 107 | from the library, whereas the latter must be combined with the library in 108 | order to run. 109 | 110 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 111 | 112 | 0. This License Agreement applies to any software library or other program 113 | which contains a notice placed by the copyright holder or other authorized 114 | party saying it may be distributed under the terms of this Lesser General 115 | Public License (also called "this License"). Each licensee is addressed as 116 | "you". 117 | 118 | A "library" means a collection of software functions and/or data prepared 119 | so as to be conveniently linked with application programs (which use some 120 | of those functions and data) to form executables. 121 | 122 | The "Library", below, refers to any such software library or work which has 123 | been distributed under these terms. A "work based on the Library" means either 124 | the Library or any derivative work under copyright law: that is to say, a 125 | work containing the Library or a portion of it, either verbatim or with modifications 126 | and/or translated straightforwardly into another language. (Hereinafter, translation 127 | is included without limitation in the term "modification".) 128 | 129 | "Source code" for a work means the preferred form of the work for making modifications 130 | to it. For a library, complete source code means all the source code for all 131 | modules it contains, plus any associated interface definition files, plus 132 | the scripts used to control compilation and installation of the library. 133 | 134 | Activities other than copying, distribution and modification are not covered 135 | by this License; they are outside its scope. The act of running a program 136 | using the Library is not restricted, and output from such a program is covered 137 | only if its contents constitute a work based on the Library (independent of 138 | the use of the Library in a tool for writing it). Whether that is true depends 139 | on what the Library does and what the program that uses the Library does. 140 | 141 | 1. You may copy and distribute verbatim copies of the Library's complete source 142 | code as you receive it, in any medium, provided that you conspicuously and 143 | appropriately publish on each copy an appropriate copyright notice and disclaimer 144 | of warranty; keep intact all the notices that refer to this License and to 145 | the absence of any warranty; and distribute a copy of this License along with 146 | the Library. 147 | 148 | You may charge a fee for the physical act of transferring a copy, and you 149 | may at your option offer warranty protection in exchange for a fee. 150 | 151 | 2. You may modify your copy or copies of the Library or any portion of it, 152 | thus forming a work based on the Library, and copy and distribute such modifications 153 | or work under the terms of Section 1 above, provided that you also meet all 154 | of these conditions: 155 | 156 | a) The modified work must itself be a software library. 157 | 158 | b) You must cause the files modified to carry prominent notices stating that 159 | you changed the files and the date of any change. 160 | 161 | c) You must cause the whole of the work to be licensed at no charge to all 162 | third parties under the terms of this License. 163 | 164 | d) If a facility in the modified Library refers to a function or a table of 165 | data to be supplied by an application program that uses the facility, other 166 | than as an argument passed when the facility is invoked, then you must make 167 | a good faith effort to ensure that, in the event an application does not supply 168 | such function or table, the facility still operates, and performs whatever 169 | part of its purpose remains meaningful. 170 | 171 | (For example, a function in a library to compute square roots has a purpose 172 | that is entirely well-defined independent of the application. Therefore, Subsection 173 | 2d requires that any application-supplied function or table used by this function 174 | must be optional: if the application does not supply it, the square root function 175 | must still compute square roots.) 176 | 177 | These requirements apply to the modified work as a whole. If identifiable 178 | sections of that work are not derived from the Library, and can be reasonably 179 | considered independent and separate works in themselves, then this License, 180 | and its terms, do not apply to those sections when you distribute them as 181 | separate works. But when you distribute the same sections as part of a whole 182 | which is a work based on the Library, the distribution of the whole must be 183 | on the terms of this License, whose permissions for other licensees extend 184 | to the entire whole, and thus to each and every part regardless of who wrote 185 | it. 186 | 187 | Thus, it is not the intent of this section to claim rights or contest your 188 | rights to work written entirely by you; rather, the intent is to exercise 189 | the right to control the distribution of derivative or collective works based 190 | on the Library. 191 | 192 | In addition, mere aggregation of another work not based on the Library with 193 | the Library (or with a work based on the Library) on a volume of a storage 194 | or distribution medium does not bring the other work under the scope of this 195 | License. 196 | 197 | 3. You may opt to apply the terms of the ordinary GNU General Public License 198 | instead of this License to a given copy of the Library. To do this, you must 199 | alter all the notices that refer to this License, so that they refer to the 200 | ordinary GNU General Public License, version 2, instead of to this License. 201 | (If a newer version than version 2 of the ordinary GNU General Public License 202 | has appeared, then you can specify that version instead if you wish.) Do not 203 | make any other change in these notices. 204 | 205 | Once this change is made in a given copy, it is irreversible for that copy, 206 | so the ordinary GNU General Public License applies to all subsequent copies 207 | and derivative works made from that copy. 208 | 209 | This option is useful when you wish to copy part of the code of the Library 210 | into a program that is not a library. 211 | 212 | 4. You may copy and distribute the Library (or a portion or derivative of 213 | it, under Section 2) in object code or executable form under the terms of 214 | Sections 1 and 2 above provided that you accompany it with the complete corresponding 215 | machine-readable source code, which must be distributed under the terms of 216 | Sections 1 and 2 above on a medium customarily used for software interchange. 217 | 218 | If distribution of object code is made by offering access to copy from a designated 219 | place, then offering equivalent access to copy the source code from the same 220 | place satisfies the requirement to distribute the source code, even though 221 | third parties are not compelled to copy the source along with the object code. 222 | 223 | 5. A program that contains no derivative of any portion of the Library, but 224 | is designed to work with the Library by being compiled or linked with it, 225 | is called a "work that uses the Library". Such a work, in isolation, is not 226 | a derivative work of the Library, and therefore falls outside the scope of 227 | this License. 228 | 229 | However, linking a "work that uses the Library" with the Library creates an 230 | executable that is a derivative of the Library (because it contains portions 231 | of the Library), rather than a "work that uses the library". The executable 232 | is therefore covered by this License. Section 6 states terms for distribution 233 | of such executables. 234 | 235 | When a "work that uses the Library" uses material from a header file that 236 | is part of the Library, the object code for the work may be a derivative work 237 | of the Library even though the source code is not. Whether this is true is 238 | especially significant if the work can be linked without the Library, or if 239 | the work is itself a library. The threshold for this to be true is not precisely 240 | defined by law. 241 | 242 | If such an object file uses only numerical parameters, data structure layouts 243 | and accessors, and small macros and small inline functions (ten lines or less 244 | in length), then the use of the object file is unrestricted, regardless of 245 | whether it is legally a derivative work. (Executables containing this object 246 | code plus portions of the Library will still fall under Section 6.) 247 | 248 | Otherwise, if the work is a derivative of the Library, you may distribute 249 | the object code for the work under the terms of Section 6. Any executables 250 | containing that work also fall under Section 6, whether or not they are linked 251 | directly with the Library itself. 252 | 253 | 6. As an exception to the Sections above, you may also combine or link a "work 254 | that uses the Library" with the Library to produce a work containing portions 255 | of the Library, and distribute that work under terms of your choice, provided 256 | that the terms permit modification of the work for the customer's own use 257 | and reverse engineering for debugging such modifications. 258 | 259 | You must give prominent notice with each copy of the work that the Library 260 | is used in it and that the Library and its use are covered by this License. 261 | You must supply a copy of this License. If the work during execution displays 262 | copyright notices, you must include the copyright notice for the Library among 263 | them, as well as a reference directing the user to the copy of this License. 264 | Also, you must do one of these things: 265 | 266 | a) Accompany the work with the complete corresponding machine-readable source 267 | code for the Library including whatever changes were used in the work (which 268 | must be distributed under Sections 1 and 2 above); and, if the work is an 269 | executable linked with the Library, with the complete machine-readable "work 270 | that uses the Library", as object code and/or source code, so that the user 271 | can modify the Library and then relink to produce a modified executable containing 272 | the modified Library. (It is understood that the user who changes the contents 273 | of definitions files in the Library will not necessarily be able to recompile 274 | the application to use the modified definitions.) 275 | 276 | b) Use a suitable shared library mechanism for linking with the Library. A 277 | suitable mechanism is one that (1) uses at run time a copy of the library 278 | already present on the user's computer system, rather than copying library 279 | functions into the executable, and (2) will operate properly with a modified 280 | version of the library, if the user installs one, as long as the modified 281 | version is interface-compatible with the version that the work was made with. 282 | 283 | c) Accompany the work with a written offer, valid for at least three years, 284 | to give the same user the materials specified in Subsection 6a, above, for 285 | a charge no more than the cost of performing this distribution. 286 | 287 | d) If distribution of the work is made by offering access to copy from a designated 288 | place, offer equivalent access to copy the above specified materials from 289 | the same place. 290 | 291 | e) Verify that the user has already received a copy of these materials or 292 | that you have already sent this user a copy. 293 | 294 | For an executable, the required form of the "work that uses the Library" must 295 | include any data and utility programs needed for reproducing the executable 296 | from it. However, as a special exception, the materials to be distributed 297 | need not include anything that is normally distributed (in either source or 298 | binary form) with the major components (compiler, kernel, and so on) of the 299 | operating system on which the executable runs, unless that component itself 300 | accompanies the executable. 301 | 302 | It may happen that this requirement contradicts the license restrictions of 303 | other proprietary libraries that do not normally accompany the operating system. 304 | Such a contradiction means you cannot use both them and the Library together 305 | in an executable that you distribute. 306 | 307 | 7. You may place library facilities that are a work based on the Library side-by-side 308 | in a single library together with other library facilities not covered by 309 | this License, and distribute such a combined library, provided that the separate 310 | distribution of the work based on the Library and of the other library facilities 311 | is otherwise permitted, and provided that you do these two things: 312 | 313 | a) Accompany the combined library with a copy of the same work based on the 314 | Library, uncombined with any other library facilities. This must be distributed 315 | under the terms of the Sections above. 316 | 317 | b) Give prominent notice with the combined library of the fact that part of 318 | it is a work based on the Library, and explaining where to find the accompanying 319 | uncombined form of the same work. 320 | 321 | 8. You may not copy, modify, sublicense, link with, or distribute the Library 322 | except as expressly provided under this License. Any attempt otherwise to 323 | copy, modify, sublicense, link with, or distribute the Library is void, and 324 | will automatically terminate your rights under this License. However, parties 325 | who have received copies, or rights, from you under this License will not 326 | have their licenses terminated so long as such parties remain in full compliance. 327 | 328 | 9. You are not required to accept this License, since you have not signed 329 | it. However, nothing else grants you permission to modify or distribute the 330 | Library or its derivative works. These actions are prohibited by law if you 331 | do not accept this License. Therefore, by modifying or distributing the Library 332 | (or any work based on the Library), you indicate your acceptance of this License 333 | to do so, and all its terms and conditions for copying, distributing or modifying 334 | the Library or works based on it. 335 | 336 | 10. Each time you redistribute the Library (or any work based on the Library), 337 | the recipient automatically receives a license from the original licensor 338 | to copy, distribute, link with or modify the Library subject to these terms 339 | and conditions. You may not impose any further restrictions on the recipients' 340 | exercise of the rights granted herein. You are not responsible for enforcing 341 | compliance by third parties with this License. 342 | 343 | 11. If, as a consequence of a court judgment or allegation of patent infringement 344 | or for any other reason (not limited to patent issues), conditions are imposed 345 | on you (whether by court order, agreement or otherwise) that contradict the 346 | conditions of this License, they do not excuse you from the conditions of 347 | this License. If you cannot distribute so as to satisfy simultaneously your 348 | obligations under this License and any other pertinent obligations, then as 349 | a consequence you may not distribute the Library at all. For example, if a 350 | patent license would not permit royalty-free redistribution of the Library 351 | by all those who receive copies directly or indirectly through you, then the 352 | only way you could satisfy both it and this License would be to refrain entirely 353 | from distribution of the Library. 354 | 355 | If any portion of this section is held invalid or unenforceable under any 356 | particular circumstance, the balance of the section is intended to apply, 357 | and the section as a whole is intended to apply in other circumstances. 358 | 359 | It is not the purpose of this section to induce you to infringe any patents 360 | or other property right claims or to contest validity of any such claims; 361 | this section has the sole purpose of protecting the integrity of the free 362 | software distribution system which is implemented by public license practices. 363 | Many people have made generous contributions to the wide range of software 364 | distributed through that system in reliance on consistent application of that 365 | system; it is up to the author/donor to decide if he or she is willing to 366 | distribute software through any other system and a licensee cannot impose 367 | that choice. 368 | 369 | This section is intended to make thoroughly clear what is believed to be a 370 | consequence of the rest of this License. 371 | 372 | 12. If the distribution and/or use of the Library is restricted in certain 373 | countries either by patents or by copyrighted interfaces, the original copyright 374 | holder who places the Library under this License may add an explicit geographical 375 | distribution limitation excluding those countries, so that distribution is 376 | permitted only in or among countries not thus excluded. In such case, this 377 | License incorporates the limitation as if written in the body of this License. 378 | 379 | 13. The Free Software Foundation may publish revised and/or new versions of 380 | the Lesser General Public License from time to time. Such new versions will 381 | be similar in spirit to the present version, but may differ in detail to address 382 | new problems or concerns. 383 | 384 | Each version is given a distinguishing version number. If the Library specifies 385 | a version number of this License which applies to it and "any later version", 386 | you have the option of following the terms and conditions either of that version 387 | or of any later version published by the Free Software Foundation. If the 388 | Library does not specify a license version number, you may choose any version 389 | ever published by the Free Software Foundation. 390 | 391 | 14. If you wish to incorporate parts of the Library into other free programs 392 | whose distribution conditions are incompatible with these, write to the author 393 | to ask for permission. For software which is copyrighted by the Free Software 394 | Foundation, write to the Free Software Foundation; we sometimes make exceptions 395 | for this. Our decision will be guided by the two goals of preserving the free 396 | status of all derivatives of our free software and of promoting the sharing 397 | and reuse of software generally. 398 | 399 | NO WARRANTY 400 | 401 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 402 | THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 403 | STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY 404 | "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 405 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 406 | FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE 407 | OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 408 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 409 | 410 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 411 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 412 | THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 413 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE 414 | OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA 415 | OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES 416 | OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH 417 | HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 418 | 419 | END OF TERMS AND CONDITIONS 420 | 421 | How to Apply These Terms to Your New Libraries 422 | 423 | If you develop a new library, and you want it to be of the greatest possible 424 | use to the public, we recommend making it free software that everyone can 425 | redistribute and change. You can do so by permitting redistribution under 426 | these terms (or, alternatively, under the terms of the ordinary General Public 427 | License). 428 | 429 | To apply these terms, attach the following notices to the library. It is safest 430 | to attach them to the start of each source file to most effectively convey 431 | the exclusion of warranty; and each file should have at least the "copyright" 432 | line and a pointer to where the full notice is found. 433 | 434 | one line to give the library's name and an idea of what it does. 435 | Copyright (C) year name of author 436 | 437 | This library is free software; you can redistribute it and/or modify it under 438 | the terms of the GNU Lesser General Public License as published by the Free 439 | Software Foundation; either version 2.1 of the License, or (at your option) 440 | any later version. 441 | 442 | This library is distributed in the hope that it will be useful, but WITHOUT 443 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 444 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 445 | details. 446 | 447 | You should have received a copy of the GNU Lesser General Public License along 448 | with this library; if not, write to the Free Software Foundation, Inc., 51 449 | Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information 450 | on how to contact you by electronic and paper mail. 451 | 452 | You should also get your employer (if you work as a programmer) or your school, 453 | if any, to sign a "copyright disclaimer" for the library, if necessary. Here 454 | is a sample; alter the names: 455 | 456 | Yoyodyne, Inc., hereby disclaims all copyright interest in 457 | the library `Frob' (a library for tweaking knobs) written 458 | by James Random Hacker. 459 | 460 | signature of Ty Coon, 1 April 1990 461 | Ty Coon, President of Vice 462 | That's all there is to it! 463 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xdg-desktop-portal-lxqt 2 | 3 | A backend implementation for [xdg-desktop-portal](http://github.com/flatpak/xdg-desktop-portal) 4 | that is using Qt/KF5/libfm-qt. 5 | 6 | ## Building xdg-desktop-portal-lxqt 7 | 8 | ### Dependencies: 9 | - Build + Runtime 10 | - Qt 6 11 | - KDE Frameworks - KWindowSystem 12 | - libfm-qt 13 | - Runtime only 14 | - Qt 6 15 | - KDE Frameworks - KWindowSystem 16 | - xdg-desktop-portal 17 | - libfm-qt 18 | 19 | ### Build instructions: 20 | ``` 21 | $ mkdir build && cd build 22 | $ cmake .. [your_options] 23 | $ make 24 | # make install 25 | ``` 26 | ### Use LXQt filedialog in applications 27 | 28 | * Firefox version 98 and higher: Open in the address bar `about:config`, search for "portal" and set both `widget.use-xdg-desktop-portal.file-picker` and `widget.use-xdg-desktop-portal.mime-handler` from `2` to `1`. 29 | * Thunderbird: Preferences > Configuration Editor `widget.use-xdg-desktop-portal` has to be set to `1`. 30 | * Some other GTK applications can be started with `GTK_USE_PORTAL=1 application` 31 | 32 | A general use of `GTK_USE_PORTAL=1` in `~/.profile` or `/etc/profile` can lead to issues and 33 | is not recommended. 34 | -------------------------------------------------------------------------------- /data/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | configure_file(org.freedesktop.impl.portal.desktop.lxqt.desktop.in org.freedesktop.impl.portal.desktop.lxqt.desktop @ONLY) 2 | configure_file(org.freedesktop.impl.portal.desktop.lxqt.service.in org.freedesktop.impl.portal.desktop.lxqt.service @ONLY) 3 | 4 | install(FILES lxqt-portals.conf DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/xdg-desktop-portal") 5 | install(FILES lxqt.portal DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/xdg-desktop-portal/portals") 6 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.impl.portal.desktop.lxqt.service DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/dbus-1/services") 7 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.impl.portal.desktop.lxqt.desktop DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications") 8 | -------------------------------------------------------------------------------- /data/lxqt-portals.conf: -------------------------------------------------------------------------------- 1 | [preferred] 2 | default=lxqt 3 | org.freedesktop.impl.portal.FileChooser=lxqt;gtk; 4 | -------------------------------------------------------------------------------- /data/lxqt.portal: -------------------------------------------------------------------------------- 1 | [portal] 2 | DBusName=org.freedesktop.impl.portal.desktop.lxqt 3 | Interfaces=org.freedesktop.impl.portal.FileChooser 4 | UseIn=LXQt 5 | -------------------------------------------------------------------------------- /data/org.freedesktop.impl.portal.desktop.lxqt.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Portal 4 | Name[az]=Portal 5 | Name[ca]=Portal 6 | Name[cs]=Portál 7 | Name[de]=Portal 8 | Name[el]=Πύλη 9 | Name[en_GB]=Portal 10 | Name[es]=Portal 11 | Name[eu]=Ataria 12 | Name[fi]=Portaali 13 | Name[fr]=Portail 14 | Name[hu]=Portál 15 | Name[ia]=Portal 16 | Name[it]=Portale 17 | Name[ko]=포털 18 | Name[lt]=Portalas 19 | Name[nl]=Portaal 20 | Name[nn]=Portal 21 | Name[pl]=Portal 22 | Name[pt]=Portal 23 | Name[pt_BR]=Portal 24 | Name[ro]=Portal 25 | Name[ru]=Портал 26 | Name[sk]=Portal 27 | Name[sl]=Portal 28 | Name[sv]=Portal 29 | Name[uk]=Портал 30 | Name[zh_CN]=系统门户 31 | Exec=@CMAKE_INSTALL_FULL_LIBEXECDIR@/xdg-desktop-portal-lxqt 32 | NoDisplay=true 33 | Icon=applications-other 34 | -------------------------------------------------------------------------------- /data/org.freedesktop.impl.portal.desktop.lxqt.service.in: -------------------------------------------------------------------------------- 1 | [D-BUS Service] 2 | Name=org.freedesktop.impl.portal.desktop.lxqt 3 | Exec=/bin/sh -c 'QT_QPA_PLATFORMTHEME=lxqt exec @CMAKE_INSTALL_FULL_LIBEXECDIR@/xdg-desktop-portal-lxqt' 4 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(SRCS 2 | utils.cpp 3 | filedialoghelper.cpp 4 | filechooser.cpp 5 | desktopportal.cpp 6 | main.cpp 7 | ) 8 | 9 | include_directories( 10 | ${Qt6Gui_PRIVATE_INCLUDE_DIRS} 11 | ) 12 | 13 | add_executable(xdg-desktop-portal-lxqt ${SRCS}) 14 | 15 | set_property(TARGET xdg-desktop-portal-lxqt PROPERTY CXX_STANDARD 14) 16 | set_property(TARGET xdg-desktop-portal-lxqt PROPERTY CXX_STANDARD_REQUIRED on) 17 | 18 | target_link_libraries(xdg-desktop-portal-lxqt 19 | Qt6::Core 20 | Qt6::DBus 21 | Qt6::Widgets 22 | fm-qt6 23 | KF6::WindowSystem 24 | ) 25 | 26 | install(TARGETS xdg-desktop-portal-lxqt DESTINATION ${CMAKE_INSTALL_FULL_LIBEXECDIR}) 27 | -------------------------------------------------------------------------------- /src/desktopportal.cpp: -------------------------------------------------------------------------------- 1 | /* BEGIN_COMMON_COPYRIGHT_HEADER 2 | * (c)LGPL2+ 3 | * 4 | * LXQt - a lightweight, Qt based, desktop toolset 5 | * https://lxqt-project.org 6 | * 7 | * Copyright: 2016 Red Hat Inc 8 | * Copyright: 2016 Jan Grulich 9 | * Copyright: 2021~ LXQt team 10 | * Authors: 11 | * Palo Kisa 12 | * 13 | * This program or library is free software; you can redistribute it 14 | * and/or modify it under the terms of the GNU Lesser General Public 15 | * License as published by the Free Software Foundation; either 16 | * version 2.1 of the License, or (at your option) any later version. 17 | * 18 | * This library is distributed in the hope that it will be useful, 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 | * Lesser General Public License for more details. 22 | 23 | * You should have received a copy of the GNU Lesser General 24 | * Public License along with this library; if not, write to the 25 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 26 | * Boston, MA 02110-1301 USA 27 | * 28 | * END_COMMON_COPYRIGHT_HEADER */ 29 | 30 | #include "desktopportal.h" 31 | #include "filechooser.h" 32 | 33 | namespace LXQt 34 | { 35 | DesktopPortal::DesktopPortal(QObject *parent) 36 | : QObject(parent) 37 | , m_fileChooser{new FileChooserPortal{this}} 38 | { 39 | } 40 | } 41 | 42 | -------------------------------------------------------------------------------- /src/desktopportal.h: -------------------------------------------------------------------------------- 1 | /* BEGIN_COMMON_COPYRIGHT_HEADER 2 | * (c)LGPL2+ 3 | * 4 | * LXQt - a lightweight, Qt based, desktop toolset 5 | * https://lxqt-project.org 6 | * 7 | * Copyright: 2016 Red Hat Inc 8 | * Copyright: 2016 Jan Grulich 9 | * Copyright: 2021~ LXQt team 10 | * Authors: 11 | * Palo Kisa 12 | * 13 | * This program or library is free software; you can redistribute it 14 | * and/or modify it under the terms of the GNU Lesser General Public 15 | * License as published by the Free Software Foundation; either 16 | * version 2.1 of the License, or (at your option) any later version. 17 | * 18 | * This library is distributed in the hope that it will be useful, 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 | * Lesser General Public License for more details. 22 | 23 | * You should have received a copy of the GNU Lesser General 24 | * Public License along with this library; if not, write to the 25 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 26 | * Boston, MA 02110-1301 USA 27 | * 28 | * END_COMMON_COPYRIGHT_HEADER */ 29 | 30 | #pragma once 31 | 32 | #include 33 | #include 34 | 35 | namespace LXQt 36 | { 37 | class FileChooserPortal; 38 | 39 | class DesktopPortal : public QObject, public QDBusContext 40 | { 41 | Q_OBJECT 42 | public: 43 | explicit DesktopPortal(QObject *parent = nullptr); 44 | 45 | private: 46 | FileChooserPortal *m_fileChooser; 47 | }; 48 | } 49 | -------------------------------------------------------------------------------- /src/filechooser.cpp: -------------------------------------------------------------------------------- 1 | /* BEGIN_COMMON_COPYRIGHT_HEADER 2 | * (c)LGPL2+ 3 | * 4 | * LXQt - a lightweight, Qt based, desktop toolset 5 | * https://lxqt-project.org 6 | * 7 | * Copyright: 2016-2018 Red Hat Inc 8 | * Copyright: 2016-2018 Jan Grulich 9 | * Copyright: 2021~ LXQt team 10 | * Authors: 11 | * Palo Kisa 12 | * 13 | * This program or library is free software; you can redistribute it 14 | * and/or modify it under the terms of the GNU Lesser General Public 15 | * License as published by the Free Software Foundation; either 16 | * version 2.1 of the License, or (at your option) any later version. 17 | * 18 | * This library is distributed in the hope that it will be useful, 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 | * Lesser General Public License for more details. 22 | 23 | * You should have received a copy of the GNU Lesser General 24 | * Public License along with this library; if not, write to the 25 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 26 | * Boston, MA 02110-1301 USA 27 | * 28 | * END_COMMON_COPYRIGHT_HEADER */ 29 | 30 | #include "filechooser.h" 31 | #include "utils.h" 32 | #include "filedialoghelper.h" 33 | 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | 48 | // Keep in sync with qflatpakfiledialog from flatpak-platform-plugin 49 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::Filter) 50 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::Filters) 51 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::FilterList) 52 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::FilterListList) 53 | // used for options - choices 54 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::Choice) 55 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::Choices) 56 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::Option) 57 | Q_DECLARE_METATYPE(LXQt::FileChooserPortal::OptionList) 58 | 59 | namespace LXQt 60 | { 61 | Q_LOGGING_CATEGORY(XdgDesktopPortalLxqtFileChooser, "xdp-lxqt-file-chooser") 62 | 63 | 64 | QDBusArgument &operator<<(QDBusArgument &arg, const FileChooserPortal::Filter &filter) 65 | { 66 | arg.beginStructure(); 67 | arg << filter.type << filter.filterString; 68 | arg.endStructure(); 69 | return arg; 70 | } 71 | 72 | const QDBusArgument &operator>>(const QDBusArgument &arg, FileChooserPortal::Filter &filter) 73 | { 74 | uint type; 75 | QString filterString; 76 | arg.beginStructure(); 77 | arg >> type >> filterString; 78 | filter.type = type; 79 | filter.filterString = filterString; 80 | arg.endStructure(); 81 | 82 | return arg; 83 | } 84 | 85 | QDBusArgument &operator<<(QDBusArgument &arg, const FileChooserPortal::FilterList &filterList) 86 | { 87 | arg.beginStructure(); 88 | arg << filterList.userVisibleName << filterList.filters; 89 | arg.endStructure(); 90 | return arg; 91 | } 92 | 93 | const QDBusArgument &operator>>(const QDBusArgument &arg, FileChooserPortal::FilterList &filterList) 94 | { 95 | QString userVisibleName; 96 | FileChooserPortal::Filters filters; 97 | arg.beginStructure(); 98 | arg >> userVisibleName >> filters; 99 | filterList.userVisibleName = userVisibleName; 100 | filterList.filters = filters; 101 | arg.endStructure(); 102 | 103 | return arg; 104 | } 105 | 106 | QDBusArgument &operator<<(QDBusArgument &arg, const FileChooserPortal::Choice &choice) 107 | { 108 | arg.beginStructure(); 109 | arg << choice.id << choice.value; 110 | arg.endStructure(); 111 | return arg; 112 | } 113 | 114 | const QDBusArgument &operator>>(const QDBusArgument &arg, FileChooserPortal::Choice &choice) 115 | { 116 | QString id; 117 | QString value; 118 | arg.beginStructure(); 119 | arg >> id >> value; 120 | choice.id = id; 121 | choice.value = value; 122 | arg.endStructure(); 123 | return arg; 124 | } 125 | 126 | QDBusArgument &operator<<(QDBusArgument &arg, const FileChooserPortal::Option &option) 127 | { 128 | arg.beginStructure(); 129 | arg << option.id << option.label << option.choices << option.initialChoiceId; 130 | arg.endStructure(); 131 | return arg; 132 | } 133 | 134 | const QDBusArgument &operator>>(const QDBusArgument &arg, FileChooserPortal::Option &option) 135 | { 136 | QString id; 137 | QString label; 138 | FileChooserPortal::Choices choices; 139 | QString initialChoiceId; 140 | arg.beginStructure(); 141 | arg >> id >> label >> choices >> initialChoiceId; 142 | option.id = id; 143 | option.label = label; 144 | option.choices = choices; 145 | option.initialChoiceId = initialChoiceId; 146 | arg.endStructure(); 147 | return arg; 148 | } 149 | 150 | FileChooserPortal::FileChooserPortal(QObject *parent) 151 | : QDBusAbstractAdaptor(parent) 152 | { 153 | qDBusRegisterMetaType(); 154 | qDBusRegisterMetaType(); 155 | qDBusRegisterMetaType(); 156 | qDBusRegisterMetaType(); 157 | qDBusRegisterMetaType(); 158 | qDBusRegisterMetaType(); 159 | qDBusRegisterMetaType