thunar 4.20.7 upstream

Tree of tag thunar-4.20.7 (commit df0e054) from https://gitlab.xfce.org/xfce/thunar.
Upstream history is not included here to keep the repository small.
This commit is contained in:
4aiman 2026-01-23 17:59:49 +01:00
commit df58603323
432 changed files with 494671 additions and 0 deletions

36
.clang-format Normal file
View file

@ -0,0 +1,36 @@
---
Language: Cpp
BasedOnStyle: GNU
AlignEscapedNewlines: DontAlign
AlignTrailingComments: true
AlignConsecutiveDeclarations: true
AllowAllParametersOfDeclarationOnNextLine: false
AlwaysBreakAfterReturnType: All
BinPackParameters: false
AlignAfterOpenBracket: true
BreakBeforeBinaryOperators: NonAssignment
ColumnLimit: 0
ContinuationIndentWidth: 0
IncludeBlocks: Regroup
IndentGotoLabels: false
InsertNewlineAtEOF: true
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 3
SpaceAfterCStyleCast: true
WhitespaceSensitiveMacros:
# Avoid breaking formatting in the code parameter
- G_DEFINE_TYPE_WITH_CODE
- G_DEFINE_TYPE_EXTENDED
- G_DEFINE_ABSTRACT_TYPE_WITH_CODE
# Buggy workaround to add exceptions to 'SpaceBeforeParens: Always' (see below)
- _
# Workaround to avoid some alignment bugs when adding a macro to WhitespaceSensitiveMacros,
# see https://github.com/llvm/llvm-project/issues/55443#issuecomment-1953268337
# This doesn't fix all alignment bugs though, so I'd rather make an exception only for '_',
# and not also for 'N_' or 'I_' for example.
# See also https://github.com/llvm/llvm-project/issues/82288
Macros:
- _(x)=x
...

178
.gitignore vendored Normal file
View file

@ -0,0 +1,178 @@
ChangeLog
Thunar.pot
Makefile
Makefile.in
aclocal.m4
autom4te.cache
compile
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
configure.in
depcomp
install-sh
intltool-*
libtool
ltmain.sh
mkinstalldirs
missing
stamp-h1
.*.swp
[Tt]hunar-*.tar.bz2
[Tt]hunar-*.tar.gz
core.*
core
*.core
*.desktop
*.desktop.in
*.service
*.policy
org.xfce.thunar.appdata.xml
thunar.appdata.xml
gtk-doc.make
Thunar.spec
docs/.*.swp
docs/*.1
docs/design/.*.swp
docs/manual/.*.swp
docs/manual/*/.*.swp
docs/manual/*/Thunar.xml
docs/manual/*/html
docs/manual/*/*.stamp
docs/manual/*/images/.*.swp
docs/papers/.*.swp
docs/reference/.*.swp
docs/reference/thunarx/xml
docs/reference/thunarx/html
docs/reference/thunarx/*.stamp
docs/reference/thunarx/.*.swp
docs/reference/thunarx/*.bak
docs/reference/thunarx/thunarx-decl-list.txt
docs/reference/thunarx/thunarx-decl.txt
docs/reference/thunarx/thunarx-overrides.txt
docs/reference/thunarx/thunarx-undeclared.txt
docs/reference/thunarx/thunarx-undocumented.txt
docs/reference/thunarx/thunarx-unused.txt
docs/reference/thunarx/thunarx.args
docs/reference/thunarx/thunarx.actions
docs/reference/thunarx/thunarx.hierarchy
docs/reference/thunarx/thunarx.interfaces
docs/reference/thunarx/thunarx.prerequisites
docs/reference/thunarx/thunarx.signals
docs/reference/thunarx/version.xml
docs/reference/thunarx/tmpl/*.bak
docs/reference/thunarx/tmpl/.*.swp
docs/reference/thunarx/tmpl/thunarx-unused.sgml
docs/reference/thunar/xml
docs/reference/thunar/html
docs/reference/thunar/*.stamp
docs/reference/thunar/.*.swp
docs/reference/thunar/*.bak
docs/reference/thunar/thunar-decl-list.txt
docs/reference/thunar/thunar-decl.txt
docs/reference/thunar/thunar-header.txt
docs/reference/thunar/thunar-overrides.txt
docs/reference/thunar/thunar-scan.c
docs/reference/thunar/thunar-sections.txt
docs/reference/thunar/thunar-undeclared.txt
docs/reference/thunar/thunar-undocumented.txt
docs/reference/thunar/thunar-unused.txt
docs/reference/thunar/thunar.args
docs/reference/thunar/thunar.actions
docs/reference/thunar/thunar.hierarchy
docs/reference/thunar/thunar.interfaces
docs/reference/thunar/thunar.prerequisites
docs/reference/thunar/thunar.signals
docs/reference/thunar/thunar.types
docs/reference/thunar/version.xml
docs/reference/thunar/tmpl/*.bak
docs/reference/thunar/tmpl/.*.swp
docs/reference/thunar/tmpl/thunar-unused.sgml
examples/.*.swp
examples/tex-open-terminal/.*.swp
icons/.*.swp
icons/16x16/.*.swp
icons/24x24/.*.swp
icons/48x48/.*.swp
icons/scalable/.*.swp
pixmaps/.*.swp
plugins/.*.swp
plugins/thunar-apr/.*.swp
plugins/thunar-sbr/.*.swp
plugins/thunar-sendto-email/thunar-sendto-email
plugins/thunar-sendto-email/thunar-sendto-email.desktop
plugins/thunar-sendto-email/.*.swp
plugins/thunar-tpa/thunar-tpa-bindings.*
plugins/thunar-tpa/thunar-tpa.desktop
plugins/thunar-tpa/thunar-tpa.desktop.in
plugins/thunar-tpa/.*.swp
plugins/thunar-tpa/thunar-tpa
plugins/thunar-uca/.*.swp
plugins/thunar-uca/uca.xml
plugins/thunar-uca/thunar-uca.gresource.c
po-doc/.*.swp
po-doc/.xml2po.mo
po/Makefile.in.in
po/.*.swp
po/*.gmo
po/*.mo
po/POTFILES
po/.intltool-merge-cache*
po/stamp-*
tests/*.loT
tests/.*.swp
tests/core.*
tests/*.core
tests/data/.*.swp
thunar/*.loT
thunar/.*.swp
thunar/thunar
thunar/thunar.a
thunar/thunar-dbus-freedesktop-interfaces.[ch]
thunar/thunar-dbus-service-infos.[ch]
thunar/thunar-fallback-icon.c
thunar/thunar-thumbnail-cache-proxy.[ch]
thunar/thunar-thumbnail-frame.c
thunar/thunar-thumbnailer-manager-proxy.h
thunar/thunar-thumbnailer-proxy.[ch]
thunar/thunar-marshal.[ch]
thunar/thunar-resources.[ch]
thunar/Thunar
thunar/core.*
thunar/*.core
thunar/thunar-*-ui.h
thunar/stamp-thunar-*.*
thunarx/.*.swp
thunarx/*.pc
thunarx/*.gir
thunarx/*.typelib
thunarx/thunarx-alias*.[ch]
thunarx/thunarx-config.h
*~
*.o
*.lo
*.la
.libs
.deps
thunar-vfs
gtk-doc.m4
test-driver
m4/*
!m4/introspection.m4
ABOUT-NLS
config.rpath
po/Makevars.template
po/Rules-quot
po/boldquot.sed
po/en@boldquot.header
po/en@quot.header
po/insert-header.sin
po/quot.sed
po/remove-potcdate.sin
thunar/libthunar.a
po/remove-potcdate.sed
po/thunar.pot

4
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,4 @@
include:
- project: 'xfce/xfce4-dev-tools'
file: '/ci/build_project.yml'

View file

@ -0,0 +1,35 @@
<!-- Please drop all sections which are not relevant for your concrete use-case -->
<!-- For enhancements and new features only the section 'Version information' might be relevant -->
## Version information
<!-- Which version of this software are you using? -->
<!-- Which distribution are you using? -->
## Steps to reproduce
<!-- Please, explain as detailed as possible the sequence of actions necessary to reproduce the issue -->
1. ...
2. ...
3. ...
## Current behavior
<!-- Please describe the current behaviour -->
## Expected outcome
<!-- Please describe the expected outcome -->
## Backtrace
<!--
For crashes, it's best to get a backtrace to see which method failed to execute.
To get a meaningful backtrace, you will need to install debug symbols. Check the Xfce wiki to see how to do so:
https://docs.xfce.org/contribute/bugs/start#backtraces
It's basically `ulimit -c unlimited` to produce coredumps on crashes and then using gdb on it to get the backtrace out of the coredump.
-->
## Additional information
<!--
- Screenshots are useful for visual errors
- Please report any warning or message printed on the terminal
-->

13
AUTHORS Normal file
View file

@ -0,0 +1,13 @@
Benedikt Meurer <benny@xfce.org>
Jannis Pohlmann <jannis@xfce.org>
Jeffs Franks <jcfranks@xfce.org>
Nick Schermer <nick@xfce.org>
Harald Judt <hjudt@xfce.org>
Andre Miranda <andreldm@xfce.org>
Alexander Schwinn <alexxcons@xfce.org>
The stock_folder-copy and stock_folder-move icons where taken from
gnome-icon-theme 2.18.0 whose authors are Lapo Calamandrei <calamandrei@gmail.com>,
Rodney Dawes <dobey@novell.com>, Luca Ferretti <elle.uca@libero.it>,
Tuomas Kuosmanen <tigert@gimp.org>, Andreas Nilsson <nisses.mail@home.se>
and Jakub Steiner <jimmac@novell.com>. The icons are licensed under GPL.

339
COPYING Normal file
View file

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

437
COPYING.LIB Normal file
View file

@ -0,0 +1,437 @@
GNU LIBRARY GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the library GPL. It is
numbered 2 because it goes with version 2 of the ordinary GPL.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it. You can use it for
your libraries, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library. If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software. To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs. This
license, the GNU Library General Public License, applies to certain
designated libraries. This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.
The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it. Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program. However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.
Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries. We
concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves. This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them. (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.) The hope is that this
will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, while the latter only
works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License"). Each licensee is
addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
c) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
d) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS

1990
ChangeLog.gio-migration Normal file

File diff suppressed because it is too large Load diff

103
FAQ Normal file
View file

@ -0,0 +1,103 @@
This file contains a list of frequently asked questions about Thunar and the
appropriate answers to these questions.
1. What is Thunar?
==================
Thunar is a fast and easy-to-use file manager for the X Window System, with a
special focus on the Xfce Desktop Environment.
2. Why doesn't Thunar execute files marked as executable?
=========================================================
For security reasons Thunar only executes files of type application/x-desktop,
application/x-executable and application/x-shellscript. For desktop files
the execution feature will only be enabled if the desktop file is of type
Application and a valid Exec line is given. For the other types the feature
is available if the file is marked executable for the current user.
Also note that for application/x-executable and application/x-shellscript, the
types of the file don't really need to match these types exactly, but it is
suffice if the detected type has a parent that matches one of the two types
listed above, or if the MIME-type is an alias for one of the above.
3. Where does Thunar store the metadata associated with files?
==============================================================
Thunar uses the metadata daemon provided by GVFS.
4. Where does Thunar store its preferences?
===========================================
Thunar stores the user configurable preferences (and hidden settings) in
an .ini file, which is located at
$XDG_CONFIG_HOME/Thunar/thunarrc
and can be examined using a text editor. See docs/README.thunarrc for an
overview of the various preferences.
5. How to use mouse gestures in Thunar?
=======================================
Thunar currently features basic support for so called "mouse gestures" in its
icon view. You can use these "mouse gestures" by holding down the middle
mouse button (usually the mouse wheel) while the mouse pointer is on the
background area of the icon view component (any area that is not covered by
an icon or a text). Now you can move the cursor into four directions to
perform certain actions, which are described below.
* Left - opens the previous visited folder
* Up - opens the parent folder
* Right - opens the next visited folder
* Down - reload the current folder
6. How do I assign different keyboard shortcuts?
================================================
If you want to rebind a shortcut, Thunar supports the standard GTK+ way
of changing shortcuts: simply hover over the menu option with the mouse
pointer and press the keyboard shortcut you want to rebind it to.
To delete a keyboard assignment, press the Backspace key while you are
on the menu entry.
If the shortcut doesn't change, then you need to enable the feature in
GTK+. This can be achieved in 3 ways:
1. If you are running Xfce 4.3 or above then you can enable "Editable
menu accelerators" in the "User Interface Preferences" dialog.
2. If you are running GNOME then you can enable "Editable menu
accelerators" in the "Menu and Toolbars" control center dialog.
3. Otherwise put the following in your ~/.gtkrc-2.0 file (create the
file if it doesn't exist):
gtk-can-change-accels=1
7. Where does Thunar store the keyboard shortcuts?
==================================================
The custom keyboard shortcuts are stored in the standard Gtk accel map
format in a file located at
$XDG_CONFIG_HOME/Thunar/accels.scm
Lines starting with ; are comments. See the GTK+ documentation for details
about the file format. If you are a packager or a system administrator and
want to provide a system-wide default for the keyboard shortcuts, that is
different from the default shortcuts in Thunar, you can create a file
Thunar/accels.scm in one of the $XDG_CONFIG_DIRS. For example, if /etc/xdg
is part of $XDG_CONFIG_DIRS (most likely for most Linux distributions), you
can install system-wide defaults to
/etc/xdg/Thunar/accels.scm
Thunar will then load shortcuts from this file on first startup.

63
HACKING Normal file
View file

@ -0,0 +1,63 @@
Bug tracking system
===================
Thunar uses the Xfce bug tracking system at https://gitlab.xfce.org/xfce/thunar,
hosted and maintained by the Xfce project.
Patches
=======
Please submit merge requests to the Xfce GitLab instance.
Your code must comply with the coding style described below.
Please base on work against the master branch of this package. You can always
clone the Thunar repository from
https://gitlab.xfce.org/xfce/thunar
Feature requests
================
Please file feature requests to the Xfce's GitLab
(https://gitlab.xfce.org/xfce/thunar).
Make sure that your feature request wasn't reported already before; requesting
a feature several times won't increase the changed that it gets added!
Coding Style
============
- GNU coding conventions, with GLib-like extensions, mostly the same
as GTK+.
- Always expand tabs. This differs from the GNU suggestion, but it is
necessary to be independent from a given tab setting.
- Do NOT ever misuse debugging macros like g_return_val_if_fail() or
g_return_if_fail() to control program flow. They are solely useful
to discover bugs, the final binary won't include code for these
statements, and so any use of these macros to control program
flow presents a bug!
- Do NOT follow the philosophy "If it works, it's right" that most
other open source projects follow, instead Thunar's philosophy is
"It doesn't work unless it's right". Think carefully of what you want
to do, don't just fire up your favourite editor and start hacking
in the hope that it will evolve into something useful one day.
- Maintainability goes over performance. If you have to choose between
a maintainable and a fast solution, always prefer the former, as it's
quite easy to optimize well-designed modules, but very hard and costly
to make spaghetti-code readable.
- Write ChangeLog entries. Whenever you commit a change or send a patch,
write a good entry per change to the ChangeLog file, see the libexo
ChangeLog for the exact format; it's very important to be descriptive
and correct here, else you'll loose your commit bits or your patches
won't be considered for inclusion.
- Use GObject whenever possible. Object-oriented design and programming
makes it easier to separate functionality and also aids in verification
and testing, and GObject provides a very solid base.
Release process
===============
Refer to https://www.xfce.org/about/releasemodel

389
INSTALL Normal file
View file

@ -0,0 +1,389 @@
Installation Instructions
*************************
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind.
Basic Installation
==================
Briefly, the shell command `./autogen.sh && make && make install'
should configure, build, and install this package.
Note that './autogen.sh' creates a './configure' script from
'configure.ac.in' and runs it automatically.
You will not need to run './configure' yourself.
Autotools has be installed on your system in order to run './autogen.sh'
The following text originally referred to './configure' ... usually you
can just replace all calls of './configure' directly with './autogen.sh'.
The following more-detailed instructions are generic; see the `README.md'
file for instructions specific to this package. Some packages provide
this `INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
necessarily a bug. More recommendations for GNU packages can be found
in *note Makefile Conventions: (standards)Makefile Conventions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README.md' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./autogen.sh' to configure the package for your system.
Running `./autogen.sh' might take a while. While running, it prints
some messages telling which features it is checking for.
Probably ./autogen.sh will list some/many missing packages.
Install the related packages in dev-version and run ./autogen.sh again,
until all required dependencies are resolved.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package, generally using the just-built uninstalled binaries.
4. After that it is possible to run thunar directly from the source-folder:
./thunar/thunar -q;./thunar/thunar
The -q argument will quit any running thunar-daemon.
However if you want to make use of thunar-plugin, you will need to
run 'make install':
5. Type `make install' to install the programs and any data files and
documentation. When installing into a prefix owned by root, it is
recommended that the package be configured and built as a regular
user, and only the `make install' phase executed with root
privileges.
6. Optionally, type `make installcheck' to repeat any self-tests, but
this time using the binaries in their final installed location.
This target does not install anything. Running this target as a
regular user, particularly if the prior `make install' required
root privileges, verifies that the installation completed
correctly.
7. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
8. Often, you can also type `make uninstall' to remove the installed
files again. In practice, not all packages have tested that
uninstallation works correctly, even though it is required by the
GNU Coding Standards.
9. Some packages, particularly those that use Automake, provide `make
distcheck', which can by used by developers to test that all other
targets like `make install' and `make uninstall' work correctly.
This target is generally not run by end users.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. This
is known as a "VPATH" build.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor. Like
this:
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CPP="gcc -E" CXXCPP="g++ -E"
This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them. In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.
The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.
The first method involves providing an override variable for each
affected directory. For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'. Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated. The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.
The second method involves providing the `DESTDIR' variable. For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names. The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters. On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.
Optional Features
=================
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README.md' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Some packages offer the ability to configure how verbose the
execution of `make' will be. For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.
Particular systems
==================
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
CC is not installed, it is recommended to use the following options in
order to use an ANSI C compiler:
./autogen.sh CC="cc -Ae -D_XOPEN_SOURCE=500"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
HP-UX `make' updates targets which have the same time stamps as
their prerequisites, which makes it generally unusable when shipped
generated files such as `configure' are involved. Use GNU `make'
instead.
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
to try
./autogen.sh CC="cc"
and if that doesn't work, try
./autogen.sh CC="cc -nodtk"
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.
On Haiku, software installed for all users goes in `/boot/common',
not `/usr/local'. It is recommended to use the following options:
./autogen.sh --prefix=/boot/common
Specifying the System Type
==========================
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS
KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./autogen.sh CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf limitation. Until the limitation is lifted, you can use
this workaround:
CONFIG_SHELL=/bin/bash ./autogen.sh CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it
operates.
`--help'
`-h'
Print a summary of all of the options to `configure', and exit.
`--help=short'
`--help=recursive'
Print a summary of the options unique to this package's
`configure', and exit. The `short' variant lists options used
only in the top level, while the `recursive' variant lists options
also present in any nested packages.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--prefix=DIR'
Use DIR as the installation prefix. *note Installation Names::
for more details, including other options available for fine-tuning
the installation locations.
`--no-create'
`-n'
Run the configure checks, but stop before creating any output
files.
`configure' also accepts some other, not widely useful, options. Run
`./autogen.sh --help' for more details.

121
Makefile.am Normal file
View file

@ -0,0 +1,121 @@
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
# -
# Copyright (c) 2010 Jannis Pohlmann <jannis@xfce.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
SUBDIRS = \
icons \
thunarx \
thunar \
docs \
examples \
plugins \
po
distclean-local:
rm -rf *.cache *~
find . -type f -name Makefile -delete
find . -type f -name Makefile.in -delete
distuninstallcheck_listfiles = \
find . -type f -print | grep -v ./share/icons/hicolor/icon-theme.cache
.PHONY: ChangeLog
ChangeLog: Makefile
(GIT_DIR=$(top_srcdir)/.git git log > .changelog.tmp \
&& mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) \
|| (touch ChangeLog; echo 'Git directory not found: installing possibly empty changelog.' >&2)
dist-hook: ChangeLog
desktopdir = $(datadir)/applications
desktop_in_in_files = \
thunar.desktop.in.in \
thunar-bulk-rename.desktop.in.in
desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in)
%.desktop.in: %.desktop.in.in Makefile
$(AM_V_GEN) $(SED) -e "s,\@HELPERDIR\@,$(HELPER_PATH_PREFIX),g" < $< > $@
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
%.desktop: %.desktop.in Makefile
$(AM_V_GEN)$(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
#
# .appdata
#
appdatadir = $(datadir)/metainfo
appdata_DATA = $(appdata_in_files:.xml.in=.xml)
appdata_in_files = org.xfce.thunar.appdata.xml.in
%.appdata.xml: %.appdata.xml.in Makefile
$(AM_V_GEN)$(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@
servicedir = $(datadir)/dbus-1/services
service_in_files = org.xfce.FileManager.service.in \
org.xfce.Thunar.service.in \
org.xfce.Thunar.FileManager1.service.in
service_DATA = $(service_in_files:.service.in=.service)
systemd_userdir = $(prefix)/lib/systemd/user
systemd_user_in_files = thunar.service.in
systemd_user_DATA = $(systemd_user_in_files:.service.in=.service)
%.service: %.service.in Makefile
$(AM_V_GEN) $(SED) -e "s,\@bindir\@,$(bindir),g" < $< > $@
polkit_policydir = $(datadir)/polkit-1/actions
polkit_in_in_files = \
org.xfce.thunar.policy.in.in
polkit_in_files = $(polkit_in_in_files:.policy.in.in=.policy.in)
%.policy.in: %.policy.in.in Makefile
sed -e "s,\@bindir\@,$(bindir),g" < $< > $@
polkit_policy_DATA = $(polkit_in_files:.policy.in=.policy)
# Not using HAVE_POLKIT because a lot of distributions put
# polkit.{its,loc} in binary package instead of development package.
# E.g. Debian puts in polkitd instead of libpolkit-gobject-1-dev
%.policy: %.policy.in Makefile
$(AM_V_GEN)$(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@ || \
cp $< $@
EXTRA_DIST = \
FAQ \
HACKING \
README.md \
$(desktop_in_in_files) \
$(service_in_files) \
$(systemd_user_in_files) \
$(appdata_in_files) \
$(polkit_in_in_files) \
its/xfce.loc \
its/xfce.its \
m4/introspection.m4
CLEANFILES = $(appdata_DATA)
DISTCLEANFILES = \
$(desktop_in_files) \
$(desktop_DATA) \
$(service_DATA) \
$(systemd_user_DATA) \
$(polkit_in_files) \
$(polkit_policy_DATA)
AM_DISTCHECK_CONFIGURE_FLAGS = \
--enable-gtk-doc \
--enable-gen-doc \
--enable-introspection

2698
NEWS Normal file

File diff suppressed because it is too large Load diff

56
README.md Normal file
View file

@ -0,0 +1,56 @@
[![License](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://gitlab.xfce.org/xfce/thunar/COPYING)
# thunar
Thunar is a modern file manager for the Xfce Desktop Environment. Thunar has been designed from the ground up to be fast and easy to use. Its user interface is clean and intuitive and does not include any confusing or useless options by default. Thunar starts up quickly and navigating through files and folders is fast and responsive.
----
### Homepage
[Thunar documentation](https://docs.xfce.org/xfce/thunar/start)
### Changelog
See [NEWS](https://gitlab.xfce.org/xfce/thunar/-/blob/master/NEWS) for details on changes and fixes made in the current release.
### Source Code Repository
[Thunar source code](https://gitlab.xfce.org/xfce/thunar)
### Download a Release Tarball
[Thunar archive](https://archive.xfce.org/src/xfce/thunar)
or
[Thunar tags](https://gitlab.xfce.org/xfce/thunar/-/tags)
### Installation
From source:
% git clone https://gitlab.xfce.org/xfce/thunar
% git checkout <branch|tag> #optional step. Per default master is checked out
% cd thunar
% ./autogen.sh
% make
# make install
From release tarball:
% tar xf thunar-<version>.tar.bz2
% cd thunar-<version>
% ./configure
% make
# make install
Both autogen.sh and configure will list missing dependencies.
If your distribution provides development versions of the related packages,
install them. Otherwise you will need to build and install the missing dependencies from source.
For additional build & debug hints, check the [Thunar wiki pages](https://wiki.xfce.org/thunar/dev) and the [detailed building wiki manual](https://docs.xfce.org/xfce/building).
### Reporting Bugs
Visit the [reporting bugs](https://docs.xfce.org/xfce/thunar/bugs) page to view currently open bug reports and instructions on reporting new bugs or submitting bugfixes.

244
THANKS Normal file
View file

@ -0,0 +1,244 @@
What's this file about?
-----------------------
This file lists all external people that have contributed to this project and
thereby helped to make Thunar such a successful project.
Testers (sorted by name):
--------------------------
These people have contributed to Thunar by testing the software,
reporting problems and making useful suggestions.
Translators (sorted by language):
----------------------------------
These people have translated Thunar to foreign languages.
Mohamed Magdy <mohamed.m.k@gmail.com>
* ar translations
Alexander Nyakhaychyk <nyakhaychyk@gmail.com>
* be translations
Carles Muñoz Gorriz <carlesmu@internautas.org>
* ca translations
Pau Rul·lan Ferragut <paurullan@bulma.net>
* ca translations
Michal Várady <miko.vaji@gmail.com>
* cs translations
Benedikt Meurer <benny@xfce.org>
* de translations
Fabian Nowak <timystery@arcor.de>
* de translations
Jannis Pohlmann <jannis@xfce.org>
* de translations
Sonam Pelden <sonaa_peldn@yahoo.com>
* dz translations
Stathis Kamperis <ekamperi@auth.gr>
* el translations
Stavros Giannouris <stavrosg2002@freemail.gr>
* el translations
Jeff Bailes <thepizzaking@gmail.com>
* en_GB translations
Antono Vasiljev <antono.vasiljev@gmail.com>
* eo translations
Sylvain Vedrenne <gnu_sylvain@xfce.org>
* eo translations
Daniel Fuertes Pérez <danifp25@yahoo.es>
* es translations
Miguel Angel Ruiz Manzano <debianized@gmail.com>
* es translations
Pablo Hernández-M. Saiz <homeless3d@gmail.com>
* es translations
Peeter Vois <Peeter.Vois@proekspert.ee>
* et translations
Piarres Beobide <pi@beobide.net>
* eu translations
Jari Rahkonen <jari.rahkonen@pp1.inet.fi>
* fi translations
Gérald Barré <g.barre@free.fr>
* fr translations
Maximilian Schleiss <maxschleiss@bluewin.ch>
* fr translations
Rafaël Carré <wavael@yahoo.fr>
* fr translations
Stephane Roy <sroy@j2n.net>
* fr translations
Iván Seoane Pardo <talivan.ivan@gmail.com>
* gl translations
Yo'av Moshe <bjesus@gmail.com>
* he translations
Yuval Tanny <tanai@int.gov.il>
* he translations
Szervác Attila <sas@321.hu>
* hu translations
Roberto Pariset <r.pariset@gmail.com>
* it translations
Daichi Kawahata <daichi@xfce.org>
* ja translations
Dimitri Gogelia <delphi.knight@gmail.com>
* ka translations
ByungHyun Choi <byunghyun.choi@debianusers.org>
* ko translations
Mantas Zapolskas <mantaz@users.sourceforge.net>
* lt translations
Rihards Prieditis <rprieditis@inbox.lv>
* lv translations
Vincent Tunru <imnotb@gmail.com>
* nl translations
Jovan Naumovski <jovan@lugola.net>
* mk translations
Viktor Stojanovski <viktor@lugola.net>
* mk translations
Terje Uriansrud <ter@operamail.com>
* nb_NO translations
Stephan Arts <psybsd@gmail.com>
* nl translations
Vincent Tunru <imnotb@gmail.com>
* nl translations
Amanpreet Singh Alam <aalam@users.sf.net>
* pa translations
Piotr Maliński <admin@rk.edu.pl>
* pl translations
Szymon Kałasz <szymon_maestro@gazeta.pl>
* pl translations
Tomasz Michał Łukaszewski <T.Lukaszewski@aster.pl>
* pl translations
Adriano Winter Bess <awbess@gmail.com>
* pt_BR translations
William Koch <wkromani@gmail.com>
* pt_BR translations
Fábio Nogueira <deb-user-ba@ubuntu.com>
* pt_BR translations
Joao Pedrosa <joaopedrosa@gmail.com>
* pt_BR translations
Rodrigo Coacci <rcoacci@gmail.com>
* pt_BR translations
Nuno Miguel <nunis@netcabo.pt>
* pt_PT translations
Misu Moldovan <dumol@gnome.ro>
* ro translations
Andrey Fedoseev <andrey.fedoseev@gmail.com>
* ru translations
Sergey Fedoseev <fedoseev.sergey@gmail.com>
* ru translations
Ivan Masár <helix84@centrum.sk>
* sk translations
Besnik Bleta <besnik@programeshqip.org>
* sq translations
Alexander Toresson <alexander.toresson@gmail.com>
* sv translations
Daniel Nylander <po@danielnylander.se>
* sv translations
Türker Sezer <turkersezer@tsdesign.info>
* tr translations
Eren Türkay <turkay.eren@gmail.com>
* tr translations
Cem Ünal <admincemunal@gmail.com>
* tr translations
Maxim V. Dziumanenko <mvd@mylinux.ua>
* uk translations
Dmitry Nikitin <luckas_fb@mail.ru>
* uk translations
Muhammad Ali Makki <makki.ma@gmail.com>
* ur translations
kangkang <kanger@gmail.com>
* zh_CN translations
Li Linxiao <linxiao.li@gmail.com>
* zh_CN translations
Hydonsingore Cia <hydonsingore@mail.educities.edu.tw>
* zh_TW translations
Cosmo Chene <cosmolax@gmail.com>
* zh_TW translations
Other contributors (sorted by name):
------------------------------------
Young Hahn <youngjin.hahn@gmail.com>
* icon designer
Daichi Kawahata <daichi@xfce.org>
* i18n coordinator
Laurent Meunier <meunier.laurent@laposte.net>
* patches
Danny Milosavljevic <danny.milo@gmx.net>
* patches
Matt McClinch <mattmcclinch@gmail.com>
* patches
Nick Schermer <nick@xfce.org>
* patches
Peter de Ridder <peter@xfce.org>
* patches

111
acinclude.m4 Normal file
View file

@ -0,0 +1,111 @@
dnl Copyright (c) 2004-2006
dnl The Thunar development team. All rights reserved.
dnl
dnl Written for Thunar by Benedikt Meurer <benny@xfce.org>.
dnl
dnl # BM_THUNAR_PLUGIN_APR()
dnl #
dnl # Check whether the "Advanced Properties" plugin
dnl # should be built and installed.
dnl #
AC_DEFUN([BM_THUNAR_PLUGIN_APR],
[
AC_ARG_ENABLE([apr-plugin], [AS_HELP_STRING([--disable-apr-plugin], [Don't build the thunar-apr plugin, see plugins/thunar-apr/README.md])],
[ac_bm_thunar_plugin_apr=$enableval], [ac_bm_thunar_plugin_apr=yes])
AC_MSG_CHECKING([whether to build the thunar-apr plugin])
AM_CONDITIONAL([THUNAR_PLUGIN_APR], [test x"$ac_bm_thunar_plugin_apr" = x"yes"])
AC_MSG_RESULT([$ac_bm_thunar_plugin_apr])
dnl Check for libexif (for the "Image" properties page)
XDT_CHECK_OPTIONAL_PACKAGE([EXIF], [libexif], [0.6.0], [exif], [Exif support])
])
dnl # BM_THUNAR_PLUGIN_SBR()
dnl #
dnl # Check whether the "Simple Builtin Renamers" plugin
dnl # should be built and installed.
dnl #
AC_DEFUN([BM_THUNAR_PLUGIN_SBR],
[
AC_ARG_ENABLE([sbr-plugin], AS_HELP_STRING([--disable-sbr-plugin], [Don't build the thunar-sbr plugin, see plugins/thunar-sbr/README.md]),
[ac_bm_thunar_plugin_sbr=$enableval], [ac_bm_thunar_plugin_sbr=yes])
AC_MSG_CHECKING([whether to build the thunar-sbr plugin])
AM_CONDITIONAL([THUNAR_PLUGIN_SBR], [test x"$ac_bm_thunar_plugin_sbr" = x"yes"])
AC_MSG_RESULT([$ac_bm_thunar_plugin_sbr])
dnl Check for PCRE2 (for the "Search & Replace" renamer)
XDT_CHECK_OPTIONAL_PACKAGE([PCRE2], [libpcre2-8], [10.0], [pcre2], [Regular expression support])
])
dnl # BM_THUNAR_PLUGIN_TPA()
dnl #
dnl # Check whether the "Trash Panel Applet" plugin should
dnl # be built and installed (this is actually a plugin
dnl # for the Xfce panel, not for Thunar).
dnl #
AC_DEFUN([BM_THUNAR_PLUGIN_TPA],
[
AC_ARG_ENABLE([tpa-plugin], AS_HELP_STRING([--disable-tpa-plugin], [Don't build the thunar-tpa plugin, see plugins/thunar-tpa/README.md]),
[ac_bm_thunar_plugin_tpa=$enableval], [ac_bm_thunar_plugin_tpa=yes])
if test x"$ac_bm_thunar_plugin_tpa" = x"yes"; then
XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-2.0], [4.12.0],
[
ac_bm_thunar_plugin_tpa=yes
],
[
dnl # Cannot build thunar-tpa if xfce4-panel is not installed
ac_bm_thunar_plugin_tpa=no
])
else
ac_bm_thunar_plugin_tpa=no
fi
AC_MSG_CHECKING([whether to build the thunar-tpa plugin])
AM_CONDITIONAL([THUNAR_PLUGIN_TPA], [test x"$ac_bm_thunar_plugin_tpa" = x"yes"])
AC_MSG_RESULT([$ac_bm_thunar_plugin_tpa])
])
dnl # BM_THUNAR_PLUGIN_UCA()
dnl #
dnl # Check whether the "User Customizable Actions" plugin
dnl # should be built and installed.
dnl #
AC_DEFUN([BM_THUNAR_PLUGIN_UCA],
[
AC_ARG_ENABLE([uca-plugin], AS_HELP_STRING([--disable-uca-plugin], [Don't build the thunar-uca plugin, see plugins/thunar-uca/README.md]),
[ac_bm_thunar_plugin_uca=$enableval], [ac_bm_thunar_plugin_uca=yes])
AC_MSG_CHECKING([whether to build the thunar-uca plugin])
AM_CONDITIONAL([THUNAR_PLUGIN_UCA], [test x"$ac_bm_thunar_plugin_uca" = x"yes"])
AC_MSG_RESULT([$ac_bm_thunar_plugin_uca])
])
dnl # BM_THUNAR_PLUGIN_WALLPAPER()
dnl #
dnl # Check whether the "Wallpaper" plugin
dnl # should be built and installed.
dnl #
AC_DEFUN([BM_THUNAR_PLUGIN_WALLPAPER],
[
AC_ARG_ENABLE([wallpaper-plugin], AS_HELP_STRING([--disable-wallpaper-plugin], [Don't build the thunar-wallpaper plugin, see plugins/thunar-wallpaper/README.md]),
[ac_bm_thunar_plugin_wallpaper=$enableval], [ac_bm_thunar_plugin_wallpaper=yes])
AC_MSG_CHECKING([whether to build the thunar-wallpaper plugin])
AM_CONDITIONAL([THUNAR_PLUGIN_WALLPAPER], [test x"$ac_bm_thunar_plugin_wallpaper" = x"yes"])
AC_MSG_RESULT([$ac_bm_thunar_plugin_wallpaper])
if test x"$ac_bm_thunar_plugin_wallpaper" = x"yes"; then
AC_CHECK_PROG([xfconf_query_found], [xfconf-query], [yes], [no])
if test x"$xfconf_query_found" = x"no"; then
echo "***"
echo "*** xfconf-query was not found on your system."
echo "*** The wallpaper won't work without it installed."
echo "***"
fi
fi
])

32
autogen.sh Executable file
View file

@ -0,0 +1,32 @@
#!/bin/sh
#
# vi:set et ai sw=2 sts=2 ts=2: */
#-
# Copyright (c) 2009 Jannis Pohlmann <jannis@xfce.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
(type xdt-autogen) >/dev/null 2>&1 || {
cat >&2 <<EOF
autogen.sh: You don't seem to have the Xfce development tools installed on
your system, which are required to build this software.
Please install the xfce4-dev-tools package first, it is available
from your distribution or https://www.xfce.org/.
EOF
exit 1
}
XDT_AUTOGEN_REQUIRED_VERSION="4.19.0" exec xdt-autogen $@

