pax_global_header 0000666 0000000 0000000 00000000064 15001750511 0014505 g ustar 00root root 0000000 0000000 52 comment=1462b3e28feda52a210d8eb5c6eb69686a5ecb9b
kupfer-328/ 0000775 0000000 0000000 00000000000 15001750511 0012657 5 ustar 00root root 0000000 0000000 kupfer-328/COPYING 0000664 0000000 0000000 00000104374 15001750511 0013723 0 ustar 00root root 0000000 0000000
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
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
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
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 3 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, see .
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Copyright (C)
This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
.
The GNU 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. But first, please read
.
kupfer-328/Documentation/ 0000775 0000000 0000000 00000000000 15001750511 0015470 5 ustar 00root root 0000000 0000000 kupfer-328/Documentation/Contributing.rst 0000664 0000000 0000000 00000006560 15001750511 0020700 0 ustar 00root root 0000000 0000000
Guidelines and Policy
=====================
Contributing
------------
You can structure your changes into a series of commits in git. A series
of well disposed changes is easy to review. Write a sufficient commit
log message for each change. Do not fear writing down details about
why the change is implemented as it is, if there are multiple
alternatives. Also, if you forsee any future possibilites or problems,
please describe them in the commit log.
You can find kupfer's `git repository at github`__ and fork it there,
for easy publication of your changes.
If you suggest your changes for inclusion into Kupfer, make sure you
have read the whole *Guidelines and Policy* chapter of this manual. And
take care to structure your changes, do not fear asking for advice. Good
Luck!
__ https://github.com/kupferlauncher/kupfer
Icon Guidelines
---------------
Consider the following:
* A Leaf is an object, a metaphor for a physical thing. It can have as
detailed icon as is possible.
* An Action is a verb, a command that can be carried out. Choose its
name with care. The icon should be simple, maybe assign the action
to a category, rather than trying to illustrate the action itself.
For example, all text display actions use the "bold style" icon, in
some icon themes simply a bold "A".
.. important::
Actions should have stylized, simple icons. Leaves and Sources
should have detailed, specific icons.
Coding style
------------
Kupfer python code is indented with four spaces. If you contribute to
kupfer keep in mind that
* Python code should be clear
* Kupfer is a simple project. Do simple first.
Python's general style guideline is called `PEP 8`_, and you should
programmers should read it. The advice given there is very useful when
coding for Kupfer.
.. _`PEP 8`: https://www.python.org/dev/peps/pep-0008/
Specific Points
---------------
Using ``rank_adjust``
.....................
A declaration like this can modify the ranking of an object::
class MyAction (Action):
rank_adjust = -5
...
1. Often, this is useless. Don't use it, let Kupfer learn which actions
are important.
2. If the action is destructive, the adjust should be negative. Never
positive. For example *Move to Trash* has a negative 10
``rank_adjust``.
3. If the action is very general, and applies to almost everything but
still should never be the default for anything, the adjust should be
negative.
Using ``super(..)``
...................
You should use the Python 3 ``super()`` without arguments.
Old code was using the following style which worked best in older
Python, but the style is obsolete::
Source.__init__(self, _("Recent items"))
Text and Encodings
..................
Care must be taken with all input and output text and its encoding!
Internally, kupfer must use ``str`` for all internal text.
The module ``kupfer.support.kupferstring`` has functions for the most
important text conversions.
A resource for unicode in Python:
| http://farmdev.com/talks/unicode/
**Always** find out what encoding you must expect for externally read
text (from files or command output). If you must guess, use the locale
encoding.
Text received from GTK is always ``str``, which means encoding is not
a problem.
Note that the gettext function ``_()`` always returns a unicode string
(``str``).
.. vim: ft=rst tw=72 et sts=4
.. this document best viewed with rst2html
kupfer-328/Documentation/Copyright.rst 0000664 0000000 0000000 00000000670 15001750511 0020175 0 ustar 00root root 0000000 0000000
Copyright
=========
The program Kupfer is released under the
`GNU General Public Licence v3`:t: (or at your option, any later
version). Please see the main program file for more information.
This documentation is released under the same terms as the main
program. The documentation sources are available inside the Kupfer
source distribution.
Copyright 2009–2023 Ulrik Sverdrup and all Kupfer authors
.. vim: ft=rst tw=72 et sts=4
kupfer-328/Documentation/GTKTheming.rst 0000664 0000000 0000000 00000001743 15001750511 0020170 0 ustar 00root root 0000000 0000000 ====================
GTK+ Theming Support
====================
----------------------------
Changing Kupfer's Appearance
----------------------------
.. contents::
Introduction
============
In Kupfer's the interface elements are marked-up with names and classes
so that Gtk 3's css mechanism can style them.
The work is not yet complete.
Existing widget names:
#kupfer
main window
#kupfer-object-pane, #kupfer-action-pane, #kupfer-indirect-object-pane
the three panes
.matchview
a pane's view
#kupfer-list
result list window
#kupfer-list-view
result list tree view
Icons
=====
The kupfer-specific icon names we use are:
+ ``kupfer`` (application)
+ ``kupfer-catalog`` (root catalog)
+ ``kupfer-execute`` (default action icon)
+ ``kupfer-launch`` (default launch icon)
+ ``kupfer-object`` (blue box generic object icon)
+ ``kupfer-object-multiple`` (multiple generic objects)
.. vim: ft=rst tw=72 et sts=4 sw=4
.. this document best viewed with rst2html
kupfer-328/Documentation/Localization.rst 0000664 0000000 0000000 00000005240 15001750511 0020653 0 ustar 00root root 0000000 0000000
Localization
============
kupfer is translated using gettext and it is managed in the build system
using ``intltool``. Translation messages are located in the ``po/``
directory. The user’s guide is located in the ``help/`` directory and it
can also be translated, see its section.
.. contents::
To create a new translation
---------------------------
Go into the directory ``po``
1. Add the language code ``$LANG`` to the file ``LINGUAS``
2. Run ``intltool-update --pot``, and copy ``untitled.pot`` to ``$LANG.po``
3. Edit and check the whole file header:
+ Write in yourself as author
+ Check ``plurals`` (copy from a language that you know uses the same
number of plural forms, or look up in GNOME's translation pages.)
+ Replace everything written in CAPS
Fill in the charset used; Kupfer translations *must* use the UTF-8 encoding.
When the header is filled-in, go to `To update or check an existing
translation`_
To update or check an existing translation
------------------------------------------
Go to your Kupfer source directory.
Here we will call your language ``$LANG``. You should use a two or
four-letter code for your language instead of ``$LANG``, for example
"de" for German or "pt_BR" for Brazilian Portuguese.
Go to the translation directory ``po``::
cd po/
To update and check the translation file, run::
intltool-update $LANG
Now check and edit ``$LANG.po``. Search for all messages marked "fuzzy",
and remove the word "fuzzy" from them when they are done.
Continue running ``intltool-update $LANG`` and check that you have 0
fuzzy and 0 untranslated, then you're finished.
This will also check consistency of the file, so that you know that all
your syntax is correct.
To try the new translation
--------------------------
Make sure the translation is listed in ``po/LINGUAS``.
To try it, you have to install kupfer with ``./waf install``, then you
can run kupfer as normal.
.. note::
If you run ``./kupfer-run`` from the source directory it won't
find the installed translations unless you make a symlink called
``locale`` to the installed location (for example
``~/.local/share/locale`` if install prefix was ``~/.local``)::
$ ln -s ~/.local/share/locale
User’s Guide
------------
Go to ``help/``. The english-language original of the user’s guide is
defined in the ``C/`` directory. Use ``make $LANG`` inside ``help`` to
update a language’s ``.po`` file. Currently, the best way to view the
translated help page during development is to run the regular build and
install, which puts the help pages under ``$PREFIX/help/$LANG/kupfer``.
.. vim: ft=rst tw=72 et sts=4
.. this document best viewed with rst2html
kupfer-328/Documentation/Makefile 0000664 0000000 0000000 00000000604 15001750511 0017130 0 ustar 00root root 0000000 0000000 # This makefile can generate html versions that are pleasant to read
# needs python-docutils
all: Contributing.html Copyright.html Localization.html Manpage.html \
Manual.html PluginAPI.html \
GTKTheming.html VersionHistory.html index.html
%.html: %.rst
rst2html5 $^ > $@
%.pdf: %.rst
rst2pdf -o $@ $^
index.html: Manual.html
cp $^ $@
clean:
rm -fv *.html
.PHONY: clean all
kupfer-328/Documentation/Manpage.rst 0000664 0000000 0000000 00000005227 15001750511 0017600 0 ustar 00root root 0000000 0000000 ======
kupfer
======
-----------------------------------------------------------------
Convenient command and access tool for applications and documents
-----------------------------------------------------------------
:Author: Ulrik Sverdrup
:Date: 2017
:Manual section: 1
SYNOPSIS
========
| ``kupfer`` [ *OPTIONS* | *FILE* ... ]
| ``kupfer-exec`` *FILE* ...
DESCRIPTION
===========
Kupfer is an interface for quick and convenient access to applications
and their documents.
The most typical use is to find a specific application and launch it. We
have tried to make Kupfer easy to extend with plugins so that this
quick-access paradigm can be extended to many more objects than just
applications.
``kupfer-exec`` is a helper script that can execute commands saved to
file, but only by connecting to an already running instance of Kupfer.
SPAWNING
========
Running kupfer on the command line (without options) will try to show
the program it if already running.
Kupfer can be invoked with a list of files
``kupfer`` *FILE* ...
The file paths will be sent to and selected in an already running
instance of the program.
You may also pipe text to ``kupfer`` to pass it to a currently running
instance.
OPTIONS
=======
--no-splash Launch without presenting main interface
--debug Enable more verbose output that can help understanding
the program's operation.
--list-plugins List all installed plugins by their identifier, version
and description.
The following are options for internal use
--exec-helper=HELPER Run plugin helper program, which should be the
name of a module inside kupfer.
The following are generic options
--help Display usage information
--version Display version information
CONFIGURATION
=============
Custom plugins are added to kupfer by installing them to the directory
*~/.local/share/kupfer/plugins*, or any kupfer/plugins directory in any
of ``$XDG_DATA_DIRS``.
ENVIRONMENT VARIABLES
=====================
If *KUPFER_NO_CUSTOM_PLUGINS* is set, only allow loading built-in
plugins (installed in the program's python package).
If *KUPFER_NO_CACHE* is set, do not load from or write to any source
cache files.
If *KUPFER_NO_KEYBINDER* is set do not use ``Keybinder`` even if it is
installed.
TROUBLESHOTING / KNOWN BUGS
===========================
Wayland
-------
Set *GDK_BACKEND* environment variable to ``x11`` solve problem with
wrong window position.
Some plugins (for example *Windows*) not work due to lack support by
*Wnck* library.
.. vim: ft=rst tw=72
.. this document best viewed with::
rst2pdf Quickstart.rst && xdg-open Quickstart.pdf
kupfer-328/Documentation/Manual.rst 0000664 0000000 0000000 00000001762 15001750511 0017445 0 ustar 00root root 0000000 0000000
==============================
Kupfer Technical Documentation
==============================
.. topic:: `Kupfer Plugin API `_
..
.. topic:: `GTK+ Theme Support `_
..
.. topic:: `Contributing `_
..
.. topic:: `Localization `_
..
.. topic:: `Man Page `_
..
.. topic:: `Version History `_
..
.. topic:: `Copyright `_
..
There is also `User Documentation`__
__ https://kupferlauncher.github.io/help/
.. How to Generate HTML or PDF from this documentation.
This is a RestructuredText_ document and it can be rendered
by installing ``python-docutils`` (``docutils`` module).
This package should also provide the utilities ``rst2html`` and
``rst2pdf`` as well as ``rst2man``.
.. _RestructuredText: http://docutils.sourceforge.net/rst.html
.. vim: ft=rst tw=72 et sts=4 sw=4
.. this document best viewed with rst2html
kupfer-328/Documentation/PluginAPI.rst 0000664 0000000 0000000 00000103637 15001750511 0020024 0 ustar 00root root 0000000 0000000 =================
Kupfer Plugin API
=================
.. contents:: :depth: 2
Introduction
============
Kupfer is a Python program that allows loading extension modules
at runtime. A plugin is equivalent to one Python module implemented
as one ``.py`` file or as a Python package.
The ``kupfer`` package is organized as follows::
kupfer/
obj/
ui/
core/
plugin/
core/__init__.py
applications.py
...
support/
...
Plugins live in the package ``kupfer.plugin``. Kupfer also includes
directories called ``kupfer/plugins`` from ``$XDG_DATA_DIRS``, which
typically means ``/usr/share/kupfer/plugins`` and
``$HOME/.local/share/kupfer/plugins``. These directories are
transparently included into the kupfer package, so the user has multiple
choices of where to install plugins.
The Plugin File
:::::::::::::::
A kupfer plugin is a ``.py`` file with some special attributes.
It starts like this (an imagined example)::
__kupfer_name__ = _("Cool X-Documents")
__kupfer_sources__ = ("DocumentSource", )
__kupfer_text_sources__ = ()
__kupfer_actions__ = ("Open", )
__description__ = _("Documents from the X program")
__version__ = "1"
__author__ = "Tom Author"
All these special variables must be defined before any other code in the
module (even imports). For a plugin, the following attributes are
required::
__kupfer_name__ (Localized name of plugin)
__description__ (Localized description of plugin)
__version__
__author__
For the plugin to do anything, the following attributes may be defined::
__kupfer_sources__ = ()
__kupfer_text_sources__ = ()
__kupfer_actions__ = ()
__kupfer_action_generators__ = ()
__kupfer_contents__ = ()
They should be tuples of *names* of classes in the module:
* all sources have to be subclasses of ``kupfer.objects.Source``
* all text sources have to be subclasses of ``kupfer.objects.TextSource``
* all actions have to be subclasses of ``kupfer.objects.Action``
If an example plugin declares::
__kupfer_sources__ = ("DocumentSource", )
it will later in the file define the class ``DocumentSource``::
from kupfer.objects import Source
class DocumentSource (Source):
def __init__(self):
Source.__init__(self, _("Cool X-Documents"))
def get_items(self):
...
# later we will see what we can do here!
Ok, this looks simple. So what are Leaves, Sources and Actions?
A **Leaf** is an object, it represents a program or a file, or a text or
something else. Every type of Leaf has different possibilities, and you
can define new Leaves. Example: a ``FileLeaf`` represents a file on the
disk.
A **Source** produces a collection of Leaves, so it makes Kupfer know
about new objects. For example, it can provide all the FileLeaves for a
particular folder.
An **Action** is the part where something happens, an action is applied
to a Leaf, and something happens. For example, *Open* can be an
action that works with all ``FileLeaf``.
A Short Working Example
:::::::::::::::::::::::
The very simplest thing we can do is to provide an action on
objects that already exist in Kupfer. These actions appear in the
right-hand actions pane in kupfer, when an object of the right type is
selected.
The complete python code for the plugin:
.. code:: python
__kupfer_name__ = _("Image Viewer")
__kupfer_actions__ = ("View", )
__description__ = _("View images quickly")
__version__ = ""
__author__ = "Tom Author"
from gi.repository import Gtk
from kupfer.obj import Action, FileLeaf
class View (Action):
def __init__(self):
super().__init__(_("View"))
def item_types(self):
yield FileLeaf
def valid_for_item(self, fileobj):
return fileobj.object.endswith(".jpg")
def activate(self, fileobj):
image_widget = Gtk.Image.new_from_file(fileobj.object)
image_widget.show()
window = Gtk.Window()
window.add(image_widget)
window.present()
That is all. What we did was the following:
* Declare a plugin called "Image Viewer" with an action class ``View``.
* Every string inside ``_("")`` is translatable
* ``View`` declares that it works with ``FileLeaf``
* ``View`` only accepts ``FileLeaf`` that end with '.jpg'
* ``View`` defines a method ``activate`` that when called, will use gtk
to show the file in a window
.. note::
Kupfer uses a simplified programming style of composition and
cooperative superclasses.
You normally never call a superclass implementation inside a method
that you define, with the exception of ``__init__``.
On the other hand, there are superclass methods that should not be
overridden. For example, ``KupferObject.get_pixbuf`` is never
overridden, instead you implement ``KupferObject.get_icon_name``.
Reference
=========
Below follows a complete summary. To accompany this reference, you can
read kupfer's inline module documentation with pydoc, by doing the
following in the source directory::
$ pydoc kupfer.obj
or equivalently::
$ python
>>> help("kupfer.obj")
KupferObject
::::::::::::
``class KupferObject`` implements the things that are common to all objects:
*name*, *description*, *icon*, *thumbnail* and *name aliases*.
``__init__(self, name)``
This is called when you call ``Leaf.__init__``, or ``Source.__init__``,
and so on in your object's ``__init__`` method.
The name parameter must be a unicode string. An object can not
change name after it has called __init__.
``get_description(self)``
Return a longer user-visible unicode string that
describes the object.
``get_icon_name(self)``
Return a string of one icon name for the object.
The icon name should preferably be in the `Icon Naming
Specification`_
.. _`Icon Naming Specification`: \
http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
``get_gicon(self)``
Return a GIcon (GIO icon) object. This takes precedence
over the icon name, if it is defined.
``get_thumbnail(self, width, height)``
Implement ``get_thumbnail`` to return a GdkPixbuf object of the
requested size that is a thumbnail of the object. If applicable.
``get_pixbuf(self, x)``
This should not be redefined. Define ``get_icon_name`` and/or
``get_gicon`` instead.
``get_icon(self)``
This should not be redefined. Define ``get_icon_name`` and/or
``get_gicon`` instead.
``repr_key(self)``
Return an object whose str() will be used in the __repr__,
self is returned by default.
This value is used to differentiate and recognize objects.
Override this if the objects type and name is not enough
to differentiate it from other objects.
``__repr__``
This should not be redefined. Define ``repr_key`` instead.
``kupfer_add_alias(self, alias)``
This should not be redefined, but can be called by the object
to add an alternate name to the object.
KupferObject Attributes
.......................
``KupferObject.rank_adjust``
A number to adjust the ranking of a certain object. Should only
be used on Actions. Should be set in the range -10 to -1 for actions
that apply to many objects but not default for any.
``KupferObject.fallback_icon_name``
Used as a the class' fallback for icon name. Do not change this.
Leaf
::::
``class Leaf`` inherits from KupferObject.
A Leaf represents an object that the user will want to act on. Examples
are a file, an application or a free-text query (TextLeaf).
This defines, in addition to KupferObject:
``__init__(self, obj, name)``
The default implementation of ``__init__`` stores the parameter
``obj`` into ``self.object`` and passes ``name`` up to
``KupferObject.__init__``.
``obj`` can be any data that the Leaf represents. ``name`` must be
a unicode string.
``Leaf.object``
``Leaf.object`` is the represented object, which is the
implementation-specific internal data.
``get_actions()``
Return a sequence of Actions that always apply to the Leaf. These
are "built-in" actions.
``__hash__`` and ``__eq__``
Leaves are hashable, can be members in a set, and duplicates are
recognized (and removed); this is essential so that equivalent
Leaves from different sources are recognized.
These methods need normally not be overridden.
By default leaves are equal if both the name and the ``Leaf.object``
attribute are the same.
``has_content()`` and ``content_source()``
A leaf can contain something, like a folder contains files or a
music album songs.
If the Leaf should have content, it should override ``has_content``
to return ``True`` and define ``content_source()`` to return
an instance of a Source.
A Leaf may decide dynamically if it has content or not.
Action
::::::
``class Action`` inherits from KupferObject.
An Action represents a command using a direct object and an optional
indirect object. One example is ``kupfer.obj.fileactions.Open`` that
will open its direct object (which must be a file), with its default
viewer.
Actions are the most versatile parts of Kupfer, since they can define
ways to use objects together. They also have to decide, which types of
Leaves they apply to, and if they apply to a given Leaf.
An action is either a `Subject + Verb`:t: action: It needs one object,
this is the direct object.
Or it is a `Subject + Verb + Object`:t: action: It needs two objects,
one direct object ("obj") and one indirect object ("iobj").
Action defines, in addition to KupferObject:
Activate: Carrying Out the Action
.................................
``activate(self, obj)``
Called to perform the action if the action is a normal
`Subject + Verb`:t: action.
``activate(self, obj, iobj)``
Called to perform the action if the action is a three-way
`Subject + Verb + Object`:t: action. (That is, ``requires_object``
returns ``True``)
``activate_multiple(self, objects)``
..
``activate_multiple(self, objects, iobjects)``
If implemented, ``activate_multiple`` is called with preference over
``activate(self, obj, iobj)`` or ``activate(self, obj)`` as
appropriate.
Implement ``activate_multiple`` to handle multiple objects on either
side in a smart way.
You should implement ``activate_multiple`` if it is possible to do
something better than the equivalent of repeating ``activate``
*n* times for *n* objects.
``activate`` and ``activate_multiple`` also receive a keyword argument
called ``ctx`` if the action defines ``wants_context(self)`` to return
``True``. See ``wants_context`` below for more information.
Determining Eligible Objects
............................
``item_types(self)``
This method should return a sequence of all Leaf types
that the action can apply to (direct object).
``valid_for_item(self, item)``
This method is called for each potential direct object
of the correct type.
Return True if the object is compatible with the action.
By default always returns ``True``.
``requires_object(self)``
Return ``True`` if the action is a `Subject + Verb + Object`:t:
action and requires both a direct and an indirect object.
If ``requires_object`` returns ``True``, then you must also
define (at least) ``object_types``.
``object_types(self)``
Return a sequence of all Leaf types that are valid for the action's
indirect object.
``object_source(self, for_item)``
If the action's indirect objects should not be picked from the full
catalog, but from a defined source, return an instance of the Source
here, else return None. ``for_item`` is the direct object.
``object_source_and_catalog(self, for_item)``
If the action has an object source, by default only that source is
used for indirect objects. Return ``True`` here to use both the
custom source and the whole catalog.
``valid_object(self, iobj, for_item)``
This method, if defined, will be called for each indirect object
(with the direct object as ``for_item``), to decide if it can be
used. Return ``True`` if it can be used.
Auxiliary Method ``wants_context(self)``
........................................
``wants_context(self)``
Return ``True`` if ``activate`` should receive an ``ExecutionToken``
as the keyword argument ``ctx``. This allows posting late
(after-the-fact) results and errors, as well as allowing access to
the GUI environment.
``wants_context`` defaults to ``False`` which corresponds to
the old protocol without ``ctx``.
So instead of ``activate(self, obj)``, the method should be implemented
as ``activate(self, obj, ctx)``.
The object passed as ``ctx`` has the following interface:
``ctx.register_late_result(result_object)``
Register the ``result_object`` as a late result. It must be a
``Leaf`` or a ``Source``.
``ctx.register_late_error(exc_info=None)``
Register an asynchronous error. (For synchronous errors, simply raise
an ``OperationError`` inside ``activate``.)
For asynchronous errors, call ``register_late_error``. If
``exc_info`` is ``None``, the current exception is used.
If ``exc_info`` is an ``OperationError`` instance, then it is used
as error. Otherwise, a tuple like ``sys.exc_info()`` can be passed.
``ctx.environment``
The environment object, which has the following methods:
``get_timestamp(self)``
Return the current event timestamp
``get_startup_notification_id(self)``
Make and return a startup notification id
``get_display(self)``
Return the display name (i.e ``:0.0``)
``present_window(self, window)``
Present ``window`` (a ``Gtk.Window``) on the current
workspace and monitor using the current event time.
Auxiliary Action Methods
........................
Some auxiliary methods tell Kupfer about how to handle the action:
``is_factory(self)``
Return ``True`` if the return value of ``activate`` is a source
that should be displayed immediately.
``has_result(self)``
Return ``True`` if the action's return value in ``activate`` should
be selected.
``is_async(self)``
Return ``True`` if the action returns a ``Task`` object conforming to
``kupfer.task.Task`` from ``activate``. The task will be executed
asynchronously in Kupfer's task queue.
``repr_key(self)``
Override this to define a unique key for the action,
if you need to differentiate between different instances of the
same Action class.
Class Attributes
................
The attribute ``action_accelerator`` is ``None`` by default but
can be a single letter string to suggest a default accelerator for
this action. Actions that act like the default open should use ``"o"``.
Source
::::::
``class Source`` inherits from KupferObject.
A Source understands specific data and delivers Leaves for it.
A Source subclass must at a minimum implement ``__init__``,
``get_items`` and ``provides``.
``Source`` defines, in addition to ``KupferObject``:
``__init__(self, names)``
You must call this method with a unicode name in the subclass
``__init__(self)``.
``get_items(self)``
Your source should define ``get_items`` to return a sequence
of leaves which are its items; the return value is cached and used
until ``mark_for_update`` is called.
Often, implementing ``get_items`` in the style of a generator (using
``yield``) is the most convenient.
The Leaves shall be returned in natural order (most relevant first),
or if sorting is required, return in any order and define
``should_sort_lexically``.
``get_leaves(self)``
``get_leaves`` must not be overridden, define ``get_items``
instead.
``provides(self)``
Return a sequence of all precise Leaf types the Source may contain.
Often, the Source contains Leaves of only one type, in that case
the implementation is written simply as ``yield ThatLeafType``.
``should_sort_lexically(self)``
Return ``True`` if the Source's leaves should be sorted
alphabethically. If not sorted lexically, ``get_items`` should yield
leaves in order of the most relevant object first (for example the
most recently used).
``initialize(self)``
This method is called when the source should be made ready to use.
This is where it should register for external change callbacks, for
example.
``finalize(self)``
This method is called before the Source is disabled (shutdown or
plugin deactivated).
``get_leaf_repr(self)``
Return a Leaf that represents the Source, if applicable; for example
the DirectorySource is represented by a FileLeaf for the directory.
``__hash__`` and ``__eq__``
Sources are hashable, and equivalents are recognized just like
Leaves, and the central SourceController manages them so that there
are no duplicates in the application.
``get_items_forced(self)``
Like ``get_items``, called when a refresh is forced. By default
it just calls ``get_items``.
``mark_for_update(self)``
Should not be overridden. Call ``mark_for_update`` in the source to
mark it so that it is refreshed by calling ``get_items``.
``repr_key(self)``
Define to a unique key if you need to differentiate between sources
of the same class. Normally only used with Sources from factory
actions or from decorator sources.
``toplevel_source(self)``
If applicable, the source can return a different source to represent
it and its objects in the top level of the catalog. The default
implementation returns ``self`` which is normally what you want.
``is_dynamic(self)``
Return ``True`` if the Source should not be cached. This is almost
never used.
Saving Source configuration data
................................
These methods are must be implemented if the Source needs to save
user-produced configuration data.
``config_save_name(self)``
Return the name key to save the data under. This should almost
always be literally ``return __name__``
``config_save(self)``
Implement this to return a datastructure that succintly but
perfectly represents the configuration data. The returned
value must be a composition of simple types, that is, nested
compositions of ``dict``, ``list``, ``str`` etc.
This is called after ``finalize`` is called on the source.
``config_restore(self, state)``
The ``state`` parameter is passed in as the saved return value
of ``config_save``. ``config_restore`` is called before
``initialize`` is called on the Source.
Content Decorators
..................
A content-decorating source provides content to a Leaf, where it does
not control the Leaf. An example is the recent documents content
decorator, that provides document collections as content to
applications.
A normal Source listed in ``__kupfer_sources__`` will be eligible for
content decoration as well if it implements the needed methods.
Otherwise content-only sources are listed in ``__kupfer_contents__``.
``@classmethod decorates_type(cls)``
Return the type of Leaf that can be decorated. You must also
implement ``decorate_item``.
``@classmethod decorate_item(cls, leaf)``
Return an instance of a Source (normally of the same type as the
content decorator itself) that is the content for the object
``leaf``. Return ``None`` if not applicable.
Sources returned from ``decorate_item`` go into the common Source
pool. The new source instance will not be used if the returned
instance is equivalent (as defined by class and ``reepr_key``
above).
Source Attributes
.................
``Source.source_user_reloadable = False``
Set to ``True`` if the source should have a user-visible
*Rescan* action. Normally you much prefer to use change
notifications so that this is not necessary.
``Source.source_prefer_sublevel = False``
Set to ``True`` to not export its objects to the top level by
default. Normally you don't wan't to change this.
``Source.source_use_cache = True``
If ``True``, the source can be pickled to disk to save its
cached items until the next time the launcher is started.
``Source.source_scan_interval``
Set inteval in secounds between refresh source by
``PeriodicRescanner``. Background process check and refresh all
sounrces every 60 secounds but not often than
``source_scan_interval``.
Sources marked to reload are refresh in next refresh run.
``Source.last_scan``
Object attribute keep information about last rescan time.
``Source._version``
Internal number that is ``1`` by default. Update this number in
``__init__`` to invalidate old versions of cache files.
TextSource
::::::::::
TextSource inherits from KupferObject.
A text source returns items for a given text string, it is much like a
simplified version of Source. At a minimum, a TextSource subclass must
implement ``get_text_items`` and ``provides``.
``__init__(self, name)``
Override as ``__init__(self)`` to provide a unicode name for the
source.
``get_text_items(self, text)``
Return a sequence of Leaves for the unicode string ``text``.
``provides(self)``
Return a sequence of the Leaf types it may contain
``get_rank(self)``
Return a static rank score for text output of this source.
ActionGenerator
:::::::::::::::
ActionGenerator inherits from object.
ActionGenerator is a helper object that can be declared in
``__kupfer_action_generators__``. It allows generating action objects
dynamically.
``get_actions_for_leaf(self, leaf)``
Return a sequence of Action objects appropriate for this Leaf
.. note::
The ``ActionGenerator`` should not perform any expensive
computation, and not access any slow media (files, network) when
returning actions. Such expensive checks must postponed and be
performed in each Action's ``valid_for_item`` method.
The Plugin Runtime
::::::::::::::::::
.. topic:: How a plugin is activated
1. The plugin module is imported into Kupfer.
If an error occurs, the loading fails and the plugin is disabled.
If the error raised is an ImportError then Kupfer report it as a
dependency problem.
2. Kupfer will initialize a ``kupfer.plugin_support.PluginSettings``
object if it exists (see next section)
3. Kupfer will call the module-level function
``initialize_plugin(name)`` if it exists.
4. Kupfer instantiates the declared sources and actions and insert
sources, actions, content decorators, action generators and text
sources into the catalog.
.. topic:: When a plugin is deactivated
When the plugin is disabled, the module-level function
``finalize_plugin(name)`` is called if it exists. [It is not yet
final whether this function is called at shutdown or only when
hot-unplugging plugins.]
kupfer.plugin_support
:::::::::::::::::::::
This module provides important API for several plugin features.
PluginSettings
..............
To use user-settable configuration parameters, use:
.. code:: python
__kupfer_settings__ = plugin_support.PluginSettings(
{
"key" : "frobbers",
"label": _("Number of frobbers"),
"type": int,
"value": 9,
},
)
Where ``PluginSettings`` takes a variable argument list of config
parameter descriptions. The configuration values are accessed with
``__kupfer_settings__[key]`` where ``key`` is from the parameter
description. Notice that ``__kupfer_settings__`` is not updated with
the user values until the plugin is properly initialized.
``PluginSettings`` is read-only but supports the GObject signal
``plugin-setting-changed (key, value)`` when values change.
Supported parameter types:
``str``
Simple string value that used Entry for enter value.
When addidtional parameter ``"multiline": True`` is provided,
multiline TextView is used in GUI to enter value.
Setting can provide ``alternatives`` - list of possible
values to choose. Alternatives may by simple list of strings - then
value displayed is equal to value used internally, or as list of
tuples (, ). In this case GUI use ComboBox
widget.
Setting can provide ``helper`` that determine how value is entered
in preferences dialog.
Supported helpers are: ``choose_directory`` and ``choose_file``.
``alternatives``, ``multiline`` and ``helper`` can't be use
together.
``int``
Allow user to enter numeric value.
Additional parameters: ``min`` and ``max`` can be provided to limit
entered value.
``bool``
Use checkbox for parameter.
``list``
Setting value is list of strings. Additional parameter ``helper``
must be provided to determine how values are entered.
For now only supported is ``choose_directory`` helper that allow
user to select one or more directories.
``plugin_support.UserNamePassword``
Form used to enter user credentials.
check_dbus_support and check_keyring_support
............................................
``plugin_support`` provides the convenience functions
``check_dbus_support()`` and ``check_keyring_support()`` that raise the
appropriate error if a dependency is missing.
Alternatives
............
Alternatives are mutually exclusive features where the user must select
which to use. Each category permits one choice.
.. topic:: Categories of Alternatives
:``terminal``: the terminal used for running programs that require
terminal
:``icon_renderer``: method used to look up icon names
:``editor``: editor used by *Edit* action
Each category has a specific format of required data that is defined in
``kupfer/plugin_support.py``. A plugin should use the function
``kupfer.plugin_support.register_alternative(caller, category_key, id_, **kwargs)``
to register their implementations of new alternatives. The arguments are:
.. topic:: ``register_alternative(caller, category_key, id_, ** kwargs)``
:``caller``: the name of the calling plugin, is always ``__name__``
:``category_key``: one of the above categories
:``id_``: the plugin's identifier for the alternative
:`kwargs`: key-value pairs defining the alternative
``register_alternative`` is normally called in the plugin's
``initialize_plugin(..)`` function.
.. topic:: Fields requried for the category ``terminal``
:``name``: unicode visible name
:``argv``: argument list: list of strings
:``exearg``: the execute-flag as a byte string (``""`` when N/A)
:``desktopid``: the likely application id as a string
:``startup_notify``: whether to use startup notification as boolean
.. topic:: Fields required for the category ``icon_renderer``
:``name``: unicode visible name
:``renderer``: an object with an interface just like
``kupfer.icons.IconRenderer``
.. topic:: Fields requried for the category ``editor``
:``name``: unicode visible name
:``argv``: argument list: list of trings
:``terminal``: whether to launch application in terminal as boolean
Plugin Packages, Resources and Distribution
:::::::::::::::::::::::::::::::::::::::::::
A plugin is a Python module–either a single python file or a folder with
an ``__init__.py`` file (a package module). In the latter case, the
whole of the plugin can be defined inside ``__init__.py``, or it can be
split into several modules. Kupfer will look for all the description
variables (like ``__kupfer_name__``) in ``__init__.py``.
.. topic:: Plugin-installed custom icons
A package module may include custom icons as .svg files. The icon files
must be declared in a file inside the python package called
``icon-list``.
* Each line is a tab-separated field list, with the icon name in
the first column and the filename (relative to the plugin package)
in the second column.
* Lines can be commented with a leading ``#``
* If a literal ``!override`` appears in the third column, the icon
is installed even if it overrides the currently used GTK icon
theme.
Plugins may be installed into any of the ``kupfer/plugins`` data
directories. Package modules can also be installed and used as ``.zip``
files, so they too can be distributed as single files.
Example Plugins
===============
I want to specifically highlight certain files in Kupfer that are good
to read as examples.
+ Custom Leaf and Action: the common case of creating a custom
``Leaf`` type and defining its default ``Open`` action, see
``kupfer/plugin/notes.py``
+ Content decoration: making content for objects, see
``kupfer/plugin/archiveinside.py`` (*Deep Archives* plugin)
+ Asynchronous error reporting: see ``kupfer/plugin/volumes.py``, action
*Unmount*
Reference to the ``kupfer`` Package
===================================
There are several modules inside the ``kupfer`` package that a plugin
can reuse.
.. topic:: ``kupfer.config``
..
.. topic:: ``kupfer.obj.representation``
This module does not need to be imported just to implement the
interface it defines.
``TextRepresentation``
``get_text_representation``
If a Leaf has a text representation (used for
copy-to-clipboard), it should implement this method
and return a string.
``UriListRepresentation``
``get_urilist_representation``
If a Leaf has a uri-list representation (used for
copy-to-clipboard), it should implement this method
and return a list of strings.
.. topic:: ``kupfer.obj``
``kupfer.obj`` includes the basic objects such as ``Leaf``,
``Action``, ``Source`` etc.
``FileLeaf``, ``AppLeaf``, ``TextLeaf`` etc.
The basic re-usable types live here
``OperationError``
Exception type for user-visible errors in action execution.
Raise ``OperationError`` with a unicode localized error message
inside ``Action.activate`` to notify the user of a serious
error.
Specialized versions exist in ``kupfer.obj.exceptions``: Such as
``NotAvailableError(toolname)``,
``NoMultiError()``
Other, rarely used object should be imported from kupfer.obj
sub-packages, ie:
``kupfe.obj.contacts``
Module provide leaves definition for contacts (emails, im etc)
that can be used in plugins supporting email clients and
similar software where is some kind of "address book".
Contact leaves can be grouped.
``kupfe.obj.helplib``
``PicklingHelperMixin`` helper for save and load object state
``FilesystemWatchMixin`` allow active monitoring file changes
and update objects state
``kupfe.obj.fileactions``
Actions operating on files (``Open``). Usually not need to be
used in plugins.
``kupfer.obj.hosts``
Define ``HostLeaf`` and ``HostServiceLeaf`` than can be used
for define service on given host (ie. ssh, www etc).
This leaves can be grouped by host.
.. topic:: ``kupfer.runtimehelper``
Module provide support for async results.
.. topic:: ``kupfer.support.datatools``
Caching object and decorators.
``LruCache``
Least-recentrly-used cache with defined max size.
``simple_cache``
Function decorator that remember only one last result and
call wrapped function when argumets was changed.
``evaluate_once``
Function decorator that call wrapped function once and always
return the same result.
.. topic:: ``kupfer.support.fileutils``
Support function related to files and directories.
.. topic:: ``kupfer.support.kupferstring``
Kupfer and python internall use unicode strings. Files, command
results etc may use other text representation (bytes).
When you handle byte strings that is text, you must convert it to
unicode as soon as possible. You only know the encoding depending
on the source of the byte string.
``tounicode``
decode UTF-8 or unicode object into unicode.
``tolocale(ustr)``
coerce unicode ``ustr`` into a locale-encoded bytestring.
``fromlocale(lstr)``
decode locale-encoded bytestring ``lstr`` to a unicode object.
``localesort``
sort collection of string in locale lexical order.
.. topic:: ``kupfer.support.pretty``
Methods than can be used for debugging - logging: ``print_info``,
``print_debug``, ``print_exc`` and ``print_error``.
Module also define ``OutputMixin`` that may be included in action,
source and leaves objects and provide methods like ``output_info``,
``output_exc``, ``output_debug`` and ``output_error``.
.. topic:: ``kupfer.support.system``
System related functions like ``get_hostname``, ``get_homedir`` and
``get_application_filename``.
.. topic:: ``kupfer.support.task``
Allow run some task in background.
.. topic:: ``kupfer.support.textutils``
Methods for text parsing / extracting.
.. topic:: ``kupfer.support.validators``
Check if text is valid email, url etc.
.. topic:: ``kupfer.support.weaklib``
Define some object and function useful to create callback with
weak references, e.g. ``dbus_signal_connect_weakly``,
``gobject_connect_weakly``.
.. topic:: ``kupfer.ui.uiutils``
``show_notification(title, text='', icon_name='', nid=0)``
Show a notification. If a previous return value is passed as
``nid``, try to replace that previous notification.
Returns a notification identifier, or None if notifications
are not supported.
``show_text_result(title, text, ctx)``
Open window with text result.
.. topic:: ``kupfer.launch``
``spawn_async(argv)``
Spawn a child process, returning True if successfully started.
``spawn_in_terminal(argv)``
Run commands in terminal.
``show_path(path)``
..
``show_url(url)``
Display with default viewer for ``path`` or ``url``.
``get_display_path_for_bytestring(filepath)``
``get_display_path_for_bytestring`` returns a user-displayable
text representation as a string.
.. topic:: ``kupfer.core``
The module ``kupfer.core`` can not be used by plugins.
.. vim: ft=rst tw=72 et sts=4 sw=4
.. this document best viewed with rst2html
kupfer-328/Documentation/VersionHistory.rst 0000664 0000000 0000000 00000224754 15001750511 0021247 0 ustar 00root root 0000000 0000000 NEWS for kupfer
===============
kupfer v328 (2025-04-xx)
------------------------
+ Other changes:
+ Use modern Ayatana Indicators; require gir1.2-ayatanaappindicator3-0.1;
by @N0rbert
+ Gui: add dark border around main window; this improve visibility Kufper
window on bright background
+ Plugins:
+ Updated:
- *Audacious*: start app on action when not running
- *Textutils*: ask user for option in "join lines" actions.
- *Trash*: ask user for confirmaton when moving files to trash
+ Fix
+ Fix toggle appindicator icon (not show after hide)
+ Fix invalid handle KUPFER_WINDOW_TYPE_HINT setting
+ Fix recognize urls with % characters
+ Fix misleading message when starting Kupfer without install.
+ Do no store content of Directory and Files sources in disc cache;
refres on startup.
+ Prevent confirm dialog to show behind main Kupfer window.
+ Dev:
+ Fix pyxdg dependency in pyproject
+ Prefer os.scandir over listdir
+ Add finish_callback to launch.spawn_async/spawn_async_raise
+ Plugin can get some input from user by configurable dialog
+ Disable typequard protocols checking; add warn about using kupfer.py
+ Fix some errors reported by linters; format code
+ Replace depricated pkgutil.find_loader that will gone in Python3.14.
+ Use argparse for command line arguments.
kupfer v327 (2024-04-28)
------------------------
+ Fix:
+ Fix random crashes reported on Arch and Python 3.11.8 probably caused by
broken support for multi display/monitor support. Close: #176
+ Fix returning to previous leaf in browser (left key action); when leaves
come from action result there is not valid parent, so searching for it
is waste of time.
+ Fix browser window placement; especially after text box is show/hide.
+ Fix random crashes on startup related probably to too fast application
start.
+ Plugins:
+ New:
- *recoll*: query Recoll full text search system
+ Fixed:
- *tmux*, *libvirt* - fix names
+ Dev:
+ Minor fixes (types)
kupfer v326 (2024-02-24)
------------------------
+ Fix:
+ Do not lowercase entered search term when passing it to sources that
create text leaves. Sources like *Shell Commands* and *Text* now get
exact text that user entered/select. Close: #175
+ Plugins:
+ Updated:
- *clipboard*: handle errors on creating file leaves from text when
text is not valid file path.
+ Dev:
+ Minor changes related to handling / logging errors.
kupfer v325 (2024-01-21)
------------------------
+ Fix:
+ Fix syntax error that sometimes happen on plugin activation. Close: #173
+ Fix missing translations in *websearch* and *qrcode* plugins.
kupfer v324 (2024-01-07)
------------------------
+ New features:
+ Allow user to choose how trim displayed text - add new options in
preferences "Text ellipsization". Close: #98
+ "Actions in first panel" - experimental feature that allow user to run
actions by selecting it in first panel and then select target object in
next panel. Require enabled "Kupfer Actions" plugin. Close: #77 (maybe).
+ Fix:
+ Fix validator for URLs: better support for URLs without FQDN and netloc.
+ Show only first line of multi-line descriptions. Whole description is
in tooltip. Close: #116
+ Fix refreshing sources cache on start - sources are force refreshed on
plugin enabled and on Kupfer start when cache not contains items.
This prevent bizarre behavior when Kupfer is restarted and sources
depend on some unavailable files.
+ Fix return to parent leave - try to load all leaves until parent leave
is found instead of go to first leave.
+ Plugins:
+ New:
- *Kupfer Actions*: put actions into first panel.
+ Updated:
- *clipboard*: fix broken description for URL and file path; handle
errors when text is recognized as file path but is broken.
- *core*: leaves with can text and uri representation can be used in
"OpenTextUrl" action.
- *ssh_hosts*: add text representation in form of ssh://host... so now
can be opened i.e. in external applications.
Add new action "Send file to..." - send file/directory to remote host.
- *websearch*: new action "Search..." - search with default engine; user
do not have to select search engine, default can be configured or
is take from "user search engines" with DDG as fallback.
+ Dev:
+ Fix loading plugin configuration that base on `ExtendedSetting`. For
now no one plugin use it anyway...
+ Minor code cleanup
kupfer v323 (final, 2023-11-26)
-------------------------------
(Changes since v322)
+ New features:
+ For grouping leaves (like hosts, contacts) add "copy to clipboard"
action for each slot (email, adress, etc). Close: #169
+ After launch some action for leave next time this action get some
bonus that make it higher on the list. Also, this action get (smaller)
bonus for each same type of leaves.
+ URL-s can be opened with selected application ("Open with..." action)
+ User can configure preferred text editor; list is loaded from
application registry.
+ List of terminals is loaded from application registry (applications
with "terminal" tag). Some terminals are still preconfigured.
+ In plugins settings user can choose files and directories by appropriate
dialog instead of type path manually.
+ Kupfer can more frequent refresh items in background and cache result;
this make searching and browsing faster.
+ If more than one action have the same accelerator pressing key navigate
between them; previously first action was activated.
+ Hosts and services have additional aliases "service:hostname"; this
allow user to fast find items by entering e.g. "sshmyserverhostname".
+ Add text representation to leaves representing songs (*rhythmbox* and
*audacious* plugins) and leaves representing services; user can
i.e. copy it to clipboard or use whenever text is acceptable.
+ Fix:
+ Make Kupfer window rounded again. Close: #83
+ After repoen Kupfer window, if current leaf has qf_id (leaf like
selected dir, file, etc), update this leaf (research) and show current
value. Close: #172
+ Fix error on group merge when source was updated in background.
+ Fix "mark as default" action broken in beta1. Close: #170
+ Add some missing icons (stock_person, stock_mail)
+ Strip whitespaces from url-s when calling "show url"
+ Do not decorate leaves in third panel as there is no way to "enter" to
it.
+ If actions have the same name, make it unique by adding plugin name;
previously module name was added.
+ Improve detecting URLs, files path, and emails addresses in text.
+ Fix not working "select clipboard text" accelerator.
+ Fix presenting first line from Text leaves: now really show first line.
+ Browser track history of selected leaves and allow return to parent leaf
instead of top of list.
+ Make sure that file opened in plugins are closed after load.
+ Plugins:
+ New:
- *Aria2*: download files be remote aria2 instance.
- *Librewolf*: load bookmarks from Librewolf web browser
- *NetworkManager*: manage network connections
- *Screenshot*: take desktop screenshot using 'scrot' or 'flamegraph'.
- *Show QRCode* plugin: generate qrcodes from text.
- *Textutils*: various tools that convert, format and generate text
content (i.e. generate random strings, convert case, encode base64,
format json and xml).
- *Tmux*: support tmux session and tmuxp workplaces.
- *Tracker3*: full-text search in Tracker 3 application.
- *Vim*: recent files opened in vim and quick access to configured
VimWikis.
- *Zoxide*: load most used directories from zoxide database.
+ Updated:
- *Application*:
+ Add additional aliases do application: executable name and original
(English) name.
+ New action "Open With...": open file with one of application that
support given file type.
+ New action "Launch here": start application in selected folder.
+ User can enable loading additional application aliases.
This make possible to select application by application comment,
keywords or generic name but may have impact on overall performance.
- *Apt*: add new actions: "Search for file in packages..." and "Browse
packages.debian.org".
- *Archive manager*: user can select 7zip (7z or 7za) to use instead of
file-roller.
- *Audacious*: use D-Bus for interaction with audacious.
- *Chromium*: monitor and load changes in bookmarks.
- *Clipboard*: detect URLs and files path in clipboard items and
selected text.
- *Dictionary*: add support for GoldenDict
- *Favorites*: allow user to add to favorite only leaves than can be
added.
- *File actions*: new action "Edit file content" that open configured
text editor
- *Image*: detect images files by mime type, not by extension.
- *Libvirt*: monitor state of virtual machines; fix icons
- *Rhythmbox*: fix errors when no mpris module available.
- *Session gnome*, *Session lxqt*, *Session xfce*: user must confirm
"logout" and "shutdown" actions
- *Session xfce*: load favorite applications defined in Whisker Menu.
- *Show Text*: bring back "Large Type" action. Close: 91
- *Ssh_hosts*:
+ Fix loading `Match` rules from ssh config file.
+ Fix monitoring for configuration changes.
+ Load and use host name from ssh .config file
+ Update icons
- *Textfiles*:
+ New action "Copy content" (with "C" accelerator): copy content of
text file to clipboard
+ "Write To" action allow user to enter destination file name.
+ Fix selecting destination directory
+ Fix encoding on write files
- *Thunar*: add "Open Trash" action
- *URL Actions*: check response status code (accept only 2xx); if there
is not exact filename in response or url, try to guess filename with
extension by url and content type.
- *Web Search*: allow user to define custom search engines by provide
appropriate URLs.
- *Volumes*:
+ New "Mount" action
+ Separate "Eject" and "Unmount" action.
- *Wikipedia*:
+ User can configure more than one language for Wikipedia search;
action "Search in Wikipedia" allow user to select Wikipedia
language.
+ Add "S" accelerator for "Search in Wikipedia" action.
- *Windows*: better detection of Kupfer windows.
- some plugins now report error (import error) when required command or
application is missing in system.
+ Dev:
+ *BREAKING*: refactor & modernize code; Python 3.9+ is now required.
+ *BREAKING*: reorganise and rename some modules, functions. Split long
files into smaller.
+ *BREAKING*: there is no backward compatibility with old/external plugins.
+ Simplify, optimize code; remove legacy and duplicated code; drop
unnecessary list creation (use iterators whenever possible); remove
redundant caching. This improve performance and memory usage.
+ Add types to most core objects.
+ When run in "debug" mode, when available, use `typeguard` for checking
types. *This may slowdown Kupfer*.
+ Add `pyproject.toml` file.
+ Refactor ui: remove deprecated components, fix layout.
+ Upgrade WAF v 2.0.25; fix & update wscript files.
+ Add `icons.get_gicon_from_file`: quick load gicon from file.
+ Add `kupfer.support.validators` with some useful functions (validate
URLs, etc).
+ Add some debugging tools to debug.py (ic, etc).
+ `FileLeaf` accept Path object.
+ `FilesystemWatchMixin` provide function to monitor single files.
+ Add some caching for icons (esp. `ComposedIcons`)
+ Add simpler caches in `kupfer.support.datatools` and some statistics to
existing. Add `get_or_insert` method to LruCache.
+ Plugin preferences may use list of string (type list) and helpers
(select directory, file). For int-type preferences can be set min and
max value.
See *zoxide*, *firefox* plugins for example use.
+ Dialog like preferences are destroyed on close.
+ Action may reload leaves list in browser as result of execute. See
*Volumes* plugin and "Mount" action.
+ Refresh action do not duplicate sources in browser.
+ Sources can define minimal interval between background load data
(`source_scan_interval`). `mark_as_default` method have new parameter
`postpone` (default False); when true, mark source to update in next
rescan campaign but not clear cache.
+ Purge mnemonics remove first oldest entries.
+ Plugins can register "favorite" items. See *Session XFCE* plugin.
+ `AsyncFileResult` wait limited time for file result.
+ Add some tests.
+ Add new dbus method - FindObject.
+ Cache `KupferObject` `repr` value
+ Colors in console output.
+ Update translation: pl
kupfer v323-rc
--------------
(not released)
+ Fix:
+ After repoen Kupfer window, if current leaf has qf_id (leaf like
selected dir, file, etc), update this leaf (research) and show current
value. Close: #172
+ Fix error on group merge when source was updated in background.
+ Plugins:
+ Updated:
- *ssh_hosts*: fix loading `Match` rules from ssh config file.
+ Dev:
+ Fix types.
+ Add new dbus method - FindObject.
kupfer v323-beta3
-----------------
+ Fix:
+ Fix detecting ssh configuration changes in `ssh_hosts` plugin
+ Plugins:
+ Updated:
- *applications*: user can enable loading additional application aliases.
This make possible to select application by application comment,
keywords or generic name but may have impact on overall performance.
+ Dev:
+ Simplify URL validators
kupfer v323-beta2
-----------------
+ New features:
+ For grouping leaves (like hosts, contacts) add "copy to clipboard"
action for each slot (email, adress, etc). Close: #169
+ After launch some action for leave next time this action get some
bonus that make it higher on the list. Also this action get (smaller)
bonus for each same type of leaves.
+ URL-s can be opened with selected application ("Open with..." action)
+ Fix:
+ Fix "mark as default" action broken in beta1. Close: #170
+ Add some missing icons (stock_person, stock_mail)
+ Strip whitespaces from url-s when calling "show url"
+ Do not decorate leaves in third panel as there is no way to "enter" to
it.
+ Plugins:
+ New:
- *textutils*: various tools that convert, format and generate text
content (i.e. generate random strings, convert case, encode base64,
format json and xml).
- *librewolf*: load bookmarks from Librewolf web browser
+ Updated:
- *ssh_hosts*: load and use host name from ssh .config file; update
icons
- *libvirt*: fix icons
- some plugins now report error (import error) when required command or
application is missing in system.
+ Dev:
- Simplify caching icons/gicons
- Cache `KupferObject` `repr` value
- Fix types
- Colors in console output.
kupfer v323-beta1
-----------------
`Python upgrade release: something may be broken.`
+ New features:
+ User can configure preferred text editor; list is loaded from
application registry.
+ List of terminals is loaded from application registry (applications
with "terminal" tag). Some terminal are still preconfigured.
+ In plugins settings user can choose files and directories by appropriate
dialog instead of type path manually.
+ Kupfer can more frequent refresh items in background and cache result;
this make searching and browsing faster.
+ Make Kupfer window rounded again.
+ If more than one action have the same accelerator pressing key navigate
between them; previously first action was activated.
+ Hosts and services have additional aliases "service:hostname"; this allow
user to fast find items by entering e.g. "sshmyserverhostname".
+ Leaves representing songs (*rhythmbox* and *audacious* plugins) and
leaves representing services have text representation, so user can
i.e. copy it to clipboard or use whenever text is acceptable.
+ Fix:
+ If actions have the same name, make it unique by adding plugin name;
previously module name was added.
+ Improve detecting URLs, files path, and emails addresses in text.
+ Fix not working "select clipboard text" accelerator.
+ Fix presenting first line from Text leaves: now really show first line.
+ Browser track history of selected leaves and allow return to parent leaf
instead of top of list.
+ Make sure that file opened in plugins are closed after load.
+ Plugins:
+ New:
- *NetworkManager*: manage network connections
- *Tmux*: support tmux session and tmuxp workplaces.
- *Zoxide*: load most used directories from zoxide database.
- *Vim*: recent files opened in vim and quick access to configured
VimWikis.
- *Tracker3*: full-text search in Tracker 3 application.
- *Show QRCode* plugin: generate qrcodes from text.
- *Aria2*: download files be remote aria2 instance.
- *Screenshot*: take desktop screenshot using 'scrot' or 'flamegraph'.
+ Updated:
- *Apt*: add new actions: "Search for file in packages..." and "Browse
packages.debian.org".
- *Application*:
+ Add additional aliases do application: executable name and original
(English) name.
+ New action "Open With...": open file with one of application that
support given file type.
+ New action "Launch here": start application in selected folder.
- *Web Search*: allow user to define custom search engines by provide
appropriate URLs.
- *Audacious*: use D-Bus for interaction with audacious.
- *Wikipedia*:
+ User can configure more than one language for Wikipedia search;
action "Search in Wikipedia" allow user to select Wikipedia language.
+ Add "S" accelerator for "Search in Wikipedia" action.
- *File actions*: new action "Edit file content" that open configured
text editor
- *Volumes*:
+ New "Mount" action
+ Separate "Eject" and "Unmount" action.
- *Textfiles*:
+ new action "Copy content" (with "C" accelerator): copy content of
text file to clipboard
+ "Write To" action allow user to enter destination file name.
+ Fix selecting destination directory
+ Fix encoding on write files
- *Show Text*: bring back "Large Type" action.
- *Chromium*: monitor and load changes in bookmarks.
- *Dictionary*: add support for GoldenDict
- *libvirt*: monitor state of virtual machines
- *Archive manager*: user can select 7zip (7z or 7za) to use instead
of file-roller.
- *Session gnome*, *Session lxqt*, *Session xfce*: user must confirm
"logout" and "shutdown" actions
- *Session xfce*: load favorite applications defined in Whisker Menu.
- *Image*: detect images files by mime type, not by extension.
- *Rhythmbox*: fix errors when no mpris module available.
- *SSH hosts*: fix broken monitoring for configuration changes.
- *Windows*: better detection of Kupfer windows.
- *Clipboard*: detect URLs and files path in clipboard items and
selected text.
- *Favorites*: allow user to add to favorite only leaves than can be
added.
- *Thunar*: add "Open Trash" action
- *URL Actions*: check response status code (accept only 2xx); if there
is not exact filename in response or url, try to guess filename with
extension by url and content type.
+ Dev:
+ *BREAKING*: refactor & modernize code; Python 3.9+ is now required.
+ *BREAKING*: reorganise and rename some modules, functions. Split long
files into smaller.
+ *BREAKING*: there is no backward compatibility with old/external plugins.
+ Simplify, optimize code; remove legacy and duplicated code; drop
unnecessary list creation (use iterators whenever possible); remove
redundant caching. This improve performance and memory usage.
+ Add types to most core objects.
+ Add `pyproject.toml` file.
+ Refactor ui: remove deprecated components, fix layout.
+ Upgrade WAF v 2.0.25; fix & update wscript files.
+ Add `icons.get_gicon_from_file`: quick load gicon from file.
+ Add `kupfer.support.validators` with some useful functions; use it in
various places.
+ Add some debugging tools to debug.py (ic, etc).
+ `FileLeaf` accept Path object.
+ `FilesystemWatchMixin` provide function to monitor single files.
+ Add some caching for icons (esp. `ComposedIcons`)
+ Add simpler caches in `kupfer.support.datatools` and some statistics to
existing. Add `get_or_insert` method to LruCache.
+ Plugin preferences may use list of string (type list) and helpers
(select directory, file). For int-type preferences can be set min and
max value.
See *zoxide*, *firefox* plugins for example use.
+ Dialog like preferences are destroyed on close.
+ Action may reload leaves list in browser as result of execute. See
*Volumes* plugin and "Mount" action.
+ Refresh action do not duplicate sources in browser.
+ Sources can define minimal interval between background load data
(`source_scan_interval`). `mark_as_default` method have new parameter
`postpone` (default False); when true, mark source to update in next
rescan campaign but not clear cache.
+ Purge mnemonics remove first oldest entries.
+ Plugins can register "favorite" items. See *Session XFCE* plugin.
+ `AsyncFileResult` wait limited time for file result.
+ Add some tests.
kupfer v322
-----------
+ Update translation: pl
+ Plugins:
+ Add support mate-dictionary in *dictionary* plugin by Igor Santos
+ Fix *Firefox* and *Thunderbird* database connection (closes: #153)
+ Add support for `file:///` URLs
+ Add *Firefox tags* plugin
+ Fix *Thunderbird* plugin - support new database schema
+ Fix *Thunderbird* plugin - support contact without proper name or other
fields (closes: #164)
+ Add *libvirt* plugin - manage libvirt domains
+ Add *zeal* plugin - quick search in zeal docsets
+ Fix *window* plugin - don't break on Wayland, fix switching workspace
+ Fix segfault on Wayland and newer version of libwnck (closes: #165)
+ Dev:
+ Don't embed timestamp in gzip header by kpcyrd
+ remove some redundant list creation
+ add missing file names in POTFILES.in
kupfer v321
-----------
+ Update translations: es, it, pl
+ Plugins:
+ Add *WhatsApp Web* by leoen25demayo
+ Add *Instapaper* by Peter Stuifzand
+ Add *Pinboard* by Peter Stuifzand
+ Add *Brotab* by Peter Stuifzand
+ Fix loading data error in *OpenSearchSource* (closes: #142)
+ Add *chromium* plugin (port old plugin to Py3) by emareg
+ In *thunderbird* add support for addressbook in sqlite format
+ In *XFCE Session* allow configure lock screen command (closes: #146)
+ Dev:
+ Fix building distributing tar file (closes: #147)
kupfer v320
-----------
+ Update translations: es, pl
+ Fix detecting running gui application, selecting active window and crashes
when application was closed (closes #124, #130)
+ Allow serialize UrlLeaf ans save it as actions (closes #126)
+ Plugins:
+ In *Firefox Keywords* provide quick search using '?keyword query'
+ In *Documents* option for disable checking is file exist before add
to list that solve problems when files are in slow/inaccesible locations
+ Restore *Clawsmail* plugin
+ Update *VirtualBox* plugin to work with last version
+ Add *deepdirectories* plugin
+ Restore *websearch* plugin (closes #127)
+ In *Firefox* fix openning locked database; fix loading profiles, allow
user to select non-default profile by name of path (closes #131)
+ Add LXQT session suport
+ Dev:
+ Update WAF version; use itstool instead of xml2po (closes #125)
kupfer v319
-----------
+ Fix *Get Parent Folder* to always return a ``FileLeaf`` (not a subclass)
+ Plugins:
+ In *Rhythmbox*, always use song uris for enqueueing tracks (fixes an issue
with legacy encoded file paths).
+ In *Rhythmbox*, improve error reporting on errors in *Get File*.
+ Add *Prefer Dark Theme* that allows you to flip this GTK setting just
for Kupfer
kupfer v318
-----------
+ Refactor some of the UI so that it uses composition instead of inheritance
for Gtk widgets. No functional changes intended (except given below).
+ The result list for the third pane now sticks to the right side.
+ Plugins:
+ In *Rhythmbox*, keep the cache even if the player is not running (#75).
+ In *Rhythmbox*, fix a bug where songs would sometimes be skipped in the
*Songs* catalog.
+ In *Media Player Control*, add item *Pause All*
kupfer v317
-----------
+ When an input method's preedit is active, backspace, return, arrows and
other keys are now reserved for the input method (ibus-mozc was tested).
+ All exceptions from content decorators from plugins are now caught and
logged (#73)
+ Fix remembering “Make (Action) Default for (Object)” when the object is
a text or a shell command.
+ Change so that ``kupfer`` only reads from stdin when called with no
arguments and when not started from a desktop file. This should fix issues
with starting from autostart or menus in some environments. (#72)
+ Fix a crash when the *Show Text* window is closed. (#71)
+ (API) Trying to install a plugin setting key with a reserved name now raises
an exception.
+ Plugins:
+ In *Recent Documents*, fix an exception with filenames in unknown encoding
+ In *Tracker*, fix an exception with malformed ``.savedSearch`` files.
kupfer v316
-----------
+ Bundle an icon used for windows and workspaces. Based on an icon in Adwaita.
+ Add two more default terminal alternatives, exo-open and x-terminal-emulator.
+ Add a few more alternatives in the drop down for large icon size
+ Plugins
+ In *Rhythmbox*, look for more album art filenames in the same directory
+ In *Firefox Keywords*, allow copying them to clipboard (Ctrl + C)
+ In *Text Files*, fix *Write To* and *Append To*
+ In *Tracker* support a location restriction for ``.savedSearch`` files.
kupfer v315
-----------
+ Fix an issue with launching X applications in wayland (#65)
+ Fix an exception on text input “file://”
+ Plugins
+ In *Volumes*, show a notification on successful unmounts (#64)
+ In *Documents* you can now opt out applications of having their recent
documents listed inside.
+ In *Rhythmbox*, use less memory for storing the library cache
+ In *Rhythmbox*, sort albums of an artist primarily by year, then title.
+ In *Shell Commands*, fix the icon name of a command
kupfer v314
-----------
+ Replaced file action *Reveal* (file manager plugins do this better)
with *Get Parent Folder* which has the default accelerator *P* and thus is
very handy for navigation.
+ Fix so that right arrow can enter directories even in text mode
+ Allow **Action Accelerators** to use more than just A-Z keys
+ Misc fixes to start **wayland compatibility**. All uses of Wnck now
gracefully disable when not applicable.
+ Wnck is now technically optional, still recommended for best experience in X.
+ Tweak arrangement of items in the first page of the preferences window,
and add a few more icon size alternatives.
+ Tweak the multiple objects icon to look at bit better
+ Recognize pasted file:// uris as files
+ Plugins
+ New plugin for file manager *Nemo*
+ Fix *Rhythmbox* to not clear the queue when playing a single song
+ Fix *Rhythmbox* to handle missing files gracefully
+ Fix *Rhythmbox*, *Audacious* to not clear cached library/playlist when
the respective program exits
kupfer v313
-----------
+ **Action Accelerators**: every action can have a configurable accelerator
key that allows activating it directly.
+ Changed some default shortcuts:
+ *Select ‘Selected Text’* now uses Ctrl + G
+ *Switch to 1st Pane* now has no binding by default
+ Fix monitor placement in Unity (#45)
+ The preferences window now loads and shows current icon size
+ The configuration file is now written in sorted order.
+ Fix a minor visual issue using some themes (padding under match text)
+ The set keybinding window now has a button to clear the current binding
+ The result list now has a minimum size depending on the small icon size,
so it sizes better for hidpi
+ Plugins
+ Handle errors better in *Tracker* and make *Get Tracker Results...*
fetch the results asynchronously.
+ Fix *Dismiss* action in *Getting Things GNOME* plugin. Thanks
@khurshid-alam for the patch!
+ Another *Create Task* action was added to GTG (an action on the app itself).
+ *Audacious* now refreshes when the program starts
+ *Attach in Email To* in *Thunderbird* is now not allowed on directories
+ *Notes* now has *(Note) → Append → (Text)* which is a reversal of
an existing action
+ *Append To Note* now works for kzrnote as well
kupfer v312
-----------
*There are some lingering open bugs for desktop environments that are not my
main desktop. Kupfer only becomes what everyone puts in, so if you can help
fixing bugs related to your environment, please come to our github page.*
+ Add several new possible accelerator keys in the main kupfer interface:
+ *Select Pane 1, 2, 3*
+ *Select Clipboard Text*, *Select Clipboard File*
+ Configure them in the keyboard tab in preferences
+ ``Keybinder`` which is optional is now also treated as such by configure
+ (API) Minor bugfix so that async Tasks don't need to set a name
+ Plugins:
+ Handle errors better in the *Trash* plugin
+ Fix the way *Rhythmbox* starts playback of multiple songs
+ Add action *Get File* on *Rhythmbox* songs
kupfer v311
-----------
+ Work even if ``Keybinder`` is not installed. Also added environment var if
you need to disable it, even when it is installed.
+ (API) Actions can now post sources as “late results”. (*Get Notes Search
Results...* now uses this.)
+ (API) Add ``ShowHide``, ``ShowHideOnDisplay`` to D-Bus interface.
+ Plugins
+ In *Notes*, retry opening notes for slow activation in Gnote/Tomboy
+ Fix task sort order in *Getting Things GNOME*
+ *Rhythmbox* and *Notes* refresh more often (when their programs restart)
kupfer v310
-----------
+ Speed up ranking objects a bit when the catalog is large
+ Show a nicer message when no action matches the search
+ Using AppIndicator is now an option (and optional dependency)
+ Plugins:
+ Add *Firefox Keywords* to use configured keywords as search engines
+ In *Applications* show more apps in *Open With...*
+ In *Applications* add new action *Reset Associations*
+ Reintroduce the *Rhythmbox* plugin, which allows searching the library,
playing and enqueuing songs. General Play/Pause/Prev/Next is in
the *Media Player Control* plugin already.
+ Reintroduce the *Getting things GNOME* plugin.
+ Reintroduce the *Devhelp* plugin.
+ (API) Allow Sources and TextSources to customize their no match and
waiting for search text.
+ (API) Allow Actions to use both the catalog and an extra source for the
indirect object
kupfer v309
-----------
+ Change Kupfer's D-Bus name and interface and object path. The old names
are still active, but the migration period will be very short because we
are in a rapid change phase. New names use the domain ``io.github.kupferlauncher``.
+ Change the no match icon to use transparency instead of ugly pixelation
+ Change the default text to simply be *Type to search*, which is shorter
and simpler.
+ Folding of *ß* has been restored, so that a search for *ss* will match it.
+ Plugins:
+ In *Notes*, some actions are now asynchronous and/or have better error
reporting.
+ In *Notes*, update for kzrnote 0.2
+ Enable *Quicksilver Icons* by default
kupfer v308.2
-------------
+ Fix showing the result list in KWin (#47) with a specific workaround
+ Plugins:
+ Fix *Shell Commands* so that they inherit the parent environment
+ Remove *GNOME Session Management* from the set enabled by default
kupfer v308.1
-------------
+ Fix widget style/space issue that was especially apparent in the GTK theme
Adapta.
kupfer v308
-----------
Be sure to check out the settings in the *Applications* plugin in this
release. The web site now also shows a language selection for the user’s
guide, so that the translations are readily available.
+ Fix a slight wobble in the result list’s position by making sure the
description label stays the same size
+ Fix how the star and arrow at the right side of the result list line up
+ Plugin API: Add methods ``get_gfile`` and ``is_content_type`` to ``FileLeaf``
+ Prerender and install fixed icon sizes
+ Plugins:
+ In *Applications* change how it filters applications based on desktop
type. The new default desktop type is blank, and this should pick up
the right desktop environment automatically. Make the *Use Desktop
Filter* toggle actually work.
+ Speed up recent documents slightly by caching an intermediate result
+ In *Documents* also recognize more file extensions when sorting
libreoffice documents to the right app.
+ Remove action *Send in Email To* from *Default Email Client*, since it
is unlikely to work for the default ``mailto:`` URL handler.
+ Rename the remaining action *Compose Email* → *Compose Email To* in
default mail, for consistency.
kupfer v307
-----------
Released Wednesday, 15 feb 2017
+ Fix a bug with disambiguation of action names
+ Stop merging contacts by full name equality
+ Accept dropped text and files on Kupfer’s window
+ Fix API to not ask for content-decoration of a leaf with existing content
+ Plugins
+ Reintroduce *Pidgin*
+ Reintroduce *Shorten Links*
+ In *Thunderbird*, rename compose email actions to differentiate them,
*Compose Email To*, *Compose Email With*.
+ In *Image Tools*, show an error if ``jpegtran`` is not found
+ In *Audacious* add runnable item *Show Playing*
+ Fix *Wikipedia* to use https
+ In *Documents*, match more applications to their own recent documents,
notably LibreOffice
+ Run copy from *File Actions* asynchronously
+ Add a new help page, for plugin *Thunar*
kupfer v306
-----------
Released Monday, 13 feb 2017
+ Fix a compatibility issue with waf wscripts for non UTF-8 locales
+ Fix plugin info loading from .zip files.
+ Fix exception on filenames that could not be represented in unicode. They
are silently skipped in directory listings for now.
+ Plugins:
+ Fix *Deep Archives* to skip directories named with archive extensions
+ Fix ``=help`` in *Calculator*
+ Revert the hack that replaced ``,`` with ``.`` in numbers in
*Calculator*
+ Add file action *Attach in Email To...* in *Thunderbird*
+ Add text action *Compose Email* in *Thunderbird*
+ Fix *Thunderbird* to read unicode correctly from the address book.
+ Reintroduce places (GTK bookmarks) in *Documents*
kupfer v305
-----------
Released Saturday, 11 feb 2017
+ Tweak how the selected pane is drawn. We still haven't arrived at a theme
and color-independent way to do this; Gtk 3 drawing and styling knowledge
is welcome in github.
+ Fix some drawing bugs in the main kupfer window by removing some old
erronous overrides of the widget size calculation.
+ Add attribute ``source_use_cache`` to the API for sources
+ Plugins:
+ Add new plugin *Media Player Control* for basic control of any
mpris-capable player. This plugin is experimental.
+ Fix bugs in *Volumes* so that it works well under Gtk 3
+ Fix the Copy button in the *Show Text* result. The text is also now
editable.
+ *Applications* now only proposes apps in *Open With...* that support
opening files. (Add ``%U`` or similar to your application’s command line
in the .desktop file, if it's missing.)
+ Stop enabling *File Actions* by default (copy is not async with Gtk 3
so it is now defective). Please use the Thunar file actions instead.
kupfer v304.1
-------------
Released Thursday, 9 feb 2017
+ Plugins:
+ *Clipboard:* add back *Clipboard Text* that was removed in v304 by
mistake
kupfer v304
-----------
Released Wednesday, 8 feb 2017
+ Clean up the distributable tarball; extra content like oldplugins is now
only in the repository and not in the tarball.
+ Fix double-clicking on the Kupfer window
+ Increase default result list length slightly
+ Plugins:
+ Reintroduce *Firefox Bookmarks*
+ *Clipboard:* attempted fix for a reported stack overflow
+ *Clipboard:* reintroduce *Clipboard File(s)* proxy object
+ Fix *File Actions* so that it works (for Gtk 3)
kupfer v303
-----------
Released Tuesday, 7 feb 2017
GNOME's hosting of the project is now officially at an end; mailing list and
repo there are gone, we are on github now. Thank you GNOME and see you next
time!
+ Completed port to pygi by removing ``pygtkcompat``
+ Build config will now look for ``python3`` if ``python`` is too old.
+ Plugins:
+ Reintroduce *Locate*
kupfer v302
-----------
Released Monday, 6 feb 2017
+ Fix sending files from the command line
+ Fix installation of help pages, new standard location ``/usr/share/help``
and including a file that was missing.
+ Fix --list-plugins and update man page.
+ Patch the included waf so that it now builds using Python 3
+ Plugin *Applications*: Add MATE as alternative
+ Fix interface to not draw preedit field at all
+ Fix *Copy to Clipboard* action.
kupfer v301
-----------
Released Monday, 6 feb 2017
A new decade of Kupfer
+ Fix loading plugin list for Python 3.6
+ New: ? starts free text input
+ New: ? text prefix gets live full text search results (plugin Tracker)
+ Plugins
+ reintroduce tracker
+ fix audacious
+ fix dictionary
+ drop multihead (updated, but needs testing)
+ drop gnome-terminal (obsolete)
kupfer v300
-----------
Released Sunday, 5 feb 2017
A new decade of Kupfer dawns!
+ Port Kupfer to Python 3
+ Port Kupfer to Gtk 3 and GObject Introspection
+ Reindent the codebase to 4 spaces
+ Regard this release as a preview, it may have bugs
+ We have a github organization, new webpage, and will need maintainers to
hold the wheel into the next decade
+ Breaking changes:
+ Plugin configs are reset
+ Old ``kfcom`` can no longer be parsed
+ Some changes in the Plugin API
+ Many plugins are obsolete and have been dropped. Some old plugins can be
updated, but I in general Kupfer wants to explore new kinds of
interaction, and not necessarily collect all possible plugins in-tree
+ Gtk theming has changed
+ New features:
+ Use CSS for Gtk 3 themes
+ Implemented using 2010s technology
+ Dependencies:
+ This release requires ``Keybinder-3.0`` (using G-I), that will be
relaxed later
.. role:: lp(strong)
kupfer v208
-----------
Released Friday, 1 June 2012
* Fix bug with nonexisting catalog directories (Karol) (:lp:`1000980`)
* Fix sending to many with Thunderbird (Karol) (:lp:`955100`)
* Fix history file for OpenOffice/LibreOffice (Karol)
* *Audacious* plugin: Work with Audacious 3 (Ulrik)
* Localization updates:
+ cs, Marek Černocký
+ es, Daniel Mustieles
+ fr, Alexandre Franke, Bruno Brouard
+ ru, Nikolay Barbariyskiy
+ sl, Matej Urbančič
kupfer v207
-----------
Released Sunday, 26 February 2012
* Documentation translated to French by Bruno Brouard
* New translation to Brazilian Portuguese by Djavan Fagundes
* New translation to Hungarian by SanskritFritz
* Handle large text objects a bit better
* Introduce proxy objects *Clipboard File* and *Clipboard Text*. These
objects are implemented in the *Clipboard* plugin, just like the *Selected
Text* object which has changed home to this plugin. Accordingly,
deactivating the clipboard plugin will deactivate these proxies.
* Support copying and pasting files from/to the clipboard, which allows much
easier integration with file managers.
* Add an information text detailing which keyring backend is used to store
passwords, visible in the user credentials dialog.
* *Vim:* Expand the vim plugin to use a helper process to track running
server instances of (G)Vim. Each running session is exported as an object,
and most importantly, files can be opened in a session using the action
*Open With*.
* *Multihead Support:* This new plugin will start the "keyboard shortcut
relay" service on additional screens, if it is needed. It is active by
default, and does not do anything on configurations with a single
X screen.
* *Send Keys:* Allow sending key sequences using comma trick.
* *Thunar:* Add action *Symlink In...*
* *Quicksilver Icons:* New plugin with a few icons from Quicksilver
* Use themable custom icon names ``kupfer-execute``, ``kupfer-catalog``,
``kupfer-launch``. Also allow plugins to choose to supply icons when the
icon theme lacks them, or always override the icon theme.
* Fix passing zero-length arguments to programs (Fabián Ezequiel Gallina)
(:lp:`863349`)
* *Gmail:* Expose more contact info fields (Adi Sieker, Karol Będkowski)
* Add plugin *DuckDuckGo* (Isaac Aggrey)
* Add quick note action to *Zim* (Karol Będkowski)
* Add *Edit Contact in Gmail* to *Gmail* (Karol)
* Fix version detection in *Gajim* (Karol)
* *Google Translate:* Since Google no longer provides this API (for free),
this plugin is no longer included in Kupfer.
* Fix compatibility with dbus-python version 1.0 (:lp:`921829`)
* Fix loss of window shape when centering (David Schneider) (:lp:`779845`)
* We are now using the format .tar.xz for the distribution tarball.
* The git repository and tarball now includes a local copy of waf (1.6.11),
unmodified but with unused in Tools/ and extras/ removed.
* Localization updates:
+ (cs) Marek Černocký
+ (de) Mario Blättermann
+ (fr) Bruno Brouard
+ (es) Daniel Mustieles
+ (hu) SanskritFritz
+ (pl) Piotr Drąg
+ (pt_BR) Djavan Fagundes
+ (sl) Andrej Žnidaršič
+ (sv) Ulrik
kupfer v206
-----------
`The longest changelog ever—the best Kupfer ever?`:t:
Released Thursday, 14 April 2011
These are changes since the v205 release. Below this I have included, the
full changelog for all the features introduced in v205, since it was not
published in whole together with the v205 release.
I would like to thank all contributors for patches, bug reports, comments
and translations. A special thanks to those who have contributed to the
`user documentation`__; it is now complete in both Polish and Spanish.
If you like my work with Kupfer, you can support me by donating. There are
instructions how to do so on the web page. –ulrik.
__ http://kaizer.se/wiki/kupfer/help/
* *Thunderbird:* fix double create email windows (:lp:`747198`)
* *Thunderbird:* fix problem with loading contacts (Karol Będkowski)
(:lp:`747438`)
* Use ``rst2man`` as it was configured (:lp:`747500`)
* Reduce runtime memory use for substantially by reimplementing the icon
cache (expectations vary btw. 10 to 30 percent).
* Prefer gnomekeyring over kwallet, and don't load keyring support if it is
not requested by a plugin (:lp:`747864`)
* Make the "folder" icon take precedence over "inode/directory"
* Fix a regression in *Go To* that would not focus minimized windows.
* In *Go To* action, cycle application windows (if they are all on the same
workspace).
* Fix :lp:`671105`: the user's home is aliased as *Home Folder* and the
"lookalike" application is hidden.
* Use GTK+ as default icon set, the ASCII icon set remains as a plugin
* Fix regression :lp:`749824`, kupfer used a GTK+ 2.20 feature. Kupfer
should now run under GTK+ 2.18 (2.16?). GTK+ 2.20 is recommended and
needed for full input method support.
* Remake ``.desktop`` file parsing to be much more lenient, so that we
can launch all applications again. Affected were especially launcher files
written by wine.
* Make sure the ``Home`` key works in text mode (:lp:`750240`)
* *Rhythmbox:* Fix omission of ``.jpg`` extension when searching cover art
(William Friesen)
* Support xfce4-dict in *Dictionary* plugin (David Schneider)
* Make sure ``kupfer.svg`` can be mimetype-detected (NAKAMURA Yoshitaka)
(:lp:`750488`)
* Fix regression that prevented mimetypes and icon cache from being updated
properly when installing from source.
* Focus the plugin list search box by default in the preferences window.
* Fix regression in *XFCE Session Management* that had a broken logout
command.
* Install kupfer as a Thunar 'sendto' object.
* Fix a bug in the autostart file we installed, it was including a '%F'
which broke ``--no-splash`` when autostarted on XFCE.
* *LibreOffice:* support their newer recent documents file (Karol Będkowski)
* *Notes:* Insert newlines after the new note title (:lp:`748991`)
* *Commands:* Recognize absolute paths with arguments as shell commands (for
example ``/bin/grep --help``. (:lp:`152093`)
* *GNU Screen:* check if sessions are still active (:lp:`756449`), don't
give up even if ``$SCREENDIR`` is missing when we are started
(:lp:`753376`)
* *Notes:* support the program kzrnote as well
* Renamed the two like-named command actions in spanish (Daniel Mustieles)
* Localization updates for v206:
+ sl Andrej Žnidaršič
+ es Daniel Mustieles
+ de Mario Blättermann
This is the changelog for the v205 release, which was released previously.
* Changes to the interface
+ Add a small menu button on the window for explicit access to
context actions, preferences window, and help.
+ Increase icon size to 128px
+ Always show description field
+ Use an undecorated window with rounded corners
+ Let the frame be slightly transparent if supported
+ Themable colors and properties by using GTK+ styling, see
``Documentation/GTKTheming.rst``, and the plugin *Custom Theme* that
shows how to use custom styles.
* Add context action "Set X as default action for object Y"
+ For example, you can make *Launch Again* default for Terminal, and our
default configuration uses this setting for two common terminals (GNOME
and XFCE).
* Updated Kupfer's technical documentation (in ``Documentation/``),
including the Plugin API reference.
* Implement a preedit widget for input methods, also resolving
the incompatibility with ibus (David Schneider) (:lp:`696727`)
* Re-implement launching of applications
* Allow the user to configure which terminal program is used.
Applies to all of *Run in Terminal*, *Open Terminal Here*, for .desktop
files that specify ``Terminal=true`` etc.
* Implement an "alternatives" mechanism so that plugins can
register mutually exclusive alternatives. Currently implemented
are Terminals (see above) and Icon Renderers.
* *Thunar*: Use Thunar 1.2's Copy and Move API.
+ These allow copying and moving anything through thunar, and it will
show progress dialogs for longer transactions.
* Add *Ascii & Unicode Icon Set* for fun
* Add simple plugin *Quick Image Viewer* to show images in a simple way.
* Add *Send Keys* plugin that can send synthetic keyboard events,
and prominently can be used for the *Paste to Foreground Window*
action on text. Requires ``xautomation`` package. (:lp:`621453`)
* *Volumes:* treat mounts as regular folders, so they can be targets for
file operations.
* *File Actions:* the action *Move to Trash* switches home to the *Trash*
plugin, the archive actions go to new *Archive Manager* plugin. *Archive
Manager* also updated to recognize more archive file types, including
``.xz``.
* Activate current selection on double-click in the interface.
(:lp:`700948`)
* Update the preferences window and move the folder configuration to the
Catalog tab.
* Add ``initialize_plugin`` to the plugin interface.
* The D-Bus interface has been extended with X screen and timestamp-aware
versions of all methods:
+ ``PresentOnDisplay``, ``PutFilesOnDisplay``, ``PutTextOnDisplay``,
``ExecuteFileOnDisplay`` all act like their similarly-named
predecessors, but take ``$DISPLAY`` and ``$DESKTOP_STARTUP_ID`` as their
last two arguments.
+ ``kupfer-exec`` activation sends the event timestamp so that focus can
be carried along correctly even when running ``.kfcom`` files (if
activated as an application by startup-notification-aware launchers,
this works with most standard desktop components).
* Internally, change how actions are carried out by allowing the
action execution context object to be passed down the execution chain
instead of being a global resource. This also allows plugins to cleanly
access current environment (event timestamp, current screen etc).
+ Support running kupfer on multiple X screens (:lp:`614796`), use
the command ``kupfer --relay`` on each additional screen for global
keyboard shortcut support. This is experimental until further notice!
* The *Tracker 0.8* plugin supports version 0.8 and 0.10 alike. Because of
that and the expected compatibility with one version after this too, it's
now called *Tracker*.
* The *Favorites* plugin lists *Kupfer Help* and *Kupfer Preferences* by
default (for new users), so that it's not empty and those items are ranked
higher.
* In free-text mode, show a character count in the text entry.
* The action *Go To* on applications has changed implementation. It will
first bring to front all the application's windows on the current
workspace, and upon the next invocations it will focus the other
workspaces, in order, if they have windows from the same application. For
single-window applications, nothing is changed.
* Localization updates for v205:
+ (cs) Marek Černocký
+ (de) Mario Blättermann
+ (es) Daniel Mustieles
+ (ko) Kim Boram
+ (nb) Kjartan Maraas
+ (pl) Karol Będkowski
+ (sl) Andrej Žnidaršič
+ (sv) Ulrik
kupfer v205
-----------
Congratulating ourselves
Released Friday, 1 April 2011
* Changes to the interface
+ NOw we have a teh awsum interface
* Add context action "Set X as default action for object Y"
+ You can finally make Kupfer do what you want.
* Implement a preedit widget for input methods, also resolving
the incompatibility with ibus (David Schneider) (:lp:`696727`)
+ Ok, so that foreign people can enter text too.
* Updated Kupfer's technical documentation (in ``Documentation/``),
including the Plugin API reference.
+ Someone finally bothered
* The action *Go To* on applications has changed implementation. It will
first bring to front all yada yada, etc...
+ Whatever, it finally works in a sensible way
* And tons of other stuff, enjoy!
kupfer v204
-----------
Released Friday, 18 March 2011
* Expand and improve upon `Kupfer's User Documentation`__.
* Use and require **Waf 1.6**, which supports building using either Python 3
or Python 2.6+. Kupfer itself still uses Python 2.6+ only.
* Add *Gwibber* plugin that allows integration with Twitter, Identi.ca, Buzz
etc. (Karol Będkowski)
* Add chat client *Empathy* plugin (Jakh Daven)
* Remove the plugin *Twitter* since it is incompatible and has no updated
implementation.
* Add *Show QRCode* plugin by Thomas Renard (:lp:`611162`)
* Periodically save data from plugins so it's not lost if Kupfer can't exit
cleanly at logout
* *Commands*: Add actions *Pass to Command*, *Filter through Command*, *Send
to Command* which add a lot of shell script-related power to Kupfer.
These actions, and *Run (Get Output)* as well, use a shell so
that you can run shell pipelines.
* *Search the Web*: Fix bug in OpenSearch parser (:lp:`682476`)
* *VirtualBox*: Support vboxapi4 (Karol Będkowski)
* *Thunderbird*: Fix problems in the mork parser (Karol Będkowski)
(:lp:`694314`)
* *OpenOffice*: Support LibreOffice too (Karol Będkowski)
* Fix "Y2011 bug" where the time parameter overflowed INT32 in keybinder
* *Shorten Links*: Use only services with stable API, added and removed
services.
* *Google Search*, *Google Translate* and ``bit.ly`` in *Shorten Links* can
use SSL for transport if a third-party plugin is installed.
* Fix bug if evolution address book is missing (Luca Falavigna)
(:lp:`691305`)
* Fix *Search the Web* to use localized ``firefox-addons`` subdirectories
for search engines (:lp:`735083`)
* Fix bug with integer division (Francesco Marella)
* *APT:* Workaround bug with ``subprocess`` (:lp:`711136`)
* Find cover art files just like Rhythmbox (William Friesen) (:lp:`676433`)
* Use ``readlink`` in ``kupfer-exec`` script too since ``realpath`` is not
always available.
* Allow plugins to use update notifications (William Friesen)
* Bug :lp:`494237` is hopefully fixed once and for all.
* The *Large Type* action will work with anything that has
``TextRepresentation``
__ http://kaizer.se/wiki/kupfer/help/
* Localization updates:
+ (cs) Marek Černocký
+ (da) Joe Hansen
+ (de) Mario Blättermann
+ (es) Daniel Mustieles
+ (gl) Marcos Lans
+ (pl) Karol Będkowski
+ (sl) Andrej Žnidaršič
+ (sv) Ulrik
+ (zh_CN) Aron Xu, Yinghua Wang
kupfer v203
-----------
.. role:: git(emphasis)
Released Saturday, 6 November 2010
* Center Kupfer on the monitor were the mouse pointer is (:lp:`642653`,
:git:`3d0ba12`)
* Ignore the system's configured input manager by default (User can choose
by pressing Shift+F10 in Kupfer). Kupfer is still not compatible with
ibus 1.3. (:lp:`601816`, :git:`4f029e6`)
* Use ``readlink`` instead of ``realpath`` (:git:`656b32d`)
* *Opera Mail*: Handle contacts with multiple e-mail addresses (Chris
Parsons) (:lp:`661893`, :git:`12924be`)
* *Google Translate*: Fix language list (Karol Będkowski) (:lp:`600406`,
:git:`7afac2b`)
* *TSClient*: Search recursively for session files (Karol, Freddie Brandt)
(:git:`ad58c2e`)
* *Rhythmbox*: Fix thumbnail lookup (William Friesen) (:lp:`669077`,
:git:`b673f98`)
* New Slovenian translation of help by Matej Urbančič (:git:`3b7df25`)
* New Turkish translation by M. Deran Delice (:git:`bd95d2a`)
kupfer v202
-----------
Released Sunday, 5 September 2010
* Add option to hide Kupfer when focus is lost (and enable by default)
(Grigory Javadyan) (:lp:`511972`)
* Use application indicators when available (Francesco Marella)
(:lp:`601861`)
* Python module `keyring` is now optional for Kupfer (but required for
the same plugins that used them before)
* Update *Google Translate* for protocol changes (Karol, Ulrik) (:lp:`600406`)
* Disable saving window position until a better solution is found
* Use 'mailto:' as URL (:lp:`630489`)
* Fix UI glictch with empty Source (William Friesen) (:lp:`630244`)
* Small changes (Francesco Marella)
* New Czech translation of the help pages (Marek Černocký)
* New Italian translation of the help pages (Francesco Marella)
* New Polish translation of the help pages (Karol Będkowski)
* New Basque translation (Oier Mees, Iñaki Larrañaga Murgoitio)
* New Galician translation (Fran Diéguez)
* Localization updates:
+ cs (Marek Černocký)
+ de (Mario Blättermann)
+ pl (Karol Będkowski)
+ sl (Andrej Žnidaršič)
+ zh_CN (Aron Xu)
kupfer v201
-----------
Released Wednesday, 30 June 2010
* New Logo and Icon by Nasser Alshammari!
* New plugin *Opera Mail* by Chris Parsons
* New plugin *SSH Hosts* by Fabian Carlström
* New plugin *Filezilla* by Karol Będkowski
* New plugin *Getting Things GNOME!* (Karol)
* New plugin *Vim* (recent files)
* *Clipboard:* Option *Copy selection to primary clipboard* (Karol)
* *Firefox:* Option *Include visited sites* (Karol) (:lp:`584618`)
* *Thunar:* Action *Send To...* (Karol)
* New preferences tab for Catalog configuration
* Allow disabling and "unloading" plugins at runtime
* Support new tracker in plugin *Tracker 0.8*
* *Shell Commands:* New Action *Run (Get Output)*
* New plugin capabilities: ActionGenerator, Plugin setting change
notifications (Karol)
* Use ``setproctitle`` module if available to set process title to
``kupfer`` (new optional dependency)
* Don't use a crypted keyring (partially addresses :lp:`593319`)
* Fix :lp:`544908`: Retain window position across sessions
* Fix :lp:`583747`: Use real theme colors for highlight
* Fix :lp:`593312`: About window has no icon
* More minor changes
* Localization updates:
+ cs, Marek Černocký
+ de, Mario Blättermann
+ es, Jorge González
+ it, Francesco Marella
+ pl, Karol Będkowski
+ sl, Andrej Žnidaršič
+ sv, Ulrik
kupfer v200
-----------
Released Wednesday, 7 April 2010
* Add Keyboard Shortcut configuration (Karol Będkowski)
* Make it easier to copy and move files (William Friesen), while showing
user-friendly errors when action is not possible (Ulrik) (:lp:`516530`)
* Collect results in a *Command Results* subcatalog, including results from
asynchronous commands (Pro tip: Bind a trigger to *Command Results* →
*Search Contents*, for quick access to copied files, downloaded files etc)
* *Last Result* proxy object implemented
* Add *Cliboards* -> *Clear* action (Karol)
* Add *Rescan* action for some sources (Karol)
* Add an icon in the plugin list search field to enable clearing it (Karol)
* Fix spelling (Francesco Marella)
* Fix bug `544289`:lp:
* Require python module ``keyring`` (since pandoras-box-1.99, but was not
mentioned)
* Recommend python-keybinder version 0.0.9 or later
* Localization updates:
+ cs Marek Černocký
+ de Mario Blättermann
+ es Jorge González
+ pl Karol Będkowski
+ sl Andrej Žnidaršič
+ sv Ulrik
+ zh_CN Aron Xu
kupfer version pandoras-box-1.99
--------------------------------
Released Tuesday, 16 March 2010
* Plugins can be loaded at runtime, although not unloaded can they not
* Plugins can bundle icons, and plugins can be packaged in .zip files
* New plugins *Google Search*, *Textfiles* and *Thunar*
* New plugin *Deep Archives* to browse inside .zip and .tar files
* New plugins *Twitter*, *Gmail* and *Google Picasa* by Karol Będkowski
* New plugin *Evolution* by Francesco Marella
* New action *Get Note Search Results...* in *Notes* by William Friesen
(LP#511954)
* New plugin capabilities (user credentials, background loader) by Karol
* Added *Next Window* proxy object to *Window List* plugin
* Allow saving Kupfer commands to .kfcom files, and executing them with
the ``kupfer-exec`` helper script.
* Display error notifications to the user when some actions can not be
carried out.
* Allow collecting selections with the *Clipboard* plugin (Karol)
* Include Gnome/Yelp documentation written using Mallard (Mario Blättermann)
* Make *Zim* plugin compatible with newer Zim (Karol, Ulrik)
* Detect multiple volume rar files (William Friesen) (LP#516021)
* Detect XFCE logout better (Karol) (LP#517819)
* Fix reading VirtualBox config files (Alexey Porotnikov) (LP#520987)
* Fixed module name collision in user plugins (LP#518958), favoriting "loose"
applications (LP#518908), bookmarked folders description (LP#509385),
Locate plugin on OpenSUSE (LP#517819), Encoding problem for application
aliases (LP#537730)
* New French translation by Christophe Benz
* New Norwegian (Bokmål) translation by Kjartan Maraas
* Kupfer now requires Python 2.6
* Localization updates:
+ cs Marek Černocký
+ de Mario Blättermann
+ es Jorge González
+ fr Christophe Benz
+ it Francesco Marella
+ nb Kjartan Maraas
+ pl Karol Będkowski
+ pt Carlos Pais
+ sl Andrej Žnidaršič
+ sv Ulrik
kupfer version pandoras-box-1.1
-------------------------------
Released Monday, 8 February 2010
* Fix bug in contact grouping code that could cause unusable Kupfer with Pidgin
plugin. Reported by Vadim Peretokin (LP#517548)
* Chromium plugin will index Google Chrome bookmarks as fallback, by William
Friesen (LP#513602)
* Kupfer's nautilus plugin was changed to be easier to reuse for others
* Some minor changes
* Localization updates:
+ pt (Carlos Pais)
kupfer version pandoras-box-1
-----------------------------
"Pandora's box"
Released Monday, 1 February 2010
* Implement the famous "comma trick": Press , (comma) in the first or
third pane to make a stack of objects to perform actions on. This allows
actions on many objects and even many-to-many actions.
* New plugin: *Triggers*: Add global keybindings to any command you can
perform in Kupfer.
* New plugin *Skype* by Karol Będkowski
* New plugin *Thunderbird* (or Icedove) (Karol)
* Implement merging of contacts and hosts: All contacts of the same name are
merged into one object. (Karol, Ulrik)
* New plugin *Higher-order Actions* to work with saved commands as objects
* The *Favorites* plugin was reimplemented: you may favorite (almost) any
object. Favorites get a star and a rank boost.
* *Window List* plugin was improved, most notably a *Frontmost Window* proxy
object was added
* New proxy object *Last Command*
* The *Firefox* plugin now includes most-visited sites from browser history
(William Friesen, Karol, Ulrik)
* The list of plugins has a field to allow filtering the list (Karol)
* New Czech localization by Marek Černocký
* Many smaller changes.
* Localization updates:
+ cs (Marek Černocký, Petr Kovar)
+ de (Mario Blättermann)
+ nl (Martin Koelewijn)
+ pl (Karol)
+ sv
+ sl (Andrej Žnidaršič)
kupfer version c19.1
--------------------
Released 31 December 2009
* New plugin: *Shorten Links* by Karol Będkowski
* Implemented *Ctrl+C* (and *Ctrl+X*) to copy (cut) selected object
* Fix bug LP #498542: restore window position code to c18
* Partial fix of bug LP #494237, window is sometimes blank
* Fix bug LP #500395, column order in *Top* plugin (Karol)
* Fix bug LP #500619, handle network errors in *Google Translate* plugin
(Karol)
* Localization updates:
+ pl (Karol)
+ sv
kupfer version c19
------------------
Released 18 December 2009
* New plugins:
+ *Gnome Terminal Profiles* by Chmouel Boudjnah
+ *OpenOffice* recent documents in OpenOffice by Karol Będkowski
+ *Top* show and send signals to running tasks (Karol)
+ *Truecrypt* show volumes in truecrypt history and allow mounting them
(Karol)
+ *Vinagre* Remote Desktop Viewer (Karol)
+ *XFCE Session Management* (Karol)
+ *Audacious* by Horia V. Corcalciuc
* New Slovenian translation by Andrej Žnidaršič
* Some plugins will now explicitly require a D-Bus connection and fail to
load if no connection was found.
* Add accelerators *Page Up*, *Page Down* and *Home* in the result list.
(Karol)
* Use customized or localized desktop directory instead of hardcoding
``~/Desktop`` by default. It will not affect users who already customized
which directories Kupfer indexes.
* It now is possible to favorite shell commandlines
* *Gajim* plugin now works with version 0.13 (Karol) (LP #489484)
* Basic support for Right-to-left (RTL) interface
* Fix bugs with "loose" Applications (not in system directories), reported
by Chmouel.
* Add accelerator *Ctrl+Return* for **Compose Command**: You may compose a
command object out of an (Object, Action) combination, to be used with the
new action *Run After Delay...*.
* Added file action *Send by Email* to *Claws Mail* plugin (Karol)
* Added file action *Mount as TrueCrypt Volume* to *TrueCrypt* plugin (Karol)
* Many small bugfixes
Localization updates:
* de: Mario Blättermann
* es: Jorge González
* it: Francesco Marella
* pl: Karol Będkowski
* sl: new (Andrej)
* sv: Ulrik Sverdrup
kupfer version c18.1
--------------------
Released 20 November 2009
* Fix bug to toss out malfunctioning plugins properly (Reported by Jan)
* Fix bug in showing the shutdown dialog, reported by user sillyfofilly (LP
484664)
* Fix bug in plugin *Document Templates*, reported by Francesco Marella
(part of LP 471462)
kupfer version c18
------------------
Released 18 November 2009
"Mímisbrunnr"
* New plugins:
+ *Pidgin* by Chmouel Boudjnah
+ *Google Translate* by Karol Będkowski
+ *APT* (package manager APT) by Martin Koelewijn and Ulrik
+ *Document Templates*
+ *Kupfer Plugins*
+ *Show Text*
* *Gajim* plugin matches contacts by jid as well as name, suggested by
Stanislav G-E (LP 462866)
* Action *Rescan* on sources is now debug only (should not be needed)
* Kupfer installs its Python package into ``$PREFIX/share`` by default,
instead of installing as a system-wide Python module.
* Kupfer can take input on stdin and pass as text to an already running
instance
* Fix bug in *Services* for Arch Linux, reported by lh (LP 463071)
* Changes for plugin authors:
+ May use ``uiutils.show_text_result`` to show text
+ ``kupfer.task.ThreadTask`` is now a reliable way to run actions
asynchronously (in a thread)
+ You can use item *Restart Kupfer* to restart (in debug mode)
+ Plugins may be implemented as Python packages, as well as modules
* Updated the dependencies in the README. pygobject 2.18 is required. Added
gvfs as very recommended.
* Other bugfixes
Localization updates:
* de (Mario Blättermann)
* es (Jorge González)
* nl (Martin Koelewijn)
* pl (Karol Będkowski)
* sv
* zh_CH (lh)
kupfer version c17
------------------
Released, 25 October 2009
"A fire lit by nine kinds of wood"
* 8 new plugins by Karol Będkowski:
+ *Claws Mail*, Contacts and actions
+ *Gajim*, Access to gajim contacts
+ *Opera Bookmarks*, for the web browser Opera
+ *PuTTY Sessions*, access to PuTTY sessions
+ *System Services*, start, stop or restart system services
+ *Terminal Server Client*, access to TSClient sessions
+ *VirtualBox*, control virtual machines, Sun or OSE version
+ *Zim*, access pages in the desktop wiki
* New plugin *Chromium Bookmarks* by Francesco Marella
* Plugins missing dependencies will be presented in the GUI with a clear
error message.
* *Firefox Bookmarks* plugin: Workaround Firefox 3.5 writing invalid JSON
(Karol, Ulrik)
* *Locate* plugin: Ignore case by default, add option to control this.
(Karol)
* Kupfer is much more friendly and says "Type to search in *Catalog*" when
it is ready to be used.
* Localization updates:
+ New Simplified Chinese localization (lh)
+ New Dutch localization (Martin Koelewijn)
+ New Portuguese localization (Carlos Pais)
+ Updated pl (Karol)
+ Updated es (Jesús Barbero Rodríguez)
kupfer version c16
------------------
Released 5 October 2009
* Translation to German (Thibaud Roth)
* Polish translation updated (Maciej Kwiatkowski)
* Add search engine descriptions from ``firefox-addons`` (Francesco Marella)
* Speed up directory browsing by using much less system calls
* Improve documentation and put it together into a `Manual`.
* Generate man page from reStructuredText document `Quickstart`.
* Evaluate valid actions (per object) lazily to save work.
* Add accelerators *Ctrl+Q* (select quit) and *Alt+A* (activate)
* Parse even horribly wrong search engine descriptions (Bug reported by
Martin Koelewijn)
kupfer version c15
------------------
* Translation to Polish by Maciej Kwiatkowski
* Speed up the string ranker tremendously; 3x faster in common cases.
* All objects now have an alias in the basic latin alphabet (if possible) so
that, for example, query `wylacz` matches item *Wyłącz*.
* Show notification icon by default
* Read XML with cElementTree (Faster.)
* Read Firefox 3's bookmarks (Python2.5 requires `cjson` module)
* New Plugin: Image Tools, with action *Scale...* and JPEG rotation actions
(*Scale* requires ImageMagick (`convert`), JPEG actions `jpegtran` and
`jhead`)
* Basic support for a Magic Keybinding: summon kupfer with current selection
kupfer version c14.1
--------------------
* Fix two bugs with new browisng mode (soft reset for text mode, backspace or
left to erase a subcatalog search)
kupfer version c14
------------------
* Rewrite and improve browsing mode:
* Browsing the catalog or folders is much improved; it is easier to keep the
overview and be oriented.
* Returning to kupfer after having performed an action, the old object is
still available, but without locking the catalog to its location.
When spawning kupfer again, the previous context is available if you
immediately browse; if you search, you search the whole catalog.
* The search times out after 2 seconds if no key is typed. Now the highlight
text will fade to show this.
* Add accelerators `Ctrl+G` and `Ctrl+T` to get current selection in nautilus
and currently selected text (if available).
kupfer version c13.1
--------------------
* Fix two bugs with *Rename To...*
kupfer version c13
------------------
* New Plugin: Calculator
* New Action: *Rename To...* in File Actions Plugin
* Smaller changes (Stop learned mnemonics database from growing indefinitely,
Catch SIGINT without python's handler, *Copy To...* requires pygobject 2.18
now)
kupfer version c12
------------------
* Translation to Spanish by Leandro Leites
* Preferences. Display plugin settings and options beside the plugin list,
and allow configuring included (and watched) directories.
* Support the new Gnome session protocol to save state on log out.
* Improve embarassingly bad shell command quoting for *Execute* and Tracker tag
actions.
* Specify user data locations with `X-UserData`
* Fix an AttributeError in Notes plugin reported by Francesco Marella
* Smaller fixes (Add/remove favorite could cease to work, Track intantiated
sources better)
kupfer version c11
------------------
The "this one goes to 11" release
* New plugin: Notes (Gnote and Tomboy support)
* Access notes, Actions: *Create Note* and *Append to Note...*
* New plugin: Selected File
* Kupfer ships with a Nautilus python extension that once installed,
you can access the currently selected file in Nautilus from Kupfer,
as the *Selected File* object
This release is localized in: Swedish (100%), Italian (90%)
kupfer version c10.1
--------------------
* Spanish Translation by Leandro Leites
kupfer version c10
------------------
* Updated italian localization
* New plugins: Url Actions, Web Search (rewritten to use all Firefox' search
engines)
* New actions: *Set Default Application*, *Create Archive In...*,
*Restore* (Restore trashed file)
* Add accelerators `Control+R` for reset, `Control+S` for select first
(source) pane and `Control+.` for untoggle text mode.
* Only the bookmarks plugins can toggle "include in toplevel" now.
* Other smaller changes (Refuse invalid Application objects from the
cache)
This release is localized in: Swedish (100%), Italian (93%)
kupfer version c9.1
-------------------
* User interface consistency and behaviour improvements. UI is simpler and
better.
* Other improvements.
This release is localized in: Swedish (100%), Italian (60%)
kupfer version c9
-----------------
The "c9" release
* Search and browse perform better
* The interface is now modal. In command mode we can bind special keys to
new functions. Type period `.` to enter free-text mode (just like in QS).
* Pressing kupfer's keybinding again will hide the window.
* Other smaller improvements
This release is localized in: Swedish (100%), Italian (60%)
kupfer version c8
-----------------
* Make the use of the indirect object pane much more fluid
* Apply interface polish (proper english capitalization of actions and
other objects, other changes)
* Add `Copy To...` action
* Try `xdg-terminal` first in *Open Terminal Here* (non-Gnome users can
either install `xdg-terminal` or symlink it to their terminal program)
* Allow unbinding the keybinding
* Fix a bug with tracker tags
[Please file bug reports and feature requests.][lp]. Read the files in
`Documentation/` and see how you can add new plugins with object and
application knowledge to kupfer.
This release is localized in: Swedish (100%), Italian (60%)
[lp]: http://launchpad.net/kupfer
kupfer version c7
-----------------
The "choice" release
This is a followup with some small changes after the c6 release, which
introduced lots of major changes, including a preferences window and
"application content."
* Allow wnck to be optional. Kupfer needs wnck to do application matching
and focusing of already running applications, but can now run without it if
wnck is not available. Window List plugin also needs wnck
* Rhythmbox plugin should not crash even if library is not found, now kupfer
can run even if rhythmbox's files are not there.
* Applications will match names as well as the executables, so that "gedit"
matches Text Editor regardless of what the displayed localized name is.
[Please file bug reports and feature requests.][lp]. Read the files in
`Documentation/` and see how you can add new plugins with object and
application knowledge to kupfer.
This release is localized in: Swedish (100%), Italian (60%)
[lp]: http://launchpad.net/kupfer
kupfer version c6
-----------------
The "Sisyphus incremental improvements" release
* Preferences window
* Allows setting keybinding on the fly
* List and enable/disable plugins and set plugin options
* Everything was improved slightly, but steadily
* Understands more applications, provides more files and objects,
and actions with **new plugins:** *Rhythmbox, Abiword, Clipboards, Dictionary,
Favorites, Selected Text, Wikipedia*
* Connect applications with their related object sources and make it their
content, such as Rhythmbox music for the Rhythmbox application.
* Applications contain their recently used documents, if
available.
* Firefox and Epiphany bookmarks are identified with each application
* Miscellaneous improvements:
* Kupfer object icon ("blue box")
* *Some* default application associations are installed (others
are learned by launching applications).
* Experimental UI with two-line title+description in browse mode
* Thumbnails for files and albums in browse mode
* Allow sending files and queries to kupfer from the commandline
using `kupfer 'query'` or `kupfer docs/file.pdf`.
* Even more plugins listen to change callbacks or filesystem monitors
to be up to date to the instant.
* Do not display nonexisting files as results
* Fine-tune how sources are loaded and refreshed on load
This release deserves lots of testing. [File bug reports and feature
requests.][bug] Read the files in `Documentation/` and see how you can add
new plugins with object and application knowledge to kupfer.
This release is localized in: Swedish (100%), Italian (60%)
Future: part 2 of beautification is refactoring of the interface, so
that the UI can be modularized and exchanged in plugins.
[bug]: http://launchpad.net/kupfer
kupfer version c5
-----------------
The "Beauty from the inside, part 1" release
* Big refactorings of the whole data model
* Move all of the data model to kupfer.data
* Allow actions with indirect objects "threepane kupfer" (with
means to configure which objects to use for an action etc)
* Uses unicode internally, instead of UTF-8-encoded strings
* Some new actions using new possibilities (Open with any, Move file
to new location, Add/Remove tracker tags) but more is possible.
* Basic manual page included
* Fileactions plugin includes unpack archive/create archive
* Ship extra and demonstration plugins in contrib/ and interals
documentation in Documentation/
* Change learning algorithm to recognize an item's type as well
(so that two objects named "project" can be ranked differently)
* Small fixes (alphabethic sorting for applications, sources, check
if objects still exist after an action, ``rank_adjust`` default actions
slightly)
This release deserves lots of testing. File bug reports and feature
requests. Read the files in Documentation/ and see how you can add
new plugins with object and application knowledge to kupfer.
This release is localized in: Swedish (100%), Italian (80%)
Future: part 2 of beautification is refactoring of the interface, so
that the UI can be exchanged. And preferences will hopefully be implemented
.. -*- encoding: UTF-8 -*-
.. vim: tw=76 ft=rst
kupfer-328/NEWS 0000777 0000000 0000000 00000000000 15001750511 0021723 2Documentation/VersionHistory.rst ustar 00root root 0000000 0000000 kupfer-328/README.rst 0000664 0000000 0000000 00000007133 15001750511 0014352 0 ustar 00root root 0000000 0000000 kupfer is a smart, quick launcher
+++++++++++++++++++++++++++++++++
:Homepage: https://kupferlauncher.github.io/
:Credits: Copyright 2007–2023 Ulrik Sverdrup and other Kupfer authors
:Licence: GNU General Public License v3 (or any later version)
Kupfer is an interface for quick and convenient access to applications
and their documents.
The most typical use is to find a specific application and launch it. We
have tried to make Kupfer easy to extend with plugins so that this
quick-access paradigm can be extended to many more objects than just
applications.
Installing
==========
This project is configured for the Waf build system, which is included.
Run it using either ``./waf`` or ``python3 waf`` (using your python.)
Installation follows the steps::
./waf configure
./waf
If configure does not find the right Python 3 executable, set ``PYTHON``
explicitly first.
then::
./waf install
or ::
sudo ./waf install
You can use ``--prefix=$PREFIX`` when configuring to assign an
installation spot. By default, Kupfer is installed for all users.
Installing only for your user is possible, but the binary directory must
be in your ``$PATH``.
About Waf
---------
Waf is included in both the distributable tarball and the repository (so
that full source code is incuded. See the file `waf` for author and
licensing information).
Waf was acquired through https://waf.io/, version 2.0.25.
The following files extracted::
./waf-light -> ./waf
./waflib -> ./waflib
./ChangeLog -> ./Waf.ChangeLog
./waflib/Tools/* some files excluded
./waflib/extras/* some files excluded
Build Requirements
------------------
* Python 3.9+
* intltool
* optionally: rst2man (python-docutils) to install the manpage
* optionally: itstool to install mallard help pages
Runtime Requirements
--------------------
Kupfer requires Python 3.9 or later, and the following important libraries:
Because the port to Python 3 and Gtk 3 is new, I don't know what the lower
boundaries of dependencies are. I've given the versions where it is
known to work.
* Gtk-3.0 version 3.22
* libkeybinder-3.0 version 0.3.1
* python gir1.2
* dbus python bindings
* python-xdg
Opportunistic dependencies
* If available, 'setproctitle' is used to set the process name
* If available, you can use AyatanaAppIndicator3. On debian the package name
needed for the dependency is ``gir1.2-ayatanaappindicator3-0.1`` (g-i bindings).
Recommended dependencies
* Wnck-3.0 version 3.20 (Without this you can't focus already running
applications)
* Yelp, the help browser
Some plugins will require additional python modules!
Spawning
========
The program is installed as ``kupfer`` into ``$PREFIX/bin``. Only one
instance can be active for one user at a given time. Normal use of
kupfer requires an active dbus session bus.
Keybinder Module
----------------
Keybinder is a library for global keyboard shortcuts.
You can use kupfer without the keybinder module, for example by assigning
a window manager keybinding to the ``kupfer`` binary.
If ``Keybinder`` gi bindings are installed, the library is used. If you must
disable it without uninstalling them then see the man page.
Documentation
=============
The user’s guide is installed as Mallard help pages, available under the
“Kupfer Help” object in the program itself; it is also on the web page.
Kupfer will use the help browser if there is a handler for the ``help:`` URI
scheme. The user’s guide’s source is under ``help/``, and it is translatable.
Please read ``Documentation/`` and ``Documentation/Manpage.rst`` for
technical and contributor documentation.
.. vim: ft=rst tw=78
kupfer-328/Waf.ChangeLog 0000664 0000000 0000000 00000025146 15001750511 0015155 0 ustar 00root root 0000000 0000000 NEW IN WAF 2.0.25
-----------------
* Fix invalid characters returned by find_program #2397
* Prepare for distutils removal (Python 3.12 regression) #2402
* Improve cp65001 compat in cpython < 3.3 #2346
* Add Fujitsu Fortran compiler detection on ARM64FX #2348
* Support multiple Sphinx output formats #2344
* Improve PyQt5 detection #2343
* Add asynchronous wafcache uploads
NEW IN WAF 2.0.24
-----------------
* Use EXT_SUFFIX config var over the deprecated/removed SO (Python 3.11 regression) #2386
* When detecting Visual Studio compilers, prefer the oldest version regardless of compiler type #2352
* Update the MacOS-specific examples #2337
* Fix Configure.find_program() invalid character handling in default variable names #2397
NEW IN WAF 2.0.23
-----------------
* Fix the Qt3D* libraries detection #2368
* Fix swig processing when \r is preset in the module name #2350
* Add RISC-V generic detection #2322
* Detect gcc first on GNU/kFreeBSD #2336
* Improve waflib/extras/msvcdeps performance #2323
NEW IN WAF 2.0.22
-----------------
* Fix stdin propagation with faulty vcvarsall scripts #2315
* Enable mixing Unix-style paths with destdir on Windows platforms #2337
* Fix shell escaping unit test parameters #2314
* Improve extras/clang_compilation_database and extras/swig compatibility #2336
* Propagate C++ flags to the Cuda compiler in extras/cuda #2311
* Fix detection of Qt 5.0.0 (preparation for Qt6) #2331
* Enable Haxe processing #2308
* Fix regression in MACOSX_DEPLOYMENT_TARGET caused by distutils #2330
* Fix extras/wafcache concurrent trimming issues #2312
* Fix extras/wafcache symlink handling #2327
NEW IN WAF 2.0.21
-----------------
* Set the default --msvc_version from VSCMD_VER if present #2299
* Force unit-test reruns on ut_str, ut_cmd or ut_path changes #2302
* Describe Qt5's library detection #2288
* Introduce conf.env.ASMDEFINES_ST to enable assembly-specific define flags
* Update extras/xcode6 to Python3 #2290
* Enable parameter "always" in extras/doxygen #2292
* Fix extras/c_dumbpreproc as it was previously broken
* Fix extras/gccdeps and extras/msvcdeps on header renaming #2293
* Improve extras/msvcdeps debug outputs and flags #2287 #2291
* Add add MCST Elbrus CPU detection in c config #2297
* Add minio object copies to extras/wafcache #2304
NEW IN WAF 2.0.20
-----------------
* Detect -flto and -fno-lto in parse_config #2281
* Improve custom option processing #2280
* Enable Clang on cygwin #2279
* Make distclean target 'no_lock_in_top/run' modifiers compatible with env vars #2271
* Update irix compiler detection
* Exclude ConfigSet from altering ConfigurationContext.run_build caches #2273
* Add gas support in extras/gccdeps.py #2278
* Improve compatibility with custom commands in extras/clang_compilation_database #2274
NEW IN WAF 2.0.19
-----------------
* Enable race-free pdb file generation waflib/extras/msvc_pdb.py #1731
* Fix negative values for -j #2256
* Fix Swig example compatibility with Python3 #2259
* Fix lto settings for endianness configuration tests #2250
* Tune the application name on --help #2254
* Improve Qt5's fPIC/fPIE detection
* Propagate LDFLAGS to Fortran tasks (in addition to LINKFLAGS)
* Enable local and remote build object caches waflib/extras/wafcache.py
NEW IN WAF 2.0.18
-----------------
* Fix a deadlock with cython and subst tasks #2244
* Fix rpath processing so that it no longer breaks dependency chains
* Fix fast_partial.py failures on configuration tests
* Fix duplicate -fno-strict-aliasing flags in Python compilation flags detection
* Fix annoying PIE errors in demos/asm/
* Improve configuration tests cache accuracy #2251
* Improve extras/fast_partial.py compatibility
* Improve extras/doxygen.py outdir parameter settings #2255
* Add a dependency scanner for assembly files (Gas/Yasm)
* Add executable arguments for configuration tests / execute=True
* Add a QtTest example to demos/qt5/ #2241
* Add a cross-compilation option to extras/objcopy.py #2247
NEW IN WAF 2.0.17
-----------------
* Improve build performance on FreeBSD and Python3 #2241
* Add Python 3.8 flag detection for building embedded interpreters #2239
* Prevent Qt5 uninstallation errors when c++ files are generated
* Improve installation/uninstallation colors
NEW IN WAF 2.0.16
-----------------
* Fix task semaphore errors on stateful tasks #2232
* Fix encoding errors with UTF-8 paths on Python 2 #2230
* Fix encoding errors in waf_unit_test #2220
* Improve dependency between javac task and use-d generated jars nodes
* Install pdb files with /debug:* flags #2224
* Make javadoc detection optional #2225
* Improve md5_tstamp documentation #2221
* Add extras/color_msvc to colorizes MSVC outputs #2221
* Fix symbol regex on mac-o binaries in extras/syms #2222
* Maintain order of lines in doxyfile in extras/doxygen #2223
* Improve extras/msvcdeps path handling
* Add extras/clang_cross for cross-compilation using clang
NEW IN WAF 2.0.15
-----------------
* Fix Python path detection under Git-Bash #2217
* Provide an option to disable args files #2216
* Improve command line length calculation for args files #2214
* Add libs/stubs to Cuda library path #2213
* Suppress ant_glob java warnings #2212
* Support multiple 'default_cmd' #2211
* Warn when buildcopy is used without any files to copy #2210
* Protobuf examples enhancements #2208 #2209
* Fix all DeprecationWarning: invalid escape sequence #2207
NEW IN WAF 2.0.14
-----------------
* Support Fortran 2008 submodules #2205
* Possible solution for Msys/Python 3.6 path issues #2217
* Support NEC SX-Aurora TSUBASA system's Fortran compiler extras/fc_nfort.py #2206
* Fix ignored configuration flags in gccdeps extras/gccdeps.py #2203
* Fix included protoc search on nested wscripts extras/protoc.py #2202
* Support extra taskgen and out of project include directories extras/protoc.py #2204
NEW IN WAF 2.0.13
-----------------
* Fix "broken revdeps" extra error message on certain build failures
* Avoid duplicate flags in Python configuration tests
* Find more Swig dependencies #2206
* Avoid spawning threads with -j1 on AIX systems
NEW IN WAF 2.0.12
-----------------
* Fix broken inheritance task trees #2194
NEW IN WAF 2.0.11
-----------------
* Do not raise an exception on check_cfg/mandatory=False/-vv #2193
* Post past task generators in lazy sub-folder builds #2191
* Disable warnings on versioned library installation
* Fix cpplint concurrent execution problems
NEW IN WAF 2.0.10
-----------------
* Add a task semaphore system
* Fix --help when no wscript is supplied #2184
* Fix Fortran processing with generated Fortran files
NEW IN WAF 2.0.9
----------------
* Add dependencies on scriptlet outputs
* Made options optional for cython waftool
* Improve doxygen error handling
NEW IN WAF 2.0.8
----------------
* Improve Windows console encoding outputs on Python 3.6 and Japanese code page #2163
* Improve msvc detection on Python 3.6 and Japanese code page #2155
* Improve moc/rcc flag parsing with msvc #2169
* Improve Eclipse project generation #2166 #2165 #2164 #2149 #2145
* Improve Boost project detection on dpkg-based systems #2146
NEW IN WAF 2.0.7
----------------
* Apply priorities to dynamically-generated tasks #2137
* Fix upcoming Python 3.7 incompatibilities #2126
* Fix Python3 support in extras/xcode6.py #2121
* Improve priority support in extras/swig.py #2137
* Improve support extras/protoc.py #2135
* Improve argument handling in extras/clang_compilation_database.py #2127
* Add glib DBus bindings in extras/gdbus.py #2134
* Avoid name collisions for precompiled headers and libraries with similar names in extras/pch.py #2122
NEW IN WAF 2.0.6
----------------
* Add Task.deep_inputs to enable further dependencies on input file tasks
* Set unit tests to depend on input file tasks instead of timestamps
NEW IN WAF 2.0.5
----------------
* Force unit tests to depend on the executable creation time besides file contents
* Enhance the Eclipse project generator
* Update the cuda examples
NEW IN WAF 2.0.4
----------------
* Enable more advanced warnings of ant_glob on build folders in verbose mode
* Defer node.ant_glob(..., generator=True) evaluation
* Enable 'waf clean' to get the list of files to remove from bld.clean_files
* Define the environment variable WAF_NO_PREFORK to skip pre-forking
* Fix Can't pickle local object '_createenviron..encode' exceptions (Python 3.6)
* Improve the Erlang module #2095
* Add task target to parallel_debug outputs #2091
NEW IN WAF 2.0.3
----------------
* Enable install_path=None for Python targets #2087
* Skip empty or duplicates in java user classpath #2084
* Change the unit test summary color scheme to use green and red colors
* Improve the deadlock error message
* Report sys.path values from Context.load_tool to improve error messages
* Cache qrc uic->h conversions to enable qrc re-use across targets
* Output long-running tasks outputs immediately using bld(rule=..., stdout=None)
NEW IN WAF 2.0.2
----------------
* Improve Intel Fortran compiler detection on Windows #2063
* Ensure that the task count starts at 1 in the build outputs
* Add a --pdb option to start pdb on unexpected exceptions #2052
* Fix conflicting qm/qrc re-used output files for multiple targets #2065
* Add java support in protobuf (extras) #2049
* Add a java test example (extras) #2062
* Enable symbol processing for empty targets (extras) #2053
NEW IN WAF 2.0.1
----------------
* Improve the default preprocessor behaviour for gcc/msvc
* Accept task objects in Build.add_to_group for compatibility reasons
* Prevent xcode generator from overwriting existing features #2038
* Fix self.includes data scope #2035
* Fix Node.ant_glob case sensitivity regression #2034
* Fix Logs.verbose options regression #2033
NEW IN WAF 2.0.0
----------------
* Provide a new priority system to improve scalability on complex builds
* Provide TaskGroup objects to improve scalability on complex builds
* Force new files into the build directory by default (use Node objects to bypass)
* Provide built-in support for building over UNC paths
* Simplify the Task class hierarchy; TaskBase is removed
* Display commands as string with "WAF_CMD_FORMAT=string waf build -v"
* Have ant_glob(..., generator=True) return a Python generator
* Accept nested lists and generators in bld(source=...)
* Sort TaskGen methods in alphabetical order by reversing TaskGen.prec order
* Remove 'ut_fun' from waf_unit_test.py
* Remove Node.sig and Node.cache_sig
* Remove the BuildContext.rule decorator
* Remove Task.update_outputs, Task.always_run
* Remove atleast-version, exact-version and max-version from conf.check_cfg
* Remove c_preproc.trimquotes
* Remove field_name, type_name, function_name from conf.check() tests
* Remove extras/mem_reducer.py as a better solution has been merged
* Remove Utils.ex_stack (use traceback.format_exc())
kupfer-328/auxdata/ 0000775 0000000 0000000 00000000000 15001750511 0014306 5 ustar 00root root 0000000 0000000 kupfer-328/auxdata/hicolor/ 0000775 0000000 0000000 00000000000 15001750511 0015745 5 ustar 00root root 0000000 0000000 kupfer-328/auxdata/hicolor/128x128/ 0000775 0000000 0000000 00000000000 15001750511 0016702 5 ustar 00root root 0000000 0000000 kupfer-328/auxdata/hicolor/128x128/apps/ 0000775 0000000 0000000 00000000000 15001750511 0017645 5 ustar 00root root 0000000 0000000 kupfer-328/auxdata/hicolor/128x128/apps/kupfer.png 0000664 0000000 0000000 00000036567 15001750511 0021670 0 ustar 00root root 0000000 0000000 PNG
IHDR >a sBIT|d pHYs f fSێ tEXtSoftware www.inkscape.org< IDATxg$u2]Lv (J$(G[#sswV+i$HQ+Q%=iEGa 1~zL̈x2\WUW4=ܙJoܸq#^5z^5#W;$ `XAF@^ srRya9k2i&_R ҍ <{܊`7пif-'