branch: externals/xelb commit ab96086534bd1ebdd6cbc8b84c0fc7587198d161 Author: Chris Feng <chris.w.f...@gmail.com> Commit: Chris Feng <chris.w.f...@gmail.com>
Prepare for GNU ELPA release * Transfer copyright to Free Software Foundation * Add packaging components (e.g. headers) * Drop support for Emacs < 24.4 * Coding style fixes: + Quote functions with "#'" + Wrap long lines + Fix doc strings / comments * Replace `string-to-int' with `string-to-number' * Fix compiling errors / eliminate compiling warnings * Remove the redundant COPYING file * Add .gitignore and .elpaignore * Rename README to README.md since the former may be used as the package description by packaging systems (we prefer the ';;; Commentary' header) --- .elpaignore | 1 + .gitignore | 1 + COPYING | 674 --------------------------------------------------- README | 9 - README.md | 10 + el_client.el | 132 +++++----- lib/xcb-xinput.el | 20 +- lib/xcb-xkb.el | 6 +- util/xcb-cursor.el | 42 ++-- util/xcb-ewmh.el | 15 +- util/xcb-icccm.el | 47 ++-- util/xcb-keysyms.el | 26 +- util/xcb-xim.el | 36 ++-- util/xcb-xlib.el | 11 +- xcb-types.el | 188 +++++++------- xcb.el | 80 ++++--- xelb.el | 68 +++++ 17 files changed, 380 insertions(+), 986 deletions(-) diff --git a/.elpaignore b/.elpaignore new file mode 100644 index 0000000..8f36919 --- /dev/null +++ b/.elpaignore @@ -0,0 +1 @@ +el_client.el diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c531d98 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.elc diff --git a/COPYING b/COPYING deleted file mode 100644 index 94a9ed0..0000000 --- a/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - 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. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>. - -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: - - <program> Copyright (C) <year> <name of author> - 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 -<http://www.gnu.org/licenses/>. - - 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 -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/README b/README deleted file mode 100644 index 5d87558..0000000 --- a/README +++ /dev/null @@ -1,9 +0,0 @@ -X protocol Emacs Lisp Binding -============================= - -XELB (X protocol Emacs Lisp Binding) is a pure Elisp implementation of the X -protocol based on the XML description files from XCB project. It features an -object-oriented API and permits a certain degree of concurrency. - -While XELB is developed and tested on Emacs 25, it should also work on recent -versions of Emacs 24. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c26009 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +X protocol Emacs Lisp Binding +============================= + +XELB (X protocol Emacs Lisp Binding) is a pure Elisp implementation of X11 +protocol based on the XML description files from XCB project. +It features an object-oriented API and permits a certain degree of concurrency. +It should enable you to implement some low-level X11 applications. +Please refer to +[xelb.el](https://github.com/ch11ng/xelb/blob/master/xelb.el) +for more details. diff --git a/el_client.el b/el_client.el index 9a5b6a1..ce5fa32 100644 --- a/el_client.el +++ b/el_client.el @@ -1,36 +1,35 @@ ;;; el_client.el --- XELB Code Generator -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: -;; el_client is responsible for converting XCB XML description files into Elisp -;; libraries. Here are a few design guidelines: +;; 'el_client' is responsible for converting XCB XML description files into +;; Elisp libraries. Here are a few design guidelines: ;; + The generated codes should be human-readable and conform to the Elisp -;; coding conventions. Names mentioned in X specifications are preferred. +;; coding conventions. Names mentioned in X specifications are preferred. ;; + Deprecated features such as <valueparam> should be dropped, for ;; - they would generate incompatible codes, and ;; - they are probably already dropped upstream. ;; + All documentations (within <doc> tags) and comments should be stripped -;; out to reduce the overall amount of code. XELB application developers are +;; out to reduce the overall amount of code. XELB application developers are ;; then encouraged to refer to the corresponding specifications to get an ;; authoritative explanation. @@ -43,12 +42,10 @@ (require 'cl-lib) -(setq pp-escape-newlines nil) - ;;;; Variables -(defvar prefix "xcb:" "Namespace of this module.") -(make-variable-buffer-local 'prefix) +(defvar ec-prefix "xcb:" "Namespace of this module.") +(make-variable-buffer-local 'ec-prefix) (defvar error-alist nil "Record X errors in this module.") (make-variable-buffer-local 'error-alist) @@ -117,14 +114,15 @@ an `xelb-auto-padding' attribute." (defun parse (file) "Parse an XCB protocol description file FILE (XML)." - (let (result header) + (let ((pp-escape-newlines nil) ;do not escape newlines + result header) (with-temp-buffer (insert-file-contents file) (setq result (libxml-parse-xml-region (point-min) (point-max) nil t)) (cl-assert (eq 'xcb (node-name result))) (setq header (node-attr result 'header)) (unless (string= header "xproto") - (setq prefix (concat prefix header ":"))) + (setq ec-prefix (concat ec-prefix header ":"))) ;; Print header (princ (format "\ ;;; -*- lexical-binding: t -*- @@ -136,16 +134,16 @@ an `xelb-auto-padding' attribute." (major-version (node-attr result 'major-version)) (minor-version (node-attr result 'minor-version))) (when extension-xname - (pp `(defconst ,(intern (concat prefix "-extension-xname")) + (pp `(defconst ,(intern (concat ec-prefix "-extension-xname")) ,extension-xname))) (when extension-name - (pp `(defconst ,(intern (concat prefix "-extension-name")) + (pp `(defconst ,(intern (concat ec-prefix "-extension-name")) ,extension-name))) (when major-version - (pp `(defconst ,(intern (concat prefix "-major-version")) + (pp `(defconst ,(intern (concat ec-prefix "-major-version")) ,(string-to-number major-version)))) (when minor-version - (pp `(defconst ,(intern (concat prefix "-minor-version")) + (pp `(defconst ,(intern (concat ec-prefix "-minor-version")) ,(string-to-number minor-version)))) (when (or extension-xname extension-name major-version minor-version) (princ "\n"))) @@ -158,11 +156,11 @@ an `xelb-auto-padding' attribute." (princ "\n")))) ;; Print error/event alists (when error-alist - (pp `(defconst ,(intern (concat prefix "error-number-class-alist")) + (pp `(defconst ,(intern (concat ec-prefix "error-number-class-alist")) ',error-alist "(error-number . error-class) alist")) (princ "\n")) (when event-alist - (pp `(defconst ,(intern (concat prefix "event-number-class-alist")) + (pp `(defconst ,(intern (concat ec-prefix "event-number-class-alist")) ',event-alist "(event-number . event-class) alist")) (princ "\n")) ;; Print footer @@ -171,7 +169,7 @@ an `xelb-auto-padding' attribute." ;;;; XCB: top-level elements (defun parse-top-level-element (node) - "Parse a top-level element." + "Parse a top-level node NODE." (setq pad-count -1) (pcase (node-name node) (`import (parse-import node)) @@ -197,26 +195,26 @@ an `xelb-auto-padding' attribute." (defun parse-struct (node) "Parse <struct>." - (let ((name (intern (concat prefix (node-attr node 'name)))) + (let ((name (intern (concat ec-prefix (node-attr node 'name)))) (contents (node-subnodes node t))) `((defclass ,name (xcb:-struct) - ,(apply 'nconc (mapcar 'parse-structure-content contents)))))) + ,(apply #'nconc (mapcar #'parse-structure-content contents)))))) (defun parse-union (node) "Parse <union>." - (let ((name (intern (concat prefix (node-attr node 'name)))) + (let ((name (intern (concat ec-prefix (node-attr node 'name)))) (contents (node-subnodes node))) `((defclass ,name (xcb:-union) - ,(apply 'nconc (mapcar 'parse-structure-content contents)))))) + ,(apply #'nconc (mapcar #'parse-structure-content contents)))))) (defun parse-xidtype (node) "Parse <xidtype>." - (let ((name (intern (concat prefix (node-attr node 'name))))) + (let ((name (intern (concat ec-prefix (node-attr node 'name))))) `((xcb:deftypealias ',name 'xcb:-u4)))) (defun parse-enum (node) "Parse <enum>." - (let ((name-prefix (concat prefix (node-attr node 'name) ":")) + (let ((name-prefix (concat ec-prefix (node-attr node 'name) ":")) (items (node-subnodes node)) (value 0)) (delq nil ;remove nil's produced by tags like <doc> @@ -235,16 +233,16 @@ an `xelb-auto-padding' attribute." "Parse <typedef>." (let* ((oldname (node-attr node 'oldname)) (oldname (or (intern-soft (concat "xcb:" oldname)) - (intern (concat prefix oldname)))) - (newname (intern (concat prefix (node-attr node 'newname))))) + (intern (concat ec-prefix oldname)))) + (newname (intern (concat ec-prefix (node-attr node 'newname))))) `((xcb:deftypealias ',newname ',oldname)))) (defun parse-request (node) "Parse <request>. The `combine-adjacent' attribute is simply ignored." - (let* ((name (intern (concat prefix (node-attr node 'name)))) - (opcode (string-to-int (node-attr node 'opcode))) + (let* ((name (intern (concat ec-prefix (node-attr node 'name)))) + (opcode (string-to-number (node-attr node 'opcode))) (contents `((~opcode :initform ,opcode :type xcb:-u1))) (subnodes (node-subnodes node t)) expressions @@ -261,11 +259,11 @@ The `combine-adjacent' attribute is simply ignored." ;; Parse <reply> (setq pad-count -1) ;reset padding counter (setq reply-name - (intern (concat prefix (node-attr node 'name) "~reply"))) + (intern (concat ec-prefix (node-attr node 'name) "~reply"))) (setq reply-contents (node-subnodes i t)) (setq reply-contents - (apply 'nconc - (mapcar 'parse-structure-content reply-contents))))) + (apply #'nconc + (mapcar #'parse-structure-content reply-contents))))) (delq nil contents) (delq nil `((defclass ,name (xcb:-request) ,contents) @@ -284,11 +282,11 @@ The `combine-adjacent' attribute is simply ignored." The `no-sequence-number' is ignored here since it's only used for KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." - (let ((name (intern (concat prefix (node-attr node 'name)))) - (event-number (string-to-int (node-attr node 'number))) + (let ((name (intern (concat ec-prefix (node-attr node 'name)))) + (event-number (string-to-number (node-attr node 'number))) (xge (node-attr node 'xge)) (contents (node-subnodes node t))) - (setq contents (apply 'nconc (mapcar 'parse-structure-content contents))) + (setq contents (apply #'nconc (mapcar #'parse-structure-content contents))) (when xge ;generic event (setq contents (append @@ -301,37 +299,37 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (defun parse-error (node) "Parse <error>." - (let ((name (intern (concat prefix (node-attr node 'name)))) - (error-number (string-to-int (node-attr node 'number))) + (let ((name (intern (concat ec-prefix (node-attr node 'name)))) + (error-number (string-to-number (node-attr node 'number))) (contents (node-subnodes node t))) (setq error-alist (nconc error-alist `((,error-number . ,name)))) `((defclass ,name (xcb:-error) - ,(apply 'nconc (mapcar 'parse-structure-content contents)))))) + ,(apply #'nconc (mapcar #'parse-structure-content contents)))))) (defun parse-eventcopy (node) "Parse <eventcopy>." - (let* ((name (intern (concat prefix (node-attr node 'name)))) + (let* ((name (intern (concat ec-prefix (node-attr node 'name)))) (refname (node-attr node 'ref)) (refname (or (intern-soft (concat "xcb:" refname)) - (intern (concat prefix refname)))) - (event-number (string-to-int (node-attr node 'number)))) + (intern (concat ec-prefix refname)))) + (event-number (string-to-number (node-attr node 'number)))) (setq event-alist (nconc event-alist `((,event-number . ,name)))) `((defclass ,name (xcb:-event ,refname) nil)))) ;shadow the method of ref (defun parse-errorcopy (node) "Parse <errorcopy>." - (let* ((name (intern (concat prefix (node-attr node 'name)))) + (let* ((name (intern (concat ec-prefix (node-attr node 'name)))) (refname (node-attr node 'ref)) (refname (or (intern-soft (concat "xcb:" refname)) - (intern (concat prefix refname)))) - (error-number (string-to-int (node-attr node 'number)))) + (intern (concat ec-prefix refname)))) + (error-number (string-to-number (node-attr node 'number)))) (setq error-alist (nconc error-alist `((,error-number . ,name)))) `((defclass ,name (xcb:-error ,refname) nil)))) ;shadow the method of ref ;;;; XCB: structure contents (defun parse-structure-content (node) - "Parse a structure content." + "Parse a structure content node NODE." (pcase (node-name node) (`pad (parse-pad node)) (`field (parse-field node)) @@ -349,10 +347,10 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (align (node-attr node 'align))) (if bytes `((,(generate-pad-name) - :initform ,(string-to-int bytes) :type xcb:-pad)) + :initform ,(string-to-number bytes) :type xcb:-pad)) (if align `((,(generate-pad-name) - :initform ,(string-to-int align) :type xcb:-pad-align)) + :initform ,(string-to-number align) :type xcb:-pad-align)) (error "Invalid <pad> field"))))) (defun parse-field (node) @@ -360,7 +358,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (let* ((name (intern (node-attr-escape node 'name))) (type (node-attr node 'type)) (type (or (intern-soft (concat "xcb:" type)) ;extension or xproto - (intern (concat prefix type))))) + (intern (concat ec-prefix type))))) `((,name :initarg ,(intern (concat ":" (symbol-name name))) :type ,type)))) (defun parse-fd (node) @@ -374,7 +372,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (name-alt (intern (concat (node-attr-escape node 'name) "~"))) (type (node-attr node 'type)) (type (or (intern-soft (concat "xcb:" type)) - (intern (concat prefix type)))) + (intern (concat ec-prefix type)))) (size (parse-expression (node-subnode node)))) `((,name :initarg ,(intern (concat ":" (symbol-name name))) :type xcb:-ignore) @@ -393,7 +391,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (let* ((name (intern (node-attr-escape node 'name))) (type (node-attr node 'type)) (type (or (intern-soft (concat "xcb:" type)) - (intern (concat prefix type)))) + (intern (concat ec-prefix type)))) (value (parse-expression (node-subnode node)))) `((,name :type ,type) (setf (slot-value obj ',name) ',value)))) @@ -406,7 +404,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (let ((name (intern (node-attr-escape node 'name))) (expression (parse-expression (car (node-subnodes node)))) (cases (cdr (node-subnodes node))) - fields fields-name) + fields) ;; Avoid duplicated slot names by appending "*" if necessary (let (names name) (dolist (case cases) @@ -421,7 +419,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (while (member name names) (setq name (concat name "*"))) (setcdr (assoc 'name (cadr field)) name)) - (cl-pushnew name names :test 'equal)))))))) + (cl-pushnew name names :test #'equal)))))))) (setq cases (mapcar (lambda (i) (let ((case-name (node-name i)) @@ -432,7 +430,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (`enumref (setq condition (nconc condition (list (parse-enumref j))))) - (x + (_ (setq tmp (parse-structure-content j)) (setq fields (nconc fields tmp)) (setq name-list @@ -450,7 +448,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." ;;;; XCB: expressions (defun parse-expression (node) - "Parse an expression." + "Parse an expression node NODE." (when node (pcase (node-name node) (`op (parse-op node)) @@ -463,7 +461,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (`sumof (parse-sumof node)) (`popcount (parse-popcount node)) (`listelement-ref (parse-listelement-ref node)) - ((or `comment `doc)) ;simply ignored + ((or `comment `doc)) ;simply ignored (x (error "Unsupported expression: <%s>" x))))) (defun parse-op (node) @@ -490,11 +488,11 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (defun parse-value (node) "Parse <value>." - (string-to-int (replace-regexp-in-string "^0x" "#x" (node-subnode node)))) + (string-to-number (replace-regexp-in-string "^0x" "#x" (node-subnode node)))) (defun parse-bit (node) "Parse <bit>." - (let ((bit (string-to-int (node-subnode node)))) + (let ((bit (string-to-number (node-subnode node)))) (cl-assert (and (<= 0 bit) (>= 31 bit))) (lsh 1 bit))) @@ -502,7 +500,7 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." "Parse <enumref>." (let ((name (concat (node-attr node 'ref) ":" (node-subnode node)))) (or (intern-soft (concat "xcb:" name)) - (intern (concat prefix name))))) + (intern (concat ec-prefix name))))) (defun parse-unop (node) "Parse <unop>." @@ -515,18 +513,18 @@ KeymapNotify event; instead, we handle this case in `xcb:unmarshal'." (expression (node-subnode node)) (list-data `(slot-value obj ',ref))) (if (not expression) - `(apply '+ ,list-data) + `(apply #'+ ,list-data) (setq expression (parse-expression expression)) - `(apply '+ (mapcar (lambda (i) - (eval ',expression (list (nconc '(obj) i)))) - ,list-data))))) + `(apply #'+ (mapcar (lambda (i) + (eval ',expression (list (nconc '(obj) i)))) + ,list-data))))) (defun parse-popcount (node) "Parse <popcount>." (let ((expression (parse-expression (node-subnode node)))) `(xcb:-popcount ,expression))) -(defun parse-listelement-ref (node) +(defun parse-listelement-ref (_node) "Parse <listelement-ref>." 'obj) ;a list element is internally named 'obj' diff --git a/lib/xcb-xinput.el b/lib/xcb-xinput.el index 2bb0ab8..8641ee9 100644 --- a/lib/xcb-xinput.el +++ b/lib/xcb-xinput.el @@ -157,7 +157,7 @@ (infos :initarg :infos :type xcb:-ignore) (infos~ :initform '(name infos type xcb:xinput:InputInfo size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2256,7 +2256,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2312,7 +2312,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2459,7 +2459,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2475,7 +2475,7 @@ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore) (axisvalues-raw~ :initform '(name axisvalues-raw type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2513,7 +2513,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2529,7 +2529,7 @@ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore) (axisvalues-raw~ :initform '(name axisvalues-raw type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2590,7 +2590,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2650,7 +2650,7 @@ (axisvalues :initarg :axisvalues :type xcb:-ignore) (axisvalues~ :initform '(name axisvalues type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) @@ -2666,7 +2666,7 @@ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore) (axisvalues-raw~ :initform '(name axisvalues-raw type xcb:xinput:FP3232 size - (apply '+ + (apply #'+ (mapcar (lambda (i) diff --git a/lib/xcb-xkb.el b/lib/xcb-xkb.el index 267cbe5..a60fe5e 100644 --- a/lib/xcb-xkb.el +++ b/lib/xcb-xkb.el @@ -1491,7 +1491,7 @@ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore) (ktLevelNames~ :initform '(name ktLevelNames type xcb:ATOM size - (apply '+ + (apply #'+ (slot-value obj 'nLevelsPerType))) :type xcb:-list) (indicatorNames :initarg :indicatorNames :type xcb:-ignore) @@ -1585,7 +1585,7 @@ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore) (ktLevelNames~ :initform '(name ktLevelNames type xcb:ATOM size - (apply '+ + (apply #'+ (slot-value obj 'nLevelsPerType))) :type xcb:-list) (indicatorNames :initarg :indicatorNames :type xcb:-ignore) @@ -1905,7 +1905,7 @@ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore) (ktLevelNames~ :initform '(name ktLevelNames type xcb:ATOM size - (apply '+ + (apply #'+ (slot-value obj 'nLevelsPerType))) :type xcb:-list) (indicatorNames :initarg :indicatorNames :type xcb:-ignore) diff --git a/util/xcb-cursor.el b/util/xcb-cursor.el index 5579fff..471e318 100644 --- a/util/xcb-cursor.el +++ b/util/xcb-cursor.el @@ -1,24 +1,23 @@ ;;; xcb-cursor.el --- Port of Xcursor -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: @@ -48,7 +47,7 @@ ;;; Code: -(require 'xcb-xproto) +(require 'xcb) (require 'xcb-render) ;; FIXME: check if resource manager really works @@ -66,7 +65,7 @@ :long-length 16384))) ;FIXME: xcb/util-cursor (rm (split-string (decode-coding-string - (apply 'unibyte-string (append (slot-value rm 'value) nil)) + (apply #'unibyte-string (append (slot-value rm 'value) nil)) 'iso-latin-1) "\n")) theme size dpi) @@ -77,16 +76,16 @@ (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i))) ("Xcursor.size" (setq size - (string-to-int (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" - "\\1" i)))) + (string-to-number + (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i)))) ("Xft.dpi" (setq dpi - (string-to-int (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" - "\\1" i)))))) + (string-to-number + (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i)))))) ;; Get cursor size from XCURSOR_SIZE environment variable (let ((default-size (getenv "XCURSOR_SIZE"))) (when default-size - (setq default-size (string-to-int default-size))) + (setq default-size (string-to-number default-size))) (setq size (or default-size size))) ;; Alternatives (when (and (not size) dpi) @@ -102,8 +101,7 @@ (setf (slot-value obj 'extra-plist) (plist-put (slot-value obj 'extra-plist) 'cursor plist)))) ;; Initialize render extension - (if (= 0 (slot-value (xcb:get-extension-data exwm--connection 'xcb:render) - 'present)) + (if (= 0 (slot-value (xcb:get-extension-data obj 'xcb:render) 'present)) (error "[XELB:CURSOR] Render extension is not supported by this server") (with-slots (minor-version) (xcb:+request-unchecked+reply obj @@ -160,6 +158,11 @@ "\\1" line) "[;, \t\n]+" t))))))) +(defsubst xcb:cursor:-shape->id (name) + "Return the standard Xcursor font for cursor named NAME." + ;; Standard X cursor fonts are defined in Emacs + (intern-soft (concat "x-pointer-" (replace-regexp-in-string "_" "-" name)))) + (defun xcb:cursor:-find-file (theme name &optional skip) "Return the file for cursor named NAME in theme THEME, or nil if not found." (catch 'return @@ -355,8 +358,8 @@ :data (with-temp-buffer (set-buffer-multibyte nil) (mapconcat - (if lsb 'xcb:-pack-u4-lsb - 'xcb:-pack-u4) + (if lsb #'xcb:-pack-u4-lsb + #'xcb:-pack-u4) pixels [])))) (xcb:+request obj (make-instance 'xcb:render:CreatePicture :pid picture @@ -391,11 +394,6 @@ (xcb:flush obj) cursor))) -(defsubst xcb:cursor:-shape->id (name) - "Return the standard Xcursor font for cursor named NAME." - ;; Standard X cursor fonts are defined in Emacs - (intern-soft (concat "x-pointer-" (replace-regexp-in-string "_" "-" name)))) - (cl-defmethod xcb:cursor:load-cursor ((obj xcb:connection) name) "Return a cursor whose name is NAME." (let* ((theme (or (plist-get diff --git a/util/xcb-ewmh.el b/util/xcb-ewmh.el index f5f00ff..84161ee 100644 --- a/util/xcb-ewmh.el +++ b/util/xcb-ewmh.el @@ -1,24 +1,23 @@ ;;; xcb-ewmh.el --- Extended Window Manager Hints -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: @@ -32,7 +31,7 @@ ;; + Initialize this library auto loads and initializes 'xcb-icccm'. ;; Todo: -;; + Interned atoms are actually connection-dependent. Currently they are +;; + Interned atoms are actually connection-dependent. Currently they are ;; simply saved as global variables. ;; + Is UTF-8 string NULL-terminated? ;; + _NET_WM_CM_Sn (should implement "manager selection" in ICCCM first) @@ -43,7 +42,7 @@ ;;; Code: -(require 'xcb-xproto) +(require 'xcb) (require 'xcb-icccm) ;;;; EWMH Atoms diff --git a/util/xcb-icccm.el b/util/xcb-icccm.el index 0e96849..3608c1b 100644 --- a/util/xcb-icccm.el +++ b/util/xcb-icccm.el @@ -1,25 +1,24 @@ ;;; xcb-icccm.el --- Inter-Client Communication -*- lexical-binding: t -*- ;;; Conventions Manual -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: @@ -32,7 +31,7 @@ ;; messages defined in this library. ;; Todo: -;; + Interned atoms are actually connection-dependent. Currently they are +;; + Interned atoms are actually connection-dependent. Currently they are ;; simply saved as global variables. ;; References: @@ -41,7 +40,7 @@ ;;; Code: -(require 'xcb-xproto) +(require 'xcb) ;;;; ICCCM atoms @@ -87,9 +86,9 @@ The value of these atoms will be available in `xcb:Atom' namespace." (xcb:icccm:--ClientMessage xcb:ClientMessage) ((format :initform 32) (type :initform xcb:Atom:WM_PROTOCOLS) - (protocol :type xcb:ATOM) ;new slot - (time :initarg :time :type xcb:TIMESTAMP) ;new slot - (pad~0 :initform 12 :type xcb:-pad)) ;new slot + (protocol :type xcb:ATOM) ;new slot + (time :initarg :time :type xcb:TIMESTAMP) ;new slot + (pad~0 :initform 12 :type xcb:-pad)) ;new slot :documentation "An ICCCM client message with data slot replaced by protocol and time.") @@ -137,22 +136,22 @@ This method automatically format the value as 8, 16 or 32 bits array." (16 (cl-assert (= (* 2 value-len) (length tmp))) (if ~lsb - (dotimes (i value-len) + (dotimes (_ value-len) (setf value (vconcat value (vector (xcb:-unpack-u2-lsb tmp 0)))) (setq tmp (substring tmp 2))) - (dotimes (i value-len) + (dotimes (_ value-len) (setf value (vconcat value (vector (xcb:-unpack-u2 tmp 0)))) (setq tmp (substring tmp 2))))) (32 (cl-assert (= (* 4 value-len) (length tmp))) (if ~lsb - (dotimes (i value-len) + (dotimes (_ value-len) (setf value (vconcat value (vector (xcb:-unpack-u4-lsb tmp 0)))) (setq tmp (substring tmp 4))) - (dotimes (i value-len) + (dotimes (_ value-len) (setf value (vconcat value (vector (xcb:-unpack-u4 tmp 0)))) (setq tmp (substring tmp 4))))) (_ (cl-assert nil))))) @@ -204,10 +203,10 @@ This method automatically decodes the value (as string)." (when (and value (= format 8)) (setf value (decode-coding-string - (apply 'unibyte-string (append value nil)) - (cond ((eq type xcb:Atom:UTF8_STRING) 'utf-8) - ((eq type xcb:Atom:STRING) 'iso-latin-1) - ((eq type xcb:Atom:COMPOUND_TEXT) + (apply #'unibyte-string (append value nil)) + (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8) + ((= type xcb:Atom:STRING) 'iso-latin-1) + ((= type xcb:Atom:COMPOUND_TEXT) 'compound-text-with-extensions) ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING)) 'no-conversion) @@ -231,9 +230,9 @@ This method automatically encodes the data (which is a string)." (vconcat (encode-coding-string data - (cond ((eq type xcb:Atom:UTF8_STRING) 'utf-8) - ((eq type xcb:Atom:STRING) 'iso-latin-1) - ((eq type xcb:Atom:COMPOUND_TEXT) + (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8) + ((= type xcb:Atom:STRING) 'iso-latin-1) + ((= type xcb:Atom:COMPOUND_TEXT) 'compound-text-with-extensions) ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING)) 'no-conversion) @@ -289,7 +288,7 @@ request OBJ." "Fill in the reply of an ICCCM GetProperty request whose fields are explicitly listed out." (let* ((retval (cl-call-next-method obj byte-array)) - (slots-orig (eieio-class-slots xcb:icccm:-GetProperty~reply)) + (slots-orig (eieio-class-slots 'xcb:icccm:-GetProperty~reply)) (slots (eieio-class-slots (eieio-object-class obj))) (slots (nthcdr (length slots-orig) slots)) (value (slot-value obj 'value))) @@ -308,7 +307,7 @@ out.") (cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-explicit)) "Return the byte-array representation of an ICCCM ChangeProperty request whose fields are explicitly listed out." - (let* ((slots-orig (eieio-class-slots xcb:icccm:-ChangeProperty)) + (let* ((slots-orig (eieio-class-slots 'xcb:icccm:-ChangeProperty)) (slots (eieio-class-slots (eieio-object-class obj))) (slots (nthcdr (length slots-orig) slots))) ;; Set data field from explicit fields diff --git a/util/xcb-keysyms.el b/util/xcb-keysyms.el index 7f9e5e5..01bb96c 100644 --- a/util/xcb-keysyms.el +++ b/util/xcb-keysyms.el @@ -1,25 +1,24 @@ ;;; xcb-keysyms.el --- Conversion between -*- lexical-binding: t -*- ;;; X keysyms, X keycodes and Emacs key event. -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: @@ -105,7 +104,7 @@ This method must be called before using any other method in this module." (cl-assert (= (length keycodes) (* 8 keycodes-per-modifier))) (dotimes (i 8) (setq events nil) - (dotimes (j keycodes-per-modifier) + (dotimes (_ keycodes-per-modifier) (when (and (/= (setq keycode (pop keycodes)) 0) (setq keysym (xcb:keysyms:keycode->keysym obj keycode 0))) (setq events @@ -121,7 +120,7 @@ This method must be called before using any other method in this module." (dolist (i (frame-list)) (when (frame-parameter i 'window-id) (throw 'break i)))))) - (id (string-to-int (frame-parameter frame 'window-id))) + (id (string-to-number (frame-parameter frame 'window-id))) (root (slot-value (car (slot-value (xcb:get-setup obj) 'roots)) 'root)) (keycode (xcb:keysyms:keysym->keycode obj ?a)) @@ -239,10 +238,10 @@ SHIFT LOCK is ignored." lmeta* rmeta* lalt* ralt* lsuper* rsuper* lhyper* rhyper* ;#xff00 - #xffff ,@(make-list 15 nil) delete) - "Emacs event representations of X function keys (keysym #xff00 to #xffff)") + "Emacs event representations of X function keys (keysym #xff00 to #xffff).") (defun xcb:keysyms:event->keysym (event) - "Translate Emacs key event to X Keysym. + "Translate Emacs key event EVENT to X Keysym. This function returns nil when it fails to convert an event." (let ((modifiers (event-modifiers event)) @@ -267,7 +266,7 @@ This function returns nil when it fails to convert an event." (setq keysym (logior keysym #xff00))) `(,keysym ;; state for KeyPress event - ,(apply 'logior + ,(apply #'logior (mapcar (lambda (i) (pcase i (`meta xcb:keysyms:meta-mask) @@ -282,7 +281,10 @@ This function returns nil when it fails to convert an event." modifiers)))))) (defun xcb:keysyms:keysym->event (keysym &optional mask allow-modifiers) - "Translate X Keysym into Emacs key event." + "Translate X Keysym KEYSYM into Emacs key event. + +One may use MASK to provide modifier keys. If ALLOW-MODIFIERS is non-nil, +this function will also return symbols for pure modifiers keys." (let ((event (cond ((and (<= #x20 keysym) (>= #xff keysym)) keysym) ((and (<= #xff00 keysym) (>= #xffff keysym)) diff --git a/util/xcb-xim.el b/util/xcb-xim.el index 847db54..847949f 100644 --- a/util/xcb-xim.el +++ b/util/xcb-xim.el @@ -1,32 +1,31 @@ ;;; xcb-xim.el --- XIM Protocol -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: ;; This library implements the X Input Method Protocol. ;; Please note that the byte order of an XIM packet can be different from that -;; of X packets. Moreover, if you are writing an XIM server, the byte order is -;; actually specified by the client. Therefore we provide a different global +;; of X packets. Moreover, if you are writing an XIM server, the byte order is +;; actually specified by the client. Therefore we provide a different global ;; variable `xim:lsb' to indicate the byte order of classes in this library. ;; You should let-bind it whenever creating new objects. @@ -106,7 +105,7 @@ ;;;; Basic requests packet format -(defvar xim:lsb xcb:lsb "t for LSB first, nil otherwise. +(defvar xim:lsb xcb:lsb "Non-nil for LSB first, nil otherwise. Consider let-bind it rather than change its global value.") @@ -125,8 +124,8 @@ Consider let-bind it rather than change its global value.") (let ((result (cl-call-next-method obj))) (vconcat (substring result 0 2) (funcall (if (slot-value obj '~lsb) - 'xcb:-pack-u2-lsb - 'xcb:-pack-u2) + #'xcb:-pack-u2-lsb + #'xcb:-pack-u2) (1- (/ (length result) 4))) (substring result 4)))) @@ -137,6 +136,7 @@ Consider let-bind it rather than change its global value.") (xcb:deftypealias 'xim:BITMASK32 'xcb:CARD32) (defsubst xim:PADDING (N) + "Pad N to 4 bytes." (% (- 4 (% N 4)) 4)) (xcb:deftypealias 'xim:LPCE 'xcb:char) @@ -459,8 +459,8 @@ Consider let-bind it rather than change its global value.") :type xcb:-list))) (cl-defmethod xcb:marshal ((obj xim:open-reply)) - (let ((im-attrs (mapconcat 'xcb:marshal (slot-value obj 'im-attrs) [])) - (ic-attrs (mapconcat 'xcb:marshal (slot-value obj 'ic-attrs) []))) + (let ((im-attrs (mapconcat #'xcb:marshal (slot-value obj 'im-attrs) [])) + (ic-attrs (mapconcat #'xcb:marshal (slot-value obj 'ic-attrs) []))) (setf (slot-value obj 'im-attrs-length) (length im-attrs) (slot-value obj 'im-attrs) im-attrs (slot-value obj 'ic-attrs-length) (length ic-attrs) @@ -553,8 +553,8 @@ Consider let-bind it rather than change its global value.") :type xcb:-list))) (cl-defmethod xcb:marshal ((obj xim:encoding-negotiation)) - (let ((names (mapconcat 'xcb:marshal (slot-value obj 'names) [])) - (encodings (mapconcat 'xcb:marshal (slot-value obj 'encodings) []))) + (let ((names (mapconcat #'xcb:marshal (slot-value obj 'names) [])) + (encodings (mapconcat #'xcb:marshal (slot-value obj 'encodings) []))) (setf (slot-value obj 'names-length) (length names) (slot-value obj 'names) names (slot-value obj 'encodings-length) (length encodings) @@ -602,7 +602,7 @@ Consider let-bind it rather than change its global value.") (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad))) (cl-defmethod xcb:marshal ((obj xim:query-extension)) - (let ((extensions (mapconcat 'xcb:marshal (slot-value obj 'extensions) []))) + (let ((extensions (mapconcat #'xcb:marshal (slot-value obj 'extensions) []))) (setf (slot-value obj 'length) (length extensions) (slot-value obj 'extensions) extensions) (cl-call-next-method obj))) @@ -656,7 +656,7 @@ Consider let-bind it rather than change its global value.") :type xcb:-list))) (cl-defmethod xcb:marshal ((obj xim:set-im-values)) - (let ((im-attributes (mapconcat 'xcb:marshal + (let ((im-attributes (mapconcat #'xcb:marshal (slot-value obj 'im-attributes) []))) (setf (slot-value obj 'length) (length im-attributes) (slot-value obj 'im-attributes) im-attributes) @@ -693,7 +693,7 @@ Consider let-bind it rather than change its global value.") :type xcb:-list))) (cl-defmethod xcb:marshal ((obj xim:create-ic)) - (let ((ic-attributes (mapconcat 'xcb:marshal + (let ((ic-attributes (mapconcat #'xcb:marshal (slot-value obj 'ic-attributes) []))) (setf (slot-value obj 'length) (length ic-attributes) (slot-value obj 'ic-attributes) ic-attributes) diff --git a/util/xcb-xlib.el b/util/xcb-xlib.el index f5e86d8..a377330 100644 --- a/util/xcb-xlib.el +++ b/util/xcb-xlib.el @@ -1,24 +1,23 @@ ;;; xcb-xlib.el --- Port of Xlib -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: diff --git a/xcb-types.el b/xcb-types.el index d808c83..0d16a08 100644 --- a/xcb-types.el +++ b/xcb-types.el @@ -1,46 +1,45 @@ ;;; xcb-types.el --- Type definitions for XCB -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: -;; This library defines various data types frequently used in XELB. Simple +;; This library defines various data types frequently used in XELB. Simple ;; types are defined with `cl-deftype' while others are defined as classes. ;; Basically, data types are used for converting objects to/from byte arrays -;; rather than for validation purpose. Classes defined elsewhere should also +;; rather than for validation purpose. Classes defined elsewhere should also ;; support `xcb:marshal' and `xcb:unmarshal' methods in order to be considered -;; a type. Most classes defined here are direct or indirect subclasses of +;; a type. Most classes defined here are direct or indirect subclasses of ;; `xcb:-struct', which has implemented the fundamental marshalling and -;; unmarshalling methods. These classes again act as the superclasses for more -;; concrete ones. You may use `eieio-browse' to easily get an overview of the +;; unmarshalling methods. These classes again act as the superclasses for more +;; concrete ones. You may use `eieio-browse' to easily get an overview of the ;; inheritance hierarchies of all classes defined. ;; Please pay special attention to the byte order adopted in your application. ;; The global variable `xcb:lsb' specifies the byte order at the time of -;; instantiating a class (e.g. via `make-instance'). You may let-bind it to +;; instantiating a class (e.g. via `make-instance'). You may let-bind it to ;; temporarily change the byte order locally. ;; Todo: ;; + The current implementation of `eieio-default-eval-maybe' only `eval's a -;; certain type of forms. If this is changed in the future, we will have to +;; certain type of forms. If this is changed in the future, we will have to ;; adapt our codes accordingly. ;; + STRING16 and CHAR2B should always be big-endian. ;; + <paramref> for `xcb:-marshal-field'? @@ -77,12 +76,7 @@ result)) (defsubst cl--slot-descriptor-name (slot) (elt slot 0)) (defsubst cl--slot-descriptor-initform (slot) (elt slot 1)) - (defsubst cl--slot-descriptor-type (slot) (elt slot 2)) - ;; More fixes for Emacs < 24.4 - (unless (fboundp 'eieio--class-public-a) - (defsubst eieio--class-public-a (slot) (aref slot class-public-a)) - (defsubst eieio--class-public-d (slot) (aref slot class-public-d)) - (defsubst eieio--class-public-type (slot) (aref slot class-public-type)))) + (defsubst cl--slot-descriptor-type (slot) (elt slot 2))) ;;;; Utility functions @@ -113,36 +107,39 @@ (xcb:-pack-u2-lsb (if (>= value 0) value (1+ (logand #xFFFF (lognot (- value))))))) -(if (/= 0 (lsh 1 32)) - ;; 64 bit - (progn - (defsubst xcb:-pack-u4 (value) - "4 bytes unsigned integer => byte array (MSB first, 64-bit)." - (vector (logand (lsh value -24) #xFF) (logand (lsh value -16) #xFF) - (logand (lsh value -8) #xFF) (logand value #xFF))) - (defsubst xcb:-pack-u4-lsb (value) - "4 byte unsigned integer => byte array (LSB first, 64-bit)." - (vector (logand value #xFF) (logand (lsh value -8) #xFF) - (logand (lsh value -16) #xFF) (logand (lsh value -24) #xFF)))) - ;; 32 bit (30-bit actually; large numbers are represented as float type) - (defsubst xcb:-pack-u4 (value) - "4 bytes unsigned integer => byte array (MSB first, 32-bit)." - (if (integerp value) - (vector (logand (lsh value -24) #xFF) (logand (lsh value -16) #xFF) - (logand (lsh value -8) #xFF) (logand value #xFF)) - (let* ((msw (truncate value #x10000)) - (lsw (truncate (- value (* msw 65536.0))))) - (vector (logand (lsh msw -8) #xFF) (logand msw #xFF) - (logand (lsh lsw -8) #xFF) (logand lsw #xFF))))) - (defsubst xcb:-pack-u4-lsb (value) - "4 bytes unsigned integer => byte array (LSB first, 32-bit)." - (if (integerp value) - (vector (logand value #xFF) (logand (lsh value -8) #xFF) - (logand (lsh value -16) #xFF) (logand (lsh value -24) #xFF)) - (let* ((msw (truncate value #x10000)) - (lsw (truncate (- value (* msw 65536.0))))) - (vector (logand lsw #xFF) (logand (lsh lsw -8) #xFF) - (logand msw #xFF) (logand (lsh msw -8) #xFF)))))) +(eval-and-compile + (if (/= 0 (lsh 1 32)) + ;; 64 bit + (progn + (defsubst xcb:-pack-u4 (value) + "4 bytes unsigned integer => byte array (MSB first, 64-bit)." + (vector (logand (lsh value -24) #xFF) (logand (lsh value -16) #xFF) + (logand (lsh value -8) #xFF) (logand value #xFF))) + (defsubst xcb:-pack-u4-lsb (value) + "4 byte unsigned integer => byte array (LSB first, 64-bit)." + (vector (logand value #xFF) + (logand (lsh value -8) #xFF) + (logand (lsh value -16) #xFF) + (logand (lsh value -24) #xFF)))) + ;; 32 bit (30-bit actually; large numbers are represented as float type) + (defsubst xcb:-pack-u4 (value) + "4 bytes unsigned integer => byte array (MSB first, 32-bit)." + (if (integerp value) + (vector (logand (lsh value -24) #xFF) (logand (lsh value -16) #xFF) + (logand (lsh value -8) #xFF) (logand value #xFF)) + (let* ((msw (truncate value #x10000)) + (lsw (truncate (- value (* msw 65536.0))))) + (vector (logand (lsh msw -8) #xFF) (logand msw #xFF) + (logand (lsh lsw -8) #xFF) (logand lsw #xFF))))) + (defsubst xcb:-pack-u4-lsb (value) + "4 bytes unsigned integer => byte array (LSB first, 32-bit)." + (if (integerp value) + (vector (logand value #xFF) (logand (lsh value -8) #xFF) + (logand (lsh value -16) #xFF) (logand (lsh value -24) #xFF)) + (let* ((msw (truncate value #x10000)) + (lsw (truncate (- value (* msw 65536.0))))) + (vector (logand lsw #xFF) (logand (lsh lsw -8) #xFF) + (logand msw #xFF) (logand (lsh msw -8) #xFF))))))) (defsubst xcb:-pack-i4 (value) "4 bytes signed integer => byte array (MSB first)." @@ -189,33 +186,34 @@ value (- (logand #xFFFF (lognot (1- value))))))) -(if (/= 0 (lsh 1 32)) - ;; 64-bit - (progn - (defsubst xcb:-unpack-u4 (data offset) - "Byte array => 4 bytes unsigned integer (MSB first, 64-bit)." - (logior (lsh (elt data offset) 24) (lsh (elt data (1+ offset)) 16) - (lsh (elt data (+ offset 2)) 8) (elt data (+ offset 3)))) - (defsubst xcb:-unpack-u4-lsb (data offset) - "Byte array => 4 bytes unsigned integer (LSB first, 64-bit)." - (logior (elt data offset) (lsh (elt data (1+ offset)) 8) - (lsh (elt data (+ offset 2)) 16) - (lsh (elt data (+ offset 3)) 24)))) - ;; 32-bit (30-bit actually; large numbers are represented as float type) - (defsubst xcb:-unpack-u4 (data offset) - "Byte array => 4 bytes unsigned integer (MSB first, 32-bit)." - (let ((msb (elt data offset))) - (+ (if (> msb 31) (* msb 16777216.0) (lsh msb 24)) - (logior (lsh (elt data (1+ offset)) 16) - (lsh (elt data (+ offset 2)) 8) - (elt data (+ offset 3)))))) - (defsubst xcb:-unpack-u4-lsb (data offset) - "Byte array => 4 bytes unsigned integer (LSB first, 32-bit)." - (let ((msb (elt data (+ offset 3)))) - (+ (if (> msb 31) (* msb 16777216.0) (lsh msb 24)) - (logior (elt data offset) - (lsh (elt data (1+ offset)) 8) - (lsh (elt data (+ offset 2)) 16)))))) +(eval-and-compile + (if (/= 0 (lsh 1 32)) + ;; 64-bit + (progn + (defsubst xcb:-unpack-u4 (data offset) + "Byte array => 4 bytes unsigned integer (MSB first, 64-bit)." + (logior (lsh (elt data offset) 24) (lsh (elt data (1+ offset)) 16) + (lsh (elt data (+ offset 2)) 8) (elt data (+ offset 3)))) + (defsubst xcb:-unpack-u4-lsb (data offset) + "Byte array => 4 bytes unsigned integer (LSB first, 64-bit)." + (logior (elt data offset) (lsh (elt data (1+ offset)) 8) + (lsh (elt data (+ offset 2)) 16) + (lsh (elt data (+ offset 3)) 24)))) + ;; 32-bit (30-bit actually; large numbers are represented as float type) + (defsubst xcb:-unpack-u4 (data offset) + "Byte array => 4 bytes unsigned integer (MSB first, 32-bit)." + (let ((msb (elt data offset))) + (+ (if (> msb 31) (* msb 16777216.0) (lsh msb 24)) + (logior (lsh (elt data (1+ offset)) 16) + (lsh (elt data (+ offset 2)) 8) + (elt data (+ offset 3)))))) + (defsubst xcb:-unpack-u4-lsb (data offset) + "Byte array => 4 bytes unsigned integer (LSB first, 32-bit)." + (let ((msb (elt data (+ offset 3)))) + (+ (if (> msb 31) (* msb 16777216.0) (lsh msb 24)) + (logior (elt data offset) + (lsh (elt data (1+ offset)) 8) + (lsh (elt data (+ offset 2)) 16))))))) (defsubst xcb:-unpack-i4 (data offset) "Byte array => 4 bytes signed integer (MSB first)." @@ -241,9 +239,9 @@ (defsubst xcb:-popcount (mask) "Return the popcount of integer MASK." - (apply '+ (mapcar (lambda (i) - (logand (lsh mask i) 1)) - (number-sequence -31 0)))) ;32-bit number assumed (CARD32) + (apply #'+ (mapcar (lambda (i) + (logand (lsh mask i) 1)) + (number-sequence -31 0)))) ;32-bit number assumed (CARD32) (defsubst xcb:-request-class->reply-class (request) "Return the reply class corresponding to the request class REQUEST." @@ -253,7 +251,7 @@ ;; typedef in C (defmacro xcb:deftypealias (new-type old-type) - "Define NEW-TYPE as an alias of type OLD-TYPE" + "Define NEW-TYPE as an alias of type OLD-TYPE." `(progn (cl-deftype ,(eval new-type) nil ,old-type) (defvaralias ,new-type ,old-type))) @@ -291,7 +289,7 @@ ;;;; Struct type -(defvar xcb:lsb t "t for LSB first (i.e., little-endian), nil otherwise. +(defvar xcb:lsb t "Non-nil for LSB first (i.e., little-endian), nil otherwise. Consider let-bind it rather than change its global value.") @@ -346,7 +344,7 @@ The optional POS argument indicates current byte index of the field (used by (unless (integerp value) (setq value (eval value `((obj . ,obj))))) ;; The length slot in xcb:-request is left out - (let ((len (if (object-of-class-p obj xcb:-request) (+ pos 2) pos))) + (let ((len (if (object-of-class-p obj 'xcb:-request) (+ pos 2) pos))) (make-vector (% (- value (% len value)) value) 0))) (`xcb:-list (let* ((list-name (plist-get value 'name)) @@ -363,7 +361,7 @@ The optional POS argument indicates current byte index of the field (used by (let ((slots (eieio-class-slots (eieio-object-class obj))) (expression (plist-get value 'expression)) (cases (plist-get value 'cases)) - result condition name-list slot-type) + result condition name-list flag slot-type) (unless (integerp expression) (setq expression (eval expression `((obj . ,obj))))) (cl-assert (integerp expression)) @@ -374,7 +372,7 @@ The optional POS argument indicates current byte index of the field (used by (if (symbolp condition) (setq condition (symbol-value condition)) (when (and (listp condition) (eq 'logior (car condition))) - (setq condition (apply 'logior (cdr condition))))) + (setq condition (apply #'logior (cdr condition))))) (cl-assert (or (integerp condition) (listp condition))) (if (integerp condition) (setq flag (/= 0 (logand expression condition))) @@ -393,7 +391,7 @@ The optional POS argument indicates current byte index of the field (used by (slot-value obj name) (+ pos (length result)))))))) result)) - ((and x (guard (child-of-class-p x xcb:-struct))) + ((guard (child-of-class-p type 'xcb:-struct)) (xcb:marshal value)) (x (error "[XCB] Unsupported type for marshalling: %s" x)))) @@ -470,7 +468,7 @@ and the second the consumed length." (`xcb:char ;as Latin-1 encoded string (setf (slot-value obj list-name) (decode-coding-string - (apply 'unibyte-string + (apply #'unibyte-string (append (substring data offset (+ offset list-size)) nil)) @@ -481,7 +479,7 @@ and the second the consumed length." (x (let ((count 0) result tmp) - (dotimes (i list-size) + (dotimes (_ list-size) (setq tmp (xcb:-unmarshal-field obj x data (+ offset count) nil)) (setq result (nconc result (list (car tmp)))) (setq count (+ count (cadr tmp)))) @@ -505,7 +503,7 @@ and the second the consumed length." (setq flag (/= 0 (logand expression condition))) (if (eq 'logior (car condition)) (setq flag (/= 0 (logand expression - (apply 'logior (cdr condition))))) + (apply #'logior (cdr condition))))) (while (and (not flag) condition) (setq flag (or flag (= expression (pop condition))))))) (when flag @@ -515,12 +513,12 @@ and the second the consumed length." (when (eq name (cl--slot-descriptor-name slot)) (setq slot-type (cl--slot-descriptor-type slot)) (throw 'break nil)))) - (setq tmp (xcb:-unmarshal-field obj data offset nil)) + (setq tmp (xcb:-unmarshal-field obj slot-type data offset nil)) (setf (slot-value obj name) (car tmp)) (setq count (+ count (cadr tmp))) (setq data (substring data (cadr tmp)))))) (list initform count))) - ((and x (guard (child-of-class-p x xcb:-struct))) + ((and x (guard (child-of-class-p x 'xcb:-struct))) (let* ((struct-obj (make-instance x)) (tmp (xcb:unmarshal struct-obj (substring data offset) obj))) (list struct-obj tmp))) @@ -557,14 +555,14 @@ the synthetic event. Otherwise, 0 is assumed. Note that this method auto pads the result to 32 bytes, as is always the case." (let ((result (cl-call-next-method obj))) (setq result (vconcat - `[,(xcb:-error-or-event-class->number + `[,(xcb:-error-or-event-class->number ;defined in 'xcb.el' connection (eieio-object-class obj))] result)) - (unless (same-class-p obj xcb:KeymapNotify) + (unless (same-class-p obj 'xcb:KeymapNotify) (setq result (vconcat (substring result 0 2) - (funcall (if (slot-value obj '~lsb) 'xcb:-pack-u2-lsb - 'xcb:-pack-u2) + (funcall (if (slot-value obj '~lsb) #'xcb:-pack-u2-lsb + #'xcb:-pack-u2) (or sequence 0)) (substring result 2)))) (cl-assert (>= 32 (length result))) @@ -573,7 +571,7 @@ Note that this method auto pads the result to 32 bytes, as is always the case." (cl-defmethod xcb:unmarshal ((obj xcb:-event) byte-array) "Fill in event OBJ according to its byte-array representation BYTE-ARRAY." (cl-call-next-method obj - (if (same-class-p obj xcb:KeymapNotify) + (if (same-class-p obj 'xcb:KeymapNotify) (substring byte-array 1) ;strip event code ;; Strip event code & sequence number (vconcat (substring byte-array 1 2) diff --git a/xcb.el b/xcb.el index c356c63..4735406 100644 --- a/xcb.el +++ b/xcb.el @@ -1,30 +1,29 @@ ;;; xcb.el --- X Protocol Emacs Lisp Binding (XELB) -*- lexical-binding: t -*- -;; Copyright (C) 2015 Chris Feng +;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Author: Chris Feng <chris.w.f...@gmail.com> -;; Keywords: unix -;; This file is not part of GNU Emacs. +;; This file is part of GNU Emacs. -;; This file is free software: you can redistribute it and/or modify +;; GNU Emacs 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 file is distributed in the hope that it will be useful, +;; GNU Emacs 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 file. If not, see <http://www.gnu.org/licenses/>. +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: ;; This library mainly provides methods for `xcb:connection', a opaque class -;; encapsulating all information concerning an X connection. The most frequently -;; used methods are: +;; encapsulating all information concerning an X connection. The most +;; frequently used methods are: ;; + Open/Close connection ;; - `xcb:connect' ;; - `xcb:connect-to-socket' @@ -46,6 +45,10 @@ ;; - `xcb:generate-id' ;; Please refer to their documentations for more details. +;; If you ever encountered errors when using this library, please set +;; `xcb:debug-on' to `t' before loading it; this should provide you more clues +;; on what is going wrong. + ;; Todo: ;; + Authentication support when connecting to X server. ;; + Use XC-MISC extension for `xcb:generate-id' when IDs are used up. @@ -57,7 +60,8 @@ (require 'xcb-xproto) -(defvar xcb:debug-on nil "non-nil to turn on debug.") +(eval-and-compile + (defvar xcb:debug-on nil "Non-nil to turn on debug.")) (defmacro xcb:-log (format-string &rest args) "Print debug info." @@ -103,16 +107,15 @@ "Connect to X server with display DISPLAY on screen SCREEN." (xcb:connect-to-display-with-auth-info display nil screen)) -(defun xcb:connect-to-display-with-auth-info (&optional display auth screen) - "Connect to X server with display DISPLAY, authentication info AUTH on screen -SCREEN." +(defun xcb:connect-to-display-with-auth-info (&optional display auth _screen) + "Connect to X server with display DISPLAY, auth info AUTH on screen _SCREEN." (unless display (setq display x-display-name)) (unless display (error "[XELB] No X display available")) (let* ((tmp (xcb:parse-display display)) (host (cdr (assoc 'host tmp))) (host (if (string= "" host) 'local host)) (dpy (cdr (assoc 'display tmp))) - (screen (if screen screen (cdr (assoc 'screen tmp)))) + ;; (_screen (or _screen (cdr (assoc 'screen tmp)))) (process (make-network-process :name "XELB" :host host :service (+ 6000 dpy))) @@ -130,8 +133,8 @@ SCREEN." (replace-regexp-in-string ".*:\\([^\\.]+\\)\\(\\..*\\)?" "\\1" name)) (screen (replace-regexp-in-string ".*:[^\\.]+\\.?\\(.*\\)?" "\\1" name))) - (setq display (string-to-int display)) - (setq screen (if (string= "" screen) 0 (string-to-int screen))) + (setq display (string-to-number display)) + (setq screen (if (string= "" screen) 0 (string-to-number screen))) `((host . ,host) (display . ,display) (screen . ,screen)))) (defun xcb:connect-to-socket (&optional socket auth-info) @@ -170,8 +173,8 @@ SCREEN." (set-process-filter process 'xcb:-connection-filter) (process-send-string ;send setup packet process - (apply 'unibyte-string - (append ;convert vector to string + (apply #'unibyte-string + (append ;convert vector to string (xcb:marshal (make-instance 'xcb:SetupRequest :byte-order (if xcb:lsb #x6c #x42) @@ -205,8 +208,8 @@ Concurrency is disabled as it breaks the orders of errors, replies and events." ;; Connection setup (unless (slot-value connection 'connected) (when (<= 8 (length cache)) ;at least setup header is available - (let ((data-len (+ 8 (* 4 (funcall (if xcb:lsb 'xcb:-unpack-u2-lsb - 'xcb:-unpack-u2) + (let ((data-len (+ 8 (* 4 (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb + #'xcb:-unpack-u2) cache 6)))) obj) (when (>= (length cache) data-len) @@ -239,8 +242,8 @@ Concurrency is disabled as it breaks the orders of errors, replies and events." (pcase (elt cache 0) (0 ;error (xcb:-log "Error received: %s" (substring cache 0 32)) - (let ((sequence (funcall (if xcb:lsb 'xcb:-unpack-u2-lsb - 'xcb:-unpack-u2) + (let ((sequence (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb + #'xcb:-unpack-u2) cache 2)) (plist (slot-value connection 'error-plist)) struct) @@ -254,16 +257,16 @@ Concurrency is disabled as it breaks the orders of errors, replies and events." (setq cache (substring cache 32)) (setf (slot-value connection 'error-sequence) sequence))) (1 ;reply - (let* ((reply-words (funcall (if xcb:lsb 'xcb:-unpack-u4-lsb - 'xcb:-unpack-u4) + (let* ((reply-words (funcall (if xcb:lsb #'xcb:-unpack-u4-lsb + #'xcb:-unpack-u4) cache 4)) (reply-length (+ 32 (* 4 reply-words))) struct sequence plist) (when (< (length cache) reply-length) ;too short, do next time (throw 'break nil)) (xcb:-log "Reply received: %s" (substring cache 0 reply-length)) - (setq sequence (funcall (if xcb:lsb 'xcb:-unpack-u2-lsb - 'xcb:-unpack-u2) + (setq sequence (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb + #'xcb:-unpack-u2) cache 2)) (setq plist (slot-value connection 'reply-plist)) (setq struct (plist-get plist sequence)) @@ -354,19 +357,18 @@ classes of EVENT (since they have the same event number)." (when (< 0 (length cache)) (setf (slot-value obj 'request-cache) []) ;should be cleared ASAP (process-send-string (slot-value obj 'process) - (apply 'unibyte-string (append cache nil)))))) + (apply #'unibyte-string (append cache nil)))))) (cl-defmethod xcb:get-extension-data ((obj xcb:connection) namespace) "Fetch the extension data from X server (block until data is retrieved)." (let* ((plist (slot-value obj 'extension-plist)) (data (plist-get plist namespace))) - (if (object-p data) + (if (eieio-object-p data) data (when (not data) ;the request has not been made (xcb:prefetch-extension-data obj namespace)) - (setq data - (xcb:+reply obj - (plist-get (slot-value obj 'extension-plist) namespace))) + (setq data (xcb:-+reply obj (plist-get (slot-value obj 'extension-plist) + namespace))) (when (cadr data) ;has error (error "[XELB] %s" (cadr data))) (setq data (car data)) @@ -392,9 +394,10 @@ classes of EVENT (since they have the same event number)." (symbol-value (intern-soft (concat (symbol-name namespace) ":-extension-xname")))) (sequence - (xcb:+request obj (make-instance 'xcb:QueryExtension - :name-len (length extension-xname) - :name extension-xname)))) + (xcb:-+request obj + (make-instance 'xcb:QueryExtension + :name-len (length extension-xname) + :name extension-xname)))) (setf (slot-value obj 'extension-plist) (plist-put (slot-value obj 'extension-plist) namespace sequence)) (xcb:flush obj)))) @@ -432,8 +435,8 @@ classes of EVENT (since they have the same event number)." (setq len (1+ len))) (setq msg (vconcat (substring msg 0 2) - (funcall (if (slot-value request '~lsb) 'xcb:-pack-u2-lsb - 'xcb:-pack-u2) + (funcall (if (slot-value request '~lsb) #'xcb:-pack-u2-lsb + #'xcb:-pack-u2) (ceiling len 4)) (substring msg 2) (make-vector (% (- 4 (% len 4)) 4) 0))) ;required sometimes @@ -511,7 +514,8 @@ Otherwise no error will ever be reported." (let ((process (slot-value obj 'process))) ;; Wait until the request processed (cl-incf (slot-value obj 'event-lock)) - (with-timeout (xcb:connection-timeout (warn "[XELB] Retrieve reply timeout")) + (with-timeout (xcb:connection-timeout + (warn "[XELB] Retrieve reply timeout")) (while (and (> sequence (slot-value obj 'reply-sequence)) (> sequence (slot-value obj 'error-sequence))) (accept-process-output process 1 nil 1))) @@ -668,7 +672,7 @@ superclass will be returned." (cdr (assoc number xcb:event-number-class-alist)) ;; Extension event (let ((first-event number) - namespace index) + namespace index alist) (while (and (not namespace) (>= first-event 64)) (setq namespace (car (rassoc first-event @@ -689,7 +693,7 @@ superclass will be returned." (cdr (assoc number xcb:error-number-class-alist)) ;; Extension error (let ((first-error number) - namespace index) + namespace index alist) (while (and (not namespace) (>= first-error 128)) (setq namespace (car (rassoc first-error diff --git a/xelb.el b/xelb.el new file mode 100644 index 0000000..3b5057e --- /dev/null +++ b/xelb.el @@ -0,0 +1,68 @@ +;;; xelb.el --- X Protocol Emacs Lisp Binding -*- lexical-binding: t -*- + +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Author: Chris Feng <chris.w.f...@gmail.com> +;; Maintainer: Chris Feng <chris.w.f...@gmail.com> +;; Version: 0 +;; Package-Requires: ((emacs "24.4")) +;; Keywords: unix +;; URL: https://github.com/ch11ng/xelb + +;; This file is part of GNU Emacs. + +;; GNU Emacs 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. + +;; GNU Emacs 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Overview +;; -------- +;; XELB (X protocol Emacs Lisp Binding) is a pure Elisp implementation of X11 +;; protocol based on the XML description files from XCB project. It features +;; an object-oriented API and permits a certain degree of concurrency. It +;; should enable you to implement some low-level X11 applications. + +;; How it works +;; ------------ +;; As is well known, X11 is a network-transparent protocol. All its messages, +;; including requests, replies, events, errors, etc are transported over +;; network. Considering that Emacs is powerful enough to do network +;; communication, it is also possible to use Emacs to send / receive those X11 +;; messages. Here we fully exploit the asynchronous feature of network +;; connections in Emacs, making XELB concurrent in a sense. + +;; X11 protocol is somewhat complicated, especially when extension protocols +;; are also concerned. Fortunately, XCB project has managed to describe these +;; protocols as XML files, which are language-neutral and can be used to +;; generate language-specific bindings. In XELB, X messages are represented as +;; 'classes', and their 'methodes' are provided to translate them to / from raw +;; byte arrays conveniently. + +;; Usage +;; ----- +;; Interfaces are mainly defined in 'xcb.el'. Please refer to that file on how +;; to use them. Most of other files are either X11 core / extension protocol +;; libraries (e.g. xcb-randr.el) or utility libraries (e.g. xcb-keysyms.el). +;; Please check the corresponding files for more details. + +;;; Code: + +(require 'xcb) + +;; DO NOT load this library; load 'xcb.el' instead. +;; This dummy file is created as a placeholder as it is required by GNU ELPA. + +(provide 'xelb) + +;;; xelb.el ends here