306
configure.ac Normal file
View file

@ -0,0 +1,306 @@
# vi:set et ai sw=2 sts=2 ts=2: */
#-
# Copyright (c) 2004-2007 Benedikt Meurer <benny@xfce.org>
# Copyright (c) 2009-2011 Jannis Pohlmann <jannis@xfce.org>
# Copyright (c) 2004-2024 Xfce Development Team <xfce4-dev@xfce.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
dnl ***************************
dnl *** Version information ***
dnl ***************************
m4_define([thunarx_verinfo], [0:0:0])
m4_define([thunarx_version_api], [3])
XDT_VERSION_INIT([4.20.7])
dnl ***************************
dnl *** Initialize autoconf ***
dnl ***************************
AC_COPYRIGHT([Copyright (c) 2004-2024 The Thunar development team. All rights reserved.])
AC_INIT([thunar], [xdt_version], [https://gitlab.xfce.org/xfce/thunar], [thunar])
AC_PREREQ([2.69])
AC_CONFIG_MACRO_DIRS([m4])
AC_CANONICAL_TARGET()
AC_REVISION([xdt_version_build])
dnl ***************************
dnl *** Initialize automake ***
dnl ***************************
AM_INIT_AUTOMAKE([1.11 dist-bzip2 tar-ustar no-dist-gzip foreign])
AC_CONFIG_HEADERS([config.h])
AM_MAINTAINER_MODE()
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl *******************************
dnl *** Check for UNIX variants ***
dnl *******************************
AC_USE_SYSTEM_EXTENSIONS
AC_SEARCH_LIBS([strerror],[cposix])
if test "x$target_os" = "xlinux-gnu"; then
AC_DEFINE([HAVE_LINUX], [], [Whether we are building on Linux or not])
fi
dnl ********************************
dnl *** Check for basic programs ***
dnl ********************************
AC_PROG_CC()
LT_PATH_LD()
AM_PROG_CC_C_O()
AC_PROG_INSTALL()
AC_CHECK_PROGS([PERL], [perl5 perl])
m4_ifdef([AC_PROG_SED], [AC_PROG_SED], [AC_CHECK_PROG(SED, sed, sed)])
dnl **************************
dnl *** Initialize libtool ***
dnl **************************
LT_PREREQ([2.4])
LT_INIT([disable-static])
dnl **************************************
dnl *** Substitute version information ***
dnl **************************************
THUNARX_VERINFO=thunarx_verinfo()
THUNARX_VERSION_API=thunarx_version_api()
THUNAR_VERSION_MAJOR=xdt_version_major()
THUNAR_VERSION_MINOR=xdt_version_minor()
THUNAR_VERSION_MICRO=xdt_version_micro()
AC_SUBST([THUNARX_VERINFO])
AC_SUBST([THUNARX_VERSION_API])
AC_SUBST([THUNAR_VERSION_MAJOR])
AC_SUBST([THUNAR_VERSION_MINOR])
AC_SUBST([THUNAR_VERSION_MICRO])
dnl ******************************
dnl *** Set helper path prefix ***
dnl ******************************
AC_ARG_WITH([helper-path-prefix],
[AS_HELP_STRING([--with-helper-path-prefix=PATH],
[Path prefix under which helper executables will be installed (default: $libdir)])],
[HELPER_PATH_PREFIX="$withval"],
[HELPER_PATH_PREFIX="$libdir"])
AC_SUBST([HELPER_PATH_PREFIX])
dnl ***************************************
dnl *** Set default thunarx directories ***
dnl ***************************************
AC_ARG_WITH([thunarx-dirs],
[AS_HELP_STRING([--with-thunarx-dirs=PATH],
[Used to set different default paths (separated by colon) for thunarx plugin lookup])],
[DEFAULT_THUNARX_DIRS="$withval"],
[DEFAULT_THUNARX_DIRS="$libdir/thunarx-$THUNARX_VERSION_API"])
AC_SUBST([DEFAULT_THUNARX_DIRS])
dnl *******************************************************
dnl *** Optional support for custom thunarx directories ***
dnl *******************************************************
AC_ARG_WITH([custom-thunarx-dirs-enabled],
[AS_HELP_STRING([--with-custom-thunarx-dirs-enabled],
[Enables the posibillity to set custom thunarx directories by using the environment variable THUNARX_DIRS])],
[CUSTOM_THUNARX_DIRS_ENABLED="TRUE"],
[CUSTOM_THUNARX_DIRS_ENABLED="FALSE"])
AC_SUBST([CUSTOM_THUNARX_DIRS_ENABLED])
dnl ***********************************************
dnl *** Work-around system-specific limitations ***
dnl ***********************************************
AC_SYS_LARGEFILE()
dnl **********************************
dnl *** Check for standard headers ***
dnl **********************************
AC_CHECK_HEADERS([ctype.h errno.h fcntl.h grp.h limits.h locale.h malloc.h memory.h \
paths.h pwd.h sched.h signal.h stdarg.h stdlib.h string.h \
sys/mman.h sys/param.h sys/stat.h sys/time.h sys/types.h \
sys/uio.h sys/wait.h time.h])
dnl ************************************
dnl *** Check for standard functions ***
dnl ************************************
AC_FUNC_MMAP()
AC_CHECK_FUNCS([localeconv mkdtemp pread pwrite sched_yield setgroupent \
setpassent strcoll strlcpy strptime symlink atexit realpath \
statx])
dnl ******************************
dnl *** Check for i18n support ***
dnl ******************************
GETTEXT_PACKAGE="$PACKAGE"
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"], [Name of default gettext domain])
AC_SUBST([GETTEXT_PACKAGE])
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19.8])
AC_SEARCH_LIBS([bind_textdomain_codeset], [intl],
[AC_DEFINE([HAVE_BIND_TEXTDOMAIN_CODESET], [1], [Define to 1 if you have the 'bind_textdomain_codeset' function.])],
[])
dnl *********************
dnl *** Check for X11 ***
dnl *********************
XDT_CHECK_LIBX11_REQUIRE()
dnl *************************
dnl *** Check for gtk-doc ***
dnl *************************
GTK_DOC_CHECK([1.9])
dnl ***********************************
dnl *** Check for required packages ***
dnl ***********************************
XDT_CHECK_PACKAGE([EXO], [exo-2], [4.19.0])
XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.72.0])
XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.72.0])
XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.72.0])
XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [2.72.0])
XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.24.0])
XDT_CHECK_PACKAGE([GDK_PIXBUF], [gdk-pixbuf-2.0], [2.42.8])
XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.17.2])
XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2], [4.17.6])
XDT_CHECK_PACKAGE([LIBXFCE4KBD_PRIVATE], [libxfce4kbd-private-3], [4.17.2])
XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.12.0])
XDT_CHECK_PACKAGE([PANGO], [pango], [1.38.0])
dnl ******************************
dnl *** GObject Instrospection ***
dnl ******************************
GOBJECT_INTROSPECTION_CHECK([1.72.0])
dnl ********************************************
dnl *** Check for session management support ***
dnl ********************************************
XDT_CHECK_LIBSM()
dnl **********************************
dnl *** Optional GIO UNIX features ***
dnl **********************************
XDT_CHECK_OPTIONAL_PACKAGE([GIO_UNIX], [gio-unix-2.0],
[2.72.0], [gio-unix], [GIO UNIX features])
dnl ***************************************************************
dnl *** Optional support for GUDev (required for thunar-volman) ***
dnl ***************************************************************
XDT_CHECK_OPTIONAL_PACKAGE([GUDEV], [gudev-1.0], [145], [gudev],
[GUDev (required for thunar-volman)])
dnl **************************************
dnl *** Optional support for libnotify ***
dnl **************************************
XDT_CHECK_OPTIONAL_PACKAGE([LIBNOTIFY], [libnotify], [0.4.0], [notifications],
[Mount notification support], [yes])
dnl ***********************************
dnl *** Check for debugging support ***
dnl ***********************************
XDT_FEATURE_DEBUG([xdt_debug_default])
dnl **************************************
dnl *** Check for linker optimizations ***
dnl **************************************
XDT_FEATURE_LINKER_OPTS()
dnl dnl ****************************************
dnl dnl *** Check for ELF visibility support ***
dnl dnl ****************************************
dnl XDT_FEATURE_VISIBILITY()
dnl *********************************
dnl *** Substitute platform flags ***
dnl *********************************
AC_MSG_CHECKING([PLATFORM_CPPFLAGS])
AC_MSG_RESULT([$PLATFORM_CPPFLAGS])
AC_SUBST([PLATFORM_CPPFLAGS])
AC_MSG_CHECKING([PLATFORM_CFLAGS])
AC_MSG_RESULT([$PLATFORM_CFLAGS])
AC_SUBST([PLATFORM_CFLAGS])
AC_MSG_CHECKING([PLATFORM_LDFLAGS])
AC_MSG_RESULT([$PLATFORM_LDFLAGS])
AC_SUBST([PLATFORM_LDFLAGS])
dnl ************************************
dnl *** Check for additional plugins ***
dnl ************************************
BM_THUNAR_PLUGIN_APR()
BM_THUNAR_PLUGIN_SBR()
BM_THUNAR_PLUGIN_TPA()
BM_THUNAR_PLUGIN_UCA()
BM_THUNAR_PLUGIN_WALLPAPER()
AC_CONFIG_FILES([
Makefile
docs/Makefile
docs/design/Makefile
docs/papers/Makefile
docs/reference/Makefile
docs/reference/thunarx/Makefile
docs/reference/thunarx/version.xml
docs/reference/thunar/Makefile
docs/reference/thunar/version.xml
examples/Makefile
examples/tex-open-terminal/Makefile
icons/Makefile
icons/16x16/Makefile
icons/24x24/Makefile
icons/48x48/Makefile
icons/128x128/Makefile
icons/scalable/Makefile
plugins/Makefile
plugins/thunar-apr/Makefile
plugins/thunar-sbr/Makefile
plugins/thunar-sendto-email/Makefile
plugins/thunar-tpa/Makefile
plugins/thunar-uca/Makefile
plugins/thunar-wallpaper/Makefile
po/Makefile.in
thunar/Makefile
thunarx/Makefile
thunarx/thunarx-3.pc
thunarx/thunarx-config.h
])
AC_OUTPUT
dnl ***************************
dnl *** Print configuration ***
dnl ***************************
echo
echo "Build Configuration:"
echo
if test x"$GIO_UNIX_FOUND" = x"yes"; then
echo "* GIO UNIX features: yes"
else
echo "* GIO UNIX features: no"
fi
if test x"$GUDEV_FOUND" = x"yes"; then
echo "* GUDev (required for thunar-volman): yes"
else
echo "* GUDev (required for thunar-volman): no"
fi
if test x"$LIBNOTIFY_FOUND" = x"yes"; then
echo "* Mount notification support: yes"
else
echo "* Mount notification support: no"
fi
echo "* Debug Support: $enable_debug"
echo "* GObject Instrospection support: $enable_introspection"
echo
echo "Additional Plugins:"
echo
echo "* Advanced Properties: $ac_bm_thunar_plugin_apr"
echo "* Simple Builtin Renamers: $ac_bm_thunar_plugin_sbr"
echo "* Trash Panel Applet: $ac_bm_thunar_plugin_tpa"
echo "* User Customizable Actions: $ac_bm_thunar_plugin_uca"
echo "* Wallpaper support: $ac_bm_thunar_plugin_wallpaper"
echo

22
docs/Makefile.am Normal file
View file

@ -0,0 +1,22 @@
SUBDIRS = \
design \
papers \
reference
doc_DATA = \
README.gtkrc
man_MANS = \
Thunar.1
if MAINTAINER_MODE
%.1: %.xml
xsltproc -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
endif
EXTRA_DIST = \
$(doc_DATA) \
$(man_MANS) \
Thunar.xml
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

83
docs/README.gtkrc Normal file
View file

@ -0,0 +1,83 @@
Thunar GTK Style Properties
===========================
Several user interface elements in Thunar are customizable via the standard
GTK style mechanism. Besides the customization provided by the GTK widgets,
that are used in Thunar, there are a bunch of additional settings that can
be customized via the GTK theme or the ~/.gtkrc-2.0 file in the users home
directory.
The following list includes the customizable widgets and the settings that
can be customized for this widgets.
ThunarAbstractIconView
----------------------
The ThunarAbstractIconView widget class is the base class for both the
ThunarIconView (the "Icon View") and the ThunarCompactView (the "Compact
List View"). It provides two additional settings that can be customized:
* column-spacing (0...)
The additional space inserted between columns in the icon and
compact view. Defaults to 6 for both the icon and the compact
view.
* row-spacing (0...)
The additional space inserted between rows in the icon and
compact view. Defaults to 6 for the icon view and 0 for the
compact view.
For example, say you want to reduce the additional spacing for the icon view
to 3 pixel, then you can put the following lines in the file ~/.gtkrc-2.0 in
your home directory (just create the file if it is not already present):
style "thunar-icon-view-reduced-style"
{
ThunarIconView::column-spacing = 3
ThunarIconView::row-spacing = 3
}
class "ThunarIconView" style "thunar-icon-view-reduced-style"
ThunarPathEntry
---------------
The ThunarPathEntry widget class is used for the location bar, both in the
traditional location selector and the "Open Location" dialog. The path entry
displays an icon right before the path, whose size can be customized via the
* icon-size (16/22/24/33/36/48/64/72/96/128/192)
style property. For example to increase the size to 24 pixel, you can put the
following lines in the file ~/.gtkrc-2.0:
style "thunar-path-entry-increased-style"
{
ThunarPathEntry::icon-size = 24
}
class "ThunarPathEntry" style "thunar-path-entry-increased-style"
You should however make sure that your icon theme supports the icon size,
otherwise you might end up with ugly up/down-scaled icons.
ThunarLocationButtons
---------------------
The ThunarLocationButtons widget class is used for the path bar style loca-
tion selector. It provides the following customizable style properties:
* spacing (0...)
The amount of space inserted between the path buttons. Defaults to
3 pixels.
Additional information can be found on the Thunar Project Wiki:
https://docs.xfce.org/xfce/thunar/hidden-settings

133
docs/Thunar.xml Normal file
View file

@ -0,0 +1,133 @@
<!--
Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
-->
<refentry id="Thunar">
<refmeta>
<refentrytitle>Thunar</refentrytitle>
<refmiscinfo class="manual">User Commands</refmiscinfo>
<refmiscinfo class="source"> </refmiscinfo>
<manvolnum>1</manvolnum>
</refmeta>
<refnamediv>
<refname>Thunar</refname>
<refpurpose>File Manager for the Xfce Desktop Environment</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>Thunar</command>
<arg choice="opt">options</arg>
<arg rep="repeat">
<arg>URI</arg>
</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>Thunar</command>
<arg choice="opt">options</arg>
<arg choice="plain">--bulk-rename</arg>
<arg rep="repeat">
<arg>URI</arg>
</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>Thunar</command>
<arg choice="opt">options</arg>
<arg choice="plain">--quit</arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>
<command>Thunar</command> is a fast and easy to use file manager for the Xfce Desktop Environment. It
has been designed from the ground up to be lighweight with special focus on usability. Its user
interface is clean and intuitive, and does not include any confusing or useless options.
</para>
</refsect1>
<refsect1>
<title>Invocation</title>
<para>
<command>Thunar</command> takes a list of <replaceable>URI</replaceable>s for folders that should be
opened in new file manager windows or files that should be selected in new file manager windows.
The <replaceable>URI</replaceable>s may be specified as either <emphasis role="bold">file:</emphasis>
or <emphasis role="bold">trash:</emphasis> URIs, absolute paths or paths relative to the current directory
from which <command>Thunar</command> is being invoked. If no <replaceable>URI</replaceable>s are specified,
the current folder will be opened in a new file manager window.
</para>
<para>
When the <option>--bulk-rename</option> option is specified no file managers windows will be opened, but instead
the <replaceable>URI</replaceable>s will be passed to the bulk renamer. The bulk renamer allows one to
rename several files or folders at once using different renamer modules.
</para>
<refsect2>
<title>Options</title>
<variablelist>
<varlistentry>
<term><option>-?</option>, <option>--help</option></term>
<listitem>
<para>Print brief help and exit.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-V</option>, <option>--version</option></term>
<listitem>
<para>Print version information and exit.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-B</option>, <option>--bulk-rename</option></term>
<listitem>
<para>
Open the <replaceable>URI</replaceable>s in a standalone window of the bulk renamer.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--daemon</option></term>
<listitem>
<para>
Do not terminate the <command>Thunar</command> instance when the last window is closed, but keep
it running to speed up opening new windows later on. This is the default when spawning <command>Thunar</command>
as part of the default Xfce session or when using D-Bus activation.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--display=DISPLAY</option></term>
<listitem>
<para>Use the specified X <option>DISPLAY</option> for the user interface.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-q</option>, <option>--quit</option></term>
<listitem>
<para>
Terminate any <command>Thunar</command> instance running in the background (spawned using the
<option>--daemon</option> option). This command should be used whenever <command>Thunar</command>
is upgraded to a new version to ensure that no old instance is reused.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect2>
</refsect1>
<refsect1>
<title>Author</title>
<para>
<command>Thunar</command> was written by Benedikt Meurer <email>benny@xfce.org</email>.
</para>
<para>
This manual page was written by Benedikt Meurer <email>benny@xfce.org</email>.
</para>
</refsect1>
</refentry>

5
docs/design/Makefile.am Normal file
View file

@ -0,0 +1,5 @@
EXTRA_DIST = \
mime.xmi \
overview.xmi
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

2118
docs/design/mime.xmi Normal file

File diff suppressed because it is too large Load diff

15653
docs/design/overview.xmi Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

4
docs/papers/Makefile.am Normal file
View file

@ -0,0 +1,4 @@
EXTRA_DIST = \
HackingOnThunar.odt
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,5 @@
SUBDIRS = \
thunar \
thunarx
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,82 @@
# The name of the module.
DOC_MODULE=thunar
# The top-level SGML file.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
# Extra options to supply to gtkdoc-scan
SCAN_OPTIONS=--deprecated-guards="EXO_DISABLE_DEPRECATED" --rebuild-sections --rebuild-types
# The directory containing the source code. Relative to $(srcdir)
DOC_SOURCE_DIR=$(top_srcdir)/thunar
# Extra options to supply to gtkdoc-mkdb
MKDB_OPTIONS=--xml-mode --output-format=xml
# Extra options to supply to gtkdoc-fixref
FIXXREF_OPTIONS=
# Used for dependencies
HFILE_GLOB=$(top_srcdir)/thunar/*.h
CFILE_GLOB=$(top_srcdir)/thunar/*.c
# Header files to ignore when scanning
IGNORE_HFILES= \
thunar-private.h \
thunar-dbus-freedesktop-interfaces.h \
thunar-dbus-service-infos.h \
thunar-marshal.h \
stamp-thunar-marshal.h \
thunar-thumbnailer-proxy.h \
thunar-thumbnail-cache-proxy.h \
thunar-resources.h
# Extra files to add when scanning (relative to $srcdir)
EXTRA_HFILES=
# Images to copy into HTML directory
HTML_IMAGES =
# Extra SGML files that are included by DOC_MAIN_SGML_FILE
content_files =
# CFLAGS and LDFLAGS for compiling scan program. Only needed
# if $(DOC_MODULE).types is non-empty.
GTKDOC_CFLAGS = \
-I$(top_srcdir) \
-I$(top_srcdir)/thunar \
-I$(top_builddir) \
$(GTK_CFLAGS) \
$(GTK_DOC_EXTRA_CFLAGS) \
$(EXO_CFLAGS) \
$(GIO_CFLAGS) \
$(GTHREAD_CFLAGS) \
$(GUDEV_CFLAGS) \
$(LIBNOTIFY_CFLAGS) \
$(LIBSM_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(LIBXFCE4KBD_PRIVATE_CFLAGS) \
$(XFCONF_CFLAGS) \
$(PANGO_CFLAGS) \
$(PLATFORM_CFLAGS)
GTKDOC_LIBS = \
$(GTK_LIBS) \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \
$(top_builddir)/thunar/libthunar.a \
$(EXO_LIBS) \
$(GIO_LIBS) \
$(GTHREAD_LIBS) \
$(GMODULE_LIBS) \
$(GUDEV_LIBS) \
$(LIBNOTIFY_LIBS) \
$(LIBSM_LIBS) \
$(LIBXFCE4UI_LIBS) \
$(LIBXFCE4KBD_PRIVATE_LIBS) \
$(XFCONF_LIBS) \
$(PANGO_LIBS)
include $(top_srcdir)/gtk-doc.make
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,275 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
[
<!ENTITY ThunarNotify SYSTEM "xml/thunar-notify.xml">
<!ENTITY ThunarMenu SYSTEM "xml/thunar-menu.xml">
<!ENTITY ThunarDbusService SYSTEM "xml/thunar-dbus-service.xml">
<!ENTITY ThunarRenamerProgress SYSTEM "xml/thunar-renamer-progress.xml">
<!ENTITY ThunarGioExtensions SYSTEM "xml/thunar-gio-extensions.xml">
<!ENTITY ThunarPropertiesDialog SYSTEM "xml/thunar-properties-dialog.xml">
<!ENTITY ThunarShortcutsModel SYSTEM "xml/thunar-shortcuts-model.xml">
<!ENTITY ThunarIconRenderer SYSTEM "xml/thunar-icon-renderer.xml">
<!ENTITY ThunarIoScanDirectory SYSTEM "xml/thunar-io-scan-directory.xml">
<!ENTITY ThunarShortcutsIconRenderer SYSTEM "xml/thunar-shortcuts-icon-renderer.xml">
<!ENTITY ThunarPreferencesDialog SYSTEM "xml/thunar-preferences-dialog.xml">
<!ENTITY ThunarTreePane SYSTEM "xml/thunar-tree-pane.xml">
<!ENTITY ThunarApplication SYSTEM "xml/thunar-application.xml">
<!ENTITY ThunarRenamerPair SYSTEM "xml/thunar-renamer-pair.xml">
<!ENTITY ThunarShortcutsView SYSTEM "xml/thunar-shortcuts-view.xml">
<!ENTITY ThunarLocationButtons SYSTEM "xml/thunar-location-buttons.xml">
<!ENTITY ThunarBrowser SYSTEM "xml/thunar-browser.xml">
<!ENTITY ThunarSendtoModel SYSTEM "xml/thunar-sendto-model.xml">
<!ENTITY ThunarUtil SYSTEM "xml/thunar-util.xml">
<!ENTITY ThunarPreferences SYSTEM "xml/thunar-preferences.xml">
<!ENTITY ThunarStandardView SYSTEM "xml/thunar-standard-view.xml">
<!ENTITY ThunarHistory SYSTEM "xml/thunar-history.xml">
<!ENTITY ThunarSidePane SYSTEM "xml/thunar-side-pane.xml">
<!ENTITY ThunarEnumTypes SYSTEM "xml/thunar-enum-types.xml">
<!ENTITY ThunarGobjectExtensions SYSTEM "xml/thunar-gobject-extensions.xml">
<!ENTITY ThunarDetailsView SYSTEM "xml/thunar-details-view.xml">
<!ENTITY ThunarDialogs SYSTEM "xml/thunar-dialogs.xml">
<!ENTITY ThunarImage SYSTEM "xml/thunar-image.xml">
<!ENTITY ThunarUser SYSTEM "xml/thunar-user.xml">
<!ENTITY ThunarLocationButton SYSTEM "xml/thunar-location-button.xml">
<!ENTITY ThunarRenamerModel SYSTEM "xml/thunar-renamer-model.xml">
<!ENTITY ThunarSizeLabel SYSTEM "xml/thunar-size-label.xml">
<!ENTITY ThunarClipboardManager SYSTEM "xml/thunar-clipboard-manager.xml">
<!ENTITY ThunarAbstractDialog SYSTEM "xml/thunar-abstract-dialog.xml">
<!ENTITY ThunarAbstractIconView SYSTEM "xml/thunar-abstract-icon-view.xml">
<!ENTITY ThunarDeviceMonitor SYSTEM "xml/thunar-device-monitor.xml">
<!ENTITY ThunarIoJobs SYSTEM "xml/thunar-io-jobs.xml">
<!ENTITY ThunarDeepCountJob SYSTEM "xml/thunar-deep-count-job.xml">
<!ENTITY ThunarIconView SYSTEM "xml/thunar-icon-view.xml">
<!ENTITY ThunarChooserButton SYSTEM "xml/thunar-chooser-button.xml">
<!ENTITY ThunarPermissionsChooser SYSTEM "xml/thunar-permissions-chooser.xml">
<!ENTITY ThunarFolder SYSTEM "xml/thunar-folder.xml">
<!ENTITY ThunarIoJobsUtil SYSTEM "xml/thunar-io-jobs-util.xml">
<!ENTITY ThunarRenamerDialog SYSTEM "xml/thunar-renamer-dialog.xml">
<!ENTITY ThunarGtkExtensions SYSTEM "xml/thunar-gtk-extensions.xml">
<!ENTITY ThunarLocationEntry SYSTEM "xml/thunar-location-entry.xml">
<!ENTITY ThunarDnd SYSTEM "xml/thunar-dnd.xml">
<!ENTITY ThunarActionManager SYSTEM "xml/thunar-action-manager.xml">
<!ENTITY ThunarEmblemChooser SYSTEM "xml/thunar-emblem-chooser.xml">
<!ENTITY ThunarSessionClient SYSTEM "xml/thunar-session-client.xml">
<!ENTITY ThunarShortcutsPane SYSTEM "xml/thunar-shortcuts-pane.xml">
<!ENTITY ThunarJob SYSTEM "xml/thunar-job.xml">
<!ENTITY ThunarJobOperation SYSTEM "xml/thunar-job-operation.xml">
<!ENTITY ThunarJobOperation SYSTEM "xml/thunar-job-operation-history.xml">
<!ENTITY ThunarPangoExtensions SYSTEM "xml/thunar-pango-extensions.xml">
<!ENTITY ThunarStatusbar SYSTEM "xml/thunar-statusbar.xml">
<!ENTITY ThunarLocationBar SYSTEM "xml/thunar-location-bar.xml">
<!ENTITY ThunarColumnEditor SYSTEM "xml/thunar-column-editor.xml">
<!ENTITY ThunarListModel SYSTEM "xml/thunar-list-model.xml">
<!ENTITY ThunarIce SYSTEM "xml/thunar-ice.xml">
<!ENTITY ThunarWindow SYSTEM "xml/thunar-window.xml">
<!ENTITY ThunarFile SYSTEM "xml/thunar-file.xml">
<!ENTITY ThunarIconFactory SYSTEM "xml/thunar-icon-factory.xml">
<!ENTITY ThunarPathEntry SYSTEM "xml/thunar-path-entry.xml">
<!ENTITY ThunarSimpleJob SYSTEM "xml/thunar-simple-job.xml">
<!ENTITY ThunarChooserDialog SYSTEM "xml/thunar-chooser-dialog.xml">
<!ENTITY ThunarComponent SYSTEM "xml/thunar-component.xml">
<!ENTITY ThunarTransferJob SYSTEM "xml/thunar-transfer-job.xml">
<!ENTITY ThunarTreeView SYSTEM "xml/thunar-tree-view.xml">
<!ENTITY ThunarDevice SYSTEM "xml/thunar-device.xml">
<!ENTITY ThunarView SYSTEM "xml/thunar-view.xml">
<!ENTITY ThunarChooserModel SYSTEM "xml/thunar-chooser-model.xml">
<!ENTITY ThunarNavigator SYSTEM "xml/thunar-navigator.xml">
<!ENTITY ThunarCompactView SYSTEM "xml/thunar-compact-view.xml">
<!ENTITY ThunarColumnModel SYSTEM "xml/thunar-column-model.xml">
<!ENTITY ThunarTreeModel SYSTEM "xml/thunar-tree-model.xml">
<!ENTITY ThunarProgressDialog SYSTEM "xml/thunar-progress-dialog.xml">
<!ENTITY ThunarGdkExtensions SYSTEM "xml/thunar-gdk-extensions.xml">
<!ENTITY ThunarProgressView SYSTEM "xml/thunar-progress-view.xml">
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
<!ENTITY % gtkdocentities SYSTEM "xml/gtkdocentities.ent">
%gtkdocentities;
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>Thunar Internal Functions Reference Manual</title>
<releaseinfo>
For &package_string;.
The latest version of this documentation can be found on-line at
<ulink role="online-location" url="https://developer.xfce.org/&package_name;/index.html">https://developer.xfce.org/&package_name;/</ulink>.
</releaseinfo>
<copyright>
<year>2024</year>
<holder>The Xfce Development Team</holder>
</copyright>
</bookinfo>
<part id="glib-gtk-extensions">
<title>Glib/GTK Extensions</title>
<xi:include href="xml/thunar-gobject-extensions.xml"/>
<xi:include href="xml/thunar-gio-extensions.xml"/>
<xi:include href="xml/thunar-gtk-extensions.xml"/>
<xi:include href="xml/thunar-gdk-extensions.xml"/>
<xi:include href="xml/thunar-pango-extensions.xml"/>
</part>
<part id="thunar-objects">
<title>Thunar Backend Objects</title>
<chapter>
<title>File Abstraction</title>
<xi:include href="xml/thunar-file.xml"/>
<xi:include href="xml/thunar-folder.xml"/>
</chapter>
<chapter>
<title>Device Management</title>
<xi:include href="xml/thunar-device.xml"/>
<xi:include href="xml/thunar-device-monitor.xml"/>
<xi:include href="xml/thunar-notify.xml"/>
</chapter>
<chapter>
<title>Parallel Tasks</title>
<xi:include href="xml/thunar-job.xml"/>
<xi:include href="xml/thunar-simple-job.xml"/>
<xi:include href="xml/thunar-io-jobs.xml"/>
<xi:include href="xml/thunar-io-jobs-util.xml"/>
<xi:include href="xml/thunar-io-scan-directory.xml"/>
<xi:include href="xml/thunar-deep-count-job.xml"/>
<xi:include href="xml/thunar-transfer-job.xml"/>
</chapter>
<chapter>
<title>X Session / DBus Management</title>
<xi:include href="xml/thunar-session-client.xml"/>
<xi:include href="xml/thunar-ice.xml"/>
<xi:include href="xml/thunar-dbus-service.xml"/>
</chapter>
<chapter>
<title>Miscellaneous</title>
<xi:include href="xml/thunar-util.xml"/>
<xi:include href="xml/thunar-enum-types.xml"/>
<xi:include href="xml/thunar-preferences.xml"/>
<xi:include href="xml/thunar-user.xml"/>
<xi:include href="xml/thunar-job-operation.xml"/>
<xi:include href="xml/thunar-job-operation-history.xml"/>
</chapter>
</part>
<part id="thunar-view">
<title>Main Screen UI Widgets</title>
<chapter>
<title>Navigation Control</title>
<xi:include href="xml/thunar-window.xml"/>
<xi:include href="xml/thunar-navigator.xml"/>
<xi:include href="xml/thunar-browser.xml"/>
<xi:include href="xml/thunar-history.xml"/>
</chapter>
<chapter>
<title>Main View</title>
<xi:include href="xml/thunar-view.xml"/>
<xi:include href="xml/thunar-standard-view.xml"/>
<xi:include href="xml/thunar-abstract-icon-view.xml"/>
<xi:include href="xml/thunar-icon-view.xml"/>
<xi:include href="xml/thunar-details-view.xml"/>
<xi:include href="xml/thunar-compact-view.xml"/>
</chapter>
<chapter>
<title>Side Pane</title>
<xi:include href="xml/thunar-side-pane.xml"/>
<xi:include href="xml/thunar-shortcuts-pane.xml"/>
<xi:include href="xml/thunar-shortcuts-view.xml"/>
<xi:include href="xml/thunar-tree-pane.xml"/>
<xi:include href="xml/thunar-tree-view.xml"/>
</chapter>
<chapter>
<title>Location Bar</title>
<xi:include href="xml/thunar-location-bar.xml"/>
<xi:include href="xml/thunar-location-buttons.xml"/>
<xi:include href="xml/thunar-location-button.xml"/>
<xi:include href="xml/thunar-location-entry.xml"/>
<xi:include href="xml/thunar-path-entry.xml"/>
</chapter>
<chapter>
<title>Status Bar</title>
<xi:include href="xml/thunar-statusbar.xml"/>
</chapter>
</part>
<part id="thunar-widgets">
<title>Other Thunar UI Widgets</title>
<chapter>
<title>Chooser</title>
<xi:include href="xml/thunar-emblem-chooser.xml"/>
<xi:include href="xml/thunar-chooser-dialog.xml"/>
<xi:include href="xml/thunar-permissions-chooser.xml"/>
<xi:include href="xml/thunar-chooser-button.xml"/>
<xi:include href="xml/thunar-chooser-model.xml"/>
</chapter>
<chapter>
<title>Dialog</title>
<xi:include href="xml/thunar-dialogs.xml"/>
<xi:include href="xml/thunar-abstract-dialog.xml"/>
<xi:include href="xml/thunar-column-editor.xml"/>
<xi:include href="xml/thunar-preferences-dialog.xml"/>
<xi:include href="xml/thunar-progress-dialog.xml"/> <!-- Duplicated on purpose -->
<xi:include href="xml/thunar-properties-dialog.xml"/>
<xi:include href="xml/thunar-renamer-dialog.xml"/> <!-- Duplicated on purpose -->
<xi:include href="xml/thunar-size-label.xml"/>
</chapter>
<chapter>
<title>Entry Model</title>
<xi:include href="xml/thunar-column-model.xml"/>
<xi:include href="xml/thunar-list-model.xml"/>
<xi:include href="xml/thunar-renamer-model.xml"/> <!-- Duplicated on purpose -->
<xi:include href="xml/thunar-shortcuts-model.xml"/>
<xi:include href="xml/thunar-sendto-model.xml"/>
<xi:include href="xml/thunar-tree-model.xml"/>
</chapter>
<chapter>
<title>File Selection</title>
<xi:include href="xml/thunar-clipboard-manager.xml"/>
<xi:include href="xml/thunar-dnd.xml"/>
<xi:include href="xml/thunar-component.xml"/>
</chapter>
<chapter>
<title>Applicaton</title>
<xi:include href="xml/thunar-application.xml"/>
</chapter>
<chapter>
<title>Menu Entries</title>
<xi:include href="xml/thunar-menu.xml"/>
<xi:include href="xml/thunar-action-manager.xml"/>
</chapter>
<chapter>
<title>Image/Icon</title>
<xi:include href="xml/thunar-image.xml"/>
<xi:include href="xml/thunar-icon-factory.xml"/>
<xi:include href="xml/thunar-icon-renderer.xml"/>
<xi:include href="xml/thunar-shortcuts-icon-renderer.xml"/>
</chapter>
<chapter>
<title>Progress</title>
<xi:include href="xml/thunar-progress-view.xml"/>
<xi:include href="xml/thunar-progress-dialog.xml"/> <!-- Duplicated on purpose -->
</chapter>
<chapter>
<title>Renamer</title>
<xi:include href="xml/thunar-renamer-progress.xml"/>
<xi:include href="xml/thunar-renamer-model.xml"/> <!-- Duplicated on purpose -->
<xi:include href="xml/thunar-renamer-dialog.xml"/> <!-- Duplicated on purpose -->
<xi:include href="xml/thunar-renamer-pair.xml"/>
</chapter>
</part>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
</book>

View file

@ -0,0 +1 @@
@PACKAGE_VERSION@

View file

@ -0,0 +1,53 @@
# The name of the module.
DOC_MODULE=thunarx
# The top-level SGML file.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
# Extra options to supply to gtkdoc-scan
SCAN_OPTIONS=--deprecated-guards="EXO_DISABLE_DEPRECATED"
# The directory containing the source code. Relative to $(srcdir)
DOC_SOURCE_DIR=$(top_srcdir)/thunarx
# Extra options to supply to gtkdoc-mkdb
MKDB_OPTIONS=--xml-mode --output-format=xml
# Extra options to supply to gtkdoc-fixref
FIXXREF_OPTIONS=
# Used for dependencies
HFILE_GLOB=
CFILE_GLOB=
# Header files to ignore when scanning
IGNORE_HFILES=thunarx-alias.h
# Extra files to add when scanning (relative to $srcdir)
EXTRA_HFILES=
# Images to copy into HTML directory
HTML_IMAGES = \
$(srcdir)/images/abstraction.png \
$(srcdir)/images/bulk-rename.png \
$(srcdir)/images/menu-provider.png \
$(srcdir)/images/say-hello.png
# Extra SGML files that are included by DOC_MAIN_SGML_FILE
content_files =
# CFLAGS and LDFLAGS for compiling scan program. Only needed
# if $(DOC_MODULE).types is non-empty.
GTKDOC_CFLAGS = \
-I$(top_srcdir) \
-I$(top_builddir) \
$(GTK_CFLAGS) \
$(GTK_DOC_EXTRA_CFLAGS)
GTKDOC_LIBS = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \
$(GTK_LIBS)
include $(top_srcdir)/gtk-doc.make
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View file

@ -0,0 +1,470 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
[
<!ENTITY ThunarxFileInfo SYSTEM "xml/thunarx-file-info.xml">
<!ENTITY ThunarxMenu SYSTEM "xml/thunarx-menu.xml">
<!ENTITY ThunarxMenuItem SYSTEM "xml/thunarx-menu-item.xml">
<!ENTITY ThunarxMenuProvider SYSTEM "xml/thunarx-menu-provider.xml">
<!ENTITY ThunarxPreferencesProvider SYSTEM "xml/thunarx-preferences-provider.xml">
<!ENTITY ThunarxPropertyPage SYSTEM "xml/thunarx-property-page.xml">
<!ENTITY ThunarxPropertyPageProvider SYSTEM "xml/thunarx-property-page-provider.xml">
<!ENTITY ThunarxProviderFactory SYSTEM "xml/thunarx-provider-factory.xml">
<!ENTITY ThunarxProviderPlugin SYSTEM "xml/thunarx-provider-plugin.xml">
<!ENTITY ThunarxRenamer SYSTEM "xml/thunarx-renamer.xml">
<!ENTITY ThunarxRenamerProvider SYSTEM "xml/thunarx-renamer-provider.xml">
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
<!ENTITY % gtkdocentities SYSTEM "xml/gtkdocentities.ent">
%gtkdocentities;
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>thunarx Reference Manual</title>
<releaseinfo>
For &package_string;.
The latest version of this documentation can be found on-line at
<ulink role="online-location" url="https://developer.xfce.org/&package_name;/index.html">https://developer.xfce.org/&package_name;/</ulink>.
</releaseinfo>
<copyright>
<year>2024</year>
<holder>The Xfce Development Team</holder>
</copyright>
</bookinfo>
<part id="thunarx-overview">
<title>Overview</title>
<para>
The Thunar Extension Framework (<systemitem class="library">thunarx</systemitem>) provides
developers with an easy way to extend the basic functionality provided by
the <ulink type="http" url="https://docs.xfce.org/xfce/thunar/start">Thunar File Manager</ulink>.
The <systemitem class="library">thunarx</systemitem> library includes interfaces that can
be implemented by extensions for various purposes.
</para>
<para>
It is based on the <ulink type="http"
url="https://developer.gnome.org/gobject/unstable/chapter-gtype.html">GLib Dynamic Type
System</ulink> and loads the extensions on demand to reduce the system resources
allocated for the file manager process.
</para>
<sect1 id="thunarx-overview-goals">
<title>Goals</title>
<para>
The Thunar Extension Framework was developed with the following goals in mind:
</para>
<orderedlist>
<listitem>
It should be easy to extend the functionality of the file manager in certain
ways.
</listitem>
<listitem>
The internals of the file manager should be hidden from the extensions to be
able to maintain API/ABI compatibility for extensions over various major
releases of the file manager.
</listitem>
<listitem>
Provide basic compatibility with the <ulink type="http"
url="https://www.gnome.org/projects/nautilus/">Nautilus</ulink> Extension Framework,
so vendors don't need to write several versions of their extensions for the various
file managers. With the current implementation it should be easy to write a small
wrapper library for generic extensions that can be loaded into both Thunar and
Nautilus.
</listitem>
<listitem>
Extensions should not be loaded into memory until they are actually required to
save system resources. This differs from the way Nautilus handles extensions and
therefore people that already know how to write Nautilus extensions must be
careful when writing extensions for Thunar, because Thunar actually unloads the
extension when it's no longer needed. The <ulink type="http"
url="https://developer.gnome.org/gobject/unstable/GTypePlugin.html">GTypePlugin</ulink>
and <ulink type="http"
url="https://developer.gnome.org/gobject/unstable/GTypeModule.html">GTypeModule</ulink>
sections in the <ulink type="http" url="https://developer.gnome.org/gobject/unstable/">GObject
Reference Manual</ulink> provide details about the handling of dynamic type plugins.
</listitem>
<listitem>
Permit developers to write extensions in languages other than C.
</listitem>
</orderedlist>
</sect1>
</part>
<part id="thunarx-writing-extensions">
<title>Writing Extensions</title>
<para>
This section explains the basic steps required to write an extension for the <ulink type="http"
url="https://docs.xfce.org/xfce/thunar/start">Thunar File Manager</ulink> using the C language interface. It is
just a short introduction and not meant to provide extensive details about the internal workings
of the file manager.
</para>
<sect1 id="thunarx-writing-extensions-basic-concepts">
<title>Basic Concepts</title>
<sect2 id="thunarx-writing-extensions-extensions-and-providers">
<title>Extensions and Providers</title>
<para>
<emphasis>Thunar Extensions</emphasis> are shared libraries that extend the basic functionality
provided by the Thunar File Manager. An extension exports one or more <link
linkend="GObject"><type>GObject</type></link>s, called <emphasis>providers</emphasis>, to Thunar.
</para>
<para>
Providers implement one or more of the <link linkend="GInterface"><type>GInterface</type></link>s included with
the <systemitem class="library">thunarx</systemitem> library. The currently exported interfaces
include the <link linkend="ThunarxMenuProvider"><type>ThunarxMenuProvider</type></link> for adding context menu
items to the file views, the <link
linkend="ThunarxPropertyPageProvider"><type>ThunarxPropertyPageProvider</type></link> for adding pages to the
file properties dialog, the <link
linkend="ThunarxPreferencesProvider"><type>ThunarxPreferencesProvider</type></link> for adding items to the
preferences section of the main menu, and the <link
linkend="ThunarxRenamerProvider"><type>ThunarxRenamerProvider</type></link> for adding renamers to the bulk
rename dialog.
</para>
</sect2>
<sect2 id="thunarx-writing-extensions-thunarxfileinfo">
<title>ThunarxFileInfo</title>
<para>
Thunar passes file references to the provider using <link linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link>
objects. The <link linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link> interface provides access to the file
information that Thunar has already read - mime type, URI, name, etc. Extensions should use the data from
the <link linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link> rather than reading it themselves, to
prevent excessive I/O.
</para>
<para>
There is exactly one <link linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link> per file, and it is kept around
for as long as Thunar is interested in the file. Extensions can use this information to manage lifecycles of
its own data - e.g. when the <link linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link> goes away, it is safe
for the extension to forget any private data for that file.
</para>
</sect2>
<sect2 id="thunarx-writing-extensions-names">
<title>Names</title>
<para>
Most objects created by the extensions need names, e.g. the <link linkend="ThunarxMenuItem"><type>ThunarxMenuItem</type></link>s
returned from the <link linkend="ThunarxMenuProvider"><type>ThunarxMenuProvider</type></link>s. These names must be
namespaced with the name of the extension. For example the main item returned from the
<application>TexOpenTerminal</application> extension (which can be found in the <filename
role="directory">examples/tex-open-terminal</filename> subdirectory of the Thunar distribution) should be called
<literal>TexOpenTerminal::open-terminal</literal>. The namespace must be global among the providers exported by
a certain extension.
</para>
</sect2>
<sect2 id="thunarx-writing-extensions-types">
<title>Types</title>
<para>
Thunar extensions are loaded as <link linkend="GTypeModule"><type>GTypeModule</type></link>s. This means that all GTypes
created by the extension must be registered with the <link linkend="GTypeModule"><type>GTypeModule</type></link>, using
<link linkend="thunarx-provider-plugin-register-type"><function>thunarx_provider_plugin_register_type()</function></link>
function (or one of the convenience macros like <link linkend="THUNARX-DEFINE-TYPE:CAPS"><function>THUNARX_DEFINE_TYPE()</function></link>)
rather than <link linked="g-type-register-static"><function>g_type_register_static()</function></link>. All types
exported by an extension must be registered in
<link linkend="thunar-extension-initialize"><function>thunar_extension_initialize()</function></link>.
</para>
</sect2>
</sect1>
<sect1 id="thunarx-writing-extensions-getting-started">
<title>Getting Started</title>
<para>
Providers are <link linkend="ThunarxProviderPlugin"><type>ThunarxProviderPlugin</type></link>s loaded from shared libraries
installed in <filename role="directory">$libdir/thunarx-2/</filename>. The shared libraries are linked against the
<systemitem class="library">thunarx-2</systemitem> library.
</para>
<para>
The extensions must provide three public functions, <function>thunar_extension_initialize()</function>,
<function>thunar_extension_shutdown()</function> and <function>thunar_extension_list_types()</function>.
</para>
<para>
<function>thunar_extension_initialize()</function> is passed a <link linkend="ThunarxProviderPlugin"><type>ThunarxProviderPlugin</type></link>
object, and is responsible to register all GTypes required by the extension. <function>thunar_extension_shutdown()</function> should
perform any extension-specific shutdown required prior to unloading the extension. <function>thunar_extension_list_types()</function>
returns an array of GTypes that represent the types of the providers exported by the extension. Thunar will instantiate
objects of those types when needed.
</para>
<example>
<title>Basic Structure of an extension</title>
<programlisting>
#include &lt;gmodule.h&gt;
#include &lt;thunarx/thunarx.h&gt;
static GType type_list[1];
static void
foo_extension_register_type (ThunarxProviderPlugin *plugin)
{
static const GTypeInfo info =
{
sizeof (FooExtensionClass),
NULL,
NULL,
(GClassInitFunc) foo_extension_class_init,
NULL,
NULL,
sizeof (FooExtension),
0,
(GInstanceInitFunc) foo_extension_init,
NULL,
};
type_list[0] = thunarx_provider_plugin_register_type (plugin,
G_TYPE_OBJECT,
"FooExtension",
&amp;info, 0);
/* implement the desired provider interfaces */
}
static GType
foo_extension_get_type (void)
{
return type_list[0];
}
G_MODULE_EXPORT void
thunar_extension_initialize (ThunarxProviderPlugin *plugin)
{
const gchar *mismatch;
/* verify the versions */
mismatch = thunarx_check_version (THUNARX_MAJOR_VERSION,
THUNARX_MINOR_VERSION,
THUNARX_MICRO_VERSION);
if (G_UNLIKELY (mismatch != NULL))
{
g_warning ("Version mismatch: %s", mismatch);
return;
}
foo_extension_register_type (plugin);
}
G_MODULE_EXPORT void
thunar_extension_shutdown (void)
{
/* any extension-specific shutdown */
}
G_MODULE_EXPORT void
thunar_extension_list_types (const GType **types,
gint *n_types)
{
*types = type_list;
*n_types = G_N_ELEMENTS (type_list);
}</programlisting>
</example>
<para>
You should check the <application>TexOpenTerminal</application> extension, which is included in the Thunar
distribution in the <filename role="directory">examples/tex-open-terminal</filename> directory, for a more
complete example of how to write a Thunar extension.
</para>
<sect2 id="thunarx-writing-extensions-compiling-thunar-extensions">
<title>Compiling Thunar Extensions</title>
<para>
To compile a Thunar extension, you need to tell the compiler where to find the
<systemitem class="library">thunarx</systemitem> header files and library. This
is done with the <literal>pkg-config</literal> utility.
</para>
<para>
The following interactive shell session demonstrates how <literal>pkg-config</literal>
is used (the actual output on your system will be different):
<screen>
$ pkg-config --cflags thunarx-2
-DXTHREADS -DXUSE_MTSAFE_API -I/opt/local/include/thunarx-2 -I/usr/local/include/atk-1.0 \
-I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/X11R6/include/gtk-2.0 \
-I/usr/X11R6/lib/gtk-2.0/include -I/usr/X11R6/include -I/usr/X11R6/include/pango-1.0 \
-I/usr/local/include/freetype2 -I/usr/local/include
$ pkg-config --libs thunarx-2
-Wl,--rpath -Wl,/usr/local/lib -L/usr/local/lib -L/usr/X11R6/lib -L/opt/local/lib -lthunarx-2</screen>
</para>
<para>
The easiest way to compile an extension is to use the <emphasis>backticks</emphasis>
feature of the shell. If you enclose a command in backticks (<emphasis>not single
quotes</emphasis>), then its output will be substituted into the command line before
execution. So to compile an extension, you would type the following:
<screen>
$ gcc -shared -fPIC -DPIC `pkg-config --cflags --libs thunarx-2` foo.c -o foo.so</screen>
</para>
</sect2>
<sect2 id="thunarx-writing-extensions-installing-thunar-extensions">
<title>Installing Thunar Extensions</title>
<para>
To determine the directory where extensions must be installed on your local system,
you can use the following command (as mentioned above, the output will be different
on your system):
<screen>
$ pkg-config --variable=extensionsdir thunarx-2
/opt/local/lib/thunarx-2</screen>
</para>
<para>
For example, to install the extension <filename>foo.so</filename> on your system,
you would type the following:
<screen>
$ install -d `pkg-config --variable=extensionsdir thunarx-2`
$ install -c -m 0755 foo.so `pkg-config --variable=extensionsdir thunarx-2`/foo.so</screen>
</para>
</sect2>
</sect1>
<sect1 id="thunarx-writing-extensions-advanced-topics">
<title>Advanced topics</title>
<para>
This section provides a short introduction to some of the advanced topics in the
Thunar Extension Framework.
</para>
<sect2 id="thunarx-writing-extensions-memory-resident-extensions">
<title>Memory-Resident Extensions</title>
<para>
Some extensions may not play well with Thunar's on-demand loading and unloading
of extensions. For example, an extension that uses a desktop library, which in
turn registers additional static GTypes will not work after being loaded and
unloaded for the first time. For these kind of extensions, Thunar provides the
option to make extensions <emphasis>memory resident</emphasis>, which means the
extension will be loaded once and afterwards will never be unloaded again until
Thunar exits.
</para>
<para>
Such extensions must set the <literal>resident</literal> property of the provider plugin in its
<function>thunar_extension_initialize()</function> function to <literal>TRUE</literal>, using the <link
linkend="thunarx-provider-plugin-set-resident"><function>thunarx_provider_plugin_set_resident()</function></link>
method.
</para>
<example>
<title>Making an extension memory resident</title>
<programlisting>
G_MODULE_EXPORT void
thunar_extension_initialize (ThunarxProviderPlugin *plugin)
{
/* setup the types for the extension */
...
/* ensure that the extension will never be unloaded */
thunarx_provider_plugin_set_resident (plugin, TRUE);
}</programlisting>
</example>
</sect2>
</sect1>
</part>
<part id="thunarx-fundamentals">
<title>Fundamentals</title>
<xi:include href="xml/thunarx-version-information.xml"/>
</part>
<part id="thunarx-abstraction-layer">
<title>Abstraction Layer</title>
<para>
In order to hide the internals of the file manager from the extensions, the <systemitem
class="library">thunarx</systemitem> library provides an abstraction layer, which includes
interfaces accessible to the extension, that are implemented by the file manager at runtime.
</para>
<para>
<inlinegraphic fileref="abstraction.png" format="PNG" />
</para>
<para>
Currently the abstraction layer consists of the interface <link
linkend="ThunarxFileInfo"><type>ThunarxFileInfo</type></link>, which provides
extensions with a way to access information about a file handled within
the file manager, the class <link
linkend="ThunarxPropertyPage"><type>ThunarxPropertyPage</type></link>, which
is the base class for widgets that can be added to the properties dialog by
extensions, the interface <link
linkend="ThunarxProviderPlugin"><type>ThunarxProviderPlugin</type></link>, which
hides the details of dynamic type registration from the extensions, and the
class <link linkend="ThunarxRenamer"><type>ThunarxRenamer</type></link>, which
is the abstract base class for renamers that can be used in the bulk rename
dialog provided by Thunar to rename multiple files at once.
</para>
<xi:include href="xml/thunarx-file-info.xml"/>
<xi:include href="xml/thunarx-menu.xml"/>
<xi:include href="xml/thunarx-menu-item.xml"/>
<xi:include href="xml/thunarx-property-page.xml"/>
<xi:include href="xml/thunarx-provider-plugin.xml"/>
<xi:include href="xml/thunarx-renamer.xml"/>
</part>
<part id="thunarx-providers">
<title>Providers</title>
<para>
The extensions interact with the file manager by implementing so called
<emphasis>providers</emphasis>. This is a concept adopted from the Nautilus
Extension Framework.
</para>
<para>
Providers are interfaces in the <systemitem class="library">thunarx</systemitem>
library that describe the functionality provided by a certain extension. For
example, when the file manager pops up the file context menu, it'll first lookup
all extensions that implement the interface <interface>ThunarxMenuProvider</interface>
ask those extensions for the list of additional menu items.
</para>
<para>
<inlinegraphic fileref="menu-provider.png" format="PNG" />
</para>
<xi:include href="xml/thunarx-menu-provider.xml"/>
<xi:include href="xml/thunarx-property-page-provider.xml"/>
<xi:include href="xml/thunarx-preferences-provider.xml"/>
<xi:include href="xml/thunarx-renamer-provider.xml"/>
</part>
<part id="thunarx-using-extensions">
<title>Using Thunar extensions in applications</title>
<xi:include href="xml/thunarx-provider-factory.xml"/>
</part>
<index>
<title>Index</title>
</index>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
</book>
<!--
vi:set ts=2 sw=2 et ai syntax=docbkxml:
-->

View file

@ -0,0 +1 @@

View file

@ -0,0 +1,243 @@
<INCLUDE>thunarx/thunarx.h</INCLUDE>
<SECTION>
<FILE>thunarx-file-info</FILE>
<TITLE>ThunarxFileInfo</TITLE>
ThunarxFileInfoIface
ThunarxFileInfo
thunarx_file_info_get_name
thunarx_file_info_get_uri
thunarx_file_info_get_parent_uri
thunarx_file_info_get_uri_scheme
thunarx_file_info_get_mime_type
thunarx_file_info_has_mime_type
thunarx_file_info_is_directory
thunarx_file_info_get_file_info
thunarx_file_info_get_filesystem_info
thunarx_file_info_get_location
thunarx_file_info_changed
thunarx_file_info_renamed
THUNARX_TYPE_FILE_INFO_LIST
thunarx_file_info_list_copy
thunarx_file_info_list_free
<SUBSECTION Standard>
THUNARX_TYPE_FILE_INFO
THUNARX_FILE_INFO
THUNARX_IS_FILE_INFO
THUNARX_FILE_INFO_GET_IFACE
<SUBSECTION Private>
thunarx_file_info_get_type
thunarx_file_info_list_get_type
</SECTION>
<SECTION>
<FILE>thunarx-menu</FILE>
<TITLE>ThunarxMenu</TITLE>
ThunarxMenu
thunarx_menu_new
thunarx_menu_append_item
thunarx_menu_prepend_item
thunarx_menu_get_items
<SUBSECTION Standard>
ThunarxMenuClass
THUNARX_TYPE_MENU
THUNARX_MENU
THUNARX_MENU_CLASS
THUNARX_IS_MENU
THUNARX_IS_MENU_CLASS
THUNARX_MENU_GET_CLASS
<SUBSECTION Private>
ThunarxMenuPrivate
thunarx_menu_get_type
</SECTION>
<SECTION>
<FILE>thunarx-menu-item</FILE>
<TITLE>ThunarxMenuItem</TITLE>
ThunarxMenuItem
thunarx_menu_item_new
thunarx_menu_item_activate
thunarx_menu_item_get_sensitive
thunarx_menu_item_set_sensitive
thunarx_menu_item_set_menu
thunarx_menu_item_list_free
<SUBSECTION Standard>
ThunarxMenuItemClass
THUNARX_TYPE_MENU_ITEM
THUNARX_MENU_ITEM
THUNARX_MENU_ITEM_CLASS
THUNARX_IS_MENU_ITEM
THUNARX_IS_MENU_ITEM_CLASS
THUNARX_MENU_ITEM_GET_CLASS
<SUBSECTION Private>
ThunarxMenuItemPrivate
thunarx_menu_item_get_type
</SECTION>
<SECTION>
<FILE>thunarx-menu-provider</FILE>
<TITLE>ThunarxMenuProvider</TITLE>
ThunarxMenuProviderIface
ThunarxMenuProvider
thunarx_menu_provider_get_file_menu_items
thunarx_menu_provider_get_folder_menu_items
thunarx_menu_provider_get_dnd_menu_items
<SUBSECTION Standard>
THUNARX_TYPE_MENU_PROVIDER
THUNARX_MENU_PROVIDER
THUNARX_IS_MENU_PROVIDER
THUNARX_MENU_PROVIDER_GET_IFACE
<SUBSECTION Private>
thunarx_menu_provider_get_type
</SECTION>
<SECTION>
<FILE>thunarx-preferences-provider</FILE>
<TITLE>ThunarxPreferencesProvider</TITLE>
ThunarxPreferencesProviderIface
ThunarxPreferencesProvider
thunarx_preferences_provider_get_menu_items
<SUBSECTION Standard>
THUNARX_TYPE_PREFERENCES_PROVIDER
THUNARX_PREFERENCES_PROVIDER
THUNARX_IS_PREFERENCES_PROVIDER
THUNARX_PREFERENCES_PROVIDER_GET_IFACE
<SUBSECTION Private>
thunarx_preferences_provider_get_type
</SECTION>
<SECTION>
<FILE>thunarx-property-page</FILE>
<TITLE>ThunarxPropertyPage</TITLE>
ThunarxPropertyPage
thunarx_property_page_new
thunarx_property_page_new_with_label_widget
thunarx_property_page_get_label
thunarx_property_page_set_label
thunarx_property_page_get_label_widget
thunarx_property_page_set_label_widget
<SUBSECTION Standard>
ThunarxPropertyPageClass
THUNARX_TYPE_PROPERTY_PAGE
THUNARX_PROPERTY_PAGE
THUNARX_PROPERTY_PAGE_CLASS
THUNARX_IS_PROPERTY_PAGE
THUNARX_IS_PROPERTY_PAGE_CLASS
THUNARX_PROPERTY_PAGE_GET_CLASS
<SUBSECTION Private>
ThunarxPropertyPagePrivate
thunarx_property_page_get_type
</SECTION>
<SECTION>
<FILE>thunarx-property-page-provider</FILE>
<TITLE>ThunarxPropertyPageProvider</TITLE>
ThunarxPropertyPageProvider
ThunarxPropertyPageProviderIface
thunarx_property_page_provider_get_pages
<SUBSECTION Standard>
THUNARX_TYPE_PROPERTY_PAGE_PROVIDER
THUNARX_PROPERTY_PAGE_PROVIDER
THUNARX_IS_PROPERTY_PAGE_PROVIDER
THUNARX_PROPERTY_PAGE_PROVIDER_GET_IFACE
<SUBSECTION Private>
thunarx_property_page_provider_get_type
</SECTION>
<SECTION>
<FILE>thunarx-provider-factory</FILE>
<TITLE>ThunarxProviderFactory</TITLE>
ThunarxProviderFactory
thunarx_provider_factory_get_default
thunarx_provider_factory_list_providers
<SUBSECTION Standard>
ThunarxProviderFactoryClass
THUNARX_TYPE_PROVIDER_FACTORY
THUNARX_PROVIDER_FACTORY
THUNARX_PROVIDER_FACTORY_CLASS
THUNARX_IS_PROVIDER_FACTORY
THUNARX_IS_PROVIDER_FACTORY_CLASS
THUNARX_PROVIDER_FACTORY_GET_CLASS
<SUBSECTION Private>
thunarx_provider_factory_get_type
</SECTION>
<SECTION>
<FILE>thunarx-provider-plugin</FILE>
<TITLE>ThunarxProviderPlugin</TITLE>
ThunarxProviderPlugin
ThunarxProviderPluginIface
thunarx_provider_plugin_get_resident
thunarx_provider_plugin_set_resident
thunarx_provider_plugin_register_type
thunarx_provider_plugin_add_interface
thunarx_provider_plugin_register_enum
thunarx_provider_plugin_register_flags
THUNARX_DEFINE_TYPE
THUNARX_DEFINE_TYPE_WITH_CODE
THUNARX_DEFINE_ABSTRACT_TYPE
THUNARX_DEFINE_ABSTRACT_TYPE_WITH_CODE
THUNARX_DEFINE_TYPE_EXTENDED
THUNARX_IMPLEMENT_INTERFACE
<SUBSECTION Standard>
THUNARX_TYPE_PROVIDER_PLUGIN
THUNARX_PROVIDER_PLUGIN
THUNARX_IS_PROVIDER_PLUGIN
THUNARX_PROVIDER_PLUGIN_GET_IFACE
<SUBSECTION Private>
thunarx_provider_plugin_get_type
</SECTION>
<SECTION>
<FILE>thunarx-renamer</FILE>
<TITLE>ThunarxRenamer</TITLE>
ThunarxRenamer
ThunarxRenamerClass
thunarx_renamer_get_help_url
thunarx_renamer_set_help_url
thunarx_renamer_get_name
thunarx_renamer_set_name
thunarx_renamer_process
thunarx_renamer_load
thunarx_renamer_save
thunarx_renamer_get_menu_items
thunarx_renamer_changed
<SUBSECTION Standard>
THUNARX_TYPE_RENAMER
THUNARX_RENAMER
THUNARX_RENAMER_CLASS
THUNARX_IS_RENAMER
THUNARX_IS_RENAMER_CLASS
THUNARX_RENAMER_GET_CLASS
<SUBSECTION Private>
thunarx_renamer_get_type
</SECTION>
<SECTION>
<FILE>thunarx-renamer-provider</FILE>
<TITLE>ThunarxRenamerProvider</TITLE>
ThunarxRenamerProvider
ThunarxRenamerProviderIface
thunarx_renamer_provider_get_renamers
<SUBSECTION Standard>
THUNARX_TYPE_RENAMER_PROVIDER
THUNARX_RENAMER_PROVIDER
THUNARX_IS_RENAMER_PROVIDER
THUNARX_RENAMER_PROVIDER_GET_IFACE
<SUBSECTION Private>
thunarx_renamer_provider_get_type
</SECTION>
<SECTION>
<FILE>thunarx-version-information</FILE>
<TITLE>Variables and functions to check the library version</TITLE>
thunarx_major_version
thunarx_minor_version
thunarx_micro_version
thunarx_check_version
THUNARX_MAJOR_VERSION
THUNARX_MINOR_VERSION
THUNARX_MICRO_VERSION
THUNARX_CHECK_VERSION
</SECTION>

View file

@ -0,0 +1,14 @@
#include <thunarx/thunarx.h>
thunarx_file_info_get_type
thunarx_menu_get_type
thunarx_menu_item_get_type
thunarx_menu_provider_get_type
thunarx_preferences_provider_get_type
thunarx_property_page_get_type
thunarx_property_page_provider_get_type
thunarx_provider_factory_get_type
thunarx_provider_plugin_get_type
thunarx_renamer_get_type
thunarx_renamer_provider_get_type

View file

@ -0,0 +1 @@
@PACKAGE_VERSION@

9
examples/Makefile.am Normal file
View file

@ -0,0 +1,9 @@
SUBDIRS = \
tex-open-terminal
EXTRA_DIST = \
nautilus-bulk-rename.py \
thunar-file-manager.py \
xfce-file-manager.py
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,65 @@
#!/usr/bin/env python
#
# Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#
# --------------------------------------------------------------- #
# This example demonstrates how to integrate Thunar's Bulk Rename #
# functionality into Nautilus. You'll need the nautilus-python #
# bindings to actually try this example. #
# #
# Just copy this file to #
# #
# ~/.nautilus/python-extensions/ #
# #
# creating the directory if it does not already exist, and re- #
# start Nautilus. Afterwards you'll see an action labeled "Bulk #
# Rename" in the file context menu, which can be used to rename #
# the selected files. #
# #
# Thunar must be compiled with D-BUS support for this to work. #
# --------------------------------------------------------------- #
import gtk
import nautilus
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
class NautilusBulkRename(nautilus.MenuProvider):
def __init__(self):
bus = dbus.SessionBus()
thunar_object = bus.get_object('org.xfce.Thunar', '/org/xfce/FileManager')
self.thunar = dbus.Interface(thunar_object, 'org.xfce.Thunar')
def menu_activate_cb(self, item, files):
uris = []
for file in files:
uris.append(file.get_uri())
self.thunar.BulkRename(files[0].get_parent_uri(), uris, False, item.get_data('display'))
def get_file_items(self, window, files):
if len(files) == 0:
return
item = nautilus.MenuItem('NautilusBulkRename::bulk-rename', 'Bulk Rename', 'Rename all selected files at once')
item.set_data('display', window.get_screen().make_display_name())
item.connect('activate', self.menu_activate_cb, files)
return item,

View file

@ -0,0 +1,44 @@
AM_CPPFLAGS = \
-I$(top_builddir) \
-I$(top_srcdir) \
-I$(top_srcdir)/examples \
-DG_LOG_DOMAIN=\"TexOpenTerminal\" \
$(PLATFORM_CPPFLAGS)
extensionsdir = $(libdir)/thunarx-$(THUNARX_VERSION_API)
extensions_LTLIBRARIES = \
tex-open-terminal.la
tex_open_terminal_la_SOURCES = \
tex-open-terminal-plugin.c \
tex-open-terminal.c \
tex-open-terminal.h
tex_open_terminal_la_CFLAGS = \
$(GTK_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(PLATFORM_CFLAGS)
tex_open_terminal_la_DEPENDENCIES = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la
tex_open_terminal_la_LIBADD = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \
$(LIBXFCE4UI_LIBS) \
$(GTK_LIBS)
tex_open_terminal_la_LDFLAGS = \
-avoid-version \
-export-dynamic \
-export-symbols-regex="^thunar_extension_(shutdown|initialize|list_types)" \
-module \
$(PLATFORM_LDFLAGS)
EXTRA_DIST = \
README.md
# Don't install/uninstall examples by default
install:
uninstall:
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,9 @@
This is an example for a Thunar Extension that provides additional context menu items.
It adds an "Open Terminal Here" action to the folder context menu and to the file context menu of directories, and thereby allows you to open a new Terminal instance in the given folder.
The example is mainly provided for developers to get an idea about how to write an extension that implements the ThunarxMenuProvider interface.
The extension is not installed by default, as every installed extension increases the resources required to run Thunar. If you want to install this extension, you can use the command `make install-extensionsLTLIBRARIES` in this directory. If you want to uninstall it, you can use the command `make uninstall-extensionsLTLIBRARIES` in this directory.
Please note that this extension is not meant for daily use, but should just serve as an example of how to write a simple Thunar extension. If you want to be able to open a terminal in a specific folder, you should consider installing the thunar-uca extension (see thunar-uca/README.md) and adding an "Open Terminal Here" action there (there's already such an action available by default).

View file

@ -0,0 +1,81 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <tex-open-terminal/tex-open-terminal.h>
G_MODULE_EXPORT void
thunar_extension_initialize (ThunarxProviderPlugin *plugin);
G_MODULE_EXPORT void
thunar_extension_shutdown (void);
G_MODULE_EXPORT void
thunar_extension_list_types (const GType **types,
gint *n_types);
static GType type_list[1];
void
thunar_extension_initialize (ThunarxProviderPlugin *plugin)
{
const gchar *mismatch;
/* verify that the thunarx versions are compatible */
mismatch = thunarx_check_version (THUNARX_MAJOR_VERSION, THUNARX_MINOR_VERSION, THUNARX_MICRO_VERSION);
if (G_UNLIKELY (mismatch != NULL))
{
g_warning ("Version mismatch: %s", mismatch);
return;
}
g_message ("Initializing TexOpenTerminal extension");
/* register the types provided by this plugin */
tex_open_terminal_register_type (plugin);
/* setup the plugin type list */
type_list[0] = TEX_TYPE_OPEN_TERMINAL;
}
void
thunar_extension_shutdown (void)
{
g_message ("Shutting down TexOpenTerminal extension");
}
void
thunar_extension_list_types (const GType **types,
gint *n_types)
{
*types = type_list;
*n_types = G_N_ELEMENTS (type_list);
}

View file

@ -0,0 +1,172 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include <libxfce4ui/libxfce4ui.h>
#include <tex-open-terminal/tex-open-terminal.h>
static void
tex_open_terminal_menu_provider_init (ThunarxMenuProviderIface *iface);
static GList *
tex_open_terminal_get_file_menu_items (ThunarxMenuProvider *provider,
GtkWidget *window,
GList *files);
static GList *
tex_open_terminal_get_folder_menu_items (ThunarxMenuProvider *provider,
GtkWidget *window,
ThunarxFileInfo *folder);
static void
tex_open_terminal_activated (ThunarxMenuItem *item,
GtkWidget *window);
struct _TexOpenTerminalClass
{
GObjectClass __parent__;
};
struct _TexOpenTerminal
{
GObject __parent__;
};
THUNARX_DEFINE_TYPE_WITH_CODE (TexOpenTerminal,
tex_open_terminal,
G_TYPE_OBJECT,
THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_MENU_PROVIDER,
tex_open_terminal_menu_provider_init));
static void
tex_open_terminal_class_init (TexOpenTerminalClass *klass)
{
/* nothing to do here */
}
static void
tex_open_terminal_init (TexOpenTerminal *open_terminal)
{
/* nothing to do here */
}
static void
tex_open_terminal_menu_provider_init (ThunarxMenuProviderIface *iface)
{
iface->get_file_menu_items = tex_open_terminal_get_file_menu_items;
iface->get_folder_menu_items = tex_open_terminal_get_folder_menu_items;
}
static GList *
tex_open_terminal_get_file_menu_items (ThunarxMenuProvider *provider,
GtkWidget *window,
GList *files)
{
/* check if we have a directory here */
if (G_LIKELY (files != NULL && files->next == NULL && thunarx_file_info_is_directory (files->data)))
return tex_open_terminal_get_folder_menu_items (provider, window, files->data);
return NULL;
}
static GList *
tex_open_terminal_get_folder_menu_items (ThunarxMenuProvider *provider,
GtkWidget *window,
ThunarxFileInfo *folder)
{
ThunarxMenuItem *item = NULL;
gchar *scheme;
gchar *path;
gchar *uri;
/* determine the uri scheme of the folder and check if we support it */
scheme = thunarx_file_info_get_uri_scheme (folder);
if (G_LIKELY (strcmp (scheme, "file") == 0))
{
/* determine the local path to the folder */
uri = thunarx_file_info_get_uri (folder);
path = g_filename_from_uri (uri, NULL, NULL);
g_free (uri);
/* check if we have a valid path here */
if (G_LIKELY (path != NULL))
{
item = thunarx_menu_item_new ("TexOpenTerminal::open-terminal-here", "Open Terminal Here", "Open Terminal in this folder", "utilities-terminal");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (tex_open_terminal_activated), window);
g_object_set_data_full (G_OBJECT (item), "open-terminal-here-path", path, g_free);
}
}
g_free (scheme);
return (item != NULL) ? g_list_prepend (NULL, item) : NULL;
}
static void
tex_open_terminal_activated (ThunarxMenuItem *item,
GtkWidget *window)
{
const gchar *path;
GError *error = NULL;
gchar *command;
/* determine the folder path */
path = g_object_get_data (G_OBJECT (item), "open-terminal-here-path");
if (G_UNLIKELY (path == NULL))
return;
/* build up the command line for the terminal */
command = g_strdup_printf ("exo-open --launch TerminalEmulator --working-directory \"%s\"", path);
/* try to run the terminal command */
if (!xfce_spawn_command_line (NULL, command, FALSE, FALSE, TRUE, &error))
{
/* display an error dialog */
xfce_dialog_show_error (GTK_WINDOW (window), error, "Failed to open terminal in folder %s.", path);
g_error_free (error);
}
/* cleanup */
g_free (command);
}

View file

@ -0,0 +1,45 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __TEX_OPEN_TERMINAL_H__
#define __TEX_OPEN_TERMINAL_H__
#include <thunarx/thunarx.h>
G_BEGIN_DECLS;
typedef struct _TexOpenTerminalClass TexOpenTerminalClass;
typedef struct _TexOpenTerminal TexOpenTerminal;
#define TEX_TYPE_OPEN_TERMINAL (tex_open_terminal_get_type ())
#define TEX_OPEN_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEX_TYPE_OPEN_TERMINAL, TexOpenTerminal))
#define TEX_OPEN_TERMINAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEX_TYPE_OPEN_TERMINAL, TexOpenTerminalClass))
#define TEX_IS_OPEN_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEX_TYPE_OPEN_TERMINAL))
#define TEX_IS_OPEN_TERMINAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEX_TYPE_OPEN_TERMINAL))
#define TEX_OPEN_TERMINAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEX_TYPE_OPEN_TERMINAL, TexOpenTerminalClass))
GType
tex_open_terminal_get_type (void) G_GNUC_CONST;
void
tex_open_terminal_register_type (ThunarxProviderPlugin *plugin);
G_END_DECLS;
#endif /* !__TEX_OPEN_TERMINAL_H__ */

56
examples/thunar-file-manager.py Executable file
View file

@ -0,0 +1,56 @@
#!/usr/bin/env python
#
# Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#
# ------------------------------------------------------------ #
# Simple example of how to communicate with Thunar using the #
# org.xfce.Thunar D-BUS interface. #
# #
# Thunar must be compiled with D-BUS support for this to work. #
# ------------------------------------------------------------ #
import gtk
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
# acquire a reference to the Thunar object
bus = dbus.SessionBus()
thunar_object = bus.get_object('org.xfce.Thunar', '/org/xfce/FileManager')
thunar = dbus.Interface(thunar_object, 'org.xfce.Thunar')
# You can now invoke methods on the thunar object, for
# example, to terminate a running Thunar instance (just
# like Thunar -q), you can use:
#
# thunar.Terminate()
#
# or, if you want to open the bulk rename dialog in the
# standalone version with an empty file list and /tmp
# as default folder for the "Add Files" dialog, use:
#
# thunar.BulkRename('/tmp', [], True, '', '')
#
# See the thunar-dbus-service-infos.xml file for the exact
# interface definition.
#
# We just popup the bulk rename dialog to
# demonstrate that it works. ;-)
thunar.BulkRename('/tmp', [], True, '', '')

69
examples/xfce-file-manager.py Executable file
View file

@ -0,0 +1,69 @@
#!/usr/bin/env python
#
# Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#
# --------------------------------------------------------------------------- #
# Simple example of how to communicate with Thunar (and any other Xfce file #
# file manager) using the org.xfce.FileManager D-BUS interface. #
# #
# Thunar must be compiled with D-BUS support for this to work. #
# --------------------------------------------------------------------------- #
import gtk
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
# acquire a reference to the FileManager object
bus = dbus.SessionBus()
xfce_file_manager_object = bus.get_object('org.xfce.FileManager', '/org/xfce/FileManager')
xfce_file_manager = dbus.Interface(xfce_file_manager_object, 'org.xfce.FileManager')
# You can now invoke methods on the xfce_file_manager object,
# for example, to open a new file manager window for /tmp, you
# would use the following method:
#
# xfce_file_manager.DisplayFolder('/tmp', '', '')
#
# or, if you also want to pre-select a file in the folder, you
# can use:
#
# xfce_file_manager.DisplayFolderAndSelect('/tmp', 'file.txt', '', '')
#
# else if you want to display the file managers preferences
# dialog, you'd use
#
# xfce_file_manager.DisplayPreferencesDialog('', '')
#
# and to open the file properties dialog of a given file, use
#
# xfce_file_manager.DisplayFileProperties('/path/to/file', '', '')
#
# and last but not least, to launch a given file (or open
# a folder), use
#
# xfce_file_manager.Launch('/path/to/file', '', '')
#
# See the thunar-dbus-service-infos.xml file for the exact
# interface definition.
#
# We just popup a new window for the root directory here to
# demonstrate that it works. ;-)
xfce_file_manager.Launch('/', '', '')

View file

@ -0,0 +1,8 @@
iconsdir = $(datadir)/icons/hicolor/128x128/apps
icons_DATA = \
org.xfce.thunar.png
EXTRA_DIST = \
$(icons_DATA)
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

14
icons/16x16/Makefile.am Normal file
View file

@ -0,0 +1,14 @@
appsdir = $(datadir)/icons/hicolor/16x16/apps
apps_DATA = \
org.xfce.thunar.png
stockdir = $(datadir)/icons/hicolor/16x16/stock/navigation
stock_DATA = \
stock_folder-copy.png \
stock_folder-move.png
EXTRA_DIST = \
$(apps_DATA) \
$(stock_DATA)
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

View file

@ -0,0 +1,252 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 16 16"
style="display:inline;enable-background:new"
version="1.0"
id="svg11300"
height="16"
width="16"
sodipodi:docname="org.xfce.thunar.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="/home/ochosi/Nerdstuff/xfce/thunar/icons/16x16/org.xfce.thunar.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1387"
id="namedview35"
showgrid="true"
inkscape:zoom="32"
inkscape:cx="2.142207"
inkscape:cy="0.9226059"
inkscape:window-x="0"
inkscape:window-y="29"
inkscape:window-maximized="1"
inkscape:current-layer="g3547"
showguides="false"
inkscape:lockguides="true"
inkscape:pagecheckerboard="false">
<inkscape:grid
type="xygrid"
id="grid842"
empspacing="4" />
</sodipodi:namedview>
<title
id="title4162">Adwaita Icon Template</title>
<defs
id="defs3">
<linearGradient
id="linearGradient854">
<stop
id="stop848"
offset="0"
style="stop-color:#79503c;stop-opacity:1" />
<stop
style="stop-color:#ad7702;stop-opacity:1"
offset="0.50000006"
id="stop850" />
<stop
id="stop852"
offset="1"
style="stop-color:#79503c;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1257"
id="linearGradient1259-9"
x1="37.378735"
y1="61.646938"
x2="39.902897"
y2="65.362389"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.0248301,0,0,0.0500901,507.1174,348.39423)" />
<linearGradient
inkscape:collect="always"
id="linearGradient1257">
<stop
style="stop-color:#bcc5ca;stop-opacity:1;"
offset="0"
id="stop1253" />
<stop
style="stop-color:#bcc5ca;stop-opacity:0;"
offset="1"
id="stop1255" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient854"
id="linearGradient1197-6"
x1="52.303093"
y1="83.351303"
x2="80.691933"
y2="83.351303"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.02818007,0,0,0.02573999,506.83686,350.05454)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="89.643501"
x2="76.094429"
y1="89.643501"
x1="51.999992"
id="linearGradient1222-1"
xlink:href="#linearGradient1220"
gradientTransform="matrix(0.07794078,0,0,0.0745119,501.11852,345.81586)" />
<linearGradient
id="linearGradient1220">
<stop
style="stop-color:#79503c;stop-opacity:1"
offset="0"
id="stop1215" />
<stop
id="stop1224"
offset="0.51465631"
style="stop-color:#ad7702;stop-opacity:1" />
<stop
style="stop-color:#79503c;stop-opacity:1"
offset="1"
id="stop1218" />
</linearGradient>
</defs>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>GNOME Design Team</dc:title>
</cc:Agent>
</dc:creator>
<dc:source />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
<dc:title>Adwaita Icon Template</dc:title>
<dc:subject>
<rdf:Bag />
</dc:subject>
<dc:date />
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<dc:publisher>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:publisher>
<dc:identifier />
<dc:relation />
<dc:language />
<dc:coverage />
<dc:description />
<dc:contributor>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
style="display:inline;enable-background:new"
id="g3547"
transform="matrix(5.0000031,0,0,5.0000031,-2535.5554,-1750.0011)"
inkscape:label="emoji-symbols-alt">
<rect
ry="0.23935749"
rx="0.28078926"
y="351.49655"
x="508.41705"
height="1.6898036"
width="0.59712142"
id="rect1245-8"
style="opacity:1;fill:#603f2f;fill-opacity:1;fill-rule:nonzero;stroke:#603f2f;stroke-width:0.02726839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
style="fill:#c02700;fill-opacity:1;fill-rule:evenodd;stroke:#c02700;stroke-width:0.08388707;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 508.92155,352.08471 c 0.17302,-0.11621 0.30805,-0.0452 0.30805,-0.0452 0,0 -0.77679,0.53415 -1.45302,0.51819 l 0.11445,-0.23932 c 0.72823,0.0107 1.02227,-0.43589 1.02227,-0.43589 0.1461,-0.055 0.3154,-0.09 0.35246,0.14826 l -0.0821,0.0133 c -0.053,0.0171 -0.22351,0.11454 -0.26206,0.0404 z"
id="path1229-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
<path
style="opacity:1;fill:url(#linearGradient1197-6);fill-opacity:1;fill-rule:nonzero;stroke:#603f2f;stroke-width:0.20830667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 508.68968,351.50416 h 0.0422 c 0.1522,0 0.27475,0.0306 0.27475,0.12305 v 1.2934 c 0,0.0925 -0.12255,0.17524 -0.27475,0.17524 h -0.0422 c -0.15221,0 -0.27476,-0.0828 -0.27476,-0.17524 v -1.2934 c 0,-0.0924 0.12255,-0.12305 0.27476,-0.12305 z"
id="rect1178-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssssssss" />
<rect
ry="0.1740209"
style="opacity:1;fill:#485e6b;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1185-9"
width="2.7999983"
height="1.1999992"
x="507.31076"
y="350.39999" />
<rect
ry="0.15954697"
style="opacity:1;fill:#a7b0b7;fill-opacity:1;stroke:#758087;stroke-width:0.19999988;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1243-2"
width="2.600208"
height="1.2002088"
x="507.41077"
y="350.09979" />
<path
style="fill:#c02700;fill-rule:evenodd;stroke:none;stroke-width:0.09017574;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 508.31076,352.35879 0.8,-0.37143 v 0.22857 l -0.8,0.37143 z"
id="path1189-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#c02700;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.08433907;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 508.31076,351.8 0.8,0.6 v 0.2 l -0.8,-0.6 z"
id="path1187-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#485e6b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.02434334px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 509.31076,351.4 c 0,0 0,-0.0542 0,-0.2 0.0754,0.11049 0.2,0.2 0.2,0.2 z"
id="path1227-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="fill:url(#linearGradient1259-9);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.03526673px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 507.91077,351.6 0.2,-0.2 v 0.2 z"
id="path1251-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

View file

@ -0,0 +1,258 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333332"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="stock_folder-copy.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient2224"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
id="linearGradient10005">
<stop
style="stop-color:#e3d0b5;stop-opacity:1"
offset="0"
id="stop10007" />
<stop
id="stop10009"
offset="0.92004764"
style="stop-color:#e5d3ba;stop-opacity:1" />
<stop
style="stop-color:#d3b58b;stop-opacity:1"
offset="1"
id="stop10011" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient2226"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<linearGradient
inkscape:collect="always"
id="linearGradient8316">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop8318" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop8320" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient2228"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient993"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient995"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient997"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="3.4011673"
inkscape:cy="12.098214"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1029"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-292.76667)">
<g
transform="translate(-0.52916674,-1.0583333)"
id="g991">
<g
id="g989"
transform="translate(-17.991664,3.4395833)">
<g
id="g979"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
sodipodi:nodetypes="ccccccccccc"
id="path973"
d="m 560.5,-8.3754874 v 6.8755001 h 11.00048 V -7.34375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -2.84387 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-0.3442374 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 H 561.5 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccsssccccc"
id="path975"
d="m 561.5,1.272441e-5 h 8.99998 V -7.5 l -1.96873,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-0.2808224 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 l -4.75,-8.3e-4 z"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path977"
d="m 561.49288,-8.4999874 h 4.0001"
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g987"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient993);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,0.4743601 c -0.17551,0.057329 -0.24265,0.18168 -0.54772,0.18168 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 l -10e-6,4.5220976 c 0,1.33755002 0.68182,2.40000001 1.5,2.40000001 h 7.99998 c 0.81819,0 1.5,-1.06244999 1.5,-2.40000001 L 571.49998,-7.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
id="path981"
sodipodi:nodetypes="ccscccccccccc"
inkscape:connector-curvature="0" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient995);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 v 3.4218877 c 0,0.4988574 0.14105,0.9688306 0.30273,1.24023441 0.16169,0.2714037 0.26177,0.2597656 0.19727,0.2597656 h 8.00038 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 0.16168,-0.27140241 0.30273,-0.74137451 0.30273,-1.24023441 V -7.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z"
id="path983"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccssssccccsccccc" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path985"
d="m 570.49998,-7.5 h -3.5207 l -2.00555,1.0000126 H 561.5"
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient997);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
</g>
</g>
</g>
<g
id="g919"
transform="translate(0.52916659,0.26458334)">
<g
transform="translate(-17.991664,3.4395833)"
id="g868">
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g8715">
<path
inkscape:connector-curvature="0"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 560.5,-8.3754874 v 6.8755001 h 11.00048 V -7.34375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -2.84387 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-0.3442374 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 H 561.5 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
id="path11539"
sodipodi:nodetypes="ccccccccccc" />
<path
inkscape:connector-curvature="0"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
d="m 561.5,1.272441e-5 h 8.99998 V -7.5 l -1.96873,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-0.2808224 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 l -4.75,-8.3e-4 z"
id="path11541"
sodipodi:nodetypes="ccccsssccccc" />
<path
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 561.49288,-8.4999874 h 4.0001"
id="path8086"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g8720">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscccccccccc"
id="path11543"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,0.4743601 c -0.17551,0.057329 -0.24265,0.18168 -0.54772,0.18168 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 l -10e-6,4.5220976 c 0,1.33755002 0.68182,2.40000001 1.5,2.40000001 h 7.99998 c 0.81819,0 1.5,-1.06244999 1.5,-2.40000001 L 571.49998,-7.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient2224);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
<path
sodipodi:nodetypes="cccccssssccccsccccc"
inkscape:connector-curvature="0"
id="path8314"
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 v 3.4218877 c 0,0.4988574 0.14105,0.9688306 0.30273,1.24023441 0.16169,0.2714037 0.26177,0.2597656 0.19727,0.2597656 h 8.00038 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 0.16168,-0.27140241 0.30273,-0.74137451 0.30273,-1.24023441 V -7.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2226);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
<path
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient2228);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 570.49998,-7.5 h -3.5207 l -2.00555,1.0000126 H 561.5"
id="path11571"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

View file

@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333332"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="stock_folder-move.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient2224"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
id="linearGradient10005">
<stop
style="stop-color:#e3d0b5;stop-opacity:1"
offset="0"
id="stop10007" />
<stop
id="stop10009"
offset="0.92004764"
style="stop-color:#e5d3ba;stop-opacity:1" />
<stop
style="stop-color:#d3b58b;stop-opacity:1"
offset="1"
id="stop10011" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient2226"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<linearGradient
inkscape:collect="always"
id="linearGradient8316">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop8318" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop8320" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient2228"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="3.4011673"
inkscape:cy="8.5267857"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1029"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-292.76667)">
<g
id="g979"
style="display:inline;fill:#bca780;stroke:#beab8b;stroke-width:1.00157475;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new;fill-opacity:0.15686275"
transform="matrix(0.26458333,0,0,0.26458333,-148.16664,295.4125)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bca780;fill-opacity:0.15686275;fill-rule:evenodd;stroke:#beab8b;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.00314964, 1.00157480999999993;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m -10.5,0.5 c -0.99615,0.0162 -1,1.125 -1,1.125 V 3.578125 8.0996094 8.5 h 0.02539 c 0.120299,1.1424193 0.740289,2 1.474609,2 h 8 c 0.7343286,0 1.3543117,-0.8575807 1.47460938,-2 H -0.5 V 8.0996094 2.65625 2.5 c -0.0156,-0.96881 -1,-1 -1,-1 H -4.7402344 C -4.7691564,1.474271 -4.7872693,1.4329456 -4.875,1.3125 L -5.84375,0.96875 C -6.05355,0.67664 -6.39036,0.50243 -6.75,0.5 Z"
transform="translate(571.99998,-9.9999875)"
id="path973"
inkscape:connector-curvature="0" />
</g>
<g
id="g987"
style="display:inline;fill:none;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-151.34166,295.4125)" />
<g
id="g919"
transform="translate(0.52916659,0.26458334)">
<g
transform="translate(-17.991664,3.4395833)"
id="g868">
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g8715">
<path
inkscape:connector-curvature="0"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 560.5,-8.3754874 v 6.8755001 h 11.00048 V -7.34375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -2.84387 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-0.3442374 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 H 561.5 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
id="path11539"
sodipodi:nodetypes="ccccccccccc" />
<path
inkscape:connector-curvature="0"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
d="m 561.5,1.272441e-5 h 8.99998 V -7.5 l -1.96873,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-0.2808224 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 l -4.75,-8.3e-4 z"
id="path11541"
sodipodi:nodetypes="ccccsssccccc" />
<path
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 561.49288,-8.4999874 h 4.0001"
id="path8086"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g8720">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscccccccccc"
id="path11543"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,0.4743601 c -0.17551,0.057329 -0.24265,0.18168 -0.54772,0.18168 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 l -10e-6,4.5220976 c 0,1.33755002 0.68182,2.40000001 1.5,2.40000001 h 7.99998 c 0.81819,0 1.5,-1.06244999 1.5,-2.40000001 L 571.49998,-7.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient2224);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
<path
sodipodi:nodetypes="cccccssssccccsccccc"
inkscape:connector-curvature="0"
id="path8314"
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 v 3.4218877 c 0,0.4988574 0.14105,0.9688306 0.30273,1.24023441 0.16169,0.2714037 0.26177,0.2597656 0.19727,0.2597656 h 8.00038 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 0.16168,-0.27140241 0.30273,-0.74137451 0.30273,-1.24023441 V -7.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2226);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
<path
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient2228);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 570.49998,-7.5 h -3.5207 l -2.00555,1.0000126 H 561.5"
id="path11571"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

9
icons/24x24/Makefile.am Normal file
View file

@ -0,0 +1,9 @@
stockdir = $(datadir)/icons/hicolor/24x24/stock/navigation
stock_DATA = \
stock_folder-copy.png \
stock_folder-move.png
EXTRA_DIST = \
$(stock_DATA)
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

View file

@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 6.3499998 6.3499998"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="stock_folder-copy.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient2224"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
id="linearGradient10005">
<stop
style="stop-color:#e3d0b5;stop-opacity:1"
offset="0"
id="stop10007" />
<stop
id="stop10009"
offset="0.92004764"
style="stop-color:#e5d3ba;stop-opacity:1" />
<stop
style="stop-color:#d3b58b;stop-opacity:1"
offset="1"
id="stop10011" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient2226"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<linearGradient
inkscape:collect="always"
id="linearGradient8316">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop8318" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop8320" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient2228"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient888"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient890"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient892"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="11.302953"
inkscape:cy="14.082663"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1029"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-290.65)">
<g
transform="translate(-18.256247,0.79375001)"
id="g886">
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g876">
<path
inkscape:connector-curvature="0"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 560.5,-9.375 V 0.5 h 15 v -7.84375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -5.84375 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-1.34375 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 h -4.75 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
id="path870"
sodipodi:nodetypes="ccccccccccc" />
<path
inkscape:connector-curvature="0"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
d="m 561.5,1 h 13 v -8.5 l -5.96875,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-1.28057 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 L 561.5,-9.5 Z"
id="path872"
sodipodi:nodetypes="ccccsssccccc" />
<path
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 561.49288,-9.49995 h 5"
id="path874"
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)"
style="display:inline;enable-background:new"
id="g884">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccscccccccccc"
id="path878"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,1.47457 C 564.60566,-6.5501267 564.49257,-6.5 564.1875,-6.5 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 V 1 c 0,1.33755 0.68182,2.5 1.5,2.5 h 12 c 0.81819,0 1.5,-1.16245 1.5,-2.5 v -8.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient888);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
<path
sodipodi:type="inkscape:offset"
inkscape:radius="-1"
inkscape:original="M 566.92188 -8.5 C 566.57272 -8.5 566.36234 -8.29041 566.1875 -8.15625 L 564.73438 -6.6816406 C 564.60481 -6.5500906 564.49257 -6.5 564.1875 -6.5 L 561.625 -6.5 C 560.97443 -6.5 560.50001 -6.066575 560.5 -5.421875 L 560.5 1 C 560.5 2.33755 561.18182 3.5 562 3.5 L 574 3.5 C 574.81819 3.5 575.5 2.33755 575.5 1 L 575.5 -7.5 C 575.4844 -8.46881 574.5 -8.5 574.5 -8.5 L 566.92188 -8.5 z "
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient890);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
id="path880"
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 V 1 c 0,0.4988574 0.14105,0.9688306 0.30273,1.2402344 C 561.96442,2.5116381 562.0645,2.5 562,2.5 h 12 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 C 574.35895,1.968832 574.5,1.4988599 574.5,1 v -8.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z" />
<path
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient892);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 574.5,-7.5 h -7.52072 l -2.00555,2 H 561.5"
id="path882"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</g>
<g
id="g868"
transform="translate(-16.668747,2.6458333)">
<g
id="g8715"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
sodipodi:nodetypes="ccccccccccc"
id="path11539"
d="M 560.5,-9.375 V 0.5 h 15 v -7.84375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -5.84375 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-1.34375 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 h -4.75 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccsssccccc"
id="path11541"
d="m 561.5,1 h 13 v -8.5 l -5.96875,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-1.28057 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 L 561.5,-9.5 Z"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path8086"
d="m 561.49288,-9.49995 h 5"
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g8720"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient2224);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,1.47457 C 564.60566,-6.5501267 564.49257,-6.5 564.1875,-6.5 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 V 1 c 0,1.33755 0.68182,2.5 1.5,2.5 h 12 c 0.81819,0 1.5,-1.16245 1.5,-2.5 v -8.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
id="path11543"
sodipodi:nodetypes="ccscccccccccc"
inkscape:connector-curvature="0" />
<path
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 V 1 c 0,0.4988574 0.14105,0.9688306 0.30273,1.2402344 C 561.96442,2.5116381 562.0645,2.5 562,2.5 h 12 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 C 574.35895,1.968832 574.5,1.4988599 574.5,1 v -8.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z"
id="path8314"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2226);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
inkscape:original="M 566.92188 -8.5 C 566.57272 -8.5 566.36234 -8.29041 566.1875 -8.15625 L 564.73438 -6.6816406 C 564.60481 -6.5500906 564.49257 -6.5 564.1875 -6.5 L 561.625 -6.5 C 560.97443 -6.5 560.50001 -6.066575 560.5 -5.421875 L 560.5 1 C 560.5 2.33755 561.18182 3.5 562 3.5 L 574 3.5 C 574.81819 3.5 575.5 2.33755 575.5 1 L 575.5 -7.5 C 575.4844 -8.46881 574.5 -8.5 574.5 -8.5 L 566.92188 -8.5 z "
inkscape:radius="-1"
sodipodi:type="inkscape:offset" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path11571"
d="m 574.5,-7.5 h -7.52072 l -2.00555,2 H 561.5"
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient2228);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

View file

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 6.3499998 6.3499998"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="stock_folder-move.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10005"
id="linearGradient2224"
gradientUnits="userSpaceOnUse"
x1="572"
y1="-6.8130836"
x2="572"
y2="2.1187184" />
<linearGradient
inkscape:collect="always"
id="linearGradient10005">
<stop
style="stop-color:#e3d0b5;stop-opacity:1"
offset="0"
id="stop10007" />
<stop
id="stop10009"
offset="0.92004764"
style="stop-color:#e5d3ba;stop-opacity:1" />
<stop
style="stop-color:#d3b58b;stop-opacity:1"
offset="1"
id="stop10011" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="linearGradient2226"
gradientUnits="userSpaceOnUse"
x1="568.01355"
y1="2.2283287"
x2="568.01355"
y2="-4.9999499" />
<linearGradient
inkscape:collect="always"
id="linearGradient8316">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop8318" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop8320" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8316"
id="radialGradient2228"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8345188,0,0,0.64220385,-1042.8817,-2.3256749)"
cx="566.83136"
cy="-6.5"
fx="566.83136"
fy="-6.5"
r="7.0071211" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.4"
inkscape:cx="11.302953"
inkscape:cy="14.082663"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1029"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-290.65)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bca780;fill-opacity:0.1563981;fill-rule:evenodd;stroke:#bca780;stroke-width:1.00157476;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:2.00314954, 1.00157476000000001;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 2.5 1.5 C 1.50385 1.5151181 1.5 2.625 1.5 2.625 L 1.5 6.578125 L 1.5 12.5 L 1.5 13 C 1.5 14.337575 2.18182 15.5 3 15.5 L 15 15.5 C 15.81819 15.5 16.5 14.337575 16.5 13 L 16.5 12.5 L 16.5 4.65625 L 16.5 4.5 C 16.484391 3.5311559 15.5 3.5 15.5 3.5 L 9.2597656 3.5 C 9.2308438 3.4742459 9.2127315 3.4329102 9.125 3.3125 L 8.15625 1.96875 C 7.9464484 1.6765925 7.6096402 1.5024189 7.25 1.5 L 2.5 1.5 z "
transform="matrix(0.26458333,0,0,0.26458333,0,290.65)"
id="path870" />
<g
id="g868"
transform="translate(-16.668747,2.6458333)">
<g
id="g8715"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
sodipodi:nodetypes="ccccccccccc"
id="path11539"
d="M 560.5,-9.375 V 0.5 h 15 v -7.84375 c -6e-5,-0.62129 -0.50371,-1.12494 -1.125,-1.125 h -5.84375 c -0.3334,0 -0.20853,0.0527 -0.40625,-0.21875 l -0.96875,-1.34375 c -0.2098,-0.29211 -0.54661,-0.46632 -0.90625,-0.46875 h -4.75 c -0.99615,0.0162 -1,1.125 -1,1.125 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b08d;fill-opacity:1;fill-rule:evenodd;stroke:#bca780;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccccsssccccc"
id="path11541"
d="m 561.5,1 h 13 v -8.5 l -5.96875,-0.0312 c -0.0587,0 -0.0805,-10e-4 -0.15625,0 -0.0757,0.001 -0.29559,0.0325 -0.5625,-0.125 -0.26691,-0.15754 -0.34468,-0.32772 -0.375,-0.375 -0.0303,-0.0473 -0.0322,-0.0522 -0.0625,-0.0937 l -0.96875,-1.28057 c -0.0355,-0.0494 -0.0954,-0.0933 -0.15625,-0.0937 L 561.5,-9.5 Z"
style="display:inline;opacity:0.072;fill:none;fill-opacity:0;stroke:#ffffff;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path8086"
d="m 561.49288,-9.49995 h 5"
style="opacity:0.17300002;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g8720"
style="display:inline;enable-background:new"
transform="matrix(0.26458333,0,0,0.26458333,-129.64583,293.03125)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient2224);fill-opacity:1;fill-rule:nonzero;stroke:#beab8b;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
d="m 566.92188,-8.5 c -0.34915,0 -0.55954,0.2095926 -0.73438,0.34375 l -1.45228,1.47457 C 564.60566,-6.5501267 564.49257,-6.5 564.1875,-6.5 h -2.5625 c -0.65057,0 -1.12499,0.433425 -1.125,1.078125 V 1 c 0,1.33755 0.68182,2.5 1.5,2.5 h 12 c 0.81819,0 1.5,-1.16245 1.5,-2.5 v -8.5 c -0.0156,-0.96881 -1,-1 -1,-1 z"
id="path11543"
sodipodi:nodetypes="ccscccccccccc"
inkscape:connector-curvature="0" />
<path
d="m 566.92188,-7.5 c 0.051,0 0.14153,-0.067801 -0.125,0.1367188 l 0.10351,-0.091797 -1.45312,1.4746093 c -0.12156,0.1234147 -0.34139,0.2961474 -0.58789,0.3828126 C 564.61287,-5.5109911 564.39477,-5.5 564.1875,-5.5 h -2.5625 c -0.20642,0 -0.125,-0.075997 -0.125,0.078125 V 1 c 0,0.4988574 0.14105,0.9688306 0.30273,1.2402344 C 561.96442,2.5116381 562.0645,2.5 562,2.5 h 12 c -0.0645,0 0.0356,0.011637 0.19727,-0.2597656 C 574.35895,1.968832 574.5,1.4988599 574.5,1 v -8.484375 c -0.002,-0.1460121 0.0557,0.019531 0.0332,0.00781 -0.0116,-0.00602 -0.0196,-0.007 -0.0332,-0.011719 -0.0128,-0.00447 -0.0312,-0.011719 -0.0312,-0.011719 z"
id="path8314"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32400004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2226);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
inkscape:original="M 566.92188 -8.5 C 566.57272 -8.5 566.36234 -8.29041 566.1875 -8.15625 L 564.73438 -6.6816406 C 564.60481 -6.5500906 564.49257 -6.5 564.1875 -6.5 L 561.625 -6.5 C 560.97443 -6.5 560.50001 -6.066575 560.5 -5.421875 L 560.5 1 C 560.5 2.33755 561.18182 3.5 562 3.5 L 574 3.5 C 574.81819 3.5 575.5 2.33755 575.5 1 L 575.5 -7.5 C 575.4844 -8.46881 574.5 -8.5 574.5 -8.5 L 566.92188 -8.5 z "
inkscape:radius="-1"
sodipodi:type="inkscape:offset" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path11571"
d="m 574.5,-7.5 h -7.52072 l -2.00555,2 H 561.5"
style="opacity:0.67099998;fill:none;fill-rule:evenodd;stroke:url(#radialGradient2228);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB

8
icons/48x48/Makefile.am Normal file
View file

@ -0,0 +1,8 @@
iconsdir = $(datadir)/icons/hicolor/48x48/apps
icons_DATA = \
org.xfce.thunar.png
EXTRA_DIST = \
$(icons_DATA)
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,450 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
version="1.1"
id="svg8"
sodipodi:docname="org.xfce.thunar.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="/home/ochosi/Nerdstuff/xfce/thunar/icons/48x48/org.xfce.thunar.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12">
<linearGradient
inkscape:collect="always"
id="linearGradient2415">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0"
id="stop2417" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1"
id="stop2419" />
</linearGradient>
<linearGradient
id="linearGradient2970">
<stop
style="stop-color:#fcaf3e;stop-opacity:1;"
offset="0"
id="stop2972" />
<stop
style="stop-color:#fcaf3e;stop-opacity:0;"
offset="1"
id="stop2974" />
</linearGradient>
<linearGradient
id="linearGradient2396">
<stop
style="stop-color:#e1e2df;stop-opacity:1;"
offset="0"
id="stop2398" />
<stop
style="stop-color:#888a85;stop-opacity:1"
offset="1"
id="stop2400" />
</linearGradient>
<linearGradient
id="linearGradient4114"
inkscape:collect="always">
<stop
id="stop4116"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4118"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2415"
id="linearGradient1275"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79356749,0.04132263,-0.04278223,0.76649288,5.6966536,5.512212)"
x1="23.906006"
y1="6.0466475"
x2="24.746471"
y2="21.63644" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2415"
id="linearGradient1277"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.79089169,-0.01015506,-0.04647258,0.70928756,44.13532,6.4752965)"
x1="12.254768"
y1="14.820889"
x2="20.264099"
y2="8.1485271" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2415"
id="linearGradient1279"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.79089169,-0.01015506,0.04647258,0.70928756,4.7575526,6.5048715)"
x1="12.900058"
y1="12.908146"
x2="18.573477"
y2="9.7130737" />
<linearGradient
xlink:href="#linearGradient1220"
id="linearGradient1222"
x1="51.999992"
y1="89.643501"
x2="76.094429"
y2="89.643501"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-6.2595495,-53.250217)" />
<linearGradient
id="linearGradient1220">
<stop
style="stop-color:#79503c;stop-opacity:1"
offset="0"
id="stop1215" />
<stop
id="stop1224"
offset="0.51465631"
style="stop-color:#ad7702;stop-opacity:1" />
<stop
style="stop-color:#79503c;stop-opacity:1"
offset="1"
id="stop1218" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="89.643501"
x2="76.094429"
y1="89.643501"
x1="51.999992"
id="linearGradient1222-1"
xlink:href="#linearGradient1220"
gradientTransform="matrix(0.38970414,0,0,0.3725597,-0.95946209,0.73553403)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="81.370674"
x2="76.077408"
y1="81.370674"
x1="52"
id="linearGradient1071"
xlink:href="#linearGradient1089"
gradientTransform="matrix(0.3899918,0,0,0.36397441,-0.97456973,3.7858815)" />
<linearGradient
id="linearGradient1089">
<stop
style="stop-color:#c02700;stop-opacity:1"
offset="0"
id="stop1083" />
<stop
id="stop1085"
offset="0.50248575"
style="stop-color:#e6461d;stop-opacity:1" />
<stop
style="stop-color:#c02700;stop-opacity:1"
offset="1"
id="stop1087" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="81.370674"
x2="76.077408"
y1="81.370674"
x1="52"
id="linearGradient1097"
xlink:href="#linearGradient1095"
gradientTransform="matrix(0.3899918,0,0,0.36397441,-0.97456973,3.7858815)" />
<linearGradient
id="linearGradient1095">
<stop
id="stop1091"
offset="0"
style="stop-color:#c02700;stop-opacity:1;" />
<stop
id="stop1093"
offset="1"
style="stop-color:#c02700;stop-opacity:1" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="86.870674"
x2="76.077408"
y1="86.870674"
x1="52"
id="linearGradient1081"
xlink:href="#linearGradient1089"
gradientTransform="matrix(0.3899918,0,0,0.36769224,-0.974569,3.3640087)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="83.241028"
x2="85.771179"
y1="96.206978"
x1="41.101963"
id="linearGradient1177"
xlink:href="#linearGradient1185"
gradientTransform="translate(-24.907937,-57.871601)" />
<linearGradient
id="linearGradient1185">
<stop
id="stop1179"
offset="0"
style="stop-color:#e6461d;stop-opacity:1" />
<stop
style="stop-color:#c02700;stop-opacity:1;"
offset="0.26479611"
id="stop1189" />
<stop
style="stop-color:#c02700;stop-opacity:1"
offset="0.80811173"
id="stop1187" />
<stop
style="stop-color:#e6461d;stop-opacity:1"
offset="0.87515253"
id="stop1181" />
<stop
id="stop1183"
offset="1"
style="stop-color:#c02700;stop-opacity:1" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient4114"
id="linearGradient1221"
gradientUnits="userSpaceOnUse"
x1="67.620171"
y1="86.940636"
x2="67.185326"
y2="88.324181"
gradientTransform="matrix(0.41649112,0,0,0.41649112,-2.6552142,-0.484625)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1046-5"
id="linearGradient1050"
x1="65.96611"
y1="60.927975"
x2="66.508476"
y2="70.690681"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.41666681,0,0,0.41666681,-2.666675,-2.416677)" />
<linearGradient
inkscape:collect="always"
id="linearGradient1046-5">
<stop
style="stop-color:#2e1e17;stop-opacity:1;"
offset="0"
id="stop1042" />
<stop
id="stop1057"
offset="0.52789009"
style="stop-color:#2e1e17;stop-opacity:0.51372549;" />
<stop
style="stop-color:#2e1e17;stop-opacity:0;"
offset="1"
id="stop1044" />
</linearGradient>
<linearGradient
gradientTransform="matrix(-1,0,0,1,132.94163,-84.738896)"
xlink:href="#linearGradient4114"
id="linearGradient1063-3"
x1="58.330563"
y1="98.761681"
x2="53.73632"
y2="98.438408"
gradientUnits="userSpaceOnUse" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="96.45739"
x2="49.692238"
y1="96.319893"
x1="53.703209"
id="linearGradient1063"
xlink:href="#linearGradient4114"
gradientTransform="translate(0.98154217,-68.738789)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="83.241028"
x2="85.771179"
y1="96.206978"
x1="41.101963"
id="linearGradient1177-9"
xlink:href="#linearGradient1185"
gradientTransform="translate(0.98154217,-68.738789)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="85.574959"
x2="81.084084"
y1="84.150307"
x1="80.177971"
id="linearGradient1169"
xlink:href="#linearGradient1167"
gradientTransform="translate(0.98154217,-68.738789)" />
<linearGradient
id="linearGradient1167">
<stop
id="stop1161"
offset="0"
style="stop-color:#c02700;stop-opacity:1" />
<stop
style="stop-color:#e6461d;stop-opacity:1"
offset="1"
id="stop1163" />
</linearGradient>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1387"
id="namedview10"
showgrid="true"
inkscape:zoom="9.386052"
inkscape:cx="3.9378253"
inkscape:cy="18.267574"
inkscape:window-x="0"
inkscape:window-y="29"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
inkscape:lockguides="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:pagecheckerboard="false"
inkscape:snap-global="false"
inkscape:document-rotation="0">
<inkscape:grid
type="xygrid"
id="grid821"
empspacing="4" />
</sodipodi:namedview>
<g
id="g1105"
transform="matrix(0.41911618,0,0,0.40591193,-3.3448011,27.509891)"
style="stroke-width:2.42447042">
<path
inkscape:connector-curvature="0"
d="m 77.021244,15.95863 c -2.039702,4.870276 10.082883,1.008375 8.590524,-1.162793 -2.027019,-0.429446 -5.879029,0.06472 -8.590524,1.162793 z"
style="fill:url(#linearGradient1169);fill-opacity:1;stroke:none;stroke-width:2.42447042px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path1071" />
<path
inkscape:connector-curvature="0"
id="path1229-4"
d="m 76.532895,17.047114 c 5.879888,-3.862121 10.469038,-1.5 10.469038,-1.5 0,0 -26.398548,17.754581 -49.379518,17.224251 l 3.889087,-7.95496 C 66.260239,25.169958 76.252565,10.327759 76.252565,10.327759 81.217386,8.5005557 86.971573,7.3332187 88.230487,15.25606 l -3.98461,2.005151 1.07913,-1.350355 c -1.798672,0.56937 -7.482406,3.598008 -8.792112,1.136258 z"
style="fill:url(#linearGradient1177-9);fill-opacity:1;fill-rule:evenodd;stroke:#c02700;stroke-width:2.42447042px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect1053"
style="opacity:0.5;fill:url(#linearGradient1063);fill-opacity:1;stroke:none;stroke-width:9.6978817"
d="m 49.890903,23.863142 0.699969,8.026203 5.730885,-1.43228 -0.314626,-7.674392 z" />
<path
inkscape:connector-curvature="0"
d="M 79.418243,8.7796687 79.608258,20.481054 74.99482,23.321729 75.798271,9.8929497 Z"
style="opacity:0.5;fill:url(#linearGradient1063-3);fill-opacity:1;stroke:none;stroke-width:9.6978817"
id="rect1053-5" />
</g>
<rect
ry="3.0667698"
rx="3.5976148"
y="23.17469"
x="20.174688"
height="21.650623"
width="7.6506238"
id="rect1245"
style="opacity:1;fill:#603f2f;fill-opacity:1;fill-rule:nonzero;stroke:#603f2f;stroke-width:0.3493765;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
ry="2.6103148"
style="opacity:1;fill:#485e6b;fill-opacity:1;stroke:#263742;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1185"
width="35"
height="18"
x="6.5"
y="8.5" />
<path
style="opacity:1;fill:url(#linearGradient1222-1);fill-opacity:1;fill-rule:nonzero;stroke:#603f2f;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 23.698288,24.5 h 0.640229 C 26.643978,24.5 28.5,24.890409 28.5,26.069593 l -0.0368,16.19505 C 28.460409,43.443824 26.607176,44.5 24.301715,44.5 h -0.640229 c -2.305462,0 -4.164163,-1.056176 -4.161483,-2.235357 l 0.0368,-16.19505 C 19.536804,24.890409 21.392825,24.5 23.698288,24.5 Z"
id="rect1178-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccssscsc" />
<path
style="fill:url(#linearGradient1081);fill-opacity:1;fill-rule:evenodd;stroke:#c02700;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 19.5,36.226502 9,-4.78318 v 2.941538 l -9,4.78318 z"
id="path1189-2"
inkscape:connector-curvature="0" />
<rect
ry="2.3927879"
style="opacity:1;fill:#a7b0b7;fill-opacity:1;stroke:#758087;stroke-width:0.99999994;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1243"
width="35"
height="18"
x="6.5"
y="4.5" />
<path
style="fill:#485e6b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.36607143px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 30.944196,23 c 0,0 0,-0.793046 0,-2.928572 C 32.109029,21.68925 34.032924,23 34.032924,23 Z"
id="path1227"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="fill:#263742;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.52901px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 13,26 3,-3 v 3 z"
id="path1251"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="fill:url(#linearGradient1277);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.14642857;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 26.597826,9.4889689 c 1.013759,1.3293821 3.540616,2.7353721 4.793543,3.1007401 0.02171,0.0064 0.05323,-0.0047 0.07415,9.88e-4 0.0053,-2.66e-4 0.01937,6.23e-4 0.02471,3.18e-4 0.316095,-0.01851 0.643875,-0.130867 1.038017,-0.363798 1.154505,-0.6823 0.685304,-0.500628 1.945168,-0.995483 0.01314,-0.0051 0.03723,-0.01684 0.05089,-0.02153 0.790908,-0.254415 2.373549,0.234955 2.650379,0.32242 -0.268206,0.03406 -1.40004,0.221704 -2.187969,0.925814 -0.005,0.0045 -0.02105,0.01744 -0.02617,0.02185 -0.0052,0.0043 -0.02079,0.01756 -0.02617,0.02185 -0.230522,0.177453 -0.584349,0.306268 -0.99004,0.386599 0.611072,0.04596 1.248161,0.114978 1.914729,0.224239 1.24431,0.203961 2.014145,0.646715 2.368396,1.228339 0.354251,0.581624 0.237475,1.293784 -0.239758,1.771632 -1.384967,1.386752 -5.089112,0.675361 -5.073961,-0.708481 7.33e-4,-0.02355 0.0029,-0.06473 0.0058,-0.08866 0.0044,-0.03003 0.02405,-0.07991 0.03199,-0.110508 0.0087,-0.03071 0.01966,-0.07927 0.03199,-0.110509 0.0052,-0.01254 0.02178,-0.03139 0.0276,-0.04401 0.735167,-1.590009 2.516456,-0.631542 3.11123,0.08431 -0.639333,-0.383747 -1.529981,-0.457502 -1.842035,-0.201121 -0.0059,0.0051 -0.02072,0.01643 -0.02617,0.02185 -0.0079,0.0083 -0.02083,0.03511 -0.0276,0.04401 -0.0018,0.0031 -0.02427,0.01868 -0.02617,0.02185 -0.0018,0.0033 1.91e-4,0.01887 -0.0015,0.02217 -0.0015,0.0033 -7e-5,0.01874 -0.0015,0.02217 -0.0037,0.01046 -0.02508,0.03295 -0.0276,0.04401 -7.32e-4,0.0037 -7.32e-4,0.01835 -0.0015,0.02217 -3.66e-4,0.0039 -0.0011,0.01822 -0.0015,0.02217 -1.46e-4,0.004 -0.0015,0.01808 -0.0015,0.02217 -0.0011,1.143187 2.974938,1.157902 3.230452,0.152398 0.06208,-0.244292 0.05769,-0.454194 0.01596,-0.620944 -0.0048,-0.01761 -0.0145,-0.04998 -0.02035,-0.06681 -0.0062,-0.01659 -0.0131,-0.05096 -0.02035,-0.06681 -0.0051,-0.01041 -0.01633,-0.03456 -0.02182,-0.04465 -0.250807,-0.437301 -0.925198,-0.584818 -1.684972,-0.709356 -1.556616,-0.255149 -3.220147,-0.0059 -4.589814,-0.169851 -2.072148,-0.248021 -2.988263,-0.540848 -4.12179,-2.027288 z"
id="path1271"
inkscape:connector-curvature="0" />
<path
id="path1273"
d="m 22.295042,9.5185439 c -1.013759,1.3293811 -3.540615,2.7353711 -4.793542,3.1007391 -0.0217,0.0064 -0.05323,-0.0047 -0.07415,9.88e-4 -0.0053,-2.66e-4 -0.01936,6.23e-4 -0.02472,3.18e-4 -0.316094,-0.01851 -0.643877,-0.130867 -1.038017,-0.363799 -1.154506,-0.6823 -0.685303,-0.500627 -1.94517,-0.995483 -0.01315,-0.0051 -0.03723,-0.01684 -0.05089,-0.02153 -0.790908,-0.254413 -2.37355,0.234956 -2.650377,0.322421 0.268203,0.03406 1.400039,0.221704 2.187966,0.925814 0.005,0.0045 0.02104,0.01744 0.02617,0.02185 0.0052,0.0043 0.0208,0.01756 0.02617,0.02185 0.230524,0.177453 0.584349,0.306268 0.99004,0.386599 -0.611071,0.04596 -1.248158,0.114978 -1.914726,0.224239 -1.244312,0.203962 -2.014147,0.646715 -2.368398,1.228339 -0.354251,0.581625 -0.237476,1.293785 0.239758,1.771633 1.384969,1.386753 5.089112,0.675362 5.073961,-0.708481 -8.05e-4,-0.02355 -0.0029,-0.06473 -0.0058,-0.08866 -0.0044,-0.03003 -0.02404,-0.07991 -0.03198,-0.110508 -0.0087,-0.03071 -0.01965,-0.07927 -0.03198,-0.110509 -0.0052,-0.01254 -0.02178,-0.03139 -0.02762,-0.04401 -0.735167,-1.59001 -2.516455,-0.631544 -3.111229,0.08432 0.639331,-0.383748 1.529979,-0.457503 1.842033,-0.201123 0.0059,0.0051 0.02072,0.01644 0.02617,0.02185 0.0079,0.0083 0.02084,0.03511 0.02762,0.04401 0.002,0.0031 0.02428,0.01868 0.02617,0.02185 0.0018,0.0033 -1.89e-4,0.01887 0.0014,0.02217 0.0015,0.0033 6.9e-5,0.01874 0.0014,0.02217 0.0037,0.01046 0.02507,0.03295 0.02762,0.04401 7.32e-4,0.0037 8.79e-4,0.01835 0.0014,0.02217 4.39e-4,0.0039 0.0012,0.01822 0.0014,0.02216 1.48e-4,0.004 0.0014,0.01808 0.0014,0.02217 10e-4,1.143188 -2.974936,1.157902 -3.230449,0.152398 -0.06208,-0.244292 -0.05769,-0.454195 -0.01595,-0.620945 0.0048,-0.01761 0.01448,-0.04997 0.02036,-0.06681 0.0062,-0.01659 0.01312,-0.05096 0.02036,-0.06681 0.005,-0.01041 0.01632,-0.03456 0.02181,-0.04465 0.250891,-0.437282 0.92528,-0.584799 1.685054,-0.709337 1.556594,-0.25515 3.220126,-0.0059 4.589794,-0.169851 2.072146,-0.248021 2.988261,-0.540848 4.121789,-2.027288 z"
style="fill:url(#linearGradient1279);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.14642857;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
style="fill:#e1e3e2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.13673;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 24.297229,8 -0.349305,0.3784743 c -0.308139,0.3338722 -1.057836,0.9167631 -1.558979,1.8795057 -0.315939,0.606948 -0.421299,1.434747 -0.375386,2.357727 -0.848009,0.306827 -1.535975,0.762627 -1.97389,1.40115 -0.733435,1.069422 -1.062166,2.321776 -1.594103,3.130985 L 18,17.820957 l 0.707655,-0.02916 c 1.204243,-0.0505 2.505084,-0.0075 3.715164,-0.385135 0.314258,-0.09804 0.60312,-0.255726 0.89236,-0.44344 -0.344192,-0.282179 -0.558465,-0.570106 -0.691518,-0.797256 -0.0027,-0.0046 -0.370149,0.225095 -0.573819,0.28864 -0.886704,0.276654 -1.309848,0.01606 -2.308282,0.0504 0.403544,-0.81641 0.336337,-1.279401 0.815477,-1.978035 0.363779,-0.530427 1.240578,-0.859441 2.0271,-1.197087 0.78652,-0.337644 1.955922,-0.15556 2.103369,-0.113885 l -0.02528,-0.829131 c -0.194911,-0.05645 -0.415232,-0.102245 -0.659525,-0.118141 -0.732881,-0.04769 -1.144984,0.17102 -1.193031,0.198197 -0.02802,-0.71446 0.102132,-1.329926 0.350816,-1.807669 0.310749,-0.596976 1.038767,-1.0067438 1.127427,-1.0550258 0.349987,0.6689328 0.671015,0.8344158 0.90771,1.5385078 0.143494,0.426856 0.410243,1.06743 0.02997,2.584704 -0.236843,0.945022 -0.541674,1.174387 -0.853055,1.423934 l 0.577278,0.564145 c 0.18615,-0.159752 0.398368,-0.385957 0.569858,-0.665026 0.430444,-0.700472 0.400448,-1.328731 0.395091,-1.403583 0,0 0.811359,0.791112 1.144507,1.353313 0.432055,0.729102 0.590177,1.204015 0.991181,1.995293 -0.889849,-0.06971 -1.469256,0.19152 -2.422522,-0.18271 -0.257784,-0.1012 -0.79499,-0.516666 -1.433449,-1.222706 -0.638462,-0.706041 -0.954724,-1.141125 -1.12039,-1.601454 l -0.82128,0.247462 c 0.0096,0.0294 0.958696,2.148358 1.910597,2.701734 0.951901,0.553373 4.034392,0.944898 5.028705,1.009597 L 29.999994,18 29.470851,17.288534 c -0.553231,-0.743842 -0.977995,-1.697439 -1.640153,-2.814855 -0.39484,-0.666305 -1.045194,-1.18993 -1.860592,-1.600512 0,0 0.08587,-1.17905 -0.197317,-2.094089 C 25.469284,9.7983602 24.733672,9.2127021 24.482051,8.5135345 Z"
id="path1269-6" />
<path
id="path1212"
d="M 25.576701,32.902181 19.066886,31.299695 19,34.255604 29,38 28.9981,34.778019 v -0.685747 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.2;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#linearGradient1221);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient1071);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1097);stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 19.5,30.492504 9,2.908646 v 2.911795 l -9,-2.908646 z"
id="path1187-1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path1040"
d="m 23.664765,24.041665 h 0.711366 c 2.561625,0 4.623872,0.443275 4.623872,1.782132 L 28.959113,28 c 0,0 -3.331893,-0.849474 -5.015611,-0.847458 C 22.259783,27.154542 19,28 19,28 l 0.04089,-2.176203 c 0,-1.338857 2.062248,-1.782132 4.623873,-1.782132 z"
style="opacity:0.75499998;fill:url(#linearGradient1050);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:nodetypes="cscczccsc" />
<path
inkscape:connector-curvature="0"
style="fill:#758087;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 30.882166,19.936923 2.080363,4.72009 -2.080363,-1.550014 z"
id="path1037" />
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

21
icons/Makefile.am Normal file
View file

@ -0,0 +1,21 @@
SUBDIRS = \
16x16 \
24x24 \
48x48 \
128x128 \
scalable
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
install-data-hook:
@-if test -z "$(DESTDIR)"; then \
echo "Updating Gtk icon cache."; \
$(gtk_update_icon_cache); \
else \
echo "*** Icon cache not updated. Remember to run:"; \
echo "***"; \
echo "*** $(gtk_update_icon_cache)"; \
echo "***"; \
fi
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,8 @@
iconsdir = $(datadir)/icons/hicolor/scalable/apps
icons_DATA = \
org.xfce.thunar.svg
EXTRA_DIST = \
$(icons_DATA)
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 43 KiB

9
its/xfce.its Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<its:rules xmlns:its="http://www.w3.org/2005/11/its"
version="2.0">
<its:translateRule selector="//*" translate="no"/>
<its:translateRule selector="//actions/action/description |
//actions/action/name |
//actions/action/commands/command/name"
translate="yes"/>
</its:rules>

7
its/xfce.loc Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0"?>
<locatingRules>
<locatingRule name="xfce-action" pattern="*-actions.xml">
<documentRule localName="actions" target="xfce.its"/>
</locatingRule>
<locatingRule name="xfce-action" pattern="uca.xml" target="xfce.its" />
</locatingRules>

96
m4/introspection.m4 Normal file
View file

@ -0,0 +1,96 @@
dnl -*- mode: autoconf -*-
dnl Copyright 2009 Johan Dahlin
dnl
dnl This file is free software; the author(s) gives unlimited
dnl permission to copy and/or distribute it, with or without
dnl modifications, as long as this notice is preserved.
dnl
# serial 1
m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
[
AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
dnl enable/disable introspection
m4_if([$2], [require],
[dnl
enable_introspection=yes
],[dnl
AC_ARG_ENABLE(introspection,
AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
[Enable introspection for this build]),,
[enable_introspection=auto])
])dnl
AC_MSG_CHECKING([for gobject-introspection])
dnl presence/version checking
AS_CASE([$enable_introspection],
[no], [dnl
found_introspection="no (disabled, use --enable-introspection to enable)"
],dnl
[yes],[dnl
PKG_CHECK_EXISTS([gobject-introspection-1.0],,
AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
found_introspection=yes,
AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
],dnl
[auto],[dnl
PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
dnl Canonicalize enable_introspection
enable_introspection=$found_introspection
],dnl
[dnl
AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
])dnl
AC_MSG_RESULT([$found_introspection])
INTROSPECTION_SCANNER=
INTROSPECTION_COMPILER=
INTROSPECTION_GENERATE=
INTROSPECTION_GIRDIR=
INTROSPECTION_TYPELIBDIR=
if test "x$found_introspection" = "xyes"; then
INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
fi
AC_SUBST(INTROSPECTION_SCANNER)
AC_SUBST(INTROSPECTION_COMPILER)
AC_SUBST(INTROSPECTION_GENERATE)
AC_SUBST(INTROSPECTION_GIRDIR)
AC_SUBST(INTROSPECTION_TYPELIBDIR)
AC_SUBST(INTROSPECTION_CFLAGS)
AC_SUBST(INTROSPECTION_LIBS)
AC_SUBST(INTROSPECTION_MAKEFILE)
AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
])
dnl Usage:
dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
[
_GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
])
dnl Usage:
dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
[
_GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
])

View file

@ -0,0 +1,4 @@
[D-BUS Service]
Name=org.xfce.FileManager
Exec=@bindir@/Thunar --gapplication-service
SystemdService=thunar.service

View file

@ -0,0 +1,4 @@
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=@bindir@/Thunar --gapplication-service
SystemdService=thunar.service

View file

@ -0,0 +1,4 @@
[D-BUS Service]
Name=org.xfce.Thunar
Exec=@bindir@/Thunar --gapplication-service
SystemdService=thunar.service

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2014 Ryan Lerch <rlerch@redhat.com> -->
<component type="desktop-application">
<id>org.xfce.thunar</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0</project_license>
<launchable type="desktop-id">thunar.desktop</launchable>
<name>Thunar</name>
<summary>File Browser</summary>
<description>
<p>
Thunar is a file browser specifically designed for the Xfce Desktop, but also can
serve as an alternate file browser for other Desktop environments. It has a simple,
clean two-pane design for browsing all your files.
</p>
</description>
<url type="homepage">https://xfce.org</url>
<url type="bugtracker">https://gitlab.xfce.org/xfce/thunar</url>
<url type="help">https://docs.xfce.org/xfce/thunar/start</url>
<url type="contact">https://docs.xfce.org/contribute/dev/start#communication_with_the_xfce_development_team</url>
<screenshots>
<screenshot type="default">
<image width="759" height="424">https://docs.xfce.org/_media/xfce/thunar/file-manager-window.png</image>
<caption>Screenshot of the XFCE Thunar File Browser User Interface</caption>
</screenshot>
</screenshots>
<categories>
<category>System</category>
</categories>
<project_group>Xfce</project_group>
<update_contact>xfce4-dev@xfce.org</update_contact>
<translation type="gettext">Thunar</translation>
<content_rating type="oars-1.1"/>
</component>

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<!--
Policy definitions for Thunar.
Copyright (c) 2014 Benedikt Meurer <benny@xfce.org>
Jannis Pohlmann <jannis@xfce.org>
Jeffs Franks <jcfranks@xfce.org>
Nick Schermer <nick@xfce.org>
-->
<vendor>Thunar</vendor>
<vendor_url>https://xfce.org/</vendor_url>
<icon_name>org.xfce.thunar</icon_name>
<action id="org.xfce.thunar">
<!-- SECURITY:
- A normal active user can run thunar without elevated rights. They
may wish to modify files they normally do not have read/write access
to. This isn't a good idea, but is common on single user systems.
-->
<description>Run Thunar as root</description>
<message>Authentication is required to run Thunar as root.</message>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">@bindir@/thunar</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

29
plugins/Makefile.am Normal file
View file

@ -0,0 +1,29 @@
if THUNAR_PLUGIN_APR
THUNAR_APR_SUBDIRS = thunar-apr
endif
if THUNAR_PLUGIN_SBR
THUNAR_SBR_SUBDIRS = thunar-sbr
endif
if THUNAR_PLUGIN_TPA
THUNAR_TPA_SUBDIRS = thunar-tpa
endif
if THUNAR_PLUGIN_UCA
THUNAR_UCA_SUBDIRS = thunar-uca
endif
if THUNAR_PLUGIN_WALLPAPER
THUNAR_WALLPAPER_SUBDIRS = thunar-wallpaper
endif
SUBDIRS = \
$(THUNAR_APR_SUBDIRS) \
$(THUNAR_SBR_SUBDIRS) \
$(THUNAR_TPA_SUBDIRS) \
$(THUNAR_UCA_SUBDIRS) \
$(THUNAR_WALLPAPER_SUBDIRS) \
thunar-sendto-email
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,60 @@
AM_CPPFLAGS = \
-I$(top_builddir) \
-I$(top_builddir)/plugins \
-I$(top_srcdir) \
-I$(top_srcdir)/plugins \
-DG_LOG_DOMAIN=\"thunar-apr\" \
-DPACKAGE_LOCALE_DIR=\"$(localedir)\" \
$(PLATFORM_CPPFLAGS)
extensionsdir = $(libdir)/thunarx-$(THUNARX_VERSION_API)
extensions_LTLIBRARIES = \
thunar-apr.la
thunar_apr_la_SOURCES = \
thunar-apr-abstract-page.c \
thunar-apr-abstract-page.h \
thunar-apr-desktop-page.c \
thunar-apr-desktop-page.h \
thunar-apr-image-page.c \
thunar-apr-image-page.h \
thunar-apr-plugin.c \
thunar-apr-private.c \
thunar-apr-private.h \
thunar-apr-provider.c \
thunar-apr-provider.h
thunar_apr_la_CFLAGS = \
$(EXIF_CFLAGS) \
$(EXO_CFLAGS) \
$(LIBXFCE4UTIL_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(GLIB_CFLAGS) \
$(GTK_CFLAGS) \
$(PLATFORM_CFLAGS)
thunar_apr_la_LDFLAGS = \
-avoid-version \
-export-dynamic \
-no-undefined \
-export-symbols-regex "^thunar_extension_(shutdown|initialize|list_types)" \
-module \
$(PLATFORM_LDFLAGS)
thunar_apr_la_LIBADD = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \
$(EXIF_LIBS) \
$(EXO_LIBS) \
$(LIBXFCE4UTIL_LIBS) \
$(LIBXFCE4UI_LIBS) \
$(GLIB_LIBS) \
$(GTK_LIBS)
thunar_apr_la_DEPENDENCIES = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la
EXTRA_DIST = \
README.md
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,13 @@
Thunar Advanced Properties (thunar-apr)
=======================================
Thunar-apr is an extension to Thunar, which provides additional pages forthe file properties dialog, that are displayed for certain kinds of files:
* Launcher/Link
* Image
The Launcher/Link page is displayed for .desktop files and allows users to easily edit the most important values (i.e. the command for a launcher and the URL for a link).
The Image page is displayed for all kinds of image files supported by the GTK+ version used by Thunar. The page displays atleast the exact format of the image and the dimensions in pixels. If the plugin is build with support for libexif (you can explicitly disable this using the `--disable-exif` configure option) and the image file includes Exif tags, the most important Exif tags found in the image file will also be displayed.
By default the thunar-apr extension will be installed, but as with every extension, it will slightly increase the resource usage of Thunar (this shouldn't be a real problem unless you're targeting an embedded system), and so you can pass `--disable-apr-plugin` to configure and the plugin won't be built and installed. Since it is an extension, you can also easily uninstall it afterwards by removing the thunar-apr.so file from the lib/thunarx-2/ directory of your installation (be sure to quit Thunar before removing files though).

View file

@ -0,0 +1,254 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <thunar-apr/thunar-apr-abstract-page.h>
#include <thunar-apr/thunar-apr-private.h>
/* Property identifiers */
enum
{
PROP_0,
PROP_FILE,
};
/* Signal identifiers */
enum
{
FILE_CHANGED,
LAST_SIGNAL,
};
static void
thunar_apr_abstract_page_dispose (GObject *object);
static void
thunar_apr_abstract_page_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void
thunar_apr_abstract_page_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void
thunar_apr_abstract_page_file_changed (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file);
static guint abstract_page_signals[LAST_SIGNAL];
THUNARX_DEFINE_ABSTRACT_TYPE (ThunarAprAbstractPage,
thunar_apr_abstract_page,
THUNARX_TYPE_PROPERTY_PAGE);
static void
thunar_apr_abstract_page_class_init (ThunarAprAbstractPageClass *klass)
{
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = thunar_apr_abstract_page_dispose;
gobject_class->get_property = thunar_apr_abstract_page_get_property;
gobject_class->set_property = thunar_apr_abstract_page_set_property;
/**
* ThunarAprAbstractPage:file:
*
* The #ThunarxFileInfo for the file being displayed by
* this property page.
**/
g_object_class_install_property (gobject_class,
PROP_FILE,
g_param_spec_object ("file", "file", "file",
THUNARX_TYPE_FILE_INFO,
G_PARAM_READWRITE));
/**
* ThunarAprAbstractPage::file-changed:
* @abstract_page : a #ThunarAprAbstractPage.
* @file : a #ThunarxFileInfo.
*
* Emitted by @abstract_page whenever the associated
* @file changes.
**/
abstract_page_signals[FILE_CHANGED] =
g_signal_new ("file-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ThunarAprAbstractPageClass, file_changed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
THUNARX_TYPE_FILE_INFO);
}
static void
thunar_apr_abstract_page_init (ThunarAprAbstractPage *abstract_page)
{
/* be sure to setup the i18n support for the thunar-apr plugin */
thunar_apr_i18n_init ();
}
static void
thunar_apr_abstract_page_dispose (GObject *object)
{
ThunarAprAbstractPage *abstract_page = THUNAR_APR_ABSTRACT_PAGE (object);
/* disconnect from the file */
thunar_apr_abstract_page_set_file (abstract_page, NULL);
(*G_OBJECT_CLASS (thunar_apr_abstract_page_parent_class)->dispose) (object);
}
static void
thunar_apr_abstract_page_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ThunarAprAbstractPage *abstract_page = THUNAR_APR_ABSTRACT_PAGE (object);
switch (prop_id)
{
case PROP_FILE:
g_value_set_object (value, thunar_apr_abstract_page_get_file (abstract_page));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
thunar_apr_abstract_page_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ThunarAprAbstractPage *abstract_page = THUNAR_APR_ABSTRACT_PAGE (object);
switch (prop_id)
{
case PROP_FILE:
thunar_apr_abstract_page_set_file (abstract_page, g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
thunar_apr_abstract_page_file_changed (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file)
{
/* emit the "file-changed" signal */
g_signal_emit (G_OBJECT (abstract_page), abstract_page_signals[FILE_CHANGED], 0, file);
}
/**
* thunar_apr_abstract_page_get_file:
* @abstract_page : a #ThunarAprAbstractPage.
*
* Returns the #ThunarxFileInfo for the file being
* displayed by the @abstract_page.
*
* Return value: the file for @abstract_page.
**/
ThunarxFileInfo *
thunar_apr_abstract_page_get_file (ThunarAprAbstractPage *abstract_page)
{
g_return_val_if_fail (THUNAR_APR_IS_ABSTRACT_PAGE (abstract_page), NULL);
return abstract_page->file;
}
/**
* thunar_apr_abstract_page_set_file:
* @abstract_page : a #ThunarAprAbstractPage.
* @file : a #ThunarxFileInfo or %NULL.
*
* Sets the #ThunarxFileInfo being displayed by the
* @abstract_page to @file. If @file is %NULL, the
* property will be reset.
**/
void
thunar_apr_abstract_page_set_file (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file)
{
g_return_if_fail (THUNAR_APR_IS_ABSTRACT_PAGE (abstract_page));
g_return_if_fail (file == NULL || THUNARX_IS_FILE_INFO (file));
/* verify that we don't already display that file */
if (G_UNLIKELY (abstract_page->file == file))
return;
/* disconnect from the previous file */
if (G_UNLIKELY (abstract_page->file != NULL))
{
g_signal_handlers_disconnect_by_func (G_OBJECT (abstract_page->file), thunar_apr_abstract_page_file_changed, abstract_page);
g_object_unref (G_OBJECT (abstract_page->file));
}
/* activate the new file */
abstract_page->file = file;
/* connect to the new file */
if (G_LIKELY (file != NULL))
{
/* connect "changed" signal and take a reference */
g_signal_connect_swapped (G_OBJECT (file), "changed", G_CALLBACK (thunar_apr_abstract_page_file_changed), abstract_page);
g_object_ref (G_OBJECT (file));
/* update the initial state */
thunar_apr_abstract_page_file_changed (abstract_page, file);
}
/* notify listeners */
g_object_notify (G_OBJECT (abstract_page), "file");
}

View file

@ -0,0 +1,66 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_APR_ABSTRACT_PAGE_H__
#define __THUNAR_APR_ABSTRACT_PAGE_H__
#include <thunarx/thunarx.h>
G_BEGIN_DECLS;
typedef struct _ThunarAprAbstractPageClass ThunarAprAbstractPageClass;
typedef struct _ThunarAprAbstractPage ThunarAprAbstractPage;
#define THUNAR_APR_TYPE_ABSTRACT_PAGE (thunar_apr_abstract_page_get_type ())
#define THUNAR_APR_ABSTRACT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_APR_TYPE_ABSTRACT_PAGE, ThunarAprAbstractPage))
#define THUNAR_APR_ABSTRACT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_APR_TYPE_ABSTRACT_PAGE, ThunarAprAbstractPageClass))
#define THUNAR_APR_IS_ABSTRACT_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_APR_TYPE_ABSTRACT_PAGE))
#define THUNAR_APR_IS_ABSTRACT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_APR_TYPE_ABSTRACT_PAGE))
#define THUNAR_APR_ABSTRACT_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_APR_TYPE_ABSTRACT_PAGE, ThunarAprAbstractPageClass))
struct _ThunarAprAbstractPageClass
{
ThunarxPropertyPageClass __parent__;
/* signals */
void (*file_changed) (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file);
};
struct _ThunarAprAbstractPage
{
ThunarxPropertyPage __parent__;
ThunarxFileInfo *file;
};
GType
thunar_apr_abstract_page_get_type (void) G_GNUC_CONST;
void
thunar_apr_abstract_page_register_type (ThunarxProviderPlugin *plugin);
ThunarxFileInfo *
thunar_apr_abstract_page_get_file (ThunarAprAbstractPage *abstract_page);
void
thunar_apr_abstract_page_set_file (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file);
G_END_DECLS;
#endif /* !__THUNAR_APR_ABSTRACT_PAGE_H__ */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,45 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_APR_DESKTOP_PAGE_H__
#define __THUNAR_APR_DESKTOP_PAGE_H__
#include <thunar-apr/thunar-apr-abstract-page.h>
G_BEGIN_DECLS;
typedef struct _ThunarAprDesktopPageClass ThunarAprDesktopPageClass;
typedef struct _ThunarAprDesktopPage ThunarAprDesktopPage;
#define THUNAR_APR_TYPE_DESKTOP_PAGE (thunar_apr_desktop_page_get_type ())
#define THUNAR_APR_DESKTOP_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_APR_TYPE_DESKTOP_PAGE, ThunarAprDesktopPage))
#define THUNAR_APR_DESKTOP_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_APR_TYPE_DESKTOP_PAGE, ThunarAprDesktopPageClass))
#define THUNAR_APR_IS_DESKTOP_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_APR_TYPE_DESKTOP_PAGE))
#define THUNAR_APR_IS_DESKTOP_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_APR_TYPE_DESKTOP_PAGE))
#define THUNAR_APR_DESKTOP_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_APR_TYPE_DESKTOP_PAGE, ThunarAprDesktopPageClass))
GType
thunar_apr_desktop_page_get_type (void) G_GNUC_CONST;
void
thunar_apr_desktop_page_register_type (ThunarxProviderPlugin *plugin);
G_END_DECLS;
#endif /* !__THUNAR_APR_DESKTOP_PAGE_H__ */

View file

@ -0,0 +1,319 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <exo/exo.h>
#include <thunar-apr/thunar-apr-image-page.h>
#ifdef HAVE_EXIF
#include <libexif/exif-data.h>
#endif
static void
thunar_apr_image_page_file_changed (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file);
#ifdef HAVE_EXIF
static const struct
{
const gchar *name;
ExifTag tag;
}
/* clang-format off */
TAIP_EXIF[] =
{
{ N_ ("Date Taken:"), EXIF_TAG_DATE_TIME_ORIGINAL, },
{ N_ ("Camera Brand:"), EXIF_TAG_MAKE, },
{ N_ ("Camera Model:"), EXIF_TAG_MODEL, },
{ N_ ("Exposure Time:"), EXIF_TAG_EXPOSURE_TIME, },
{ N_ ("Exposure Program:"), EXIF_TAG_EXPOSURE_PROGRAM, },
{ N_ ("Aperture Value:"), EXIF_TAG_APERTURE_VALUE, },
{ N_ ("Metering Mode:"), EXIF_TAG_METERING_MODE, },
{ N_ ("Flash Fired:"), EXIF_TAG_FLASH, },
{ N_ ("Focal Length:"), EXIF_TAG_FOCAL_LENGTH, },
{ N_ ("Shutter Speed:"), EXIF_TAG_SHUTTER_SPEED_VALUE, },
{ N_ ("ISO Speed Ratings:"), EXIF_TAG_ISO_SPEED_RATINGS, },
{ N_ ("Software:"), EXIF_TAG_SOFTWARE, },
{ N_ ("Description:"), EXIF_TAG_IMAGE_DESCRIPTION, },
{ N_ ("Comment:"), EXIF_TAG_USER_COMMENT, },
};
/* clang-format on */
#endif
struct _ThunarAprImagePageClass
{
ThunarAprAbstractPageClass __parent__;
};
struct _ThunarAprImagePage
{
ThunarAprAbstractPage __parent__;
GtkWidget *type_label;
GtkWidget *dimensions_label;
#ifdef HAVE_EXIF
GtkWidget *exif_labels[G_N_ELEMENTS (TAIP_EXIF)];
#endif
};
THUNARX_DEFINE_TYPE (ThunarAprImagePage,
thunar_apr_image_page,
THUNAR_APR_TYPE_ABSTRACT_PAGE);
static void
thunar_apr_image_page_class_init (ThunarAprImagePageClass *klass)
{
ThunarAprAbstractPageClass *thunarapr_abstract_page_class;
thunarapr_abstract_page_class = THUNAR_APR_ABSTRACT_PAGE_CLASS (klass);
thunarapr_abstract_page_class->file_changed = thunar_apr_image_page_file_changed;
}
static void
thunar_apr_image_page_init (ThunarAprImagePage *image_page)
{
AtkRelationSet *relations;
PangoAttribute *attribute;
PangoAttrList *attr_list;
AtkRelation *relation;
AtkObject *object;
GtkWidget *label;
GtkWidget *grid;
#ifdef HAVE_EXIF
GtkWidget *spacer;
guint n;
#endif
gtk_container_set_border_width (GTK_CONTAINER (image_page), 12);
thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (image_page), _("Image"));
/* allocate shared bold Pango attributes */
attr_list = pango_attr_list_new ();
attribute = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
attribute->start_index = 0;
attribute->end_index = -1;
pango_attr_list_insert (attr_list, attribute);
grid = gtk_grid_new ();
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
gtk_container_add (GTK_CONTAINER (image_page), grid);
gtk_widget_show (grid);
label = gtk_label_new (_("Image Type:"));
gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
gtk_label_set_attributes (GTK_LABEL (label), attr_list);
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
gtk_widget_show (label);
image_page->type_label = gtk_label_new ("");
gtk_label_set_selectable (GTK_LABEL (image_page->type_label), TRUE);
gtk_label_set_xalign (GTK_LABEL (image_page->type_label), 0.0f);
gtk_label_set_ellipsize (GTK_LABEL (image_page->type_label), PANGO_ELLIPSIZE_END);
gtk_widget_set_hexpand (image_page->type_label, TRUE);
gtk_grid_attach (GTK_GRID (grid), image_page->type_label, 1, 0, 1, 1);
gtk_widget_show (image_page->type_label);
/* set Atk label relation for the label */
object = gtk_widget_get_accessible (image_page->type_label);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
label = gtk_label_new (_("Image Size:"));
gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
gtk_label_set_attributes (GTK_LABEL (label), attr_list);
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
gtk_widget_show (label);
image_page->dimensions_label = gtk_label_new ("");
gtk_label_set_selectable (GTK_LABEL (image_page->dimensions_label), TRUE);
gtk_label_set_xalign (GTK_LABEL (image_page->dimensions_label), 0.0f);
gtk_label_set_ellipsize (GTK_LABEL (image_page->dimensions_label), PANGO_ELLIPSIZE_END);
gtk_widget_set_hexpand (image_page->dimensions_label, TRUE);
gtk_grid_attach (GTK_GRID (grid), image_page->dimensions_label, 1, 1, 1, 1);
gtk_widget_show (image_page->dimensions_label);
/* set Atk label relation for the label */
object = gtk_widget_get_accessible (image_page->dimensions_label);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
#ifdef HAVE_EXIF
/* some spacing between the General info and the Exif info */
spacer = g_object_new (GTK_TYPE_BOX, "orientation", GTK_ORIENTATION_VERTICAL, "height-request", 6, NULL);
gtk_grid_attach (GTK_GRID (grid), spacer, 0, 2, 2, 1);
gtk_widget_show (spacer);
/* add labels for the Exif info */
for (n = 0; n < G_N_ELEMENTS (TAIP_EXIF); ++n)
{
label = gtk_label_new (_(TAIP_EXIF[n].name));
gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
gtk_label_set_attributes (GTK_LABEL (label), attr_list);
gtk_grid_attach (GTK_GRID (grid), label, 0, n + 3, 1, 1);
gtk_widget_show (label);
image_page->exif_labels[n] = gtk_label_new ("");
gtk_label_set_selectable (GTK_LABEL (image_page->exif_labels[n]), TRUE);
gtk_label_set_xalign (GTK_LABEL (image_page->exif_labels[n]), 0.0f);
gtk_label_set_ellipsize (GTK_LABEL (image_page->exif_labels[n]), PANGO_ELLIPSIZE_END);
gtk_widget_set_hexpand (image_page->exif_labels[n], TRUE);
gtk_grid_attach (GTK_GRID (grid), image_page->exif_labels[n], 1, n + 3, 1, 1);
gtk_widget_show (image_page->exif_labels[n]);
g_object_bind_property (G_OBJECT (image_page->exif_labels[n]), "visible", G_OBJECT (label), "visible", G_BINDING_SYNC_CREATE);
/* set Atk label relation for the label */
object = gtk_widget_get_accessible (image_page->exif_labels[n]);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
}
#endif
/* release shared bold Pango attributes */
pango_attr_list_unref (attr_list);
}
static void
thunar_apr_image_page_file_changed (ThunarAprAbstractPage *abstract_page,
ThunarxFileInfo *file)
{
ThunarAprImagePage *image_page = THUNAR_APR_IMAGE_PAGE (abstract_page);
GdkPixbufFormat *format;
gchar *filename;
gchar *text;
gchar *uri;
gint height;
gint width;
#ifdef HAVE_EXIF
ExifEntry *exif_entry;
ExifData *exif_data;
gchar exif_buffer[1024];
guint n;
#endif
/* determine the URI for the file */
uri = thunarx_file_info_get_uri (file);
if (G_UNLIKELY (uri == NULL))
return;
/* determine the local path of the file */
filename = g_filename_from_uri (uri, NULL, NULL);
if (G_LIKELY (filename != NULL))
{
/* determine the pixbuf format */
format = gdk_pixbuf_get_file_info (filename, &width, &height);
if (G_LIKELY (format != NULL))
{
/* update the "Image Type" label */
gchar *name = gdk_pixbuf_format_get_name (format);
gchar *desc = gdk_pixbuf_format_get_description (format);
text = g_strdup_printf ("%s (%s)", name, desc);
gtk_label_set_text (GTK_LABEL (image_page->type_label), text);
g_free (name);
g_free (desc);
g_free (text);
/* update the "Image Size" label */
text = g_strdup_printf (ngettext ("%dx%d pixel", "%dx%d pixels", width + height), width, height);
gtk_label_set_text (GTK_LABEL (image_page->dimensions_label), text);
g_free (text);
#ifdef HAVE_EXIF
/* hide all Exif labels (will be shown again if data is available) */
for (n = 0; n < G_N_ELEMENTS (TAIP_EXIF); ++n)
gtk_widget_hide (image_page->exif_labels[n]);
/* try to load the Exif data for the file */
exif_data = exif_data_new_from_file (filename);
if (G_LIKELY (exif_data != NULL))
{
/* update all Exif labels */
for (n = 0; n < G_N_ELEMENTS (TAIP_EXIF); ++n)
{
/* lookup the entry for the tag */
exif_entry = exif_data_get_entry (exif_data, TAIP_EXIF[n].tag);
if (G_LIKELY (exif_entry != NULL))
{
/* determine the value */
if (exif_entry_get_value (exif_entry, exif_buffer, sizeof (exif_buffer)) != NULL)
{
/* setup the label text */
text = (g_utf8_validate (exif_buffer, -1, NULL)) ? g_strdup (exif_buffer) : g_filename_display_name (exif_buffer);
gtk_label_set_text (GTK_LABEL (image_page->exif_labels[n]), text);
g_free (text);
/* show the label */
gtk_widget_show (image_page->exif_labels[n]);
}
}
}
/* cleanup */
exif_data_free (exif_data);
}
#endif
}
else
{
/* tell the user that we're unable to determine the file info */
gtk_label_set_text (GTK_LABEL (image_page->type_label), _("Unknown"));
gtk_label_set_text (GTK_LABEL (image_page->dimensions_label), _("Unknown"));
#ifdef HAVE_EXIF
/* hide all Exif labels */
for (n = 0; n < G_N_ELEMENTS (TAIP_EXIF); ++n)
gtk_widget_hide (image_page->exif_labels[n]);
#endif
}
}
/* cleanup */
g_free (filename);
g_free (uri);
}

View file

@ -0,0 +1,45 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_APR_IMAGE_PAGE_H__
#define __THUNAR_APR_IMAGE_PAGE_H__
#include <thunar-apr/thunar-apr-abstract-page.h>
G_BEGIN_DECLS;
typedef struct _ThunarAprImagePageClass ThunarAprImagePageClass;
typedef struct _ThunarAprImagePage ThunarAprImagePage;
#define THUNAR_APR_TYPE_IMAGE_PAGE (thunar_apr_image_page_get_type ())
#define THUNAR_APR_IMAGE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_APR_TYPE_IMAGE_PAGE, ThunarAprImagePage))
#define THUNAR_APR_IMAGE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_APR_TYPE_IMAGE_PAGE, ThunarAprImagePageClass))
#define THUNAR_APR_IS_IMAGE_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_APR_TYPE_IMAGE_PAGE))
#define THUNAR_APR_IS_IMAGE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_APR_TYPE_IMAGE_PAGE))
#define THUNAR_APR_IMAGE_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_APR_TYPE_IMAGE_PAGE, ThunarAprImagePageClass))
GType
thunar_apr_image_page_get_type (void) G_GNUC_CONST;
void
thunar_apr_image_page_register_type (ThunarxProviderPlugin *plugin);
G_END_DECLS;
#endif /* !__THUNAR_APR_IMAGE_PAGE_H__ */

View file

@ -0,0 +1,91 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <thunar-apr/thunar-apr-abstract-page.h>
#include <thunar-apr/thunar-apr-desktop-page.h>
#include <thunar-apr/thunar-apr-image-page.h>
#include <thunar-apr/thunar-apr-provider.h>
G_MODULE_EXPORT void
thunar_extension_initialize (ThunarxProviderPlugin *plugin);
G_MODULE_EXPORT void
thunar_extension_shutdown (void);
G_MODULE_EXPORT void
thunar_extension_list_types (const GType **types,
gint *n_types);
static GType type_list[1];
G_MODULE_EXPORT void
thunar_extension_initialize (ThunarxProviderPlugin *plugin)
{
const gchar *mismatch;
/* verify that the thunarx versions are compatible */
mismatch = thunarx_check_version (THUNARX_MAJOR_VERSION, THUNARX_MINOR_VERSION, THUNARX_MICRO_VERSION);
if (G_UNLIKELY (mismatch != NULL))
{
g_warning ("Version mismatch: %s", mismatch);
return;
}
#ifdef G_ENABLE_DEBUG
g_message ("Initializing ThunarApr extension");
#endif
/* register the types provided by this plugin */
thunar_apr_abstract_page_register_type (plugin);
thunar_apr_desktop_page_register_type (plugin);
thunar_apr_image_page_register_type (plugin);
thunar_apr_provider_register_type (plugin);
/* setup the plugin provider type list */
type_list[0] = THUNAR_APR_TYPE_PROVIDER;
}
G_MODULE_EXPORT void
thunar_extension_shutdown (void)
{
#ifdef G_ENABLE_DEBUG
g_message ("Shutting down ThunarApr extension");
#endif
}
G_MODULE_EXPORT void
thunar_extension_list_types (const GType **types,
gint *n_types)
{
*types = type_list;
*n_types = G_N_ELEMENTS (type_list);
}

View file

@ -0,0 +1,49 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_LIBINTL_H
#include <libintl.h>
#endif
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
#include <exo/exo.h>
#include <thunar-apr/thunar-apr-private.h>
/**
* thunar_apr_i18n_init:
*
* Sets up i18n support for the thunar-apr plugin.
**/
void
thunar_apr_i18n_init (void)
{
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
#endif
}

View file

@ -0,0 +1,33 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_APR_PRIVATE_H__
#define __THUNAR_APR_PRIVATE_H__
#include <glib.h>
G_BEGIN_DECLS;
void
thunar_apr_i18n_init (void);
G_END_DECLS;
#endif /* !__THUNAR_APR_PRIVATE_H__ */

View file

@ -0,0 +1,135 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include <thunar-apr/thunar-apr-desktop-page.h>
#include <thunar-apr/thunar-apr-image-page.h>
#include <thunar-apr/thunar-apr-provider.h>
static void
thunar_apr_provider_property_page_provider_init (ThunarxPropertyPageProviderIface *iface);
static GList *
thunar_apr_provider_get_pages (ThunarxPropertyPageProvider *property_page_provider,
GList *files);
struct _ThunarAprProviderClass
{
GObjectClass __parent__;
};
struct _ThunarAprProvider
{
GObject __parent__;
};
THUNARX_DEFINE_TYPE_WITH_CODE (ThunarAprProvider,
thunar_apr_provider,
G_TYPE_OBJECT,
THUNARX_IMPLEMENT_INTERFACE (THUNARX_TYPE_PROPERTY_PAGE_PROVIDER,
thunar_apr_provider_property_page_provider_init));
static void
thunar_apr_provider_class_init (ThunarAprProviderClass *klass)
{
}
static void
thunar_apr_provider_property_page_provider_init (ThunarxPropertyPageProviderIface *iface)
{
iface->get_pages = thunar_apr_provider_get_pages;
}
static void
thunar_apr_provider_init (ThunarAprProvider *apr_provider)
{
}
static GList *
thunar_apr_provider_get_pages (ThunarxPropertyPageProvider *property_page_provider,
GList *files)
{
GSList *formats;
GSList *lp;
gchar **mime_types;
gchar *scheme;
GList *pages = NULL;
gint n;
/* we can handle only property pages for a single file */
if (G_UNLIKELY (files == NULL || files->next != NULL))
return NULL;
/* determine the URI scheme of the file (works only for local files) */
scheme = thunarx_file_info_get_uri_scheme (files->data);
if (G_LIKELY (strcmp (scheme, "file") == 0))
{
/* ThunarAprDesktopPage case */
if (G_LIKELY (pages == NULL))
{
/* check if we have a .desktop file here */
if (thunarx_file_info_has_mime_type (files->data, "application/x-desktop"))
pages = g_list_append (pages, g_object_new (THUNAR_APR_TYPE_DESKTOP_PAGE, "file", files->data, NULL));
}
/* ThunarAprImagePage case */
if (G_LIKELY (pages == NULL))
{
/* determine the supported GdkPixbuf formats */
formats = gdk_pixbuf_get_formats ();
for (lp = formats; lp != NULL && pages == NULL; lp = lp->next)
{
/* check if any of the mime types of this format matches */
mime_types = gdk_pixbuf_format_get_mime_types (lp->data);
for (n = 0; mime_types[n] != NULL && pages == NULL; ++n)
if (thunarx_file_info_has_mime_type (files->data, mime_types[n]))
pages = g_list_append (pages, g_object_new (THUNAR_APR_TYPE_IMAGE_PAGE, "file", files->data, NULL));
g_strfreev (mime_types);
}
g_slist_free (formats);
}
}
g_free (scheme);
return pages;
}

View file

@ -0,0 +1,45 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_APR_PROVIDER_H__
#define __THUNAR_APR_PROVIDER_H__
#include <thunarx/thunarx.h>
G_BEGIN_DECLS;
typedef struct _ThunarAprProviderClass ThunarAprProviderClass;
typedef struct _ThunarAprProvider ThunarAprProvider;
#define THUNAR_APR_TYPE_PROVIDER (thunar_apr_provider_get_type ())
#define THUNAR_APR_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_APR_TYPE_PROVIDER, ThunarAprProvider))
#define THUNAR_APR_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_APR_TYPE_PROVIDER, ThunarAprProviderClass))
#define THUNAR_APR_IS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_APR_TYPE_PROVIDER))
#define THUNAR_APR_IS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_APR_TYPE_PROVIDER))
#define THUNAR_APR_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_APR_TYPE_PROVIDER, ThunarAprProviderClass))
GType
thunar_apr_provider_get_type (void) G_GNUC_CONST;
void
thunar_apr_provider_register_type (ThunarxProviderPlugin *plugin);
G_END_DECLS;
#endif /* !__THUNAR_APR_PROVIDER_H__ */

View file

@ -0,0 +1,60 @@
AM_CPPFLAGS = \
-I$(top_builddir) \
-I$(top_builddir)/plugins \
-I$(top_srcdir) \
-I$(top_srcdir)/plugins \
-DG_LOG_DOMAIN=\"thunar-sbr\" \
$(PLATFORM_CPPFLAGS)
extensionsdir = $(libdir)/thunarx-$(THUNARX_VERSION_API)
extensions_LTLIBRARIES = \
thunar-sbr.la
thunar_sbr_la_SOURCES = \
thunar-sbr-case-renamer.c \
thunar-sbr-case-renamer.h \
thunar-sbr-date-renamer.c \
thunar-sbr-date-renamer.h \
thunar-sbr-enum-types.c \
thunar-sbr-enum-types.h \
thunar-sbr-insert-renamer.c \
thunar-sbr-insert-renamer.h \
thunar-sbr-number-renamer.c \
thunar-sbr-number-renamer.h \
thunar-sbr-plugin.c \
thunar-sbr-provider.c \
thunar-sbr-provider.h \
thunar-sbr-remove-renamer.c \
thunar-sbr-remove-renamer.h \
thunar-sbr-replace-renamer.c \
thunar-sbr-replace-renamer.h
thunar_sbr_la_CFLAGS = \
$(EXIF_CFLAGS) \
$(EXO_CFLAGS) \
$(GLIB_CFLAGS) \
$(PCRE2_CFLAGS) \
$(PLATFORM_CFLAGS)
thunar_sbr_la_LDFLAGS = \
-avoid-version \
-export-dynamic \
-no-undefined \
-export-symbols-regex "^thunar_extension_(shutdown|initialize|list_types)" \
-module \
$(PLATFORM_LDFLAGS)
thunar_sbr_la_LIBADD = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la \
$(EXIF_LIBS) \
$(EXO_LIBS) \
$(GLIB_LIBS) \
$(PCRE2_LIBS)
thunar_sbr_la_DEPENDENCIES = \
$(top_builddir)/thunarx/libthunarx-$(THUNARX_VERSION_API).la
EXTRA_DIST = \
README.md
# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

View file

@ -0,0 +1,24 @@
Thunar Simple Builtin Renamers (thunar-sbr)
===========================================
Thunar-sbr is an extension to Thunar, which includes a bunch of simple renamers for the bulk rename dialog:
* Insert / Overwrite
* Insert Date / Time
* Numbering
* Remove Characters
* Search & Replace
* Uppercase / Lowercase
By default the thunar-sbr extension will be installed, but as with every extension, it will slightly increase the resource usage of Thunar (this shouldn't be a real problem unless you're targeting an embedded system), and so you can pass `--disable-sbr-plugin` to configure and the plugin won't be built and installed. Since it is an extension, you can also easily uninstall it afterwards by removing the thunar-sbr.so file from the lib/thunarx-2/ directory of your installation (be sure to quit Thunar before removing files though).
Regular Expressions
-------------------
The "Search & Replace" renamer can be built with support for regular expressions using the Perl-compatible regular expression (PCRE) library version 6.0 or above. The reasons to use PCRE instead of the POSIX regular expressions, that are part of the system C library, are:
* PCRE supports UTF-8, which Thunar uses internally for all user visible texts (be sure to enable this when installing PCRE using the `--enable-utf8` configure switch).
* PCRE uses a more consistent syntax, which is easier to understand for most people.

View file

@ -0,0 +1,319 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <exo/exo.h>
#include <thunar-sbr/thunar-sbr-case-renamer.h>
/* Property identifiers */
enum
{
PROP_0,
PROP_MODE,
};
static void
thunar_sbr_case_renamer_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void
thunar_sbr_case_renamer_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static gchar *
thunar_sbr_case_renamer_process (ThunarxRenamer *renamer,
ThunarxFileInfo *file,
const gchar *text,
guint idx);
struct _ThunarSbrCaseRenamerClass
{
ThunarxRenamerClass __parent__;
};
struct _ThunarSbrCaseRenamer
{
ThunarxRenamer __parent__;
ThunarSbrCaseRenamerMode mode;
};
THUNARX_DEFINE_TYPE (ThunarSbrCaseRenamer, thunar_sbr_case_renamer, THUNARX_TYPE_RENAMER);
static void
thunar_sbr_case_renamer_class_init (ThunarSbrCaseRenamerClass *klass)
{
ThunarxRenamerClass *thunarxrenamer_class;
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->get_property = thunar_sbr_case_renamer_get_property;
gobject_class->set_property = thunar_sbr_case_renamer_set_property;
thunarxrenamer_class = THUNARX_RENAMER_CLASS (klass);
thunarxrenamer_class->process = thunar_sbr_case_renamer_process;
/**
* ThunarSbrCaseRenamer:mode:
*
* The #ThunarSbrCaseRenamerMode for this
* #ThunarSbrCaseRenamer instance.
**/
g_object_class_install_property (gobject_class,
PROP_MODE,
g_param_spec_enum ("mode", "mode", "mode",
THUNAR_SBR_TYPE_CASE_RENAMER_MODE,
THUNAR_SBR_CASE_RENAMER_MODE_LOWER,
G_PARAM_READWRITE));
}
static void
thunar_sbr_case_renamer_init (ThunarSbrCaseRenamer *case_renamer)
{
AtkRelationSet *relations;
AtkRelation *relation;
GEnumClass *klass;
AtkObject *object;
GtkWidget *combo;
GtkWidget *label;
GtkWidget *hbox;
guint n;
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
gtk_box_pack_start (GTK_BOX (case_renamer), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
label = gtk_label_new_with_mnemonic (_("Con_vert to:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
combo = gtk_combo_box_text_new ();
klass = g_type_class_ref (THUNAR_SBR_TYPE_CASE_RENAMER_MODE);
for (n = 0; n < klass->n_values; ++n)
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(klass->values[n].value_nick));
g_object_bind_property (G_OBJECT (case_renamer), "mode", G_OBJECT (combo), "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
g_type_class_unref (klass);
gtk_widget_show (combo);
/* set Atk label relation for the combo */
object = gtk_widget_get_accessible (combo);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
}
static void
thunar_sbr_case_renamer_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ThunarSbrCaseRenamer *case_renamer = THUNAR_SBR_CASE_RENAMER (object);
switch (prop_id)
{
case PROP_MODE:
g_value_set_enum (value, thunar_sbr_case_renamer_get_mode (case_renamer));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
thunar_sbr_case_renamer_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ThunarSbrCaseRenamer *case_renamer = THUNAR_SBR_CASE_RENAMER (object);
switch (prop_id)
{
case PROP_MODE:
thunar_sbr_case_renamer_set_mode (case_renamer, g_value_get_enum (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gchar *
tscr_utf8_strcase (const gchar *text,
gboolean title_case)
{
const gchar *t;
gboolean upper = TRUE;
gunichar c;
GString *result;
/* allocate a new string for the result */
result = g_string_sized_new (32);
/* convert the input text */
for (t = text; *t != '\0'; t = g_utf8_next_char (t))
{
/* check the next char */
c = g_utf8_get_char (t);
if (title_case && g_unichar_isspace (c))
{
upper = TRUE;
}
else if (upper && g_unichar_isalpha (c))
{
c = g_unichar_toupper (c);
upper = FALSE;
}
else
{
c = g_unichar_tolower (c);
}
/* append the char to the result */
g_string_append_unichar (result, c);
}
return g_string_free (result, FALSE);
}
static gchar *
thunar_sbr_case_renamer_process (ThunarxRenamer *renamer,
ThunarxFileInfo *file,
const gchar *text,
guint idx)
{
ThunarSbrCaseRenamer *case_renamer = THUNAR_SBR_CASE_RENAMER (renamer);
switch (case_renamer->mode)
{
case THUNAR_SBR_CASE_RENAMER_MODE_LOWER:
return g_utf8_strdown (text, -1);
case THUNAR_SBR_CASE_RENAMER_MODE_UPPER:
return g_utf8_strup (text, -1);
case THUNAR_SBR_CASE_RENAMER_MODE_TITLE:
return tscr_utf8_strcase (text, TRUE);
case THUNAR_SBR_CASE_RENAMER_MODE_FIRST_UPPER:
return tscr_utf8_strcase (text, FALSE);
default:
g_assert_not_reached ();
return NULL;
}
}
/**
* thunar_sbr_case_renamer_new:
*
* Allocates a new #ThunarSbrCaseRenamer instance.
*
* Return value: the newly allocated #ThunarSbrCaseRenamer.
**/
ThunarSbrCaseRenamer *
thunar_sbr_case_renamer_new (void)
{
return g_object_new (THUNAR_SBR_TYPE_CASE_RENAMER,
"name", _("Uppercase / Lowercase"),
NULL);
}
/**
* thunar_sbr_case_renamer_get_mode:
* @case_renamer : a #ThunarSbrCaseRenamer.
*
* Returns the current #ThunarSbrCaseRenamerMode
* for the @case_renamer.
*
* Return value: the current mode of @case_renamer.
**/
ThunarSbrCaseRenamerMode
thunar_sbr_case_renamer_get_mode (ThunarSbrCaseRenamer *case_renamer)
{
g_return_val_if_fail (THUNAR_SBR_IS_CASE_RENAMER (case_renamer), THUNAR_SBR_CASE_RENAMER_MODE_LOWER);
return case_renamer->mode;
}
/**
* thunar_sbr_case_renamer_set_mode:
* @case_renamer : a #ThunarSbrCaseRenamer.
* @mode : the new #ThunarSbrCaseRenamerMode.
*
* Sets the #ThunarSbrCaseRenamerMode of the @case_renamer
* to the specified @mode.
**/
void
thunar_sbr_case_renamer_set_mode (ThunarSbrCaseRenamer *case_renamer,
ThunarSbrCaseRenamerMode mode)
{
g_return_if_fail (THUNAR_SBR_IS_CASE_RENAMER (case_renamer));
/* check if we already use that mode */
if (G_UNLIKELY (case_renamer->mode == mode))
return;
/* apply the new mode */
case_renamer->mode = mode;
/* notify listeners */
g_object_notify (G_OBJECT (case_renamer), "mode");
/* emit the "changed" signal */
thunarx_renamer_changed (THUNARX_RENAMER (case_renamer));
}

View file

@ -0,0 +1,54 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_SBR_CASE_RENAMER_H__
#define __THUNAR_SBR_CASE_RENAMER_H__
#include <thunar-sbr/thunar-sbr-enum-types.h>
G_BEGIN_DECLS;
typedef struct _ThunarSbrCaseRenamerClass ThunarSbrCaseRenamerClass;
typedef struct _ThunarSbrCaseRenamer ThunarSbrCaseRenamer;
#define THUNAR_SBR_TYPE_CASE_RENAMER (thunar_sbr_case_renamer_get_type ())
#define THUNAR_SBR_CASE_RENAMER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_SBR_TYPE_CASE_RENAMER, ThunarSbrCaseRenamer))
#define THUNAR_SBR_CASE_RENAMER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_SBR_TYPE_CASE_RENAMER, ThunarSbrCaseRenamerClass))
#define THUNAR_SBR_IS_CASE_RENAMER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_SBR_TYPE_CASE_RENAMER))
#define THUNAR_SBR_IS_CASE_RENAMER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_SBR_TYPE_CASE_RENAMER))
#define THUNAR_SBR_CASE_RENAMER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_SBR_TYPE_CASE_RENAMER, ThunarSbrCaseRenamerClass))
GType
thunar_sbr_case_renamer_get_type (void) G_GNUC_CONST;
void
thunar_sbr_case_renamer_register_type (ThunarxProviderPlugin *plugin);
ThunarSbrCaseRenamer *
thunar_sbr_case_renamer_new (void) G_GNUC_MALLOC;
ThunarSbrCaseRenamerMode
thunar_sbr_case_renamer_get_mode (ThunarSbrCaseRenamer *case_renamer);
void
thunar_sbr_case_renamer_set_mode (ThunarSbrCaseRenamer *case_renamer,
ThunarSbrCaseRenamerMode mode);
G_END_DECLS;
#endif /* !__THUNAR_SBR_CASE_RENAMER_H__ */

View file

@ -0,0 +1,789 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2007 Nick Schermer <nick@xfce.org>
* Copyright (c) 2007 Benedikt Meurer <benny@xfce.org>
* Copyright (c) 2009 Jannis Pohlmann <jannis@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif
#include <libxfce4util/libxfce4util.h>
#include <thunar-sbr/thunar-sbr-date-renamer.h>
#ifdef HAVE_EXIF
#include <libexif/exif-data.h>
#endif
/* Property identifiers */
enum
{
PROP_0,
PROP_MODE,
PROP_FORMAT,
PROP_OFFSET,
PROP_OFFSET_MODE,
};
static void
thunar_sbr_date_renamer_finalize (GObject *object);
static void
thunar_sbr_date_renamer_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void
thunar_sbr_date_renamer_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static gchar *
thunar_sbr_get_time_string (guint64 file_time,
const gchar *custom_format);
#ifdef HAVE_EXIF
static guint64
thunar_sbr_get_time_from_string (const gchar *string);
#endif
static guint64
thunar_sbr_get_time (ThunarxFileInfo *file,
ThunarSbrDateMode mode);
static gchar *
thunar_sbr_date_renamer_process (ThunarxRenamer *renamer,
ThunarxFileInfo *file,
const gchar *text,
guint idx);
struct _ThunarSbrDateRenamerClass
{
ThunarxRenamerClass __parent__;
};
struct _ThunarSbrDateRenamer
{
ThunarxRenamer __parent__;
ThunarSbrDateMode mode;
guint offset;
ThunarSbrOffsetMode offset_mode;
gchar *format;
};
THUNARX_DEFINE_TYPE (ThunarSbrDateRenamer, thunar_sbr_date_renamer, THUNARX_TYPE_RENAMER);
static void
thunar_sbr_date_renamer_class_init (ThunarSbrDateRenamerClass *klass)
{
ThunarxRenamerClass *thunarxrenamer_class;
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = thunar_sbr_date_renamer_finalize;
gobject_class->get_property = thunar_sbr_date_renamer_get_property;
gobject_class->set_property = thunar_sbr_date_renamer_set_property;
thunarxrenamer_class = THUNARX_RENAMER_CLASS (klass);
thunarxrenamer_class->process = thunar_sbr_date_renamer_process;
/**
* ThunarSbrDateRenamer:mode:
*
* The #ThunarSbrDateMode to use.
**/
g_object_class_install_property (gobject_class,
PROP_MODE,
g_param_spec_enum ("mode",
"mode",
"mode",
THUNAR_SBR_TYPE_DATE_MODE,
THUNAR_SBR_DATE_MODE_NOW,
G_PARAM_READWRITE));
/**
* ThunarSbrDateRenamer:format:
*
* The date format to insert.
**/
g_object_class_install_property (gobject_class,
PROP_FORMAT,
g_param_spec_string ("format",
"format",
"format",
"%Y%m%d",
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
/**
* ThunarSbrDateRenamer:offset:
*
* The starting offset at which to insert/overwrite.
**/
g_object_class_install_property (gobject_class,
PROP_OFFSET,
g_param_spec_uint ("offset",
"offset",
"offset",
0, G_MAXUINT, 0,
G_PARAM_READWRITE));
/**
* ThunarSbrDateRenamer:offset-mode:
*
* The offset mode for the renamer.
**/
g_object_class_install_property (gobject_class,
PROP_OFFSET_MODE,
g_param_spec_enum ("offset-mode",
"offset-mode",
"offset-mode",
THUNAR_SBR_TYPE_OFFSET_MODE,
THUNAR_SBR_OFFSET_MODE_LEFT,
G_PARAM_READWRITE));
}
static void
thunar_sbr_date_renamer_init (ThunarSbrDateRenamer *date_renamer)
{
GEnumClass *klass;
AtkRelationSet *relations;
AtkRelation *relation;
AtkObject *object;
GtkWidget *grid, *hbox;
GtkWidget *label, *combo;
GtkWidget *spinner;
GtkWidget *entry;
GtkAdjustment *adjustment;
guint n;
grid = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
gtk_box_pack_start (GTK_BOX (date_renamer), grid, TRUE, TRUE, 0);
gtk_widget_show (grid);
label = gtk_label_new_with_mnemonic (_("Insert _time:"));
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
gtk_widget_show (label);
combo = gtk_combo_box_text_new ();
klass = g_type_class_ref (THUNAR_SBR_TYPE_DATE_MODE);
for (n = 0; n < klass->n_values; ++n)
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(klass->values[n].value_nick));
g_object_bind_property (G_OBJECT (date_renamer), "mode", G_OBJECT (combo), "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
gtk_grid_attach (GTK_GRID (grid), combo, 1, 0, 1, 1);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
g_type_class_unref (klass);
gtk_widget_show (combo);
/* set Atk label relation for the combo */
object = gtk_widget_get_accessible (combo);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
label = gtk_label_new_with_mnemonic (_("_Format:"));
gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1);
gtk_widget_show (label);
entry = gtk_entry_new ();
g_object_bind_property (G_OBJECT (entry), "text", G_OBJECT (date_renamer), "format", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
gtk_widget_set_hexpand (GTK_WIDGET (entry), TRUE);
gtk_grid_attach (GTK_GRID (grid), entry, 3, 0, 1, 1);
gtk_widget_set_tooltip_text (entry,
_("The format describes the date and time parts to insert "
"into the file name. For example, %Y will be substituted "
"with the year, %m with the month and %d with the day. "
"See the documentation of the date utility for additional "
"information."));
gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
gtk_widget_show (entry);
/* set Atk label relation for the entry */
object = gtk_widget_get_accessible (entry);
relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add (relations, relation);
g_object_unref (G_OBJECT (relation));
g_object_unref (relations);
label = gtk_label_new_with_mnemonic (_("_At position:"));
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
gtk_widget_show (label);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
gtk_grid_attach (GTK_GRID (grid), hbox, 1, 1, 3, 1);
gtk_widget_show (hbox);
spinner = gtk_spin_button_new_with_range (0u, G_MAXUINT, 1u);
gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
gtk_entry_set_alignment (GTK_ENTRY (spinner), 1.0f);
gtk_entry_set_activates_default (GTK_ENTRY (spinner), TRUE);
gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner), 0);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (spinner), TRUE);
gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, FALSE, 0);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinner);
gtk_widget_show (spinner);
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spinner));
g_object_bind_property (G_OBJECT (date_renamer), "offset", G_OBJECT (adjustment), "value", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
combo = gtk_combo_box_text_new ();
klass = g_type_class_ref (THUNAR_SBR_TYPE_OFFSET_MODE);
for (n = 0; n < klass->n_values; ++n)
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(klass->values[n].value_nick));
g_object_bind_property (G_OBJECT (date_renamer), "offset-mode", G_OBJECT (combo), "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
g_type_class_unref (klass);
gtk_widget_show (combo);
}
static void
thunar_sbr_date_renamer_finalize (GObject *object)
{
ThunarSbrDateRenamer *date_renamer = THUNAR_SBR_DATE_RENAMER (object);
/* release the format */
g_free (date_renamer->format);
(*G_OBJECT_CLASS (thunar_sbr_date_renamer_parent_class)->finalize) (object);
}
static void
thunar_sbr_date_renamer_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ThunarSbrDateRenamer *date_renamer = THUNAR_SBR_DATE_RENAMER (object);
switch (prop_id)
{
case PROP_MODE:
g_value_set_enum (value, thunar_sbr_date_renamer_get_mode (date_renamer));
break;
case PROP_FORMAT:
g_value_set_string (value, thunar_sbr_date_renamer_get_format (date_renamer));
break;
case PROP_OFFSET:
g_value_set_uint (value, thunar_sbr_date_renamer_get_offset (date_renamer));
break;
case PROP_OFFSET_MODE:
g_value_set_enum (value, thunar_sbr_date_renamer_get_offset_mode (date_renamer));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
thunar_sbr_date_renamer_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ThunarSbrDateRenamer *date_renamer = THUNAR_SBR_DATE_RENAMER (object);
switch (prop_id)
{
case PROP_MODE:
thunar_sbr_date_renamer_set_mode (date_renamer, g_value_get_enum (value));
break;
case PROP_FORMAT:
thunar_sbr_date_renamer_set_format (date_renamer, g_value_get_string (value));
break;
case PROP_OFFSET:
thunar_sbr_date_renamer_set_offset (date_renamer, g_value_get_uint (value));
break;
case PROP_OFFSET_MODE:
thunar_sbr_date_renamer_set_offset_mode (date_renamer, g_value_get_enum (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gchar *
thunar_sbr_get_time_string (guint64 file_time,
const gchar *format)
{
struct tm *tm;
time_t _time;
gchar *converted;
gchar buffer[1024];
gint length;
_time = (time_t) file_time;
/* determine the local file time */
tm = localtime (&_time);
/* conver the format to the current locale */
converted = g_locale_from_utf8 (format, -1, NULL, NULL, NULL);
/* parse the format */
length = strftime (buffer, sizeof (buffer), converted, tm);
/* cleanup */
g_free (converted);
/* check if strftime succeeded */
if (G_UNLIKELY (length == 0))
return NULL;
/* return the utf-8 string */
return g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
}
#ifdef HAVE_EXIF
static guint64
thunar_sbr_get_time_from_string (const gchar *string)
{
struct tm tm;
#ifdef HAVE_STRPTIME
/* parse the string with strptime */
strptime (string, "%Y:%m:%d %T", &tm);
#else
gint result;
gint year, month, day, hour, min, sec;
result = sscanf (string, "%d:%d:%d %d:%d:%d", &year, &month, &day, &hour, &min, &sec);
/* only continue when atleast the date is parsed succesfully */
if (G_LIKELY (result >= 3 && g_date_valid_dmy (day, month, year)))
{
/* be sure to start with a clean tm */
memset (&tm, 0, sizeof (tm));
/* set the date */
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
/* set the time */
tm.tm_hour = result >= 4 ? hour : 0;
tm.tm_min = result >= 5 ? min : 0;
tm.tm_sec = result >= 6 ? sec : 0;
}
else
{
return 0;
}
#endif
/* return the local time */
return mktime (&tm);
}
#endif
static guint64
thunar_sbr_get_time (ThunarxFileInfo *file,
ThunarSbrDateMode mode)
{
GFileInfo *file_info;
guint64 file_time = 0;
#ifdef HAVE_EXIF
gchar *uri, *filename;
ExifEntry *exif_entry;
ExifData *exif_data;
gchar exif_buffer[128];
#endif
switch (mode)
{
case THUNAR_SBR_DATE_MODE_NOW:
/* set the time to the current time */
file_time = time (NULL);
break;
case THUNAR_SBR_DATE_MODE_ATIME:
case THUNAR_SBR_DATE_MODE_MTIME:
/* get the file info */
file_info = thunarx_file_info_get_file_info (file);
/* get the time from the info */
if (mode == THUNAR_SBR_DATE_MODE_ATIME)
{
file_time = g_file_info_get_attribute_uint64 (file_info,
G_FILE_ATTRIBUTE_TIME_ACCESS);
}
else
{
file_time = g_file_info_get_attribute_uint64 (file_info,
G_FILE_ATTRIBUTE_TIME_MODIFIED);
}
/* release the file info */
g_object_unref (file_info);
break;
#ifdef HAVE_EXIF
case THUNAR_SBR_DATE_MODE_TAKEN:
/* get the uri */
uri = thunarx_file_info_get_uri (file);
if (G_LIKELY (uri != NULL))
{
/* determine the local path of the file */
filename = g_filename_from_uri (uri, NULL, NULL);
if (G_LIKELY (filename != NULL))
{
/* try to load the exif data for the file */
exif_data = exif_data_new_from_file (filename);
if (G_LIKELY (exif_data != NULL))
{
/* lookup the entry for the tag, fallback on less common ones */
exif_entry = exif_data_get_entry (exif_data, EXIF_TAG_DATE_TIME);
if (exif_entry == NULL)
exif_entry = exif_data_get_entry (exif_data, EXIF_TAG_DATE_TIME_ORIGINAL);
if (exif_entry == NULL)
exif_entry = exif_data_get_entry (exif_data, EXIF_TAG_DATE_TIME_DIGITIZED);
if (G_LIKELY (exif_entry != NULL))
{
/* determine the value */
if (exif_entry_get_value (exif_entry, exif_buffer, sizeof (exif_buffer)) != NULL)
file_time = thunar_sbr_get_time_from_string (exif_buffer);
}
/* cleanup */
exif_data_free (exif_data);
}
/* cleanup */
g_free (filename);
}
/* cleanup */
g_free (uri);
}
break;
#endif
}
return file_time;
}
static gchar *
thunar_sbr_date_renamer_process (ThunarxRenamer *renamer,
ThunarxFileInfo *file,
const gchar *text,
guint idx)
{
ThunarSbrDateRenamer *date_renamer = THUNAR_SBR_DATE_RENAMER (renamer);
gchar *string;
guint64 file_time;
const gchar *s;
GString *result;
guint text_length;
guint offset;
/* return when there is no text in the custom format entry */
if (G_UNLIKELY (date_renamer->format == NULL || *date_renamer->format == '\0'))
return g_strdup (text);
/* determine the input text length */
text_length = g_utf8_strlen (text, -1);
/* determine the real offset and check if it's valid */
offset = (date_renamer->offset_mode == THUNAR_SBR_OFFSET_MODE_LEFT) ? date_renamer->offset : (text_length - date_renamer->offset);
if (G_UNLIKELY (offset > text_length))
return g_strdup (text);
/* get the file time */
file_time = thunar_sbr_get_time (file, date_renamer->mode);
if (file_time == 0)
return g_strdup (text);
/* allocate space for the result */
result = g_string_sized_new (2 * text_length);
/* determine the text pointer for the offset */
s = g_utf8_offset_to_pointer (text, offset);
/* add the text before the insert/overwrite offset */
g_string_append_len (result, text, s - text);
/* parse the time string */
string = thunar_sbr_get_time_string (file_time, date_renamer->format);
if (string)
{
g_string_append (result, string);
g_free (string);
}
/* append the remaining text */
g_string_append (result, s);
/* return the result */
return g_string_free (result, FALSE);
}
/**
* thunar_sbr_date_renamer_new:
*
* Allocates a new #ThunarSbrDateRenamer instance.
*
* Return value: the newly allocated #ThunarSbrDateRenamer.
**/
ThunarSbrDateRenamer *
thunar_sbr_date_renamer_new (void)
{
return g_object_new (THUNAR_SBR_TYPE_DATE_RENAMER,
"name", _("Insert Date / Time"),
NULL);
}
/**
* thunar_sbr_date_renamer_get_mode:
* @date_renamer : a #ThunarSbrDateRenamer.
*
* Returns the mode of the @date_renamer.
*
* Return value: the mode of @date_renamer.
**/
ThunarSbrDateMode
thunar_sbr_date_renamer_get_mode (ThunarSbrDateRenamer *date_renamer)
{
g_return_val_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer), THUNAR_SBR_DATE_MODE_NOW);
return date_renamer->mode;
}
/**
* thunar_sbr_date_renamer_set_mode:
* @date_renamer : a #ThunarSbrDateRenamer.
* @mode : the new #ThunarSbrDateMode for @date_renamer.
*
* Sets the mode of @date_renamer to @mode.
**/
void
thunar_sbr_date_renamer_set_mode (ThunarSbrDateRenamer *date_renamer,
ThunarSbrDateMode mode)
{
g_return_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer));
/* check if we have a new mode */
if (G_LIKELY (date_renamer->mode != mode))
{
/* apply the new mode */
date_renamer->mode = mode;
/* update the renamer */
thunarx_renamer_changed (THUNARX_RENAMER (date_renamer));
/* notify listeners */
g_object_notify (G_OBJECT (date_renamer), "mode");
}
}
/**
* thunar_sbr_date_renamer_get_format:
* @date_renamer : a #ThunarSbrDateRenamer.
*
* Returns the format for the @date_renamer.
*
* Return value: the format for @date_renamer.
**/
const gchar *
thunar_sbr_date_renamer_get_format (ThunarSbrDateRenamer *date_renamer)
{
g_return_val_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer), NULL);
return date_renamer->format;
}
/**
* thunar_sbr_date_renamer_set_format:
* @date_renamer : a #ThunarSbrDateRenamer.
* @format : the new format for @date_renamer.
*
* Sets the format for @date_renamer to @format.
**/
void
thunar_sbr_date_renamer_set_format (ThunarSbrDateRenamer *date_renamer,
const gchar *format)
{
g_return_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer));
/* check if we have a new format */
if (G_LIKELY (g_strcmp0 (date_renamer->format, format) != 0))
{
/* apply the new format */
g_free (date_renamer->format);
date_renamer->format = g_strdup (format);
/* update the renamer */
thunarx_renamer_changed (THUNARX_RENAMER (date_renamer));
/* notify listeners */
g_object_notify (G_OBJECT (date_renamer), "format");
}
}
/**
* thunar_sbr_date_renamer_get_offset:
* @date_renamer : a #ThunarSbrInsertRenamer.
*
* Returns the offset for the @date_renamer.
*
* Return value: the offset for @date_renamer.
**/
guint
thunar_sbr_date_renamer_get_offset (ThunarSbrDateRenamer *date_renamer)
{
g_return_val_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer), 0);
return date_renamer->offset;
}
/**
* thunar_sbr_date_renamer_set_offset:
* @date_renamer : a #ThunarSbrInsertRenamer.
* @offset : the new offset for @date_renamer.
*
* Sets the offset for @date_renamer to @offset.
**/
void
thunar_sbr_date_renamer_set_offset (ThunarSbrDateRenamer *date_renamer,
guint offset)
{
g_return_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer));
/* check if we have a new offset */
if (G_LIKELY (date_renamer->offset != offset))
{
/* apply the new offset */
date_renamer->offset = offset;
/* update the renamer */
thunarx_renamer_changed (THUNARX_RENAMER (date_renamer));
/* notify listeners */
g_object_notify (G_OBJECT (date_renamer), "offset");
}
}
/**
* thunar_sbr_date_renamer_get_offset_mode:
* @date_renamer : a #ThunarSbrInsertRenamer.
*
* Returns the offset mode for the @date_renamer.
*
* Return value: the offset mode for @date_renamer.
**/
ThunarSbrOffsetMode
thunar_sbr_date_renamer_get_offset_mode (ThunarSbrDateRenamer *date_renamer)
{
g_return_val_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer), THUNAR_SBR_OFFSET_MODE_LEFT);
return date_renamer->offset_mode;
}
/**
* thunar_sbr_date_renamer_set_offset_mode:
* @date_renamer : a #ThunarSbrInsertRenamer.
* @offset_mode : the new offset mode for @date_renamer.
*
* Sets the offset mode for @date_renamer to @offset_mode.
**/
void
thunar_sbr_date_renamer_set_offset_mode (ThunarSbrDateRenamer *date_renamer,
ThunarSbrOffsetMode offset_mode)
{
g_return_if_fail (THUNAR_SBR_IS_DATE_RENAMER (date_renamer));
/* check if we have a new setting */
if (G_LIKELY (date_renamer->offset_mode != offset_mode))
{
/* apply the new setting */
date_renamer->offset_mode = offset_mode;
/* update the renamer */
thunarx_renamer_changed (THUNARX_RENAMER (date_renamer));
/* notify listeners */
g_object_notify (G_OBJECT (date_renamer), "offset-mode");
}
}

View file

@ -0,0 +1,74 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2007 Nick Schermer <nick@xfce.org>
* Copyright (c) 2007 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_SBR_DATE_RENAMER_H__
#define __THUNAR_SBR_DATE_RENAMER_H__
#include <thunar-sbr/thunar-sbr-enum-types.h>
G_BEGIN_DECLS;
typedef struct _ThunarSbrDateRenamerClass ThunarSbrDateRenamerClass;
typedef struct _ThunarSbrDateRenamer ThunarSbrDateRenamer;
#define THUNAR_SBR_TYPE_DATE_RENAMER (thunar_sbr_date_renamer_get_type ())
#define THUNAR_SBR_DATE_RENAMER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_SBR_TYPE_DATE_RENAMER, ThunarSbrDateRenamer))
#define THUNAR_SBR_DATE_RENAMER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_SBR_TYPE_DATE_RENAMER, ThunarSbrDateRenamerClass))
#define THUNAR_SBR_IS_DATE_RENAMER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNAR_SBR_TYPE_DATE_RENAMER))
#define THUNAR_SBR_IS_DATE_RENAMER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_SBR_TYPE_DATE_RENAMER))
#define THUNAR_SBR_DATE_RENAMER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_SBR_TYPE_DATE_RENAMER, ThunarSbrDateRenamerClass))
GType
thunar_sbr_date_renamer_get_type (void) G_GNUC_CONST;
void
thunar_sbr_date_renamer_register_type (ThunarxProviderPlugin *plugin);
ThunarSbrDateRenamer *
thunar_sbr_date_renamer_new (void) G_GNUC_MALLOC;
ThunarSbrDateMode
thunar_sbr_date_renamer_get_mode (ThunarSbrDateRenamer *date_renamer);
void
thunar_sbr_date_renamer_set_mode (ThunarSbrDateRenamer *date_renamer,
ThunarSbrDateMode mode);
const gchar *
thunar_sbr_date_renamer_get_format (ThunarSbrDateRenamer *date_renamer);
void
thunar_sbr_date_renamer_set_format (ThunarSbrDateRenamer *date_renamer,
const gchar *format);
guint
thunar_sbr_date_renamer_get_offset (ThunarSbrDateRenamer *date_renamer);
void
thunar_sbr_date_renamer_set_offset (ThunarSbrDateRenamer *date_renamer,
guint offset);
ThunarSbrOffsetMode
thunar_sbr_date_renamer_get_offset_mode (ThunarSbrDateRenamer *date_renamer);
void
thunar_sbr_date_renamer_set_offset_mode (ThunarSbrDateRenamer *date_renamer,
ThunarSbrOffsetMode offset_mode);
G_END_DECLS;
#endif /* !__THUNAR_SBR_DATE_RENAMER_H__ */

View file

@ -0,0 +1,154 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib/gi18n-lib.h>
#include <thunar-sbr/thunar-sbr-enum-types.h>
static GType case_renamer_mode_type;
static GType insert_mode_type;
static GType number_mode_type;
static GType offset_mode_type;
static GType text_mode_type;
static GType date_mode_type;
GType
thunar_sbr_case_renamer_mode_get_type (void)
{
return case_renamer_mode_type;
}
GType
thunar_sbr_insert_mode_get_type (void)
{
return insert_mode_type;
}
GType
thunar_sbr_number_mode_get_type (void)
{
return number_mode_type;
}
GType
thunar_sbr_offset_mode_get_type (void)
{
return offset_mode_type;
}
GType
thunar_sbr_text_mode_get_type (void)
{
return text_mode_type;
}
GType
thunar_sbr_date_mode_get_type (void)
{
return date_mode_type;
}
void
thunar_sbr_register_enum_types (ThunarxProviderPlugin *plugin)
{
/* clang-format off */
static const GEnumValue case_renamer_mode_values[] =
{
{ THUNAR_SBR_CASE_RENAMER_MODE_LOWER, "THUNAR_SBR_CASE_RENAMER_MODE_LOWER", N_ ("lowercase"), },
{ THUNAR_SBR_CASE_RENAMER_MODE_UPPER, "THUNAR_SBR_CASE_RENAMER_MODE_UPPER", N_ ("UPPERCASE"), },
{ THUNAR_SBR_CASE_RENAMER_MODE_TITLE, "THUNAR_SBR_CASE_RENAMER_MODE_TITLE", N_ ("Title Case"), },
{ THUNAR_SBR_CASE_RENAMER_MODE_FIRST_UPPER, "THUNAR_SBR_CASE_RENAMER_MODE_FIRST_UPPER", N_ ("First character uppercase"), },
{ 0, NULL, NULL, },
};
static const GEnumValue insert_mode_values[] =
{
{ THUNAR_SBR_INSERT_MODE_INSERT, "THUNAR_SBR_INSERT_MODE_INSERT", N_ ("Insert"), },
{ THUNAR_SBR_INSERT_MODE_OVERWRITE, "THUNAR_SBR_INSERT_MODE_OVERWRITE", N_ ("Overwrite"), },
{ 0, NULL, NULL, },
};
static const GEnumValue number_mode_values[] =
{
{ THUNAR_SBR_NUMBER_MODE_123, "THUNAR_SBR_NUMBER_MODE_123", N_ ("1, 2, 3, ..."), },
{ THUNAR_SBR_NUMBER_MODE_010203, "THUNAR_SBR_NUMBER_MODE_010203", N_ ("01, 02, 03, ..."), },
{ THUNAR_SBR_NUMBER_MODE_001002003, "THUNAR_SBR_NUMBER_MODE_001002003", N_ ("001, 002, 003, ..."), },
{ THUNAR_SBR_NUMBER_MODE_000100020003, "THUNAR_SBR_NUMBER_MODE_000100020003", N_ ("0001, 0002, 0003, ..."), },
{ THUNAR_SBR_NUMBER_MODE_000010000200003, "THUNAR_SBR_NUMBER_MODE_000010000200003", N_ ("00001, 00002, 00003, ..."), },
{ THUNAR_SBR_NUMBER_MODE_ABC, "THUNAR_SBR_NUMBER_MODE_ABC", N_ ("a, b, c, d, ..."), },
{ 0, NULL, NULL, },
};
static const GEnumValue offset_mode_values[] =
{
{ THUNAR_SBR_OFFSET_MODE_LEFT, "THUNAR_SBR_OFFSET_MODE_LEFT", N_ ("From the front (left)"), },
{ THUNAR_SBR_OFFSET_MODE_RIGHT, "THUNAR_SBR_OFFSET_MODE_RIGHT", N_ ("From the back (right)"), },
{ 0, NULL, NULL, },
};
static const GEnumValue text_mode_values[] =
{
{ THUNAR_SBR_TEXT_MODE_OTN, "THUNAR_SBR_TEXT_MODE_OTN", N_ ("Old Name - Text - Number"), },
{ THUNAR_SBR_TEXT_MODE_NTO, "THUNAR_SBR_TEXT_MODE_NTO", N_ ("Number - Text - Old Name"), },
{ THUNAR_SBR_TEXT_MODE_TN, "THUNAR_SBR_TEXT_MODE_TN", N_ ("Text - Number"), },
{ THUNAR_SBR_TEXT_MODE_NT, "THUNAR_SBR_TEXT_MODE_NT", N_ ("Number - Text"), },
{ 0, NULL, NULL, },
};
static const GEnumValue date_mode_values[] =
{
{ THUNAR_SBR_DATE_MODE_NOW, "THUNAR_SBR_DATE_MODE_NOW", N_ ("Current"), },
{ THUNAR_SBR_DATE_MODE_ATIME, "THUNAR_SBR_DATE_MODE_ATIME", N_ ("Date Accessed"), },
{ THUNAR_SBR_DATE_MODE_MTIME, "THUNAR_SBR_DATE_MODE_MTIME", N_ ("Date Modified"), },
#ifdef HAVE_EXIF
{ THUNAR_SBR_DATE_MODE_TAKEN, "THUNAR_SBR_DATE_MODE_TAKEN", N_ ("Date Picture Taken"), },
#endif
{ 0, NULL, NULL, },
};
/* clang-format on */
case_renamer_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrCaseRenamerMode", case_renamer_mode_values);
insert_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrInsertMode", insert_mode_values);
number_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrNumberMode", number_mode_values);
offset_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrOffsetMode", offset_mode_values);
text_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrTextMode", text_mode_values);
date_mode_type = thunarx_provider_plugin_register_enum (plugin, "ThunarSbrDateMode", date_mode_values);
}

View file

@ -0,0 +1,170 @@
/* vi:set et ai sw=2 sts=2 ts=2: */
/*-
* Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __THUNAR_SBR_ENUM_TYPES_H__
#define __THUNAR_SBR_ENUM_TYPES_H__
#include <thunarx/thunarx.h>
G_BEGIN_DECLS;
#define THUNAR_SBR_TYPE_CASE_RENAMER_MODE (thunar_sbr_case_renamer_mode_get_type ())
/**
* ThunarSbrCaseRenamerMode:
* @THUNAR_SBR_CASE_RENAMER_MODE_LOWER : convert to lower case.
* @THUNAR_SBR_CASE_RENAMER_MODE_UPPER : convert to upper case.
* @THUNAR_SBR_CASE_RENAMER_MODE_TITLE : convert to title case.
* @THUNAR_SBR_CASE_RENAMER_MODE_FIRST_UPPER : convert to First character uppercase.
*
* The operation mode for the #ThunarSbrCaseRenamer.
**/
typedef enum
{
THUNAR_SBR_CASE_RENAMER_MODE_LOWER,
THUNAR_SBR_CASE_RENAMER_MODE_UPPER,
THUNAR_SBR_CASE_RENAMER_MODE_TITLE,
THUNAR_SBR_CASE_RENAMER_MODE_FIRST_UPPER,
} ThunarSbrCaseRenamerMode;
GType
thunar_sbr_case_renamer_mode_get_type (void) G_GNUC_CONST;
#define THUNAR_SBR_TYPE_INSERT_MODE (thunar_sbr_insert_mode_get_type ())
/**
* ThunarSbrInsertMode:
* @THUNAR_SBR_INSERT_MODE_INSERT : insert characters.
* @THUNAR_SBR_INSERT_MODE_OVERWRITE : overwrite existing characters.
*
* The operation mode for the #ThunarSbrInsertRenamer.
**/
typedef enum
{
THUNAR_SBR_INSERT_MODE_INSERT,
THUNAR_SBR_INSERT_MODE_OVERWRITE,
} ThunarSbrInsertMode;
GType
thunar_sbr_insert_mode_get_type (void) G_GNUC_CONST;
#define THUNAR_SBR_TYPE_NUMBER_MODE (thunar_sbr_number_mode_get_type ())
/**
* ThunarSbrNumberMode:
* @THUNAR_SBR_NUMBER_MODE_123 : 1, 2, 3, ...
* @THUNAR_SBR_NUMBER_MODE_010203 : 01, 02, 03, ...
* @THUNAR_SBR_NUMBER_MODE_001002003 : 001, 002, 003, ...
* @THUNAR_SBR_NUMBER_MODE_000100020003 : 0001, 0002, 0003, ...
* @THUNAR_SBR_NUMBER_MODE_000100020003 : 00001, 00002, 00003, ...
* @THUNAR_SBR_NUMBER_MODE_ABC : a, b, c, ...
*
* The numbering mode for the #ThunarSbrNumberRenamer.
**/
typedef enum
{
THUNAR_SBR_NUMBER_MODE_123,
THUNAR_SBR_NUMBER_MODE_010203,
THUNAR_SBR_NUMBER_MODE_001002003,
THUNAR_SBR_NUMBER_MODE_000100020003,
THUNAR_SBR_NUMBER_MODE_000010000200003,
THUNAR_SBR_NUMBER_MODE_ABC,
} ThunarSbrNumberMode;
GType
thunar_sbr_number_mode_get_type (void) G_GNUC_CONST;
#define THUNAR_SBR_TYPE_OFFSET_MODE (thunar_sbr_offset_mode_get_type ())
/**
* ThunarSbrOffsetMode:
* @THUNAR_SBR_OFFSET_MODE_LEFT : offset starting from the left.
* @THUNAR_SBR_OFFSET_MODE_RIGHT : offset starting from the right.
*
* The offset mode for the #ThunarSbrInsertRenamer and the
* #ThunarSbrRemoveRenamer.
**/
typedef enum
{
THUNAR_SBR_OFFSET_MODE_LEFT,
THUNAR_SBR_OFFSET_MODE_RIGHT,
} ThunarSbrOffsetMode;
GType
thunar_sbr_offset_mode_get_type (void) G_GNUC_CONST;
#define THUNAR_SBR_TYPE_TEXT_MODE (thunar_sbr_text_mode_get_type ())
/**
* ThunarSbrTextMode:
* @THUNAR_SBR_TEXT_MODE_OTN : Old Name - Text - Number
* @THUNAR_SBR_TEXT_MODE_NTO : Number - Text - Old Name
* @THUNAR_SBR_TEXT_MODE_TN : Text - Number
* @THUNAR_SBR_TEXT_MODE_NT : Number - Text
*
* The text mode for the #ThunarSbrNumberRenamer.
**/
typedef enum
{
THUNAR_SBR_TEXT_MODE_OTN,
THUNAR_SBR_TEXT_MODE_NTO,
THUNAR_SBR_TEXT_MODE_TN,
THUNAR_SBR_TEXT_MODE_NT,
} ThunarSbrTextMode;
GType
thunar_sbr_text_mode_get_type (void) G_GNUC_CONST;
#define THUNAR_SBR_TYPE_DATE_MODE (thunar_sbr_date_mode_get_type ())
/**
* ThunarSbrDateMode:
* @THUNAR_SBR_DATE_MODE_NOW : Current Time
* @THUNAR_SBR_DATE_MODE_ATIME : Access Time
* @THUNAR_SBR_DATE_MODE_MTIME : Modification Time
* @THUNAR_SBR_DATE_MODE_TAKEN : Picture Taken Time
*
* The date mode for the #ThunarSbrDateRenamer.
**/
typedef enum
{
THUNAR_SBR_DATE_MODE_NOW,
THUNAR_SBR_DATE_MODE_ATIME,
THUNAR_SBR_DATE_MODE_MTIME,
#ifdef HAVE_EXIF
THUNAR_SBR_DATE_MODE_TAKEN,
#endif
} ThunarSbrDateMode;
GType
thunar_sbr_date_mode_get_type (void) G_GNUC_CONST;
void
thunar_sbr_register_enum_types (ThunarxProviderPlugin *plugin);
G_END_DECLS;
#endif /* !__THUNAR_SBR_ENUM_TYPES_H__ */

Some files were not shown because too many files have changed in this diff Show more