xdiagnose-3.8.10/0000775000000000000000000000000013437474155010471 5ustar xdiagnose-3.8.10/AUTHORS0000664000000000000000000000013413151230744011522 0ustar Copyright (C) 2010 Bryce Harrington bryce@canonical.com Icon by flooredmusic (OpenClipart) xdiagnose-3.8.10/COPYING0000664000000000000000000010437413151230744011520 0ustar GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . xdiagnose-3.8.10/Makefile0000664000000000000000000000141513151230744012115 0ustar APPNAME=xdiagnose APPURL=http://launchpad.net/xdiagnose # Run all the tests check: ./run-tests clean: rm -rf doc/api find . -name '*.pyc' -print0 | xargs -0 rm -f find . -name '*~' -print0 | xargs -0 rm -f # Check for common & easily catchable Python mistakes. pyflakes: pyflakes $(APPNAME) # Check for coding standard violations. pep8: find . -name '*.py' -print0 | xargs -0 pep8 --ignore E221,E222 find . -name '*.py' -print0 | xargs -0 pep8 --ignore E221,E222 --repeat | wc -l apidocs: pydoctor --add-package $(APPNAME) \ --make-html --html-output=doc/api \ --project-name=$(APPNAME) \ --project-url=$(APPURL) lint: pyflakes pep8 .PHONY: check lint pyflakes pep8 apidocs clean # Ignore pyflakes exit code so pep8 will run for 'make lint' .IGNORE: pyflakes xdiagnose-3.8.10/README0000664000000000000000000000164213151230744011337 0ustar Bulletproof-X ------------- This is a failsafe-mode for Xorg, that will be called when Xorg is unable to start due to misconfiguration. Todo ==== * Fallback to "vga" where vesa won't work. So far I've not succeeded in getting vga started in anything better than 320x200, which is unusable, so fallback is not currently enabled. * Apply the gdm config changes to gdm.conf * Drop failsafeInstall and update this README * Re-enable ctrl-alt-backspace * Option to turn debugging on * Option to turn KMS on or off * Option to set color depth * Option to set Xorg.0.log verbosity * If AGP system, option to try different AGPMode values * Troubleshooting of blank screen on lid close issue * Troubleshooting tools for hibernation - Turn on hibernation monitoring - Provide a listing of hibernation attempts and results - Offer any kernel tweaks to make hibernation work better - Offer to file bug report about the issue xdiagnose-3.8.10/apport/0000775000000000000000000000000013151231675011765 5ustar xdiagnose-3.8.10/apport/apport-gpu-error-intel.py0000775000000000000000000001635113151230744016702 0ustar #!/usr/bin/python3 from __future__ import absolute_import, print_function, unicode_literals import os import os.path import sys import re import datetime from apport.hookutils import * from apport import unicode_gettext as _ pci_devices = [ { 'name':'i810', 're':'(8086:7121)', 'supported':False }, { 'name':'i810dc', 're':'(8086:7123)', 'supported':False }, { 'name':'i810e', 're':'(8086:7125)', 'supported':False }, { 'name':'i815', 're':'(8086:1132|82815)', 'supported':False }, { 'name':'i830', 're':'(8086:3577|82830)', 'supported':False }, { 'name':'i845', 're':'(8086:2562|82845G)', 'supported':False }, { 'name':'i855', 're':'(8086:3582|855GM)', 'supported':False }, { 'name':'i865', 're':'(8086:2572|82865G)', 'supported':False }, { 'name':'i915g', 're':'(8086:2582)' }, { 'name':'i915gm', 're':'(8086:2592|915GM)' }, { 'name':'e7221', 're':'(8086:258a)', 'supported':False }, { 'name':'i945g', 're':'(8086:2772|945G[ \/]|82945G[ \/])' }, { 'name':'i945gm', 're':'(8086:27a2|945GM[ \/]|82945GM[ \/])' }, { 'name':'i945gme', 're':'(8086:27ae|945GME|82945GME)' }, { 'name':'IGDg', 're':'(8086:a001)' }, { 'name':'IGDgm', 're':'(8086:a011)' }, { 'name':'pineviewg', 're':'(8086:a001)' }, { 'name':'pineviewgm', 're':'(8086:a011)' }, { 'name':'i946gz', 're':'(8086:2972|82946GZ)' }, { 'name':'g35', 're':'(8086:2982|82G35)' }, { 'name':'i965q', 're':'(8086:2992|Q965)' }, { 'name':'i965g', 're':'(8086:29a2|G965)' }, { 'name':'g33', 're':'(8086:29c2|82G33)' }, { 'name':'q35', 're':'(8086:29b2)' }, { 'name':'q33', 're':'(8086:29d2)' }, { 'name':'i965gm', 're':'(8086:2a02|GM965)' }, { 'name':'i965gme', 're':'(8086:2a12)' }, { 'name':'gm45', 're':'(8086:2a42)' }, { 'name':'IGDeg', 're':'(8086:2e02)' }, { 'name':'q45', 're':'(8086:2e12)' }, { 'name':'g45', 're':'(8086:2e22)' }, { 'name':'g41', 're':'(8086:2e32)' }, { 'name':'b43', 're':'(8086:2e42)' }, { 'name':'clarkdale', 're':'(8086:0042)' }, { 'name':'arrandale', 're':'(8086:0046)' }, { 'name':'sandybridge-gt1', 're':'(8086:0102)' }, { 'name':'sandybridge-m-gt1', 're':'(8086:0106)' }, { 'name':'sandybridge-s', 're':'(8086:010a)' }, { 'name':'sandybridge-gt2', 're':'(8086:0112)' }, { 'name':'sandybridge-m-gt2', 're':'(8086:0116)' }, { 'name':'sandybridge-gt2+', 're':'(8086:0122)' }, { 'name':'sandybridge-m-gt2+','re':'(8086:0126)' }, ] for device in pci_devices: device['rc'] = re.compile(device['re'], re.IGNORECASE) def get_pci_device(text): regex_vga = re.compile('VGA compatible controller (.*)', re.IGNORECASE) lines = regex_vga.findall(text) if len(lines) > 0: for l in lines: if len(l.strip())>0: for device in pci_devices: if device['rc'].search(l.strip()): return device return None def get_signature(text): '''Assumes the format of the i915_error_state file''' codes = { 'EIR' : re.compile("EIR: 0x([0-9a-fA-F]+)"), 'ESR' : re.compile("ESR: 0x([0-9a-fA-F]+)"), 'PGTBL_ER' : re.compile("PGTBL_ER: 0x([0-9a-fA-F]+)"), 'IPEHR' : re.compile("IPEHR: 0x([0-9a-fA-F]+)"), } section = None signature = '' for line in text.split("\n"): if line == 'Blitter command stream:': section = 'blitter' elif line == 'Video (BSD) command stream:': section = 'video' elif line == 'Render command stream:': section = 'render' elif line[:8] == 'Active [': section = 'active' return signature else: for k, r in codes.items(): match = r.search(line) if match and match.group(1) != "00000000": if section: signature += " %s.%s: 0x%s" %(section, k, match.group(1)) else: signature += " %s: 0x%s" %(k, match.group(1)) return signature def main(argv=None): if argv is None: argv = sys.argv if '--force' not in argv: # If not a development release, bail rel = command_output(['lsb_release', '-d']) if 'development branch' not in rel: return 1 from apport.packaging_impl import impl as packaging if not packaging.enabled(): return 2 import apport.report report = apport.report.Report(type='Crash') report.setdefault('Tags', '') report.setdefault('Title', 'GPU lockup') report.add_os_info() report.add_proc_info() report.add_user_info() package = 'xserver-xorg-video-intel' try: package_version = apport.packaging.get_version(package) except ValueError as e: if 'does not exist' in e.message: package_version = 'unknown' report['Package'] = '%s %s' % (package, package_version) report['Tags'] += ' freeze' report['Lspci'] = command_output(['lspci', '-vvnn']) device = get_pci_device(report['Lspci']) if device and 'name' in device: if '--force' not in argv: if 'supported' in device and device['supported'] == False: # Unsupported chipset; we don't want bugs reported for this HW return 3 report['Chipset'] = device['name'] report['Title'] = "[%s] GPU lockup" %(device['name']) try: attach_hardware(report) attach_related_packages(report, ["xserver-xorg", "libdrm2", "xserver-xorg-video-intel"]) except: # attach_hardware can fail with UnicodeDecodeError parsing DMI (See LP: #1062042) # attach_related_packages can fail with SystemError if apt isn't updated (See LP: #1103061) pass attach_file_if_exists(report, '/etc/X11/xorg.conf', 'XorgConf') attach_file(report, '/var/log/Xorg.0.log', 'XorgLog') attach_file_if_exists(report, '/var/log/Xorg.0.log.old', 'XorgLogOld') attach_file_if_exists(report, '/sys/kernel/debug/dri/0/i915_error_state', 'i915_error_state') signature = get_signature(report.get('i915_error_state', '')) if not signature: # Lack of a signature generally indicates an invalid error state, such # as a false positive or a '0x000000' (non-)error state. In either case, # the bug won't be upstreamable nor otherwise actionable. if '--force' not in argv: return 4 report['Title'] += " " + signature report['DuplicateSignature'] = "%s %s" %(report['Title'], report['DistroRelease']) nowtime = datetime.datetime.now() report_filename = '/var/crash/%s.%s.crash' % (package, str(nowtime).replace(' ', '_')) if '--stdout' in argv: print("# %s" %(report_filename)) report.write(sys.stdout.buffer) return 0 report_file = os.fdopen(os.open(report_filename, os.O_WRONLY|os.O_CREAT|os.O_EXCL), 'wb') os.chmod(report_filename, 0o600) try: report.write(report_file) finally: report_file.close() return 0 if __name__ == '__main__': sys.exit(main()) xdiagnose-3.8.10/bin/0000775000000000000000000000000013151230744011224 5ustar xdiagnose-3.8.10/bin/dpkg-log-summary0000775000000000000000000001474513151230744014364 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import re import os import sys import datetime # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'xdiagnose')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses def loadfile(filename): fp = open(filename) text = fp.read() fp.close() return text def parse_dpkg_dates(dpkg_text): dates = {} re_dpkg = re.compile(r'^(\d+-\d+-\d+) (\d\d:\d\d:\d\d) (\w+) (.*)$') for line in dpkg_text.split("\n"): m = re_dpkg.match(line) if not m: continue event_date = datetime.datetime.strptime(m.group(1), "%Y-%m-%d") dates[event_date] = True return sorted(dates) def parse_dpkg(dpkg_text, start_date=None, end_date=None): re_dpkg = re.compile(r'^(\d+-\d+-\d+) (\d\d:\d\d:\d\d) (\w+) (.*)$') events = { } for line in dpkg_text.split("\n"): m = re_dpkg.match(line) if not m: continue event_date = datetime.datetime.strptime(m.group(1), "%Y-%m-%d") event_time = m.group(2) event_name = m.group(3) event_detail = m.group(4) if start_date and event_date < start_date: continue if end_date and event_date > end_date: continue if event_name not in ['install', 'upgrade', 'remove']: continue [pkg, old_ver, new_ver] = event_detail.split(' ') result = os.popen("apt-cache show %s 2>/dev/null | grep ^Source" % (pkg)).read().split(': ') if len(result) > 1: binary_pkg = pkg value = result[1].strip() source_pkg = value.split("\n")[0] else: source_pkg = pkg if source_pkg in events: source_event_found = False for source_pkg_event in events[source_pkg]: if source_pkg_event['new_version'] == new_ver: source_event_found = True source_pkg_event['binaries'].append(binary_pkg) break if source_event_found: continue else: events[source_pkg] = [ ] # TODO: Create PackageEvent class source_pkg_event = { 'action': event_name, 'date': event_date.strftime("%Y-%m-%d"), 'time': event_time, 'source_package': source_pkg, 'old_version': old_ver, 'new_version': new_ver, 'binaries': [ ], } events[source_pkg].append(source_pkg_event) #print "%-8s %-30s %-12s %-12s %-30s %-30s" %( # event_name, source_pkg, source_pkg_event['date'], event_time, old_ver, new_ver) return events if __name__ == "__main__": import gettext from gettext import gettext as _ gettext.textdomain('xdiagnose') from xdiagnose import info from xdiagnose.utils.option_handler import OptionHandler from xdiagnose.utils import debug opt_hand = OptionHandler(info) opt_hand.add('-v', '--verbose', dest='verbose', help=_('Show debug messages'), action='store_true', default=False, desc='Turns on verbose debugging output.') opt_hand.add('-D', '--show-dates', dest='show_dates', help=_("List dates on which updates were performed"), action='store_true', default=False, desc='List dates on which updates were performed') opt_hand.add('-s', '--start-date', dest='start_date', help=_("Only include entries from this date forward (YYYY/MM/DD)"), action='store', default=None, desc='Only include entries from this date forward (YYYY/MM/DD)') opt_hand.add('-e', '--end-date', dest='end_date', help=_("Only include entries from this date and earlier (YYYY/MM/DD)"), action='store', default=None, desc='Only include entries from this date and earlier (YYYY/MM/DD)') opts, args = opt_hand.parse_args() debug.DEBUGGING = opts.verbose if len(args) < 1: dpkg_log_filename = '/var/log/dpkg.log' else: dpkg_log_filename = args[0] if opts.verbose: print("Reading from %s" %(dpkg_log_filename)) dpkg_text = loadfile(dpkg_log_filename) if opts.show_dates: event_dates = parse_dpkg_dates(dpkg_text) for d in event_dates: print(d.strftime("%Y-%m-%d")) sys.exit(0) start_date = None if opts.start_date: start_date = datetime.datetime.strptime(opts.start_date, "%Y-%m-%d") end_date = None if opts.end_date: end_date = datetime.datetime.strptime(opts.end_date, "%Y-%m-%d") dpkg_events = parse_dpkg(dpkg_text, start_date, end_date) for pkg in sorted(dpkg_events): indent = '' for event in dpkg_events[pkg]: print("%s%-2s %-40s %-10s %-10s %-30s %-30s" %( indent, event['action'][0], event['source_package'], event['date'], event['time'], event['old_version'], event['new_version'])) indent += ' ' sys.exit(0) xdiagnose-3.8.10/bin/xdiagnose0000775000000000000000000001065313151230744013140 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import sys import logging import gettext from gettext import gettext as _ gettext.textdomain('xdiagnose') import signal signal.signal(signal.SIGINT, signal.SIG_DFL) #TODO: Add for policykit support #from gi.repository import GObject, Gio, Polkit # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'xdiagnose')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses from xdiagnose.applet import XDiagnoseApplet from xdiagnose.utils import debug from xdiagnose.utils.screen import X_is_running # TODO: Re-enable with policykit support #def check_authorization_cb(authority, res, loop): # try: # result = authority.check_authorization_finish(res) # if result.get_is_authorized(): # print("Authorized") # # TODO: Enable the Apply button # elif result.get_is_challenge(): # print("Challenge") # else: # print("Not authorized") # # TODO: Exit application gracefully # sys.exit(2) # except GObject.GError as error: # print("Error checking authorization: %s" % error.message) # sys.exit(2) if __name__ == "__main__": from xdiagnose import info from xdiagnose.utils.option_handler import OptionHandler opt_hand = OptionHandler(info) opt_hand.add('-v', '--verbose', dest='verbose', help=_('Show debug messages'), action='store_true', default=False, desc='Turns on verbose debugging output.') opt_hand.add('-f', '--fails-to-start', dest='failure_to_start', help=_("Troubleshoot failure to start a graphical X11 session"), action='store_true', default=False, desc='Launch the GUI failsafe-X session to troubleshoot why X11 did not start.') opts, args = opt_hand.parse_args() debug.DEBUGGING = opts.verbose # Set the logging level to show debug messages. if opts.verbose: logging.basicConfig(level=logging.DEBUG) logging.debug('logging enabled') # xdiagnose requires Gtk and thus needs X if not X_is_running(): sys.stderr.write("Could not open X display\n") sys.exit(1) if os.getenv("USER") != "root": sys.stderr.write("Error: Must run as superuser\n") sys.exit(2) # Run the application. if opts.failure_to_start: app = XDiagnose() else: app = XDiagnoseApplet() # TODO: Re-enable this after setting up bootloader-edit dbus mechanism # authority = Polkit.Authority.get() # subject = Polkit.UnixProcess.new(os.getppid()) # action_id = "org.freedesktop.policykit.exec" # authority.check_authorization(subject, # action_id, # None, # Polkit.CheckAuthorizationFlags.ALLOW_USER_INTERACTION, # None, # check_authorization_cb, # app) app.run() xdiagnose-3.8.10/bin/xdiagnose-pkexec0000775000000000000000000000004613151230744014410 0ustar #!/bin/sh pkexec "/usr/bin/xdiagnose" xdiagnose-3.8.10/bin/xedid0000775000000000000000000001610613151230744012253 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import re import os import sys import fnmatch # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'xdiagnose')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses from xdiagnose.edid import Edid, EdidFirmware, load_edid_bytecodes from xdiagnose.utils.paths import locate from xdiagnose.utils import debug ## NVIDIA ## # # In Precise, -nvidia does not support writable EDID via KMS. # However, it does provide a CustomEDID option in xorg.conf which # servces essentially the same purpose. To use it, you need # a section like the following in your xorg.conf. (I believe the # nvidia-config GUI tool has buttons to add this for you.) # #Section "Device" # Identifier "Device0" # Driver "nvidia" #Choose the driver used for this monitor # Option "UseEDID" "FALSE" # Option "CustomEDID" "DFP-1:/etc/X11/xorg.conf.d/edid.bin" #EndSection # TODO: Need a corresponding edid read functionality. (Or can we # just use the get-edid script from the read-edid package?) def usage(): return """xedid [edid-sources] Commands: list [edid-src] - List edids available on the system show [edid-src] - Display decoded edid information save [edid-src] - Copy active EDIDs to binary *.edid files raw [edid-src] - Prints the EDID hex codes install - Adds given edid file to kernel firmware dir uninstall - Removes named edid file from firmware dir activate - Makes kernel use given edid from firmware dir Notes: EDID sources (edid-src) can be Xorg.0.log files or binary or hex edid files. EDID binaries (edid) must be binary files in a valid EDID data format. The kernel's EDID firmware directory can have multiple edids installed, but only one activated at a time. The activated EDID is passed to the kernel command line. """ from xdiagnose import info class Info(object): PROGNAME = 'xedid' VERSION = '1.0' SHORT_DESCRIPTION = 'View, manipulate or override EDID data' DESCRIPTION = """ This utility allows you to install a new EDID into the kernel firmware directory to override the one read from the monitor. This can be useful if the monitor's EDID is faulty or if a KVM or other adapter is causing the EDID to not be read properly. Also, it provides routines to examine EDID contents, convert them to and from various formats, and manipulate them in other ways. """ if __name__ == "__main__": from optparse import OptionParser opt_hand = OptionParser(usage=usage(), version="%s %s" %(Info.PROGNAME, Info.VERSION), epilog="%s - %s" %(info.PROGNAME, info.SHORT_DESCRIPTION) ) opt_hand.add_option('-v', '--verbose', dest="verbose", help="Show debug messages", action="store_true", default=False) #desc="Turns on verbose debugging output.") opts, args = opt_hand.parse_args() debug.DEBUGGING = opts.verbose if len(args) > 0: command = args[0] else: command = "show" # Handle firmware requests if command in ['install', 'uninstall', 'activate']: # Test that everything is sane if len(args) < 2: print(usage()) sys.exit(2) elif os.getenv("USER") != "root": print("Error: Must run as root") sys.exit(3) firmware = EdidFirmware() for filename in args[1:]: if command == 'install': # TODO: Verify file(s) are valid edid # TODO: Move install to an EdidFirmware class firmware.install(filename) elif command == 'uninstall': firmware.uninstall(filename) elif command == 'activate': firmware.activate(filename) sys.exit(0) source_files = args[1:] sources = [] for filename in args[1:]: for bytecode in load_edid_bytecodes(filename): edid = Edid(bytecode) sources.append(edid) if len(sources) == 0: # Xorg.0.log for bytecode in load_edid_bytecodes("/var/log/Xorg.0.log"): xlog_edid = Edid(bytecode) xlog_edid._origin = "Xorg.0.log" sources.append(xlog_edid) # Kernel edid nodes re_lvds = re.compile(".*LVDS.*") # Identify what edid file sysfs nodes are present for node in locate('edid', root="/sys"): if re_lvds.match(node): continue try: for bytecode in load_edid_bytecodes(node): node_edid = Edid(bytecode) node_edid._origin = "sysfs" sources.append(node_edid) except: continue fw = EdidFirmware() for fw_edid in fw.list(): sources.append(fw_edid) # TODO: Weed out duplicate edids source_number = 0 for edid in sources: if command == "list": print(edid.name) elif command == "show": print(edid) elif command == "save": filename = "%s-%s-%s.%02d.edid" %( edid.manufacturer, edid.product_id, edid.serial_number, source_number) if edid.save(filename): print(filename) elif command == "raw": raw_edid = edid.to_hex() for i in range(0, int(len(raw_edid)/32)): j = i + 1 print(raw_edid[i*32:j*32]) print() else: print("Unknown command '%s'" %(command)) print(usage()) sys.exit(1) source_number += 1 sys.exit(0) xdiagnose-3.8.10/bin/xpci0000775000000000000000000000551413151230744012122 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import sys # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'xdiagnose')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses from xdiagnose.pci_devices import get_pci_devices from xdiagnose.utils import debug if __name__ == "__main__": from xdiagnose import info from xdiagnose.utils.option_handler import OptionHandler opt_hand = OptionHandler(info) opt_hand.add('-v', '--verbose', dest='verbose', help='Show debug messages', action='store_true', default=False, desc='Turns on verbose debugging output.') opts, args = opt_hand.parse_args() debug.DEBUGGING = opts.verbose if len(args) > 0: text = ' '.join(args) else: import subprocess process = subprocess.Popen('lspci -vvnn', shell=True, stdout=subprocess.PIPE) text = process.communicate()[0] devices = get_pci_devices(text) if devices is None: sys.exit(1) for device in devices: if device: print(device.name, device.regex, end='') if device.generation: print('', device.generation, end='') if device.title: print('', device.title, end='') print('', ','.join(device.drivers), end='') if not device.supported: print(" (NOT SUPPORTED)") print("") xdiagnose-3.8.10/bin/xrandr-tool0000775000000000000000000000763213151230744013433 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import re import os import sys import subprocess # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'xdiagnose')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses if __name__ == "__main__": from xdiagnose import info from xdiagnose.utils.option_handler import OptionHandler from xdiagnose.utils import debug opt_hand = OptionHandler(info) opt_hand.add('-v', '--verbose', dest='verbose', help='Show debug messages', action='store_true', default=False, desc='Turns on verbose debugging output.') opt_hand.add('-f', '--fails-to-start', dest='failure_to_start', help="Troubleshoot failure to start a graphical X11 session", action='store_true', default=False, desc='Launch the GUI failsafe-X session to troubleshoot why X11 did not start.') opts, args = opt_hand.parse_args() debug.DEBUGGING = opts.verbose if len(args) < 1: print("Usage: xrandr-tool ") print() print("Commands:") print(" outputs") print(" current-resolution [output-name]") print(" resolutions [output-name]") sys.exit(1) command = args[0] output_name = None if len(args) > 1: output_name = args[1] re_output = re.compile("^(.*) (?:disconnected|connected) (.*)") re_res = re.compile("^ (\d+x\d+) *(.*)") # The results from xrandr are given in terms of the available display devices. # One device can have zero or more associated modes. Unfortunately xrandr # indicates this through indentation and is kinda wordy, so we have to keep # track of the context we see mode names in as we parse the results. process = subprocess.Popen(['xrandr'], stdout=subprocess.PIPE) xrandr_stdout, xrandr_stderr = process.communicate() current_output_name = None for line in str(xrandr_stdout, encoding='utf8').split("\n"): m = re_output.match(line) if m: current_output_name = m.group(1) if command == "outputs": print(current_output_name) if "resolution" in command: m = re_res.match(line) if m and current_output_name == output_name: res = m.group(1) if command == "current-resolution": if line.find('*') != -1: print(res) else: print(res) xdiagnose-3.8.10/bin/xrotate0000775000000000000000000000537113151230744012646 0ustar #!/bin/bash # Script originated from https://bbs.archlinux.org/viewtopic.php?id=107167 comment #4 # Hacked on for Nexus 7 ~ Bryce Harrington rotate_display() { output=$1 rotation=$2 #xrandr --output ${output} --rotate right xrandr -o $(( rotation * 3 )) if [ $? -ne 0 ]; then echo "xrandr fail" >> /tmp/xrotate.log return 1 fi return 0 } matrix_rotate() { device=$1 rotation=$2 case ${rotation} in 0) MATRIX="0 -1 1 1 0 0 0 0 1" ;; # 90 deg to right 1) MATRIX="1 0 0 0 1 0 0 0 1" ;; # normal 2) MATRIX="0 1 0 1 0 -1 0 0 1" ;; # 90 deg to left esac xinput set-prop $device "Coordinate Transformation Matrix" $MATRIX if [ $? -ne 0 ]; then echo "xinput matrix transformation fail" >> /tmp/xrotate.log return 1 fi return 0 } rotate_device() { device=$1 rotation=$2 xinput set-prop $device "Evdev Axes Swap" $rotation if [ $? -ne 0 ]; then echo "xinput axis swap fail" >> /tmp/xrotate.log return 1 fi xinput set-prop $device "Evdev Axis Inversion" $rotation, $rotation if [ $? -ne 0 ]; then echo "xinput axis inversion fail" >> /tmp/xrotate.log return 1 fi return 0 } calibrate_device() { device=$1 rotation=$2 rangex=( 0 9640 ) rangey=( 0 7220 ) case ${rotation} in 0) cal=( ${rangey[@]} ${rangex[@]} ) ;; 1) cal=( ${rangex[@]} ${rangey[@]} ) ;; esac xinput set-prop $device "Evdev Axis Calibration" ${cal[@]} if [ $? -ne 0 ]; then echo "xinput calibration fail" >> /tmp/xrotate.log return 1 fi return 0 } rotate() { rotation=$1 devices=( "elan-touchscreen" ) rotate_display "LVDS-1" ${rotation} for device in ${devices[@]}; do #rotate_device ${device} ${rotation} \ # || return 1 matrix_rotate ${device} ${rotation} \ || return 1 #calibrate_device ${device} ${rotation} done return 0 } # If no args given, default to 'auto' CMD=${1:-auto} case "${CMD}" in dump) echo echo "### xinput list ###" xinput list echo echo "### Xorg.0.log ###" cat /var/log/Xorg.0.log echo echo "### dmesg ###" dmesg | egrep -i "(tegra|elan|usb|input)" echo echo "### props ###" xinput list-props "elan-touchscreen" ;; portrait | normal) rotate 0 || exit 1 ;; landscape | right) rotate 1 || exit 1 ;; auto) # Auto-detect rotation to use xrandrout="$(xrandr)" case $xrandrout in *connected\ 1280x800* ) rotation=0 ;; *connected\ 800x1280* ) rotation=1 ;; esac rotate ${rotation} || exit 1 ;; *) echo "Usage: xrotate [portrait|landscape|auto|dump]" ;; esac exit 0 xdiagnose-3.8.10/com.canonical.xdiagnose.policy.in0000664000000000000000000000134013151230744016764 0ustar <_message>Authentication is needed to diagnose graphics issues Canonical Ltd auth_admin auth_admin auth_admin /usr/bin/xdiagnose true xdiagnose-3.8.10/data/0000775000000000000000000000000013437474007011376 5ustar xdiagnose-3.8.10/data/bubu.lib0000664000000000000000000001367413151230744013025 0ustar # -*- mode: sh -*- ############################ # Bash Routines for UBUntu # ############################ ######################################################################## # Defaults QUIET=${QUIET:-0} COLUMNS=${COLUMNS:-80} INTERACTIVE=${INTERACTIVE:-"no"} ######################################################################## # Notifications # write_msg() { echo "*** $*" | fold -s -w "${COLUMNS}" } msg() { if [ ${QUIET} -lt 1 ]; then write_msg "$*" fi } dbg() { if [ ${QUIET} -lt 2 ]; then write_msg "$*" fi } warn() { write_msg "Warning: $*" 1>&2 } die() { write_msg "ERROR: $*" 1>&2 final_summary exit 1 } interact() { if [ "${INTERACTIVE}" = "yes" ]; then echo -n "Press enter to $1 ..." read nothing else echo "Proceeding to $1" fi } ######################################################################## # Test results tracking # declare -a RESULTS declare -a _RESULT_STATUS declare -a _RESULT_ACTION declare -a _RESULT_ARG pass_count=0 fail_count=0 _push_result() { status=$1 action=$2 arg=$3 i=${#RESULTS[*]} RESULTS[$i]="$status $action $arg" _RESULT_STATUS[$i]=$status _RESULT_ACTION[$i]=$action _RESULT_ARG[$i]=$arg } clear_results() { RESULTS=() _RESULT_STATUS=() _RESULT_ACTION=() _RESULT_ARG=() } pass() { msg=$1 echo "[PASS] $msg" _push_result "pass" "$msg" "" pass_count=$(( $pass_count + 1 )) return 0 } fail() { msg=$1 echo "[FAIL] $msg" _push_result "FAIL" "$msg" "" fail_count=$(( $fail_count + 1 )) return 1 } display_results() { for i in $(seq 0 ${#RESULTS[*]}) ; do echo ${RESULTS[$i]} done } final_summary() { echo echo "Results: ${#RESULTS[*]}; Passed: $pass_count; Failed: $fail_count" } json_test_summary() { [ ! -z "$1" ] || return 1 echo > $1 < /dev/null) } is_installed() { prog=$1 need=$2 /usr/bin/which $prog > /dev/null 2>&1 err=$? if [ ! $err = 0 ]; then warn "Could not $need because $prog is not installed ($err)" return $err fi return 0 } # is_pid_running(PID) # # Checks if the given $PID is still running. Returns a true value if # it is, false otherwise. # is_pid_running() { PID=$1 ps --pid ${PID} --no-header | grep ${PID} return $? } is_chroot() { r=$(stat / | grep -v File:) s=$(stat /proc/1/root/ | grep -v File:) test "$r" != "$s" return $? } ######################################################################## # Paths and filenames # abspath() { if [ -d $1 ] ; then dir=${1%/}/ else dir=$(dirname $1)/ fi echo $(cd ${dir} && echo ${PWD%/}/${dir##*/}) } ######################################################################## # Process control # stop_service() { svc=$1 pidof $svc > /dev/null && /etc/init.d/$svc stop pidof $svc > /dev/null && die "Could not stop service $svc" echo "Service $svc stopped" } stop_command() { cmd=$1 pidof $cmd > /dev/null && pkill -9 $cmd pidof $cmd > /dev/null && die "Could not stop command $cmd" echo "Command $cmd stopped" } # kill_pid(PID) # # Forcibly kills the process ID and prevents it from # displaying any messages (to stdout, stderr, or otherwise) # kill_pid() { PID=$1 disown $PID kill -9 $PID > /dev/null 2>&1 } ######################################################################## # Apt Packaging # apt_install() { pkgs=$* for pkg in $pkgs; do /usr/bin/apt-get install --yes --allow-unauthenticated $pkg if [ $? -eq 0 ]; then _push_result "pass" "apt_install" "$pkg" else _push_result "FAIL" "apt_install" "$pkg" fi done } apt_remove() { pkgs=$* for pkg in $pkgs; do /usr/bin/apt-get remove --yes --allow-unauthenticated $pkg if [ $? -eq 0 ]; then _push_result "pass" "apt_install" "$pkg" else _push_result "FAIL" "apt_install" "$pkg" fi done } apt_build_dep() { pkgs=$* for pkg in $pkgs; do /usr/bin/apt-get build-dep --yes --allow-unauthenticated $pkg if [ $? -eq 0 ]; then _push_result "pass" "apt_build_dep" "$pkg" else _push_result "FAIL" "apt_build_dep" "$pkg" fi done } ######################################################################## # Config file manip config_hash_line() { file=$1 shift line=$* cp ${file} ${file}.orig sed -e "s/^$line$/#$line/g" ${file}.orig \ > ${file} } config_contains() { file=$1 shift text=$* egrep "${text}" $file > /dev/null 2>&1 return $? } config_add_line() { file=$1 shift line=$* egrep "^ *${line}$" $file > /dev/null 2>&1 if [ $? -ne 0 ] ; then echo ${line} >> $file fi } ######################################################################## # xorg-specific functions # get_xorg_drivers() { pid=`pidof X` if [ -z "$pid" ]; then echo "Error: X is not running" return 1 fi cat /proc/$pid/smaps | \ egrep '_drv.so|_dri.so' | \ cut -d '/' -f 7 | \ cut -d "_" -f 1 | \ sort -u } get_debian_version() { pkg=$1 dpkg -l $pkg | cat \ | egrep '^ii' \ | sed -e "s/ \+/ /g" \ | cut -d' ' -f 3 } get_installed_version() { get_debian_version $1 \ | sed -e "s/^.*+//" \ | cut -d- -f1 \ | sed -e "s/^[0-9]://" \ | sed -e "s/ubuntu.*$//" } get_base_version() { buf=${1#*:} # Strip epoch echo ${buf%-*} # Strip debian version } ok_if_pkg_ge() { pkg=$1; shift || true wanted=$1; shift || true have=$(dpkg -s "$pkg" 2>/dev/null | grep -m1 ^Version: | cut -d" " -f2-) if dpkg --compare-versions "$have" ge "$wanted"; then exit 0; fi } # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/data/failsafeXServer0000775000000000000000000000754113437472764014434 0ustar #!/bin/bash # $Id:$ # # This provides a stripped down 'failsafe' mode for situations # where X is failing to start up. # Author: Bryce W. Harrington # Copyright (C) 2010 Canonical, Ltd. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. xorg_conf_failsafe=${BPX_XORG_CONF_FAILSAFE:-"/etc/X11/xorg.conf.failsafe"} xorg_conf=${BPX_XORG_CONF:-"/etc/X11/xorg.conf"} client=${BPX_CLIENT:-"/usr/share/xdiagnose/failsafeXinit"} clientargs=${BPX_CLIENTARGS:-$xorg_conf_failsafe} checkduration=${BPX_CHECK_DURATION:-30} failsafe_log=${BPX_LOG:-"/var/log/Xorg.failsafe.log"} displaymanager=$1 server=${BPX_SERVER:-/usr/bin/X} serverargs="${serverargs} -br -once -config ${xorg_conf_failsafe} -logfile ${failsafe_log}" # -br: Black background # -once: Terminate server after one session # -config: Specify location of xorg.conf file to use # Note: Only root can specify absolute paths # -logfile: Don't overwrite Xorg.0.log # vt7: Force use of vt7 for X warn() { echo "Warning: $1" 1>&2 } is_installed() { prog=$1 need=$2 /usr/bin/which $prog > /dev/null 2>&1 err=$? if [ ! $err = 0 ]; then warn "Could not $need because $prog is not installed ($err)" return $err fi return 0 } get_driver() { machine=$(uname -m) if grep -q -E '(nouveau|drm)fb' /proc/fb; then echo "fbdev" elif [ $machine = "ppc" ]; then echo "fbdev" elif [ $machine = "powerpc" ]; then echo "fbdev" elif [ $machine = "ppc64" ]; then echo "fbdev" else echo "vesa" fi return 0 } # Check if we've already attempted a failsafe session without success if [ -e "$failsafe_log" ]; then cur_time=$(date +"%s") last_run=$(ls -l --time-style=+%s $failsafe_log | cut -d' ' -f6) time_diff=$(expr $cur_time - $last_run) if [ $time_diff -lt $checkduration ]; then warn "Failsafe mode was already attempted within $checkduration seconds." warn "Falling back to display manager to report the issue." exit 1 fi fi driver=$(get_driver) # Generate a fresh xorg.conf.failsafe cat > $xorg_conf_failsafe <> $failsafe_log if [ $? -ne 0 ]; then warn "Cannot write to $failsafe_log" fi fi clientargs="${clientargs} ${displaymanager}" # Stop any existing display managers, else they could conflict if [ ! -d /run/systemd ]; then service gdm stop service lightdm stop fi echo "xinit $client $clientargs -- $server $serverargs" xinit $client $clientargs -- $server $serverargs xdiagnose-3.8.10/data/failsafeXinit0000775000000000000000000001674613151230744014117 0ustar #!/bin/bash # This provides a stripped down 'failsafe' mode for situations # where X is failing to start up. # Author: Bryce W. Harrington # Copyright (C) 2010 Canonical, Ltd. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. xorg_conf=$1 dm=$2 display=0 xorg_log="/var/log/Xorg.${display}.log" gdm_log="/var/log/gdm/:${display}.log" gdm_log_1="/var/log/gdm/:${display}.log.1" gdm_log_2="/var/log/gdm/:${display}.log.2" lightdm_log="/var/log/lightdm/lightdm.log" lightdm_display_log="/var/log/lightdm/:0.log" lightdm_greeter_log="/var/log/lightdm/:0-greeter.log" apport_hook="/usr/share/apport/package-hooks/source_xorg.py" app_width=600 app_height=300 app_title="$(gettext 'Failsafe-X')" timestamp=$(date +%y%m%d%H%M%S) . gettext.sh TEXTDOMAIN=xdiagnose export TEXTDOMAIN TEXTDOMAINDIR=/usr/share/locale-langpack export TEXTDOMAINDIR display_main_menu() { zenity --list \ --radiolist \ --title "$app_title" \ --width $app_width --height $app_height \ --text "$(gettext 'What would you like to do?')" \ --column "" --column "$(gettext 'Choice')" --column "" \ TRUE DEFAULT_RES_MODE "$(gettext 'Try running with default graphical mode')" \ FALSE RECONFIGURE "$(gettext 'Reconfigure graphics')" \ FALSE TROUBLESHOOT "$(gettext 'Troubleshoot the error')" \ FALSE EXIT_TO_CONSOLE "$(gettext 'Exit to console login')" \ --hide-column 2 # TODO: 3 FILE_BUG "Report a bug about this failure" \ } display_reconfigure_menu() { # TODO: Only display SELECT_BACKUP if backups are available zenity --list \ --radiolist \ --title "$app_title : $(gettext 'Reconfiguration')" \ --text "$(gettext 'How would you like to reconfigure your display?')" \ --width $app_width --height $app_height \ --column "" --column "$(gettext 'Choice')" --column "" \ TRUE DEFAULT_CONFIG "$(gettext 'Use default (generic) configuration')" \ FALSE SELECT_BACKUP "$(gettext 'Use your backed-up configuration')" \ --hide-column 2 } display_troubleshooting_menu() { zenity --list \ --radiolist \ --title "$app_title : $(gettext 'Troubleshooting')" \ --text "$(gettext 'What information would you like to review?')" \ --width $app_width --height $app_height \ --column "" --column "$(gettext 'Choice')" --column "" \ TRUE VIEW_XORG_LOG "$(gettext 'Review the xserver log file')" \ FALSE VIEW_GDM_LOG "$(gettext 'Review the startup errors')" \ FALSE EDIT_CONFIG "$(gettext 'Edit configuration file')" \ --hide-column 2 # TODO: 5 VERIFY_XORGCONF "Check configuration file" } display_filebug_menu() { # Run apport to file a bug if [ -e $apport_hook ]; then python3 $apport_hook if [ $? == 0 ]; then zenity --info --text "$(gettext 'A bug report has been written.\nYou can send it next time you log in.')" else zenity --error --text "$(gettext 'Your bug could not be recorded successfully.\n')" fi else zenity --error --text "$(eval_gettext 'Cannot file bug: \$apport_hook is not present.')" fi } backup_xorg_conf() { # TODO: backup xorg.conf more elegantly... xorg_conf_backup="/etc/X11/xorg.conf-backup-${timestamp}" cp /etc/X11/xorg.conf ${xorg_conf_backup} if [ $? != 0 ]; then return zenity --question --text "$(gettext 'Your config could not be backed up.\nDo you want to continue anyway?\n')" fi } default_config() { backup_xorg_conf || return 1 rm /etc/X11/xorg.conf if [ $? == 0 ]; then zenity --info --text "$(gettext 'Your configuration has been restored to default,\nand your old configuration backed up.\nPlease restart.\n')" else zenity --error --text "$(gettext 'Failure restoring configuration to default.\nYour config has not been changed.')" fi } restore_default_config() { backup_xorg_conf || return 1 rm /etc/X11/xorg.conf } view_xorg_log() { zenity --text-info --filename=$xorg_log --width=640 --height=480 } view_gdm_log() { zenity --text-info --filename=${gdm_log_1} --width=640 --height=480 } verify_xorgconf() { # Run Alberto's xorg.conf checker (once it's available in main) zenity --error --text "$(gettext 'Sorry, this option is not implemented yet')" } edit_config() { backup_xorg_conf || return 1 xorg_conf_tmp=$(mktemp -t xorg.conf.XXXXXXXX) zenity --text-info --editable --filename=/etc/X11/xorg.conf --width=640 --height=480 > "${xorg_conf_tmp}" && mv "${xorg_conf_tmp}" /etc/X11/xorg.conf chmod 644 /etc/X11/xorg.conf } # Scan Xorg.0.log for errors LOG_ERRORS=$(grep -e "^(EE)" $xorg_log) if [ -z "$LOG_ERRORS" ]; then zenity --warning --text "$(gettext 'The system is running in low-graphics mode\n\nYour screen, graphics card, and input device settings\ncould not be detected correctly. You will need to configure these yourself.')" else zenity --warning --text "$(gettext 'The system is running in low-graphics mode\n\nThe following error was encountered. You may need\nto update your configuration to solve this.\n\n')""${LOG_ERRORS}" fi # TODO: Add --window-icon "$app_icon" to all zenity windows choice="" while : ; do case "$choice" in ## Main Menu ## DEFAULT_RES_MODE ) restore_default_config; break ;; RECONFIGURE ) choice=$(display_reconfigure_menu) ;; TROUBLESHOOT ) choice=$(display_troubleshooting_menu) ;; FILE_BUG ) choice=$(display_filebug_menu) ;; ## Reconfigure Menu ## DEFAULT_CONFIG ) choice="RECONFIGURE"; default_config ;; SELECT_BACKUP ) choice="RECONFIGURE"; ;; ## Troubleshooting Menu ## VIEW_XORG_LOG ) choice="TROUBLESHOOT"; view_xorg_log ;; VIEW_GDM_LOG ) choice="TROUBLESHOOT"; view_gdm_log ;; VERIFY_XORGCONF ) choice="TROUBLESHOOT"; verify_xorgconf ;; EDIT_CONFIG ) choice="TROUBLESHOOT"; edit_config ;; EXIT_TO_CONSOLE ) choice="CONSOLE"; break ;; EXIT ) break ;; *) choice=$(display_main_menu) || break ;; esac done if [ $choice == "CONSOLE" ]; then if [ -d /run/systemd ]; then chvt 7 systemctl isolate multi-user.target else chvt 2 fi exit fi if [ -d /run/systemd ]; then systemctl default else start $dm | \ zenity --progress --pulsate --text "$(gettext 'Stand by one minute while the display restarts...')" fi xdiagnose-3.8.10/data/icons/0000775000000000000000000000000013151230744012500 5ustar xdiagnose-3.8.10/data/icons/scalable/0000775000000000000000000000000013151230744014246 5ustar xdiagnose-3.8.10/data/icons/scalable/apps/0000775000000000000000000000000013151230744015211 5ustar xdiagnose-3.8.10/data/icons/scalable/apps/xdiagnose.svg0000664000000000000000000002705413151230744017723 0ustar image/svg+xml xdiagnose-3.8.10/data/workloads/0000775000000000000000000000000013151230744013372 5ustar xdiagnose-3.8.10/data/workloads/README0000664000000000000000000000147313151230744014257 0ustar All Workloads must be named do_*. Workloads should be named "do_*_loop" if they run continuously until killed. A given workload can have dependencies above and beyond xdiagnose itself, but must include functionality to test and install what it needs. In general workloads should strive to not require any packages which are not available in the Ubuntu main, universe, or multiverse archives. Workloads should take a command as first argument: info - Returns a string documenting the workload and its prerequisites depends - Returns a list of prerequisite packages this workload requires check - Test if prerequisites are satisfied setup - Set up working directories, etc. once - Execute the process one time only run - Execute the process in a loop indefinitely Dependencies ------------ wmctrl xdiagnose-3.8.10/data/workloads/do_chws_loop0000775000000000000000000000227513151230744016005 0ustar #!/bin/bash DESCRIPTION="Workload that switches workspaces" PREREQS="" DEPENDS="wmctrl" CYCLE_DELAY=${CYCLE_DELAY:-3} check() { which wmctrl > /dev/null if [ $? -ne 0 ]; then return 1 fi return 0 } workload() { INFO=$(wmctrl -d) if [ $? != 0 ]; then echo "Error: Failed to run wmctrl" 2>&1 exit 1 fi WORKAREA_WIDTH=$(echo "${INFO}"| awk '{sub(/x[0-9]+/, "", $9); print $9}') WORKAREA_HEIGHT=$(echo "${INFO}"| awk '{sub(/[0-9]+x/, "", $9); print $9}') FULLSCREEN=${WORKAREA_WIDTH}x${WORKAREA_HEIGHT} NUM_WORKSPACES=$(echo "${INFO}" | wc -l) for WS in $(seq 1 $NUM_WORKSPACES); do wmctrl -o $(($WORKAREA_WIDTH * $WS)),0 sleep $CYCLE_DELAY done } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) check ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/do_cpu_spin_loop0000775000000000000000000000073213151230744016655 0ustar #!/bin/sh DESCRIPTION="Workload to impose a 100% busy loop on a CPU" case $1 in info) echo $DESCRIPTION ;; depends) ;; check) ;; setup) ;; once) NOOP=1 ;; run) echo $$ while : do NOOP=1 done ;; *) echo $DESCRIPTION echo echo "Usage: $0 {info|depends|setup|check|once|run}" exit 1 esac xdiagnose-3.8.10/data/workloads/do_disk_write_loop0000775000000000000000000000123513151230744017200 0ustar #!/bin/bash DESCRIPTION="Workload to generate disk write load" # Time delay before start of entire new cycle. CYCLE_DELAY=${CYCLE_DELAY:-1} # Filename to write to TMP_FILE=/tmp/cpu_$$ workload() { echo 1 > $TMP_FILE sleep ${CYCLE_DELAY} } case $1 in info) echo ${DESCRIPTION} ;; depends) ;; check) ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo ${DESCRIPTION} echo echo "Usage: $0 {info|depends|setup|check|once|run}" exit 1 esac xdiagnose-3.8.10/data/workloads/do_glx_loop0000775000000000000000000000255113151230744015630 0ustar #!/bin/bash DESCRIPTION="Workload that exercises screensaver functionality" PREREQS="" DEPENDS="mesa-utils" CYCLE_DELAY=${CYCLE_DELAY:-1} check() { glxinfo > /dev/null if [ $? -ne 0 ]; then echo "Error: glx utilities missing" return 1 fi return 0 } workload() { pi=3.1415 origin_x=200 origin_y=200 r=100 n=60 glxgears -geometry 400x400+${origin_x}+$((${origin_y}+${r})) > /dev/null & for i in $(seq 0 $n); do x=$(echo "$origin_x + $r * s($i * 4 * $pi / $n)" | bc -l) y=$(echo "$origin_y + $r * c($i * 4 * $pi / $n)" | bc -l) coords="${x%\.*},${y%\.*}" sleep 0.001 #echo $coords wmctrl -r glxgears -e 0,$coords,-1,-1 done sleep $CYCLE_DELAY wmctrl -c glxgears sleep $CYCLE_DELAY } restore() { wmctrl -c glxgears } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) check ;; setup) ;; once) workload; restore ;; restore) restore ;; run) echo $$ while : do workload done restore ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run|restore}" exit 1 esac xdiagnose-3.8.10/data/workloads/do_kernel_compile_loop0000775000000000000000000000236113151230744020025 0ustar #!/bin/sh DESCRIPTION="Workload to build the kernel source tree repeatedly" PREREQS="" DEPENDS="linux-source" WORKING_DIR=${WORKING_DIR:-~/linux-build} DISTFILE=${DISTFILE:-$(ls /usr/src/linux*tar.bz2 | head -n 1)} check() { # Verify that linux source got installed if [ -z "$DISTFILE" ]; then echo "Error: Linux source tarball is not present" return 1 fi } setup() { check || return 1 mkdir -p $WORKING_DIR if [ ! -d $WORKING_DIR ]; then echo "Error: $WORKING_DIR does not exist" return 2 fi cd $WORKING_DIR echo "Unpacking linux source tar file" rm -rf ${WORKING_DIR}/* tar xjf $DISTFILE mv ${WORKING_DIR}/* linux-source } workload() { cd $WORKING_DIR/linux-source make mrproper make defconfig make -j20 bzImage } case $1 in info) echo $DESCRIPTION ;; depends) echo $DEPENDS ;; check) check ;; setup) setup ;; once) setup ; workload ;; run) echo $$ setup || exit 1 while : do workload done ;; *) echo $DESCRIPTION echo echo "Usage: $0 {info|depends|setup|check|once|run}" exit 1 esac xdiagnose-3.8.10/data/workloads/do_monitor_disable_loop0000775000000000000000000000217213151230744020207 0ustar #!/bin/bash DESCRIPTION="Uses RANDR to disable/enable video outputs" PREREQS="" DEPENDS="" CYCLE_DELAY=${CYCLE_DELAY:-5} OUTPUT_NAME=$(xrandr | grep ' connected ' | cut -d' ' -f1 | head -n 1) ORIGINAL_STATE=$(xrandr) # TODO: When the output is restored, it comes back mirrored even though # it might have originally been extended. Need a function which # takes an xrandr snapshot as input, parses it, and then invokes # the respective xrandr options to put it back to that state. workload() { echo $OUTPUT_NAME xrandr --output ${OUTPUT_NAME} --off sleep 1 xrandr --output ${OUTPUT_NAME} --auto sleep ${CYCLE_DELAY} } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/do_monitor_resolution_loop0000775000000000000000000000176513151230744021016 0ustar #!/bin/bash DESCRIPTION="Uses RANDR to rotate/reflect screen" PREREQS="" DEPENDS="" CYCLE_DELAY=${CYCLE_DELAY:-12} OUTPUT_NAME="TODO" ORIGINAL_STATE=$(xrandr) # TODO: Need a function which takes an xrandr snapshot as input, parses # it, and then invokes the respective xrandr options to put it # back to that state. workload() { for mode in $(xrandr-tool resolutions $OUTPUT_NAME); do echo $mode xrandr --output ${OUTPUT_NAME} --mode $mode sleep 3 done sleep ${CYCLE_DELAY} } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/do_monitor_rotation_loop0000775000000000000000000000237513151230744020450 0ustar #!/bin/bash DESCRIPTION="Uses RANDR to rotate/reflect screen" PREREQS="" DEPENDS="" CYCLE_DELAY=${CYCLE_DELAY:-15} ORIGINAL_STATE=$(xrandr) # TODO: Need a function which takes an xrandr snapshot as input, parses # it, and then invokes the respective xrandr options to put it # back to that state. workload() { echo $OUTPUT_NAME xrandr --output ${OUTPUT_NAME} --reflect xy sleep 1 xrandr --output ${OUTPUT_NAME} --reflect normal sleep 1 xrandr --output ${OUTPUT_NAME} --rotate inverted sleep 1 xrandr --output ${OUTPUT_NAME} --rotate left sleep 1 xrandr --output ${OUTPUT_NAME} --rotate right sleep 1 xrandr --output ${OUTPUT_NAME} --rotate normal sleep 1 xrandr --output ${OUTPUT_NAME} --auto sleep ${CYCLE_DELAY} } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/do_screensaver_loop0000775000000000000000000000463513151230744017363 0ustar #!/bin/bash DESCRIPTION="Workload that exercises screensaver functionality" PREREQS="" DEPENDS="gnome-screensaver" CYCLE_DELAY=${CYCLE_DELAY:-10} ORIG_LOCK_STATE=true ORIG_MODE=blank ORIG_SAVERS="[]" SCREENSAVERS=$(ls -1 /usr/share/applications/screensavers/gl* | cut -d/ -f6 | cut -d. -f1) export $(dbus-launch) setup() { ORIG_LOCK_STATE=$(gconftool-2 --get /apps/gnome-screensaver/lock_enabled) ORIG_MODE=$(gconftool-2 --get /apps/gnome-screensaver/mode) ORIG_SAVERS=$(gconftool-2 --get /apps/gnome-screensaver/themes) # Disable screensaver locking gconftool-2 --set /apps/gnome-screensaver/lock_enabled \ --type Boolean FALSE # Switch screensaver to single mode gconftool-2 --set /apps/gnome-screensaver/mode \ --type string "single" return 0 } finalize() { # Restore screensaver locking gconftool-2 --set /apps/gnome-screensaver/lock_enabled \ --type Boolean ${ORIG_LOCK_STATE} # Restore screensaver mode gconftool-2 --set /apps/gnome-screensaver/mode \ --type Boolean ${ORIG_MODE} } check() { gnome-screensaver-command -q if [ $? -ne 0 ]; then echo "Error: gnome-screensaver unavailable" return 1 fi if [ -z "${SCREENSAVERS}" ]; then echo "Error: No screensavers found" return 1 fi return 0 } workload() { for screensaver in ${SCREENSAVERS}; do echo $screensaver gconftool-2 --set /apps/gnome-screensaver/themes \ --type list --list-type string "[screensavers-$screensaver]" if [ $? -ne 0 ]; then echo "Error: Failed to set screensaver" fi gnome-screensaver-command -a sleep ${CYCLE_DELAY} gnome-screensaver-command -c sleep ${CYCLE_DELAY} gnome-screensaver-command -p sleep ${CYCLE_DELAY} gnome-screensaver-command -d done } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) check ;; setup) setup ;; once) setup ; workload ; finalize ;; restore) finalize ;; run) echo $$ setup while : do workload done finalize ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run|restore}" exit 1 esac xdiagnose-3.8.10/data/workloads/do_video_loop0000775000000000000000000000266713151230744016154 0ustar #!/bin/bash VIDEO_DEFAULT=/usr/share/tpclient-pywx/graphics/intro-high.mpg DESCRIPTION="Workload that runs multiple video streams in parallel" PREREQS="Specify a video (defaults to ${VIDEO_DEFAULT})" DEPENDS="mplayer tpclient-pywx" VIDEO_FILENAME=${2:-${VIDEO_DEFAULT}} VIDEO_PLAYER=${VIDEO_PLAYER:-mplayer -volume 0} CYCLE_DELAY=${CYCLE_DELAY:-12} check() { # Verify a valid video has been specified if [ ! -e $VIDEO_FILENAME ]; then if $VIDEO_FILENAME = $VIDEO_DEFAULT ; then echo "Error: Could not find video to play" echo " Install tpclient-pywx or specify file on command line" else echo "Error: $VIDEO_FILENAME does not exist" fi return 1 fi } workload() { ${VIDEO_PLAYER} ${VIDEO_FILENAME} > /dev/null 2>&1 & PID=$! echo ${VIDEO_PLAYER} ${VIDEO_FILENAME} [${PID}] # Let video play for a while, then kill it if it's still running sleep ${CYCLE_DELAY} kill ${PID} > /dev/null 2>&1 } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) check ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/do_vtswitch_loop0000775000000000000000000000152113151230744016705 0ustar #!/bin/bash DESCRIPTION="Workload that cycles between X and a vt console" PREREQS="Must be run as administrative user" DEPENDS="fgconsole" CYCLE_DELAY=${CYCLE_DELAY:-4} check() { if $UID = 0; then return 0 fi return 1 } workload() { CUR_CON=$(sudo fgconsole) chvt 1 sleep $CYCLE_DELAY chvt $CUR_CON sleep $CYCLE_DELAY } case $1 in info) echo $DESCRIPTION echo $PREREQS ;; depends) echo $DEPENDS ;; check) check ;; setup) ;; once) workload ;; run) echo $$ while : do workload done ;; *) echo $DESCRIPTION echo echo $PREREQS echo echo "Usage: $0 {info|depends|setup|check|once|run} [VIDEO]" exit 1 esac xdiagnose-3.8.10/data/workloads/repro.sh0000775000000000000000000000142713151230744015064 0ustar #!/bin/bash INFO=$(wmctrl -d) WORKAREA_WIDTH=$(echo "${INFO}"| awk '{sub(/x[0-9]+/, "", $9); print $9}') WORKAREA_HEIGHT=$(echo "${INFO}"| awk '{sub(/[0-9]+x/, "", $9); print $9}') FULLSCREEN=${WORKAREA_WIDTH}x${WORKAREA_HEIGHT} XVT=$(sudo fgconsole) chws() { wmctrl -o $(($WORKAREA_WIDTH * $1)),0 } #for x in `seq 1 3`; do # echo "System will suspend now. Please wake it up again." # sudo pm-suspend # sleep 5 #done chws 0 for x in `seq 1 10`; do gnome-terminal & done sleep 5 chws 1 glxgears -geometry $FULLSCREEN >/dev/null & glxgears >/dev/null & sleep 5 chws 2 gnome-terminal --geometry=$FULLSCREEN & sleep 5 chws 3 totem $(perl -e 'print "/usr/share/example-content/Ubuntu_Free_Culture_Showcase/SpiritOfUbuntu.ogv " x 30;') & sleep 5 while true; do chws 4 chws 0 done xdiagnose-3.8.10/data/workloads/run_workloads0000775000000000000000000000454113151230744016215 0ustar #!/usr/bin/python3 from __future__ import absolute_import, print_function, unicode_literals import sys import apt import subprocess import signal import time # TODO: Depends on whether xdiagnose has been installed #workloads_dir = '/usr/share/xdiagnose/workloads' workloads_dir = '.' workloads = [ 'do_video_loop' ] # TODO: Trap ^C and do cleanup if its hit # TODO: Start up multiple workloads simultaneously def signal_handler(signal, frame): print "Ctrl-C hit" sys.exit(0) signal.signal(signal.SIGINT, signal_handler) def check_dependencies(): dependencies_unmet = [] for script in workloads: exe = "%s/%s depends" %(workloads_dir, script) print exe p = subprocess.Popen([exe], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() depends = stdout.strip().split() for package in depends: print " ", package progress = apt.progress.base.OpProgress() cache = apt.apt_pkg.Cache(progress) sources = apt.apt_pkg.SourceRecords() pkg = None if package in cache: pkg = cache[package] elif sources.lookup(package): source = sources.get(package) # TODO: Is it installed? for binary_package in source.binaries: if binary_package in cache: pkg = cache[package] if pkg is None: sys.stderr.write("Error: Couldn't find package %s\n" %(package)) dependencies_unmet.append(package) elif pkg.current_state != apt.apt_pkg.CURSTATE_INSTALLED: dependencies_unmet.append(package) return dependencies_unmet dependencies_unmet = check_dependencies(): if len(dependencies_unmet)>0: sys.stderr.write("Error: Unmet dependencies\n") for dep in dependencies_unmet: sys.stderr.write(" %s\n" %(dep)) sys.exit(1) for script in workloads: exe = "%s/%s depends" %(workloads_dir, script) print exe # TODO: Hang onto processes p = subprocess.Popen([exe], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() print "'%s'" %(stdout.strip()) # TODO: Wait on child processes to complete time.sleep(200) xdiagnose-3.8.10/data/workloads/youtube-loop.html0000664000000000000000000000141113151230744016720 0ustar Auto-looping Youtube Video

Auto-looping Youtube Video

This test page plays the following youtube video in an endless loop.

xdiagnose-3.8.10/data/workloads/youtube-reload.html0000664000000000000000000000137313151230744017224 0ustar Auto-reloading Youtube Video

Auto-reloading Youtube Video

This page will reload and play this youtube video every minute.

xdiagnose-3.8.10/debian/0000775000000000000000000000000014020554614011677 5ustar xdiagnose-3.8.10/debian/changelog0000664000000000000000000006623614020554614013566 0ustar xdiagnose (3.8.10) hirsute; urgency=medium * Drop build-dependency on obsolete dh-systemd -- Steve Langasek Fri, 05 Mar 2021 17:23:24 -0800 xdiagnose (3.8.9) disco; urgency=medium * failsafeXServer: Fix checking when the server was last run, thanks Kevin Dalley! (LP: #1816945) -- Timo Aaltonen Tue, 05 Mar 2019 15:23:57 +0200 xdiagnose (3.8.8) artful; urgency=medium * Move apport hooks to xserver-xorg. -- Timo Aaltonen Tue, 29 Aug 2017 16:39:14 +0300 xdiagnose (3.8.7) artful; urgency=medium * debian/xdiagnose.links: Remove slightly outdated lts-quantal links. -- Adam Conrad Fri, 16 Jun 2017 10:32:55 -0600 xdiagnose (3.8.6) artful; urgency=medium * Don't crash in xedid when /lib/firmware/edid/ is missing (LP: #1628283) * Remove pybuild build artifact from the source package * Remove debdiff files left over in previous upload. * Remove stray .bzr directory. -- Balint Reczey Wed, 07 Jun 2017 01:18:24 +0000 xdiagnose (3.8.5) yakkety; urgency=medium * Use xdiagnose-pkexec helper script (like synaptic-pkexec) to fix xdiagnose not starting from GNOME's Activities Overview (LP: #1483276) * Install app icon in standard location (making it themeable) -- Jeremy Bicha Sat, 20 Aug 2016 00:55:14 -0400 xdiagnose (3.8.4) xenial; urgency=medium * links: Add -video-amdgpu and -input-libinput. -- Timo Aaltonen Thu, 07 Apr 2016 13:19:34 +0300 xdiagnose (3.8.3) xenial; urgency=medium * Complete the port to Python 3-only. (LP: #1440564) * d/control: Update Build-Depends to use pybuild and drop Python 2. * d/rules: Switch to --buildsystem pybuild and simplify rules. * d/compat: Bump to version 9. -- Barry Warsaw Fri, 19 Feb 2016 08:41:53 -0500 xdiagnose (3.8.2build1) xenial; urgency=medium * No-change rebuild to drop python3.4 support. -- Matthias Klose Tue, 19 Jan 2016 12:40:02 +0100 xdiagnose (3.8.2) xenial; urgency=medium * Drop obsolete and no-op dh_installinit --upstart-only option. (LP: #1519228) -- Martin Pitt Tue, 24 Nov 2015 10:20:45 +0100 xdiagnose (3.8.1build1) xenial; urgency=medium * No-change rebuild for python3 defaults change. -- Matthias Klose Fri, 23 Oct 2015 19:37:37 +0000 xdiagnose (3.8.1) wily; urgency=medium * debian/xdiagnose.links: - Add links for the current nvidia packages. * apport/source_xorg.py: - Don't fail if no /proc/driver/nvidia is available, as the kernel module might not be loaded. - Add a pattern to match all the nvidia driver flavours. -- Alberto Milone Mon, 05 Oct 2015 16:27:37 +0200 xdiagnose (3.8) wily; urgency=medium [ Didier Roche ] * Port and ensure scripts are running with python3 (LP: #1440564) -- Steve Langasek Wed, 10 Jun 2015 13:47:00 -0700 xdiagnose (3.7.2) vivid; urgency=medium * Only fallback to xdiagnose on systemd if an installed default display manager is configured. Do not fail graphical.target without any dm. (LP: #1441883) -- Didier Roche Thu, 09 Apr 2015 10:38:15 +0200 xdiagnose (3.7.1) vivid; urgency=medium * Ship xdiagnose.conf override to have graphical.target requiring display-manager.service and falling back to failsafe mode if failing. * Change console option to correspond to multi-user.target instead of rescue mode. * Ensure we don't start the xdiagnose failsafe target while upgrading. -- Didier Roche Mon, 15 Dec 2014 14:30:51 +0100 xdiagnose (3.7) vivid; urgency=medium * add systemd failsafe mode: - add special failsafe-graphical.target and failsafe-x.service units - detect from Xinit if run under systemd and console is then rescue target - ship systemd units and depends on dh-systemd * Adapt failsafe Xinit/XServer to be able to run with lightdm without gdm being installed * Bump Standards-Version -- Didier Roche Mon, 08 Dec 2014 17:15:12 +0100 xdiagnose (3.6.6) utopic; urgency=medium * Disable apport hook again for utopic. -- Maarten Lankhorst Mon, 06 Oct 2014 10:20:36 +0200 xdiagnose (3.6.5) utopic; urgency=medium * apport/apport-gpu-error-intel.py: include the package version in the Package key so that data on errors.ubuntu.com is richer. -- Brian Murray Thu, 29 May 2014 08:27:55 -0700 xdiagnose (3.6.4) utopic; urgency=medium * debian/failsafe-x.conf: Use RESULT=failed instead of EXIT_STATUS=[!0] to catch more failure cases (like hitting the upstart respawn limit) and to allow the lightdm or gdm jobs to specify their own normal exit statuses. * debian/xdiagnose.udev: Re-enable Intel apport hook for utopic -- Michael Terry Thu, 01 May 2014 14:08:59 -0400 xdiagnose (3.6.3build2) trusty; urgency=medium * Rebuild against Python 3.4. -- Matthias Klose Sun, 23 Mar 2014 09:59:55 +0100 xdiagnose (3.6.3build1) trusty; urgency=medium * Rebuild against Python 3.4. -- Colin Watson Thu, 13 Mar 2014 16:22:07 +0000 xdiagnose (3.6.3) trusty; urgency=medium * debian/xdiagnose.udev: Disable apport hook again. -- Maarten Lankhorst Wed, 12 Mar 2014 10:26:35 +0100 xdiagnose (3.6.2build1) trusty; urgency=medium * Rebuild to drop files installed into /usr/share/pyshared. -- Matthias Klose Sun, 23 Feb 2014 13:54:53 +0000 xdiagnose (3.6.2) trusty; urgency=low * debian/xdiagnose.udev: Re-enable apport hook for trusty. -- Maarten Lankhorst Tue, 22 Oct 2013 10:27:48 +0200 xdiagnose (3.6.1) saucy; urgency=low * debian/xdiagnose.udev: Disable apport hook again. -- Maarten Lankhorst Mon, 14 Oct 2013 09:06:55 +0200 xdiagnose (3.6) saucy; urgency=low [ Bryce Harrington ] * xedid: + Make -h display the proper usage information + refactoring: move firmware operations to an EdidFirmware class + Clarify documentation + Implement uninstall and deactivate API [ Maarten Lankhorst ] * debian/xdiagnose.udev: Re-enable apport hook for saucy. -- Bryce Harrington Fri, 03 May 2013 13:20:50 -0700 xdiagnose (3.5.1) raring-proposed; urgency=low * bin/xdiagnose: Exit with error if run as non-root. Otherwise, the program will crash when it tries to write a new grub configuration. (LP: #769419) -- Bryce Harrington Tue, 23 Apr 2013 14:15:03 -0700 xdiagnose (3.5) raring-proposed; urgency=low * apport/source_xorg.py: + Catch exceptions thrown from attach_hardware() call, such as for errors in unicode handling. (LP: #1168206) + Only prompt for generating an nvidia-bug-report.log.gz in user interactive sessions (i.e. check that ui is defined.) (LP: #1163635) -- Bryce Harrington Thu, 11 Apr 2013 18:53:27 -0700 xdiagnose (3.4.4) raring; urgency=low * debian/xdiagnose.udev: Disable gpu apport hook for raring release (LP: #1073626) * apport/apport-gpu-error-intel.py: - Bail if not on a devel release (LP: #1071278) - Skip over failure accessing apt cache (LP: #1103061) -- Bryce Harrington Mon, 01 Apr 2013 18:54:09 -0700 xdiagnose (3.4.3) raring; urgency=low [ Bryce Harrington ] * apport/source_xorg.py: + Fix assertion in apport when assigning a None value for the xserver.configfile parameter. This may not be defined if there is no xorg.conf (a common situation). + Fix HookError when specifying a gpu hang is 'infrequent' + Drop the post-release dialog recommending technical support (LP: #1080233, #1005573) + Add capturing of gsettings options for unredirected fullscreen windows * debian/xdiagnose.links: + Add lts-quantal X.org packages [ Michael Terry ] * Switch from gksu to pkexec (LP: #421660) -- Bryce Harrington Wed, 13 Feb 2013 18:38:28 -0800 xdiagnose (3.4.2) raring; urgency=low * control: Add Conflicts for ubuntu-defaults-nexus7 <= 0.39, since xrotate was in that package previously. (LP: #1101842) * apport/source_xorg.py: Don't rely on __file__ for locating modules from the package; instead catch the import errors and skip use of the feature. (LP: #1101800) -- Bryce Harrington Sat, 19 Jan 2013 11:59:08 -0800 xdiagnose (3.4.1) raring; urgency=low * Fix python3 issues (LP: #1101688) -- Bryce Harrington Sat, 19 Jan 2013 01:26:24 -0800 xdiagnose (3.4) raring; urgency=low * bin/xrotate: Add new script to manually rotate screen and input. Designed for the Nexus 7 tablet; will need extended to support other devices. * bin/xedid: Add new script for viewing and installing EDID files into firmware. + Fixes situation where EDID is unavailable, corrupted, or invalid (LP: #575985) + Fixes situation where KVM corrupts the EDID the monitor provides. (LP: #992346) * bin/xpci: Fix two string issues so xpci will run. (LP: #1098390) * apport/source_xorg.py: Gracefully skip Xorg.0.log parsing if the parsing fails. (LP: #1098395) * apport/apport-gpu-error-intel.py: Gracefully skip DMI parsing if the parsing fails. (LP: #1062042) * xdiagnose/applet.py: Fix bug where a stray =1 gets added to GRUB_CMDLINE_LINUX_DEFAULT. (LP: #954123) * tests: Add sample Xorg.*.log files rather than using the on-disk one -- Bryce Harrington Wed, 09 Jan 2013 18:17:24 -0800 xdiagnose (3.3) raring; urgency=low * apport/source_xorg.py: Integrate use of the Xorg log parsing module to display summary info parsed from Xorg.0.log. (LP: #1035499) -- Bryce Harrington Thu, 04 Oct 2012 16:39:43 -0700 xdiagnose (3.2) quantal; urgency=low * bin/*: When run within trunk, use trunk modules * failsafe-x: Remove the (obsolete) archive generation functionality. Users should use `ubuntu-bug xorg` instead in this case. (LP: #1036211) * control: Depend on python3-apport since apport hooks have been converted to python3. (LP: #1056837) * apport/source_xorg.py: Don't prompt with support questions for auto-collected crash bugs. (LP: #1036114) -- Bryce Harrington Tue, 25 Sep 2012 11:16:30 -0700 xdiagnose (3.1) quantal; urgency=low * control: Move intel-gpu-tools to recommends to fix FTBS * Force Xorg.0.log encoding to bytes to work around UTF-8 issues (LP: #1041104) * Drop unused and undefined i18n calls (LP: #1046991) * Use gksudo to gain elevated permissions required by xdiagnose (LP: #769419) -- Bryce Harrington Tue, 28 Aug 2012 15:39:01 -0700 xdiagnose (3.0) quantal; urgency=low * Rename general.lib to bubu.lib (Bash UBuntu Utilities) * x_pkg_names.py: Add module for determining upstream name for debian package * xorglog.py: Add module for parsing the Xorg.0.log file * pci_devices.py: Update intel, poulsbo, ati, and nvidia PCI IDs * xdiagnose: Fix --version to print the version * xpci: Fix python3 byte->str conversion error * apport/source_xorg.py: - Fix python3 conversion issue finding string in bytes - Improve grammar/punctuation in a couple dialogs * debian/control: Add dependency on librsvg2-common for icon (LP: #1026752) -- Bryce Harrington Wed, 15 Aug 2012 13:44:38 -0700 xdiagnose (2.9) quantal; urgency=low * xdiagnose.udev: Make the GPU apport hook trigger on RESET=1 rather than ERROR=1, as an attempt to prevent capturing bug reports on false gpu lockups. (LP: #983640) * apport/source_xorg.py: - Link to all technical support options, not just to Ask Ubuntu. Reword recommendation to explain why technical support should be used first. Add a 'referred-by-support' tag so we can give those bugs priority attention. Provide an option to just file the bug. (LP: #991602) - Drop question to allow flagging regressions following updates, since bug reporters have been using it incorrectly, resulting in too many false positives. (LP: #1018510) - Clarify question about "willing to do whatever it takes" to specify that the debugging work may require gdb or git bisection work. * xdiagnose.desktop.in: Move xdiagnose to System/Settings menu. Provide a GenericName. Set the gettext domain. * debian/control: Add runtime dependency on librsvg2, required for displaying SVG icons. (LP: #969603) -- Bryce Harrington Tue, 19 Jun 2012 14:26:04 -0700 xdiagnose (2.8) quantal; urgency=low * Drop out-of-tree python2 module (LP: #1013911) -- Bryce Harrington Fri, 15 Jun 2012 19:29:56 -0700 xdiagnose (2.7) quantal; urgency=low [ Oliver Grawert ] * port all program code to new python3 conventions * adjust shebang lines for all python scripts to use python3 * update debian/rules and control for python3 support * remove unused debian/pycompat file * switch test suite to python3 * make test suite skip testing of directories * add dependency on python3-apport * make launchpadlib usage optional until it is ported to python3 * adjust apport-gpu-error-intel.py for new apport API * xdiagnose/applet.py fix string handling of subprocess.Popen * fixes (LP: #1013171) [ Bryce Harrington ] * Add a couple preliminary edid tools * Fix apt_install to not use chroots * Install general.lib * Don't show xdiagnose in the menu (LP: #994048) * Build depend on both py2 and py3 versions of distutils-extra, required by dh_auto_clean -- Bryce Harrington Thu, 14 Jun 2012 11:00:23 -0700 xdiagnose (2.6) quantal; urgency=low * Add general.lib to consolidate common bash functions * Add Makefile to generate API docs with pydoctor * apport-gpu-error-intel.py: Use --force to override certain early exits in gpu hook. * control: Add explicit depends on apport for apport.hookutils * rules: Force python_distutils as build system -- Bryce Harrington Wed, 16 May 2012 22:13:53 -0700 xdiagnose (2.5) precise; urgency=low * apport hook fixes: - Fix missing Xorg.0.log, xorg.conf, etc. files for bugs filed against input packages. - Fix inclusion of lightdm logs, which were recently renamed in lightdm. - Fix reversed logic for inclusion of keyboard data on input bugs - Fix reporting gpu lockups without signatures. These aren't actionable bug reports since there is no indicated error. -- Bryce Harrington Fri, 13 Apr 2012 13:13:26 -0700 xdiagnose (2.4) precise; urgency=low * Fix 'sys is not defined' error. Occurs if grub config is inaccessible. (LP: #961520) * Fix scripts to be executable. (LP: #966649) * apport hook fixes: - Refresh list of X.org package apport hooks to match all packages the ubuntu-x-team is subscribed to as of LTS 12.04 pre-freeze date. - Drop inclusion of gdm logs. Since Ubuntu uses lightdm now, these files are no longer needed. - Fix generation of nvidia-bug-report.log.gz. Executable had the wrong path, so bug reports were being filed without this file. It is required for forwarding bugs to NVIDIA. - Add a --force arg, to enable the gpu hook test to run even if apport has been disabled on the system. Enables test suite to pass all tests on Precise. * Add an xpci script to display device/driver info -- Bryce Harrington Wed, 04 Apr 2012 13:30:31 -0700 xdiagnose (2.3) precise; urgency=low * Fix crash due to undefined utils.screen. Add utils module to setup script. (LP: #959841) -- Bryce Harrington Tue, 20 Mar 2012 10:47:38 -0700 xdiagnose (2.2) precise; urgency=low * apport hook fixes: + Fix tagging of compiz bugs. Only include the tag if we can extract a valid number from the compiz --version string. (LP: #927343) + Use main.log instead of apt.log for determining last major upgrade. * failsafe-X fixes: + Fix broken reconfigure option in failsafe-X scripts. Drop command to call Xorg -configure. In addition to not working in this case, when it does work it generates a xorg.conf that would never work. (LP: #565490) + Fix broken keyboard/mouse input when entering failsafe-X mode, by dropping the vt7 workaround (which no longer appears needed.) (LP: #914038) * xdiagnose applet fixes: + Fix crash with KeyError in run(): 'quiet' by checking key existance before deleting. (LP: #946836) + Fix non-closable error listings window, by converting main window from a Dialog to a Window. (LP: #941882) + Fix ^C in terminal to terminate the program. + Fix strings to not refer directly to Ubuntu, so can be more easily used in derivatives. (LP: #495253) + Fix crash about /etc/default/grub being unwritable. Check file existance on startup and exit if it isn't present. (LP: #946309) + Fix test failure in config_update removing a non-existant key. Check for it before removal. -- Bryce Harrington Wed, 14 Mar 2012 13:14:31 -0700 xdiagnose (2.1) precise; urgency=low [ Bryce Harrington ] * Preliminary redesign of failsafe-x dialog [ Gabor Kelemen ] * Enable better i18n support (LP: #913802) -- Bryce Harrington Wed, 11 Jan 2012 17:50:18 +0100 xdiagnose (2.0) precise; urgency=low * debian/control: Drop dependence on transitional python-gobject in favor of python-gi. * Avoid deleting keys from dict that don't exist. Fixes crash with missing 'nopat'. (LP: #903484) -- Bryce Harrington Wed, 11 Jan 2012 15:40:02 +0100 xdiagnose (1.9) precise; urgency=low * debian/control: Add versioned Conflicts: to x11-common, to ensure that we don't unpack xdiagnose with a changed /etc/init/failsafe-x.conf conffile before the new x11-common preinst has a chance to remove its own obsolete one. (LP: #903143) -- Martin Pitt Thu, 15 Dec 2011 10:31:58 +0100 xdiagnose (1.8) precise; urgency=low * rules: Fix dh_installinit to actually install the upstart rule (LP: #876031) * failsafeXServer: Always generate a new xorg.conf.failsafe. * control: Drop apport dependency (LP: #888749) -- Bryce Harrington Fri, 02 Dec 2011 17:46:11 -0800 xdiagnose (1.7) precise; urgency=low * Add data/media/microscope.svg - icon for program. Icon derived from microscope image by flooredmusic on OpenClipart.org (public domain image). * Include datetime module (LP: #881840) * Drop user notification of past manually-installed nvidia packages. The packaging scripts do a better job catching this now, and this logic can produce false-positives sometimes. (LP: #847601) * Properly substitute $xorg_backup_file variable in failsafe-x (LP: #575873) [Chad Miller] * Improve wording of 'development is complete' dialog. (LP: #891645) -- Bryce Harrington Wed, 05 Oct 2011 19:36:24 -0700 xdiagnose (1.6) oneiric; urgency=low * Correct X availability check. Needs to use gi rather than pygtk. * Extract BUG/OOPS/ERROR messages from dmesg and display in GUI -- Bryce Harrington Wed, 05 Oct 2011 17:41:45 -0700 xdiagnose (1.5) oneiric; urgency=low * Check if X is up before trying to do GUI stuff (LP: #829607) * Fix crash (ValueError) when running apport hook as root. Thanks Chris Bainbridge. (LP: #844733) -- Bryce Harrington Wed, 05 Oct 2011 11:46:12 -0700 xdiagnose (1.4) oneiric; urgency=low * failsafeXServer: - Detect and use fbdev where appropriate. - Don't take md5sum of xorg.conf if it isn't there. - Accept display manager name as first argument * debian/failsafe-x.upstart: Pass display manager to failsafeXServer * bin/xrandr-tool: New utility to parse output from xrandr * data/workloads/: Add workloads to exercise xrandr functionalities * xdiagnose: - Button for viewing Xorg.0.log error messages - Button for filing a bug report against xorg -- Bryce Harrington Mon, 29 Aug 2011 18:52:17 -0700 xdiagnose (1.3) oneiric; urgency=low * Bump the Replaces versioning to be << 1:7.6+7ubuntu1, the first version with the xorg apport hook split out. Fixes upgrades from Natty when natty-updates are enabled. (LP: #865083) -- Christopher James Halse Rogers Mon, 03 Oct 2011 17:54:30 +1100 xdiagnose (1.2) oneiric; urgency=low * add support to the xorg apport hook for the new nux caching method: (LP: #842656) - unconditionaly rerun the test and ignore the cache - attach available cache files if present -- Didier Roche Tue, 06 Sep 2011 17:55:45 +0200 xdiagnose (1.1) oneiric; urgency=low [Michael Vogt] * add missing replaces on x11-common [Bryce Harrington] * rules, failsafe-x.upstart: Change failsafe-x from gdm to lightdm * apport hooks - Display debug output when invoked directly - Include lsinput and dmidecode for input bugs - Move scripts into an apport/ directory - Correct duplicate installation of the gpu hook * bin/dpkg-log-summary: New script to parse /var/log/dpkg.log and display data in a slightly more comprehensible fashion. * data/workloads/: Add a set of scripts to generate various types of stresses on the system, to assist in reproducing bugs. * data/failsafe*: Move into the data subdir so DistUtilsExtra.auto will auto-install them properly. -- Bryce Harrington Fri, 19 Aug 2011 12:15:43 -0700 xdiagnose (1.0) oneiric; urgency=low * apport hooks - Title false gpu lockup bugs as 'False GPU lockup' * control: Up the replaces version to account for -intel SRUs (LP: #824023) -- Bryce Harrington Thu, 11 Aug 2011 12:18:12 -0700 xdiagnose (0.9) oneiric; urgency=low * apport hooks - ui.choice() returns an array of results, not a scalar - Avoid attaching display manager files if the log directory isn't there - Enable user to tag bugs to indicate if its a regression, they know a workaround or fix, etc. - Clarify other user-visible messages * xdiagnose applet - Cleanup codebase * failsafeXServer - Write logs to /var/log/, not /var/log/gdm/ - Fix run log detection * failsafeXinit - Update for lightdm - General cleanup -- Bryce Harrington Tue, 19 Jul 2011 19:10:01 -0700 xdiagnose (0.8) oneiric; urgency=low * apport hooks - Exit if user clicked cancel - fix incorrect variable name, causing bug filing to fail with traceback "NameError: global name 'choice' is not defined" - couple minor clarifications - Set false gpu hang bug titles to 'False GPU lockup' - Include dpkg.log in all reports. We get many bugs reported to X.org that are regressions in other packages outside X; this will help identify what the true cause might have been. - Add a --stdout option to facilitate testing * run-tests: Support running bash tests * tests/test_apport_gpu_hook, tests/test_source_xorg: Add basic test checks for the apport hooks. * pci_device.py: Add NOUVEAU to list of supported drivers in PCI ID table -- Bryce Harrington Tue, 19 Jul 2011 14:17:00 -0700 xdiagnose (0.7) oneiric; urgency=low * source_xorg.py: + Add lightdm log files + Add plymouth log files + Add -evdev version + Ask a few basic questions for gpu hang bugs + Segregate users willing to do additional testing and debugging * pci_device.py: Add a PCI ID lookup module * apport-gpu-error-intel.py: Generate signature from i915_error_state file * run-tests, tests/*: Add tests to do some basic checks. -- Bryce Harrington Thu, 30 Jun 2011 01:06:20 -0700 xdiagnose (0.6) oneiric; urgency=low * xdiagnose/*.py, bin/xdiagnose: Port from pygtk to PyGI and GTK 3. * debian/control: Update dependencies for GI. Drop python-launchpad-integration, it's not being used right now. Once it is, this needs to use gir1.2-launchpad-integration-3.0. * debian/control: Bump python-distutils-extra build dependency to >= 2.28 to ensure that we don't use 2.27 (which causes an FTBFS). * debian/control: Bump Standards-Version to 3.9.2, no changes necessary. -- Martin Pitt Thu, 16 Jun 2011 13:47:16 +0200 xdiagnose (0.5) oneiric; urgency=low * debian/control, debian/rules: Convert from cdbs to dh7. Before it tried to mix cdbs includes and override_* stanzas, which doesn't work. Also fix the source directory of apport-gpu-error-intel.py. This makes the installation of the setup.py bits actually work (such as the Python module). * debian/rules: Drop override for installing apport-gpu-error-intel.py. Do that in debian/xdiagnose.install instead. -- Martin Pitt Thu, 16 Jun 2011 12:53:17 +0200 xdiagnose (0.4) oneiric; urgency=low * debian/rules: Drop usage of pysupport, as we dropped it from the build depends. Fixes FTBFS. * debian/control: Drop python-distutils-extra dependency, this is just a build dependency. -- Martin Pitt Thu, 16 Jun 2011 12:40:16 +0200 xdiagnose (0.3) oneiric; urgency=low * debian/control, debian/rules: Convert to dh_python2 instead of python-support. (LP: #784885) -- Bryce Harrington Fri, 10 Jun 2011 18:09:32 -0700 xdiagnose (0.2-0ubuntu2) natty; urgency=low * xdiagnose/XDiagnoseApplet.py: Disable the grub text mode feature. Since this feature involves adding another line to the grub config, turning this back off gets a bit complicated. -- Bryce Harrington Thu, 07 Apr 2011 23:27:52 -0700 xdiagnose (0.2-0ubuntu1) natty; urgency=low * control, rules, copyright: Switch to CDBS packaging * control: Drop glade dependency (not needed with new quickly templates) * bin/xdiagnose, xdiagnose/XDiagnoseApplet.py: + Fix failure to run due to missing python library file. Narrow tool's scope down to just kernel param editing for X debugging. + Add options for turning on kernel drm debugging and disabling splash + Add option for working around nvidia memory bug + Add option for working around vesafb conflict bugs + Add option to force grub to use text mode, for working around vesafb transition issues. -- Bryce Harrington Wed, 06 Apr 2011 19:29:30 -0700 xdiagnose (0.1-0ubuntu2) natty; urgency=low * Add dependencies on gtk and glade libraries (LP: #672996) -- Bryce Harrington Fri, 17 Dec 2010 11:16:43 -0800 xdiagnose (0.1-0ubuntu1) natty; urgency=low * Initial release. This package breaks out the xorg FailsafeX application to its own package. Since FailsafeX is not used by Debian, this helps reduce the divergence of Ubuntu's xorg package with them. Also, having it a standalone package should help with testing. -- Bryce Harrington Thu, 04 Nov 2010 16:26:31 -0700 xdiagnose-3.8.10/debian/compat0000664000000000000000000000000213151230744013074 0ustar 9 xdiagnose-3.8.10/debian/control0000664000000000000000000000162114020554614013302 0ustar Source: xdiagnose Section: python Priority: extra X-Python3-Version: >= 3.2 Build-Depends: debhelper (>= 9.20160709), dh-python, dh-translations, python3 (>= 3.2), python3-all, python3-gi, intltool, apport, python3-distutils-extra (>= 2.32-2), Maintainer: Bryce Harrington Standards-Version: 3.9.6 Homepage: http://wiki.ubuntu.com/X Package: xdiagnose Architecture: all Depends: ${misc:Depends}, ${python3:Depends}, python3-gi (>= 3.2.0-3), gir1.2-gtk-3.0, python3-apport, librsvg2-2, librsvg2-common, policykit-1, Recommends: intel-gpu-tools Replaces: xserver-xorg-video-intel (<= 2:2.14.0-4ubuntu8), xorg (<< 1:7.6+7ubuntu1), x11-common (<< 1:7.6+7ubuntu1) Conflicts: x11-common (<< 1:7.6+7ubuntu1), ubuntu-defaults-nexus7 (<= 0.39) Description: X.org diagnosis tool This package is a friendly GUI application for diagnosing several common X.org problems on Ubuntu. xdiagnose-3.8.10/debian/copyright0000664000000000000000000000246113151230744013634 0ustar This work was packaged for Debian by: Bryce Harrington on Tue, 09 Feb 2010 10:00:00 -0800 Upstream Author: Bryce Harrington Copyright: Copyright © 2010 Canonical, Ltd. License: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. xdiagnose-3.8.10/debian/failsafe-graphical.target0000664000000000000000000000020613151230744016606 0ustar [Unit] Description=Graphical failsafe fallback Requires=multi-user.target failsafe-x.service After=multi-user.target AllowIsolate=yes xdiagnose-3.8.10/debian/failsafe-x.service0000664000000000000000000000035013151230744015275 0ustar [Unit] Description=X.org diagnosis failsafe Conflicts=shutdown.target graphical.target Requires=plymouth-quit.service After=plymouth-quit.service [Service] ExecStart=-/usr/share/xdiagnose/failsafeXServer Type=idle KillMode=process xdiagnose-3.8.10/debian/failsafe-x.upstart0000664000000000000000000000056613151230744015350 0ustar # failsafe-x - Recovery options if display manager fails to start # # If display manager exits non-zero, something is wrong - launch the # failsafe-X interface description "Recovery options if display manager fails to start" start on stopped lightdm RESULT=failed or stopped gdm RESULT=failed stop on runlevel [06] task exec /usr/share/xdiagnose/failsafeXServer "$JOB" xdiagnose-3.8.10/debian/rules0000775000000000000000000000063713151230744012764 0ustar #!/usr/bin/make -f #export DH_VERBOSE=1 #export PYBUILD_VERBOSE=1 export PYBUILD_NAME=xdiagnose %: dh "$@" --with python3,systemd,translations --buildsystem pybuild override_dh_installinit: dh_installinit --no-start --name failsafe-x mv debian/xdiagnose/usr/share/apport/package-hooks/apport-gpu-error-intel.py \ debian/xdiagnose/usr/share/apport/ override_dh_systemd_start: dh_systemd_start --no-start xdiagnose-3.8.10/debian/xdiagnose.conf0000664000000000000000000000015613151230744014530 0ustar # Fallback to xdiagnose if we couldn't start the display-manager [Unit] OnFailure=failsafe-graphical.target xdiagnose-3.8.10/debian/xdiagnose.install0000664000000000000000000000032613151230744015250 0ustar apport/apport-gpu-error-intel.py usr/share/apport debian/failsafe-x.service lib/systemd/system debian/failsafe-graphical.target lib/systemd/system debian/xdiagnose.conf lib/systemd/system/display-manager.service.d xdiagnose-3.8.10/debian/xdiagnose.udev0000664000000000000000000000073013151230744014544 0ustar # do not edit this file, it will be overwritten on update # Jesse Barnes on ubuntu-devel@lists.ubuntu.com: # You'll get three events, one when the error is detected, one before the # reset and one after. Each has a different environment variable set; the # initial error has ERROR=1, the pre-reset event has RESET=1 and the # post-reset event has ERROR=0. #SUBSYSTEM=="drm", ACTION=="change", ENV{RESET}=="1", RUN+="/usr/share/apport/apport-gpu-error-intel.py" xdiagnose-3.8.10/po/0000775000000000000000000000000013151230744011072 5ustar xdiagnose-3.8.10/po/POTFILES.in0000664000000000000000000000023613151230744012650 0ustar com.canonical.xdiagnose.policy.in xdiagnose.desktop.in bin/xdiagnose bin/dpkg-log-summary data/failsafeXinit xdiagnose/applet.py xdiagnose/errors_treeview.py xdiagnose-3.8.10/run-tests0000775000000000000000000000043213151230744012345 0ustar #!/bin/bash for t in tests/test*; do echo $t file_type=$(file -b $t) case ${file_type} in *?ython*) python3 ${t} ;; *Bourne*) bash ${t} ;; *bash*) bash ${t} ;; *perl*) perl ${t} ;; *) echo "Unknown" ;; esac echo done xdiagnose-3.8.10/setup.cfg0000664000000000000000000000015513151230744012276 0ustar [build_i18n] domain=xdiagnose desktop_files=[ ("share/applications", ("xdiagnose.desktop.in",) ) ] xdiagnose-3.8.10/setup.py0000664000000000000000000000505313151230744012171 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import re import glob import DistUtilsExtra.auto from xdiagnose import info changelog = "debian/changelog" if os.path.exists(changelog): head=open(changelog).readline() match = re.compile(".*\((.*)\).*").match(head) if match: version = match.group(1) # TODO: Also set the VERSION in info.py DistUtilsExtra.auto.setup( name = info.PROGNAME, version = version, url = info.URL, author = info.LEAD_DEVELOPER.name, author_email = info.LEAD_DEVELOPER.email, description = info.SHORT_DESCRIPTION, long_description = info.DESCRIPTION, license = info.LICENSE_URL, platforms = ['any'], requires = ['gobject', 'pygtk'], # Note: Requires pep8 and pydoctor for make lint packages = [ 'xdiagnose', 'xdiagnose/utils', ], package_data = { }, data_files = [ ('share/xdiagnose/workloads', glob.glob('data/workloads/*')), ('share/xdiagnose', glob.glob('data/failsafe*')), ('share/xdiagnose', ['data/bubu.lib']), ], scripts = [ 'bin/dpkg-log-summary', 'bin/xdiagnose', 'bin/xdiagnose-pkexec', 'bin/xedid', 'bin/xrandr-tool', 'bin/xrotate', 'bin/xpci', ], ) xdiagnose-3.8.10/tests/0000775000000000000000000000000013151243012011606 5ustar xdiagnose-3.8.10/tests/sample.Xorg.0.log0000664000000000000000000023657313151230744014676 0ustar [ 10.877] X.Org X Server 1.11.3 Release Date: 2011-12-16 [ 10.877] X Protocol Version 11, Revision 0 [ 10.877] Build Operating System: Linux 2.6.42-35-generic x86_64 Ubuntu [ 10.877] Current Operating System: Linux humber.bryceharrington.org 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 [ 10.877] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.2.0-35-generic root=UUID=9ecdf7d7-aa38-4bc2-955e-3e266345a259 ro [ 10.877] Build Date: 19 December 2012 02:07:05AM [ 10.877] xorg-server 2:1.11.4-0ubuntu10.10 (For technical support please see http://www.ubuntu.com/support) [ 10.877] Current version of pixman: 0.24.4 [ 10.877] Before reporting problems, check http://wiki.x.org to make sure that you have the latest version. [ 10.877] Markers: (--) probed, (**) from config file, (==) default setting, (++) from command line, (!!) notice, (II) informational, (WW) warning, (EE) error, (NI) not implemented, (??) unknown. [ 10.877] (==) Log file: "/var/log/Xorg.0.log", Time: Thu Jan 3 17:11:10 2013 [ 10.878] (==) Using system config directory "/usr/share/X11/xorg.conf.d" [ 10.879] (==) No Layout section. Using the first Screen section. [ 10.879] (==) No screen section available. Using defaults. [ 10.879] (**) |-->Screen "Default Screen Section" (0) [ 10.879] (**) | |-->Monitor "" [ 10.880] (==) No monitor specified for screen "Default Screen Section". Using a default monitor configuration. [ 10.880] (==) Automatically adding devices [ 10.880] (==) Automatically enabling devices [ 10.880] (WW) The directory "/usr/share/fonts/X11/cyrillic" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (WW) The directory "/usr/share/fonts/X11/100dpi/" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (WW) The directory "/usr/share/fonts/X11/75dpi/" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (WW) The directory "/usr/share/fonts/X11/100dpi" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (WW) The directory "/usr/share/fonts/X11/75dpi" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (WW) The directory "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType" does not exist. [ 10.880] Entry deleted from font path. [ 10.880] (==) FontPath set to: /usr/share/fonts/X11/misc, /usr/share/fonts/X11/Type1, built-ins [ 10.880] (==) ModulePath set to "/usr/lib/x86_64-linux-gnu/xorg/extra-modules,/usr/lib/xorg/extra-modules,/usr/lib/xorg/modules" [ 10.880] (II) The server relies on udev to provide the list of input devices. If no devices become available, reconfigure udev or disable AutoAddDevices. [ 10.880] (II) Loader magic: 0x7eff9a71eb00 [ 10.880] (II) Module ABI versions: [ 10.880] X.Org ANSI C Emulation: 0.4 [ 10.880] X.Org Video Driver: 11.0 [ 10.880] X.Org XInput driver : 16.0 [ 10.880] X.Org Server Extension : 6.0 [ 10.881] (--) PCI:*(0:1:0:0) 1002:9490:174b:e100 rev 0, Mem @ 0xe0000000/268435456, 0xfbae0000/65536, I/O @ 0x0000be00/256, BIOS @ 0x????????/131072 [ 10.881] (II) Open ACPI successful (/var/run/acpid.socket) [ 10.881] (II) LoadModule: "extmod" [ 11.696] (II) Loading /usr/lib/xorg/modules/extensions/libextmod.so [ 11.696] (II) Module extmod: vendor="X.Org Foundation" [ 11.696] compiled for 1.11.3, module version = 1.0.0 [ 11.696] Module class: X.Org Server Extension [ 11.696] ABI class: X.Org Server Extension, version 6.0 [ 11.696] (II) Loading extension MIT-SCREEN-SAVER [ 11.696] (II) Loading extension XFree86-VidModeExtension [ 11.696] (II) Loading extension XFree86-DGA [ 11.696] (II) Loading extension DPMS [ 11.696] (II) Loading extension XVideo [ 11.696] (II) Loading extension XVideo-MotionCompensation [ 11.696] (II) Loading extension X-Resource [ 11.696] (II) LoadModule: "dbe" [ 11.697] (II) Loading /usr/lib/xorg/modules/extensions/libdbe.so [ 11.697] (II) Module dbe: vendor="X.Org Foundation" [ 11.697] compiled for 1.11.3, module version = 1.0.0 [ 11.697] Module class: X.Org Server Extension [ 11.697] ABI class: X.Org Server Extension, version 6.0 [ 11.697] (II) Loading extension DOUBLE-BUFFER [ 11.697] (II) LoadModule: "glx" [ 11.697] (II) Loading /usr/lib/xorg/modules/extensions/libglx.so [ 11.699] (II) Module glx: vendor="X.Org Foundation" [ 11.699] compiled for 1.11.3, module version = 1.0.0 [ 11.699] ABI class: X.Org Server Extension, version 6.0 [ 11.699] (==) AIGLX enabled [ 11.700] (II) Loading extension GLX [ 11.700] (II) LoadModule: "record" [ 11.700] (II) Loading /usr/lib/xorg/modules/extensions/librecord.so [ 11.701] (II) Module record: vendor="X.Org Foundation" [ 11.701] compiled for 1.11.3, module version = 1.13.0 [ 11.701] Module class: X.Org Server Extension [ 11.701] ABI class: X.Org Server Extension, version 6.0 [ 11.701] (II) Loading extension RECORD [ 11.701] (II) LoadModule: "dri" [ 11.701] (II) Loading /usr/lib/xorg/modules/extensions/libdri.so [ 11.702] (II) Module dri: vendor="X.Org Foundation" [ 11.702] compiled for 1.11.3, module version = 1.0.0 [ 11.702] ABI class: X.Org Server Extension, version 6.0 [ 11.702] (II) Loading extension XFree86-DRI [ 11.702] (II) LoadModule: "dri2" [ 11.702] (II) Loading /usr/lib/xorg/modules/extensions/libdri2.so [ 11.703] (II) Module dri2: vendor="X.Org Foundation" [ 11.703] compiled for 1.11.3, module version = 1.2.0 [ 11.703] ABI class: X.Org Server Extension, version 6.0 [ 11.703] (II) Loading extension DRI2 [ 11.703] (==) Matched fglrx as autoconfigured driver 0 [ 11.703] (==) Matched ati as autoconfigured driver 1 [ 11.703] (==) Matched vesa as autoconfigured driver 2 [ 11.703] (==) Matched fbdev as autoconfigured driver 3 [ 11.703] (==) Assigned the driver to the xf86ConfigLayout [ 11.703] (II) LoadModule: "fglrx" [ 11.703] (WW) Warning, couldn't open module fglrx [ 11.703] (II) UnloadModule: "fglrx" [ 11.703] (II) Unloading fglrx [ 11.703] (EE) Failed to load module "fglrx" (module does not exist, 0) [ 11.703] (II) LoadModule: "ati" [ 11.703] (II) Loading /usr/lib/xorg/modules/drivers/ati_drv.so [ 11.704] (II) Module ati: vendor="X.Org Foundation" [ 11.704] compiled for 1.11.3, module version = 6.14.99 [ 11.704] Module class: X.Org Video Driver [ 11.704] ABI class: X.Org Video Driver, version 11.0 [ 11.704] (II) LoadModule: "radeon" [ 11.704] (II) Loading /usr/lib/xorg/modules/drivers/radeon_drv.so [ 11.707] (II) Module radeon: vendor="X.Org Foundation" [ 11.707] compiled for 1.11.3, module version = 6.14.99 [ 11.707] Module class: X.Org Video Driver [ 11.707] ABI class: X.Org Video Driver, version 11.0 [ 11.708] (II) LoadModule: "vesa" [ 11.708] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so [ 11.709] (II) Module vesa: vendor="X.Org Foundation" [ 11.709] compiled for 1.11.3, module version = 2.3.0 [ 11.709] Module class: X.Org Video Driver [ 11.709] ABI class: X.Org Video Driver, version 11.0 [ 11.709] (II) LoadModule: "fbdev" [ 11.709] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so [ 11.710] (II) Module fbdev: vendor="X.Org Foundation" [ 11.710] compiled for 1.11.3, module version = 0.4.2 [ 11.710] ABI class: X.Org Video Driver, version 11.0 [ 11.710] (==) Matched fglrx as autoconfigured driver 0 [ 11.710] (==) Matched ati as autoconfigured driver 1 [ 11.710] (==) Matched vesa as autoconfigured driver 2 [ 11.710] (==) Matched fbdev as autoconfigured driver 3 [ 11.710] (==) Assigned the driver to the xf86ConfigLayout [ 11.710] (II) LoadModule: "fglrx" [ 11.710] (WW) Warning, couldn't open module fglrx [ 11.710] (II) UnloadModule: "fglrx" [ 11.710] (II) Unloading fglrx [ 11.710] (EE) Failed to load module "fglrx" (module does not exist, 0) [ 11.710] (II) LoadModule: "ati" [ 11.710] (II) Loading /usr/lib/xorg/modules/drivers/ati_drv.so [ 11.710] (II) Module ati: vendor="X.Org Foundation" [ 11.710] compiled for 1.11.3, module version = 6.14.99 [ 11.710] Module class: X.Org Video Driver [ 11.710] ABI class: X.Org Video Driver, version 11.0 [ 11.710] (II) LoadModule: "vesa" [ 11.710] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so [ 11.710] (II) Module vesa: vendor="X.Org Foundation" [ 11.710] compiled for 1.11.3, module version = 2.3.0 [ 11.710] Module class: X.Org Video Driver [ 11.710] ABI class: X.Org Video Driver, version 11.0 [ 11.710] (II) UnloadModule: "vesa" [ 11.710] (II) Unloading vesa [ 11.710] (II) Failed to load module "vesa" (already loaded, 0) [ 11.710] (II) LoadModule: "fbdev" [ 11.710] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so [ 11.710] (II) Module fbdev: vendor="X.Org Foundation" [ 11.710] compiled for 1.11.3, module version = 0.4.2 [ 11.710] ABI class: X.Org Video Driver, version 11.0 [ 11.710] (II) UnloadModule: "fbdev" [ 11.710] (II) Unloading fbdev [ 11.710] (II) Failed to load module "fbdev" (already loaded, 0) [ 11.710] (II) RADEON: Driver for ATI Radeon chipsets: ATI Radeon Mobility X600 (M24) 3150 (PCIE), ATI FireMV 2400 (PCI), ATI Radeon Mobility X300 (M24) 3152 (PCIE), ATI FireGL M24 GL 3154 (PCIE), ATI FireMV 2400 3155 (PCI), ATI Radeon X600 (RV380) 3E50 (PCIE), ATI FireGL V3200 (RV380) 3E54 (PCIE), ATI Radeon IGP320 (A3) 4136, ATI Radeon IGP330/340/350 (A4) 4137, ATI Radeon 9500 AD (AGP), ATI Radeon 9500 AE (AGP), ATI Radeon 9600TX AF (AGP), ATI FireGL Z1 AG (AGP), ATI Radeon 9800SE AH (AGP), ATI Radeon 9800 AI (AGP), ATI Radeon 9800 AJ (AGP), ATI FireGL X2 AK (AGP), ATI Radeon 9600 AP (AGP), ATI Radeon 9600SE AQ (AGP), ATI Radeon 9600XT AR (AGP), ATI Radeon 9600 AS (AGP), ATI FireGL T2 AT (AGP), ATI Radeon 9650, ATI FireGL RV360 AV (AGP), ATI Radeon 7000 IGP (A4+) 4237, ATI Radeon 8500 AIW BB (AGP), ATI Radeon IGP320M (U1) 4336, ATI Radeon IGP330M/340M/350M (U2) 4337, ATI Radeon Mobility 7000 IGP 4437, ATI Radeon 9000/PRO If (AGP/PCI), ATI Radeon 9000 Ig (AGP/PCI), ATI Radeon X800 (R420) JH (AGP), ATI Radeon X800PRO (R420) JI (AGP), ATI Radeon X800SE (R420) JJ (AGP), ATI Radeon X800 (R420) JK (AGP), ATI Radeon X800 (R420) JL (AGP), ATI FireGL X3 (R420) JM (AGP), ATI Radeon Mobility 9800 (M18) JN (AGP), ATI Radeon X800 SE (R420) (AGP), ATI Radeon X800XT (R420) JP (AGP), ATI Radeon X800 VE (R420) JT (AGP), ATI Radeon X850 (R480) (AGP), ATI Radeon X850 XT (R480) (AGP), ATI Radeon X850 SE (R480) (AGP), ATI Radeon X850 PRO (R480) (AGP), ATI Radeon X850 XT PE (R480) (AGP), ATI Radeon Mobility M7 LW (AGP), ATI Mobility FireGL 7800 M7 LX (AGP), ATI Radeon Mobility M6 LY (AGP), ATI Radeon Mobility M6 LZ (AGP), ATI FireGL Mobility 9000 (M9) Ld (AGP), ATI Radeon Mobility 9000 (M9) Lf (AGP), ATI Radeon Mobility 9000 (M9) Lg (AGP), ATI FireMV 2400 PCI, ATI Radeon 9700 Pro ND (AGP), ATI Radeon 9700/9500Pro NE (AGP), ATI Radeon 9600TX NF (AGP), ATI FireGL X1 NG (AGP), ATI Radeon 9800PRO NH (AGP), ATI Radeon 9800 NI (AGP), ATI FireGL X2 NK (AGP), ATI Radeon 9800XT NJ (AGP), ATI Radeon Mobility 9600/9700 (M10/M11) NP (AGP), ATI Radeon Mobility 9600 (M10) NQ (AGP), ATI Radeon Mobility 9600 (M11) NR (AGP), ATI Radeon Mobility 9600 (M10) NS (AGP), ATI FireGL Mobility T2 (M10) NT (AGP), ATI FireGL Mobility T2e (M11) NV (AGP), ATI Radeon QD (AGP), ATI Radeon QE (AGP), ATI Radeon QF (AGP), ATI Radeon QG (AGP), ATI FireGL 8700/8800 QH (AGP), ATI Radeon 8500 QL (AGP), ATI Radeon 9100 QM (AGP), ATI Radeon 7500 QW (AGP/PCI), ATI Radeon 7500 QX (AGP/PCI), ATI Radeon VE/7000 QY (AGP/PCI), ATI Radeon VE/7000 QZ (AGP/PCI), ATI ES1000 515E (PCI), ATI Radeon Mobility X300 (M22) 5460 (PCIE), ATI Radeon Mobility X600 SE (M24C) 5462 (PCIE), ATI FireGL M22 GL 5464 (PCIE), ATI Radeon X800 (R423) UH (PCIE), ATI Radeon X800PRO (R423) UI (PCIE), ATI Radeon X800LE (R423) UJ (PCIE), ATI Radeon X800SE (R423) UK (PCIE), ATI Radeon X800 XTP (R430) (PCIE), ATI Radeon X800 XL (R430) (PCIE), ATI Radeon X800 SE (R430) (PCIE), ATI Radeon X800 (R430) (PCIE), ATI FireGL V7100 (R423) (PCIE), ATI FireGL V5100 (R423) UQ (PCIE), ATI FireGL unknown (R423) UR (PCIE), ATI FireGL unknown (R423) UT (PCIE), ATI Mobility FireGL V5000 (M26) (PCIE), ATI Mobility FireGL V5000 (M26) (PCIE), ATI Mobility Radeon X700 XL (M26) (PCIE), ATI Mobility Radeon X700 (M26) (PCIE), ATI Mobility Radeon X700 (M26) (PCIE), ATI Radeon X550XTX 5657 (PCIE), ATI Radeon 9100 IGP (A5) 5834, ATI Radeon Mobility 9100 IGP (U3) 5835, ATI Radeon XPRESS 200 5954 (PCIE), ATI Radeon XPRESS 200M 5955 (PCIE), ATI Radeon 9250 5960 (AGP), ATI Radeon 9200 5961 (AGP), ATI Radeon 9200 5962 (AGP), ATI Radeon 9200SE 5964 (AGP), ATI FireMV 2200 (PCI), ATI ES1000 5969 (PCI), ATI Radeon XPRESS 200 5974 (PCIE), ATI Radeon XPRESS 200M 5975 (PCIE), ATI Radeon XPRESS 200 5A41 (PCIE), ATI Radeon XPRESS 200M 5A42 (PCIE), ATI Radeon XPRESS 200 5A61 (PCIE), ATI Radeon XPRESS 200M 5A62 (PCIE), ATI Radeon X300 (RV370) 5B60 (PCIE), ATI Radeon X600 (RV370) 5B62 (PCIE), ATI Radeon X550 (RV370) 5B63 (PCIE), ATI FireGL V3100 (RV370) 5B64 (PCIE), ATI FireMV 2200 PCIE (RV370) 5B65 (PCIE), ATI Radeon Mobility 9200 (M9+) 5C61 (AGP), ATI Radeon Mobility 9200 (M9+) 5C63 (AGP), ATI Mobility Radeon X800 XT (M28) (PCIE), ATI Mobility FireGL V5100 (M28) (PCIE), ATI Mobility Radeon X800 (M28) (PCIE), ATI Radeon X850 5D4C (PCIE), ATI Radeon X850 XT PE (R480) (PCIE), ATI Radeon X850 SE (R480) (PCIE), ATI Radeon X850 PRO (R480) (PCIE), ATI unknown Radeon / FireGL (R480) 5D50 (PCIE), ATI Radeon X850 XT (R480) (PCIE), ATI Radeon X800XT (R423) 5D57 (PCIE), ATI FireGL V5000 (RV410) (PCIE), ATI Radeon X700 XT (RV410) (PCIE), ATI Radeon X700 PRO (RV410) (PCIE), ATI Radeon X700 SE (RV410) (PCIE), ATI Radeon X700 (RV410) (PCIE), ATI Radeon X700 SE (RV410) (PCIE), ATI Radeon X1800, ATI Mobility Radeon X1800 XT, ATI Mobility Radeon X1800, ATI Mobility FireGL V7200, ATI FireGL V7200, ATI FireGL V5300, ATI Mobility FireGL V7100, ATI Radeon X1800, ATI Radeon X1800, ATI Radeon X1800, ATI Radeon X1800, ATI Radeon X1800, ATI FireGL V7300, ATI FireGL V7350, ATI Radeon X1600, ATI RV505, ATI Radeon X1300/X1550, ATI Radeon X1550, ATI M54-GL, ATI Mobility Radeon X1400, ATI Radeon X1300/X1550, ATI Radeon X1550 64-bit, ATI Mobility Radeon X1300, ATI Mobility Radeon X1300, ATI Mobility Radeon X1300, ATI Mobility Radeon X1300, ATI Radeon X1300, ATI Radeon X1300, ATI RV505, ATI RV505, ATI FireGL V3300, ATI FireGL V3350, ATI Radeon X1300, ATI Radeon X1550 64-bit, ATI Radeon X1300/X1550, ATI Radeon X1600, ATI Radeon X1300/X1550, ATI Mobility Radeon X1450, ATI Radeon X1300/X1550, ATI Mobility Radeon X2300, ATI Mobility Radeon X2300, ATI Mobility Radeon X1350, ATI Mobility Radeon X1350, ATI Mobility Radeon X1450, ATI Radeon X1300, ATI Radeon X1550, ATI Mobility Radeon X1350, ATI FireMV 2250, ATI Radeon X1550 64-bit, ATI Radeon X1600, ATI Radeon X1650, ATI Radeon X1600, ATI Radeon X1600, ATI Mobility FireGL V5200, ATI Mobility Radeon X1600, ATI Radeon X1650, ATI Radeon X1650, ATI Radeon X1600, ATI Radeon X1300 XT/X1600 Pro, ATI FireGL V3400, ATI Mobility FireGL V5250, ATI Mobility Radeon X1700, ATI Mobility Radeon X1700 XT, ATI FireGL V5200, ATI Mobility Radeon X1700, ATI Radeon X2300HD, ATI Mobility Radeon HD 2300, ATI Mobility Radeon HD 2300, ATI Radeon X1950, ATI Radeon X1900, ATI Radeon X1950, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI Radeon X1900, ATI AMD Stream Processor, ATI Radeon X1900, ATI Radeon X1950, ATI RV560, ATI RV560, ATI Mobility Radeon X1900, ATI RV560, ATI Radeon X1950 GT, ATI RV570, ATI RV570, ATI FireGL V7400, ATI RV560, ATI Radeon X1650, ATI Radeon X1650, ATI RV560, ATI Radeon 9100 PRO IGP 7834, ATI Radeon Mobility 9200 IGP 7835, ATI Radeon X1200, ATI Radeon X1200, ATI Radeon X1200, ATI Radeon X1200, ATI Radeon X1200, ATI RS740, ATI RS740M, ATI RS740, ATI RS740M, ATI Radeon HD 2900 XT, ATI Radeon HD 2900 XT, ATI Radeon HD 2900 XT, ATI Radeon HD 2900 Pro, ATI Radeon HD 2900 GT, ATI FireGL V8650, ATI FireGL V8600, ATI FireGL V7600, ATI Radeon 4800 Series, ATI Radeon HD 4870 x2, ATI Radeon 4800 Series, ATI Radeon HD 4850 x2, ATI FirePro V8750 (FireGL), ATI FirePro V7760 (FireGL), ATI Mobility RADEON HD 4850, ATI Mobility RADEON HD 4850 X2, ATI Radeon 4800 Series, ATI FirePro RV770, AMD FireStream 9270, AMD FireStream 9250, ATI FirePro V8700 (FireGL), ATI Mobility RADEON HD 4870, ATI Mobility RADEON M98, ATI Mobility RADEON HD 4870, ATI Radeon 4800 Series, ATI Radeon 4800 Series, ATI FirePro M7750, ATI M98, ATI M98, ATI M98, ATI Mobility Radeon HD 4650, ATI Radeon RV730 (AGP), ATI Mobility Radeon HD 4670, ATI FirePro M5750, ATI Mobility Radeon HD 4670, ATI Radeon RV730 (AGP), ATI RV730XT [Radeon HD 4670], ATI RADEON E4600, ATI Radeon HD 4600 Series, ATI RV730 PRO [Radeon HD 4650], ATI FirePro V7750 (FireGL), ATI FirePro V5700 (FireGL), ATI FirePro V3750 (FireGL), ATI Mobility Radeon HD 4830, ATI Mobility Radeon HD 4850, ATI FirePro M7740, ATI RV740, ATI Radeon HD 4770, ATI Radeon HD 4700 Series, ATI Radeon HD 4770, ATI FirePro M5750, ATI RV610, ATI Radeon HD 2400 XT, ATI Radeon HD 2400 Pro, ATI Radeon HD 2400 PRO AGP, ATI FireGL V4000, ATI RV610, ATI Radeon HD 2350, ATI Mobility Radeon HD 2400 XT, ATI Mobility Radeon HD 2400, ATI RADEON E2400, ATI RV610, ATI FireMV 2260, ATI RV670, ATI Radeon HD3870, ATI Mobility Radeon HD 3850, ATI Radeon HD3850, ATI Mobility Radeon HD 3850 X2, ATI RV670, ATI Mobility Radeon HD 3870, ATI Mobility Radeon HD 3870 X2, ATI Radeon HD3870 X2, ATI FireGL V7700, ATI Radeon HD3850, ATI Radeon HD3690, AMD Firestream 9170, ATI Radeon HD 4550, ATI Radeon RV710, ATI Radeon RV710, ATI Radeon RV710, ATI Radeon HD 4350, ATI Mobility Radeon 4300 Series, ATI Mobility Radeon 4500 Series, ATI Mobility Radeon 4500 Series, ATI FirePro RG220, ATI Mobility Radeon 4330, ATI RV630, ATI Mobility Radeon HD 2600, ATI Mobility Radeon HD 2600 XT, ATI Radeon HD 2600 XT AGP, ATI Radeon HD 2600 Pro AGP, ATI Radeon HD 2600 XT, ATI Radeon HD 2600 Pro, ATI Gemini RV630, ATI Gemini Mobility Radeon HD 2600 XT, ATI FireGL V5600, ATI FireGL V3600, ATI Radeon HD 2600 LE, ATI Mobility FireGL Graphics Processor, ATI Radeon HD 3470, ATI Mobility Radeon HD 3430, ATI Mobility Radeon HD 3400 Series, ATI Radeon HD 3450, ATI Radeon HD 3450, ATI Radeon HD 3430, ATI Radeon HD 3450, ATI FirePro V3700, ATI FireMV 2450, ATI FireMV 2260, ATI FireMV 2260, ATI Radeon HD 3600 Series, ATI Radeon HD 3650 AGP, ATI Radeon HD 3600 PRO, ATI Radeon HD 3600 XT, ATI Radeon HD 3600 PRO, ATI Mobility Radeon HD 3650, ATI Mobility Radeon HD 3670, ATI Mobility FireGL V5700, ATI Mobility FireGL V5725, ATI Radeon HD 3200 Graphics, ATI Radeon 3100 Graphics, ATI Radeon HD 3200 Graphics, ATI Radeon 3100 Graphics, ATI Radeon HD 3300 Graphics, ATI Radeon HD 3200 Graphics, ATI Radeon 3000 Graphics, SUMO, SUMO, SUMO2, SUMO2, SUMO2, SUMO2, SUMO, SUMO, SUMO, SUMO, SUMO, SUMO, SUMO, ATI Radeon HD 4200, ATI Radeon 4100, ATI Mobility Radeon HD 4200, ATI Mobility Radeon 4100, ATI Radeon HD 4290, ATI Radeon HD 4250, AMD Radeon HD 6310 Graphics, AMD Radeon HD 6310 Graphics, AMD Radeon HD 6250 Graphics, AMD Radeon HD 6250 Graphics, AMD Radeon HD 6300 Series Graphics, AMD Radeon HD 6200 Series Graphics, PALM, PALM, CYPRESS, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro (FireGL) Graphics Adapter, AMD Firestream 9370, AMD Firestream 9350, ATI Radeon HD 5800 Series, ATI Radeon HD 5800 Series, ATI Radeon HD 5800 Series, ATI Radeon HD 5800 Series, ATI Radeon HD 5900 Series, ATI Radeon HD 5900 Series, ATI Mobility Radeon HD 5800 Series, ATI Mobility Radeon HD 5800 Series, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro (FireGL) Graphics Adapter, ATI Mobility Radeon HD 5800 Series, ATI Radeon HD 5700 Series, ATI Radeon HD 5700 Series, ATI Radeon HD 6700 Series, ATI Radeon HD 5700 Series, ATI Radeon HD 6700 Series, ATI Mobility Radeon HD 5000 Series, ATI Mobility Radeon HD 5000 Series, ATI Mobility Radeon HD 5570, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro (FireGL) Graphics Adapter, ATI Radeon HD 5670, ATI Radeon HD 5570, ATI Radeon HD 5500 Series, REDWOOD, ATI Mobility Radeon HD 5000 Series, ATI Mobility Radeon HD 5000 Series, ATI Mobility Radeon Graphics, ATI Mobility Radeon Graphics, CEDAR, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro (FireGL) Graphics Adapter, ATI FirePro 2270, CEDAR, ATI Radeon HD 5450, CEDAR, CEDAR, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, CAYMAN, AMD Radeon HD 6900 Series, AMD Radeon HD 6900 Series, CAYMAN, CAYMAN, CAYMAN, AMD Radeon HD 6900M Series, Mobility Radeon HD 6000 Series, BARTS, BARTS, Mobility Radeon HD 6000 Series, Mobility Radeon HD 6000 Series, BARTS, BARTS, BARTS, BARTS, AMD Radeon HD 6800 Series, AMD Radeon HD 6800 Series, AMD Radeon HD 6700 Series, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, TURKS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS, CAICOS [ 11.712] (II) VESA: driver for VESA chipsets: vesa [ 11.712] (II) FBDEV: driver for framebuffer: fbdev [ 11.712] (++) using VT number 7 [ 11.712] (II) Loading /usr/lib/xorg/modules/drivers/radeon_drv.so [ 11.712] (II) [KMS] Kernel modesetting enabled. [ 11.712] (WW) Falling back to old probe method for vesa [ 11.712] (WW) Falling back to old probe method for fbdev [ 11.712] (II) Loading sub module "fbdevhw" [ 11.712] (II) LoadModule: "fbdevhw" [ 11.712] (II) Loading /usr/lib/xorg/modules/libfbdevhw.so [ 11.713] (II) Module fbdevhw: vendor="X.Org Foundation" [ 11.713] compiled for 1.11.3, module version = 0.0.2 [ 11.713] ABI class: X.Org Video Driver, version 11.0 [ 11.713] (II) RADEON(0): Creating default Display subsection in Screen section "Default Screen Section" for depth/fbbpp 24/32 [ 11.713] (==) RADEON(0): Depth 24, (--) framebuffer bpp 32 [ 11.713] (II) RADEON(0): Pixel depth = 24 bits stored in 4 bytes (32 bpp pixmaps) [ 11.713] (==) RADEON(0): Default visual is TrueColor [ 11.713] (==) RADEON(0): RGB weight 888 [ 11.713] (II) RADEON(0): Using 8 bits per RGB (8 bit DAC) [ 11.713] (--) RADEON(0): Chipset: "ATI RV730XT [Radeon HD 4670]" (ChipID = 0x9490) [ 11.713] (II) RADEON(0): PCIE card detected [ 11.713] drmOpenDevice: node name is /dev/dri/card0 [ 11.713] drmOpenDevice: open result is 9, (OK) [ 11.713] drmOpenByBusid: Searching for BusID pci:0000:01:00.0 [ 11.713] drmOpenDevice: node name is /dev/dri/card0 [ 11.713] drmOpenDevice: open result is 9, (OK) [ 11.713] drmOpenByBusid: drmOpenMinor returns 9 [ 11.713] drmOpenByBusid: drmGetBusid reports pci:0000:01:00.0 [ 11.713] (II) Loading sub module "exa" [ 11.713] (II) LoadModule: "exa" [ 11.713] (II) Loading /usr/lib/xorg/modules/libexa.so [ 11.714] (II) Module exa: vendor="X.Org Foundation" [ 11.714] compiled for 1.11.3, module version = 2.5.0 [ 11.714] ABI class: X.Org Video Driver, version 11.0 [ 11.714] (II) RADEON(0): KMS Color Tiling: enabled [ 11.714] (II) RADEON(0): KMS Pageflipping: enabled [ 11.714] (II) RADEON(0): SwapBuffers wait for vsync: enabled [ 11.744] (II) RADEON(0): Output VGA-0 has no monitor section [ 11.800] (II) RADEON(0): Output HDMI-0 has no monitor section [ 11.857] (II) RADEON(0): Output DVI-0 has no monitor section [ 11.880] (II) RADEON(0): EDID for output VGA-0 [ 11.936] (II) RADEON(0): EDID for output HDMI-0 [ 11.936] (II) RADEON(0): Manufacturer: DEL Model: a07a Serial#: 808924748 [ 11.936] (II) RADEON(0): Year: 2011 Week: 37 [ 11.936] (II) RADEON(0): EDID Version: 1.3 [ 11.936] (II) RADEON(0): Digital Display Input [ 11.936] (II) RADEON(0): Max Image Size [cm]: horiz.: 52 vert.: 32 [ 11.936] (II) RADEON(0): Gamma: 2.20 [ 11.936] (II) RADEON(0): DPMS capabilities: StandBy Suspend Off [ 11.936] (II) RADEON(0): Supported color encodings: RGB 4:4:4 YCrCb 4:4:4 [ 11.936] (II) RADEON(0): First detailed timing is preferred mode [ 11.936] (II) RADEON(0): redX: 0.640 redY: 0.330 greenX: 0.300 greenY: 0.600 [ 11.936] (II) RADEON(0): blueX: 0.150 blueY: 0.060 whiteX: 0.313 whiteY: 0.329 [ 11.936] (II) RADEON(0): Supported established timings: [ 11.936] (II) RADEON(0): 720x400@70Hz [ 11.936] (II) RADEON(0): 640x480@60Hz [ 11.936] (II) RADEON(0): 800x600@60Hz [ 11.936] (II) RADEON(0): 1024x768@60Hz [ 11.936] (II) RADEON(0): Manufacturer's mask: 0 [ 11.936] (II) RADEON(0): Supported standard timings: [ 11.936] (II) RADEON(0): #0: hsize: 1280 vsize 960 refresh: 60 vid: 16513 [ 11.936] (II) RADEON(0): #1: hsize: 1280 vsize 1024 refresh: 60 vid: 32897 [ 11.936] (II) RADEON(0): #2: hsize: 1600 vsize 1200 refresh: 60 vid: 16553 [ 11.936] (II) RADEON(0): #3: hsize: 1680 vsize 1050 refresh: 60 vid: 179 [ 11.936] (II) RADEON(0): #4: hsize: 1920 vsize 1080 refresh: 60 vid: 49361 [ 11.937] (II) RADEON(0): Supported detailed timing: [ 11.937] (II) RADEON(0): clock: 154.0 MHz Image Size: 518 x 324 mm [ 11.937] (II) RADEON(0): h_active: 1920 h_sync: 1968 h_sync_end 2000 h_blank_end 2080 h_border: 0 [ 11.937] (II) RADEON(0): v_active: 1200 v_sync: 1203 v_sync_end 1209 v_blanking: 1235 v_border: 0 [ 11.937] (II) RADEON(0): Serial No: M2GCR195076L [ 11.937] (II) RADEON(0): Monitor name: DELL U2412M [ 11.937] (II) RADEON(0): Ranges: V min: 50 V max: 61 Hz, H min: 30 H max: 83 kHz, PixClock max 175 MHz [ 11.937] (II) RADEON(0): EDID (in hex): [ 11.937] (II) RADEON(0): 00ffffffffffff0010ac7aa04c363730 [ 11.937] (II) RADEON(0): 2515010380342078eaee95a3544c9926 [ 11.937] (II) RADEON(0): 0f5054a1080081408180a940b300d1c0 [ 11.937] (II) RADEON(0): 010101010101283c80a070b023403020 [ 11.937] (II) RADEON(0): 360006442100001a000000ff004d3247 [ 11.937] (II) RADEON(0): 43523139353037364c0a000000fc0044 [ 11.937] (II) RADEON(0): 454c4c2055323431324d0a20000000fd [ 11.937] (II) RADEON(0): 00323d1e5311000a2020202020200075 [ 11.937] (II) RADEON(0): Printing probed modes for output HDMI-0 [ 11.937] (II) RADEON(0): Modeline "1920x1200"x60.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 11.937] (II) RADEON(0): Modeline "1920x1080"x60.0 172.78 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [ 11.937] (II) RADEON(0): Modeline "1600x1200"x60.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 11.937] (II) RADEON(0): Modeline "1680x1050"x60.0 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync (65.3 kHz) [ 11.937] (II) RADEON(0): Modeline "1280x1024"x60.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 11.937] (II) RADEON(0): Modeline "1280x960"x60.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 11.937] (II) RADEON(0): Modeline "1024x768"x60.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 11.937] (II) RADEON(0): Modeline "800x600"x60.3 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 11.937] (II) RADEON(0): Modeline "640x480"x60.0 25.20 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 11.937] (II) RADEON(0): Modeline "720x400"x70.1 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 11.993] (II) RADEON(0): EDID for output DVI-0 [ 11.993] (II) RADEON(0): Manufacturer: DEL Model: a07a Serial#: 810045516 [ 11.993] (II) RADEON(0): Year: 2011 Week: 23 [ 11.993] (II) RADEON(0): EDID Version: 1.3 [ 11.993] (II) RADEON(0): Digital Display Input [ 11.993] (II) RADEON(0): Max Image Size [cm]: horiz.: 52 vert.: 32 [ 11.993] (II) RADEON(0): Gamma: 2.20 [ 11.993] (II) RADEON(0): DPMS capabilities: StandBy Suspend Off [ 11.993] (II) RADEON(0): Supported color encodings: RGB 4:4:4 YCrCb 4:4:4 [ 11.993] (II) RADEON(0): First detailed timing is preferred mode [ 11.993] (II) RADEON(0): redX: 0.640 redY: 0.330 greenX: 0.300 greenY: 0.600 [ 11.993] (II) RADEON(0): blueX: 0.150 blueY: 0.060 whiteX: 0.313 whiteY: 0.329 [ 11.993] (II) RADEON(0): Supported established timings: [ 11.993] (II) RADEON(0): 720x400@70Hz [ 11.993] (II) RADEON(0): 640x480@60Hz [ 11.993] (II) RADEON(0): 800x600@60Hz [ 11.993] (II) RADEON(0): 1024x768@60Hz [ 11.993] (II) RADEON(0): Manufacturer's mask: 0 [ 11.993] (II) RADEON(0): Supported standard timings: [ 11.993] (II) RADEON(0): #0: hsize: 1280 vsize 960 refresh: 60 vid: 16513 [ 11.993] (II) RADEON(0): #1: hsize: 1280 vsize 1024 refresh: 60 vid: 32897 [ 11.993] (II) RADEON(0): #2: hsize: 1600 vsize 1200 refresh: 60 vid: 16553 [ 11.993] (II) RADEON(0): #3: hsize: 1680 vsize 1050 refresh: 60 vid: 179 [ 11.993] (II) RADEON(0): #4: hsize: 1920 vsize 1080 refresh: 60 vid: 49361 [ 11.993] (II) RADEON(0): Supported detailed timing: [ 11.993] (II) RADEON(0): clock: 154.0 MHz Image Size: 518 x 324 mm [ 11.993] (II) RADEON(0): h_active: 1920 h_sync: 1968 h_sync_end 2000 h_blank_end 2080 h_border: 0 [ 11.993] (II) RADEON(0): v_active: 1200 v_sync: 1203 v_sync_end 1209 v_blanking: 1235 v_border: 0 [ 11.993] (II) RADEON(0): Serial No: M2GCR15V0HPL [ 11.993] (II) RADEON(0): Monitor name: DELL U2412M [ 11.993] (II) RADEON(0): Ranges: V min: 50 V max: 61 Hz, H min: 30 H max: 83 kHz, PixClock max 175 MHz [ 11.993] (II) RADEON(0): EDID (in hex): [ 11.993] (II) RADEON(0): 00ffffffffffff0010ac7aa04c504830 [ 11.993] (II) RADEON(0): 1715010380342078eaee95a3544c9926 [ 11.993] (II) RADEON(0): 0f5054a1080081408180a940b300d1c0 [ 11.993] (II) RADEON(0): 010101010101283c80a070b023403020 [ 11.993] (II) RADEON(0): 360006442100001a000000ff004d3247 [ 11.993] (II) RADEON(0): 43523135563048504c0a000000fc0044 [ 11.993] (II) RADEON(0): 454c4c2055323431324d0a20000000fd [ 11.993] (II) RADEON(0): 00323d1e5311000a2020202020200010 [ 11.993] (II) RADEON(0): Printing probed modes for output DVI-0 [ 11.993] (II) RADEON(0): Modeline "1920x1200"x60.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 11.993] (II) RADEON(0): Modeline "1920x1080"x60.0 172.78 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [ 11.993] (II) RADEON(0): Modeline "1600x1200"x60.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 11.993] (II) RADEON(0): Modeline "1680x1050"x60.0 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync (65.3 kHz) [ 11.993] (II) RADEON(0): Modeline "1280x1024"x60.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 11.993] (II) RADEON(0): Modeline "1280x960"x60.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 11.993] (II) RADEON(0): Modeline "1024x768"x60.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 11.993] (II) RADEON(0): Modeline "800x600"x60.3 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 11.993] (II) RADEON(0): Modeline "640x480"x60.0 25.20 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 11.993] (II) RADEON(0): Modeline "720x400"x70.1 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 11.993] (II) RADEON(0): Output VGA-0 disconnected [ 11.993] (II) RADEON(0): Output HDMI-0 connected [ 11.993] (II) RADEON(0): Output DVI-0 connected [ 11.993] (II) RADEON(0): Using exact sizes for initial modes [ 11.993] (II) RADEON(0): Output HDMI-0 using initial mode 1920x1200 [ 11.993] (II) RADEON(0): Output DVI-0 using initial mode 1920x1200 [ 11.993] (II) RADEON(0): Using default gamma of (1.0, 1.0, 1.0) unless otherwise stated. [ 11.993] (II) RADEON(0): mem size init: gart size :1fdff000 vram size: s:20000000 visible:f6f6000 [ 11.993] (II) RADEON(0): EXA: Driver will allow EXA pixmaps in VRAM [ 11.993] (==) RADEON(0): DPI set to (96, 96) [ 11.993] (II) Loading sub module "fb" [ 11.993] (II) LoadModule: "fb" [ 11.994] (II) Loading /usr/lib/xorg/modules/libfb.so [ 11.994] (II) Module fb: vendor="X.Org Foundation" [ 11.994] compiled for 1.11.3, module version = 1.0.0 [ 11.994] ABI class: X.Org ANSI C Emulation, version 0.4 [ 11.994] (II) Loading sub module "ramdac" [ 11.994] (II) LoadModule: "ramdac" [ 11.994] (II) Module "ramdac" already built-in [ 11.994] (II) UnloadModule: "vesa" [ 11.994] (II) Unloading vesa [ 11.994] (II) UnloadModule: "fbdev" [ 11.994] (II) Unloading fbdev [ 11.994] (II) UnloadModule: "fbdevhw" [ 11.994] (II) Unloading fbdevhw [ 11.994] (--) Depth 24 pixmap format is 32 bpp [ 12.000] (II) RADEON(0): [DRI2] Setup complete [ 12.000] (II) RADEON(0): [DRI2] DRI driver: r600 [ 12.000] (II) RADEON(0): [DRI2] VDPAU driver: r600 [ 12.000] (II) RADEON(0): Front buffer size: 9000K [ 12.000] (II) RADEON(0): VRAM usage limit set to 219499K [ 12.001] (==) RADEON(0): Backing store disabled [ 12.001] (II) RADEON(0): Direct rendering enabled [ 12.001] (II) RADEON(0): Setting EXA maxPitchBytes [ 12.001] (II) EXA(0): Driver allocated offscreen pixmaps [ 12.001] (II) EXA(0): Driver registered support for the following operations: [ 12.001] (II) Solid [ 12.001] (II) Copy [ 12.001] (II) Composite (RENDER acceleration) [ 12.001] (II) UploadToScreen [ 12.001] (II) DownloadFromScreen [ 12.001] (II) RADEON(0): Acceleration enabled [ 12.001] (==) RADEON(0): DPMS enabled [ 12.001] (==) RADEON(0): Silken mouse enabled [ 12.002] (II) RADEON(0): Set up textured video [ 12.002] (II) RADEON(0): [XvMC] Associated with Radeon Textured Video. [ 12.002] (II) RADEON(0): [XvMC] Extension initialized. [ 12.002] (II) RADEON(0): RandR 1.2 enabled, ignore the following RandR disabled message. [ 12.002] (--) RandR disabled [ 12.002] (II) Initializing built-in extension Generic Event Extension [ 12.002] (II) Initializing built-in extension SHAPE [ 12.002] (II) Initializing built-in extension MIT-SHM [ 12.002] (II) Initializing built-in extension XInputExtension [ 12.002] (II) Initializing built-in extension XTEST [ 12.002] (II) Initializing built-in extension BIG-REQUESTS [ 12.002] (II) Initializing built-in extension SYNC [ 12.002] (II) Initializing built-in extension XKEYBOARD [ 12.002] (II) Initializing built-in extension XC-MISC [ 12.002] (II) Initializing built-in extension SECURITY [ 12.002] (II) Initializing built-in extension XINERAMA [ 12.002] (II) Initializing built-in extension XFIXES [ 12.002] (II) Initializing built-in extension RENDER [ 12.002] (II) Initializing built-in extension RANDR [ 12.002] (II) Initializing built-in extension COMPOSITE [ 12.002] (II) Initializing built-in extension DAMAGE [ 12.012] (II) AIGLX: enabled GLX_MESA_copy_sub_buffer [ 12.012] (II) AIGLX: enabled GLX_INTEL_swap_event [ 12.012] (II) AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control [ 12.012] (II) AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects [ 12.012] (II) AIGLX: Loaded and initialized r600 [ 12.012] (II) GLX: Initialized DRI2 GL provider for screen 0 [ 12.014] (II) RADEON(0): Setting screen physical size to 508 x 317 [ 12.022] (II) XKB: reuse xkmfile /var/lib/xkb/server-B20D7FC79C7F597315E3E501AEF10E0D866E8E92.xkm [ 12.024] (II) config/udev: Adding input device Power Button (/dev/input/event1) [ 12.024] (**) Power Button: Applying InputClass "evdev keyboard catchall" [ 12.024] (II) LoadModule: "evdev" [ 12.024] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.025] (II) Module evdev: vendor="X.Org Foundation" [ 12.025] compiled for 1.11.3, module version = 2.7.0 [ 12.025] Module class: X.Org XInput Driver [ 12.025] ABI class: X.Org XInput driver, version 16.0 [ 12.025] (II) Using input driver 'evdev' for 'Power Button' [ 12.025] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.025] (**) Power Button: always reports core events [ 12.025] (**) evdev: Power Button: Device: "/dev/input/event1" [ 12.025] (--) evdev: Power Button: Vendor 0 Product 0x1 [ 12.025] (--) evdev: Power Button: Found keys [ 12.025] (II) evdev: Power Button: Configuring as keyboard [ 12.025] (**) Option "config_info" "udev:/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1/event1" [ 12.025] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD, id 6) [ 12.025] (**) Option "xkb_rules" "evdev" [ 12.025] (**) Option "xkb_model" "pc105" [ 12.025] (**) Option "xkb_layout" "us" [ 12.025] (II) config/udev: Adding input device Power Button (/dev/input/event0) [ 12.025] (**) Power Button: Applying InputClass "evdev keyboard catchall" [ 12.025] (II) Using input driver 'evdev' for 'Power Button' [ 12.025] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.025] (**) Power Button: always reports core events [ 12.025] (**) evdev: Power Button: Device: "/dev/input/event0" [ 12.025] (--) evdev: Power Button: Vendor 0 Product 0x1 [ 12.025] (--) evdev: Power Button: Found keys [ 12.025] (II) evdev: Power Button: Configuring as keyboard [ 12.025] (**) Option "config_info" "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0C0C:00/input/input0/event0" [ 12.025] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD, id 7) [ 12.025] (**) Option "xkb_rules" "evdev" [ 12.025] (**) Option "xkb_model" "pc105" [ 12.025] (**) Option "xkb_layout" "us" [ 12.026] (II) config/udev: Adding input device HDA ATI HDMI HDMI/DP,pcm=3 (/dev/input/event14) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Line-Out Side (/dev/input/event10) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Line-Out CLFE (/dev/input/event11) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Line-Out Surround (/dev/input/event12) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Line-Out Front (/dev/input/event13) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Line (/dev/input/event6) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.026] (II) config/udev: Adding input device HDA Intel PCH Front Mic (/dev/input/event7) [ 12.026] (II) No input driver specified, ignoring this device. [ 12.026] (II) This device may have been added with another device file. [ 12.027] (II) config/udev: Adding input device HDA Intel PCH Rear Mic (/dev/input/event8) [ 12.027] (II) No input driver specified, ignoring this device. [ 12.027] (II) This device may have been added with another device file. [ 12.027] (II) config/udev: Adding input device HDA Intel PCH Front Headphone (/dev/input/event9) [ 12.027] (II) No input driver specified, ignoring this device. [ 12.027] (II) This device may have been added with another device file. [ 12.027] (II) config/udev: Adding input device Yubico Yubico Yubikey II (/dev/input/event2) [ 12.027] (**) Yubico Yubico Yubikey II: Applying InputClass "evdev keyboard catchall" [ 12.027] (II) Using input driver 'evdev' for 'Yubico Yubico Yubikey II' [ 12.027] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.027] (**) Yubico Yubico Yubikey II: always reports core events [ 12.027] (**) evdev: Yubico Yubico Yubikey II: Device: "/dev/input/event2" [ 12.027] (--) evdev: Yubico Yubico Yubikey II: Vendor 0x1050 Product 0x10 [ 12.027] (--) evdev: Yubico Yubico Yubikey II: Found keys [ 12.027] (II) evdev: Yubico Yubico Yubikey II: Configuring as keyboard [ 12.027] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7.7/2-1.7.7.4/2-1.7.7.4:1.0/input/input2/event2" [ 12.027] (II) XINPUT: Adding extended input device "Yubico Yubico Yubikey II" (type: KEYBOARD, id 8) [ 12.027] (**) Option "xkb_rules" "evdev" [ 12.027] (**) Option "xkb_model" "pc105" [ 12.027] (**) Option "xkb_layout" "us" [ 12.027] (II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/event3) [ 12.027] (**) Logitech USB Optical Mouse: Applying InputClass "evdev pointer catchall" [ 12.027] (II) Using input driver 'evdev' for 'Logitech USB Optical Mouse' [ 12.027] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.027] (**) Logitech USB Optical Mouse: always reports core events [ 12.027] (**) evdev: Logitech USB Optical Mouse: Device: "/dev/input/event3" [ 12.027] (--) evdev: Logitech USB Optical Mouse: Vendor 0x46d Product 0xc05a [ 12.027] (--) evdev: Logitech USB Optical Mouse: Found 3 mouse buttons [ 12.027] (--) evdev: Logitech USB Optical Mouse: Found scroll wheel(s) [ 12.027] (--) evdev: Logitech USB Optical Mouse: Found relative axes [ 12.027] (--) evdev: Logitech USB Optical Mouse: Found x and y relative axes [ 12.027] (II) evdev: Logitech USB Optical Mouse: Configuring as mouse [ 12.027] (II) evdev: Logitech USB Optical Mouse: Adding scrollwheel support [ 12.027] (**) evdev: Logitech USB Optical Mouse: YAxisMapping: buttons 4 and 5 [ 12.027] (**) evdev: Logitech USB Optical Mouse: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 12.027] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7.7/2-1.7.7.6/2-1.7.7.6:1.0/input/input3/event3" [ 12.027] (II) XINPUT: Adding extended input device "Logitech USB Optical Mouse" (type: MOUSE, id 9) [ 12.027] (II) evdev: Logitech USB Optical Mouse: initialized for relative axes. [ 12.028] (**) Logitech USB Optical Mouse: (accel) keeping acceleration scheme 1 [ 12.028] (**) Logitech USB Optical Mouse: (accel) acceleration profile 0 [ 12.028] (**) Logitech USB Optical Mouse: (accel) acceleration factor: 2.000 [ 12.028] (**) Logitech USB Optical Mouse: (accel) acceleration threshold: 4 [ 12.028] (II) config/udev: Adding input device Logitech USB Optical Mouse (/dev/input/mouse0) [ 12.028] (II) No input driver specified, ignoring this device. [ 12.028] (II) This device may have been added with another device file. [ 12.028] (II) config/udev: Adding input device USBPS2 (/dev/input/event4) [ 12.028] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 12.028] (II) Using input driver 'evdev' for 'USBPS2' [ 12.028] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.028] (**) USBPS2: always reports core events [ 12.028] (**) evdev: USBPS2: Device: "/dev/input/event4" [ 12.028] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 12.028] (--) evdev: USBPS2: Found keys [ 12.028] (II) evdev: USBPS2: Configuring as keyboard [ 12.028] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.0/input/input4/event4" [ 12.028] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 10) [ 12.028] (**) Option "xkb_rules" "evdev" [ 12.028] (**) Option "xkb_model" "pc105" [ 12.028] (**) Option "xkb_layout" "us" [ 12.028] (II) config/udev: Adding input device USBPS2 (/dev/input/event5) [ 12.028] (**) USBPS2: Applying InputClass "evdev pointer catchall" [ 12.028] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 12.028] (II) Using input driver 'evdev' for 'USBPS2' [ 12.028] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 12.028] (**) USBPS2: always reports core events [ 12.028] (**) evdev: USBPS2: Device: "/dev/input/event5" [ 12.028] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 12.028] (--) evdev: USBPS2: Found 9 mouse buttons [ 12.028] (--) evdev: USBPS2: Found scroll wheel(s) [ 12.028] (--) evdev: USBPS2: Found relative axes [ 12.028] (--) evdev: USBPS2: Found x and y relative axes [ 12.028] (--) evdev: USBPS2: Found absolute axes [ 12.028] (II) evdev: USBPS2: Forcing absolute x/y axes to exist. [ 12.028] (--) evdev: USBPS2: Found keys [ 12.028] (II) evdev: USBPS2: Configuring as mouse [ 12.028] (II) evdev: USBPS2: Configuring as keyboard [ 12.028] (II) evdev: USBPS2: Adding scrollwheel support [ 12.028] (**) evdev: USBPS2: YAxisMapping: buttons 4 and 5 [ 12.028] (**) evdev: USBPS2: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 12.028] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.1/input/input5/event5" [ 12.028] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 11) [ 12.028] (**) Option "xkb_rules" "evdev" [ 12.028] (**) Option "xkb_model" "pc105" [ 12.028] (**) Option "xkb_layout" "us" [ 12.028] (II) evdev: USBPS2: initialized for relative axes. [ 12.029] (WW) evdev: USBPS2: ignoring absolute axes. [ 12.029] (**) USBPS2: (accel) keeping acceleration scheme 1 [ 12.029] (**) USBPS2: (accel) acceleration profile 0 [ 12.029] (**) USBPS2: (accel) acceleration factor: 2.000 [ 12.029] (**) USBPS2: (accel) acceleration threshold: 4 [ 12.029] (II) config/udev: Adding input device USBPS2 (/dev/input/mouse1) [ 12.029] (II) No input driver specified, ignoring this device. [ 12.029] (II) This device may have been added with another device file. [ 13.089] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [ 13.089] (II) RADEON(0): Using EDID range info for horizontal sync [ 13.089] (II) RADEON(0): Using EDID range info for vertical refresh [ 13.089] (II) RADEON(0): Printing DDC gathered Modelines: [ 13.089] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 13.089] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 13.089] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 13.089] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 13.089] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 13.089] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 13.089] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 13.089] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 13.089] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [ 13.089] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [ 13.436] (II) RADEON(0): Allocate new frame buffer 3840x1200 stride 3840 [ 13.436] (II) RADEON(0): VRAM usage limit set to 211399K [ 15.458] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [ 15.458] (II) RADEON(0): Using hsync ranges from config file [ 15.458] (II) RADEON(0): Using vrefresh ranges from config file [ 15.458] (II) RADEON(0): Printing DDC gathered Modelines: [ 15.458] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 15.458] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 15.458] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 15.458] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 15.458] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 15.458] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 15.458] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 15.458] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 15.458] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [ 15.458] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [ 16.126] (II) XKB: reuse xkmfile /var/lib/xkb/server-518754FAB1FA320CD11E67E5F27005732682D4B3.xkm [ 16.432] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.436] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.443] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.453] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.460] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.467] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.475] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.478] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.482] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.486] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.492] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.496] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.500] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.504] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.507] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.511] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.514] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.518] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.521] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.525] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.528] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 16.532] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 36.521] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [ 36.521] (II) RADEON(0): Using hsync ranges from config file [ 36.521] (II) RADEON(0): Using vrefresh ranges from config file [ 36.522] (II) RADEON(0): Printing DDC gathered Modelines: [ 36.522] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 36.522] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 36.522] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 36.522] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 36.522] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 36.522] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 36.522] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 36.522] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 36.522] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [ 36.522] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [ 132.778] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68210.724] (II) config/udev: removing device USBPS2 [ 68210.724] (II) evdev: USBPS2: Close [ 68210.724] (II) UnloadModule: "evdev" [ 68210.724] (II) Unloading evdev [ 68210.904] (II) config/udev: removing device USBPS2 [ 68210.904] (II) evdev: USBPS2: Close [ 68210.904] (II) UnloadModule: "evdev" [ 68210.904] (II) Unloading evdev [ 68212.753] (II) config/udev: Adding input device USBPS2 (/dev/input/mouse1) [ 68212.753] (II) No input driver specified, ignoring this device. [ 68212.753] (II) This device may have been added with another device file. [ 68212.754] (II) config/udev: Adding input device USBPS2 (/dev/input/event4) [ 68212.754] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68212.754] (II) Using input driver 'evdev' for 'USBPS2' [ 68212.754] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68212.754] (**) USBPS2: always reports core events [ 68212.754] (**) evdev: USBPS2: Device: "/dev/input/event4" [ 68212.754] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68212.754] (--) evdev: USBPS2: Found keys [ 68212.754] (II) evdev: USBPS2: Configuring as keyboard [ 68212.754] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.0/input/input15/event4" [ 68212.754] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 10) [ 68212.754] (**) Option "xkb_rules" "evdev" [ 68212.754] (**) Option "xkb_model" "pc105" [ 68212.754] (**) Option "xkb_layout" "us" [ 68212.755] (II) config/udev: Adding input device USBPS2 (/dev/input/event5) [ 68212.755] (**) USBPS2: Applying InputClass "evdev pointer catchall" [ 68212.755] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68212.755] (II) Using input driver 'evdev' for 'USBPS2' [ 68212.755] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68212.755] (**) USBPS2: always reports core events [ 68212.755] (**) evdev: USBPS2: Device: "/dev/input/event5" [ 68212.755] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68212.755] (--) evdev: USBPS2: Found 9 mouse buttons [ 68212.755] (--) evdev: USBPS2: Found scroll wheel(s) [ 68212.755] (--) evdev: USBPS2: Found relative axes [ 68212.755] (--) evdev: USBPS2: Found x and y relative axes [ 68212.755] (--) evdev: USBPS2: Found absolute axes [ 68212.755] (II) evdev: USBPS2: Forcing absolute x/y axes to exist. [ 68212.755] (--) evdev: USBPS2: Found keys [ 68212.755] (II) evdev: USBPS2: Configuring as mouse [ 68212.755] (II) evdev: USBPS2: Configuring as keyboard [ 68212.755] (II) evdev: USBPS2: Adding scrollwheel support [ 68212.755] (**) evdev: USBPS2: YAxisMapping: buttons 4 and 5 [ 68212.755] (**) evdev: USBPS2: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 68212.756] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.1/input/input16/event5" [ 68212.756] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 11) [ 68212.756] (**) Option "xkb_rules" "evdev" [ 68212.756] (**) Option "xkb_model" "pc105" [ 68212.756] (**) Option "xkb_layout" "us" [ 68212.756] (II) evdev: USBPS2: initialized for relative axes. [ 68212.756] (WW) evdev: USBPS2: ignoring absolute axes. [ 68212.756] (**) USBPS2: (accel) keeping acceleration scheme 1 [ 68212.756] (**) USBPS2: (accel) acceleration profile 0 [ 68212.756] (**) USBPS2: (accel) acceleration factor: 2.000 [ 68212.756] (**) USBPS2: (accel) acceleration threshold: 4 [ 68212.794] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.801] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.807] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.812] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.818] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.829] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.841] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.852] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.863] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.869] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.879] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.890] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.896] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.901] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.906] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.911] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.916] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.927] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.938] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.944] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.950] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68212.956] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68504.760] (II) config/udev: removing device USBPS2 [ 68504.760] (II) evdev: USBPS2: Close [ 68504.760] (II) UnloadModule: "evdev" [ 68504.760] (II) Unloading evdev [ 68504.872] (II) config/udev: removing device USBPS2 [ 68504.872] (II) evdev: USBPS2: Close [ 68504.872] (II) UnloadModule: "evdev" [ 68504.872] (II) Unloading evdev [ 68515.814] (II) config/udev: Adding input device USBPS2 (/dev/input/event5) [ 68515.814] (**) USBPS2: Applying InputClass "evdev pointer catchall" [ 68515.814] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68515.814] (II) Using input driver 'evdev' for 'USBPS2' [ 68515.815] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68515.815] (**) USBPS2: always reports core events [ 68515.815] (**) evdev: USBPS2: Device: "/dev/input/event5" [ 68515.815] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68515.815] (--) evdev: USBPS2: Found 9 mouse buttons [ 68515.815] (--) evdev: USBPS2: Found scroll wheel(s) [ 68515.815] (--) evdev: USBPS2: Found relative axes [ 68515.815] (--) evdev: USBPS2: Found x and y relative axes [ 68515.815] (--) evdev: USBPS2: Found absolute axes [ 68515.815] (II) evdev: USBPS2: Forcing absolute x/y axes to exist. [ 68515.815] (--) evdev: USBPS2: Found keys [ 68515.815] (II) evdev: USBPS2: Configuring as mouse [ 68515.815] (II) evdev: USBPS2: Configuring as keyboard [ 68515.815] (II) evdev: USBPS2: Adding scrollwheel support [ 68515.815] (**) evdev: USBPS2: YAxisMapping: buttons 4 and 5 [ 68515.815] (**) evdev: USBPS2: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 68515.815] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.1/input/input18/event5" [ 68515.815] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 10) [ 68515.815] (**) Option "xkb_rules" "evdev" [ 68515.815] (**) Option "xkb_model" "pc105" [ 68515.815] (**) Option "xkb_layout" "us" [ 68515.815] (II) evdev: USBPS2: initialized for relative axes. [ 68515.815] (WW) evdev: USBPS2: ignoring absolute axes. [ 68515.815] (**) USBPS2: (accel) keeping acceleration scheme 1 [ 68515.815] (**) USBPS2: (accel) acceleration profile 0 [ 68515.816] (**) USBPS2: (accel) acceleration factor: 2.000 [ 68515.816] (**) USBPS2: (accel) acceleration threshold: 4 [ 68515.816] (II) config/udev: Adding input device USBPS2 (/dev/input/mouse1) [ 68515.816] (II) No input driver specified, ignoring this device. [ 68515.816] (II) This device may have been added with another device file. [ 68515.817] (II) config/udev: Adding input device USBPS2 (/dev/input/event4) [ 68515.817] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68515.817] (II) Using input driver 'evdev' for 'USBPS2' [ 68515.817] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68515.817] (**) USBPS2: always reports core events [ 68515.817] (**) evdev: USBPS2: Device: "/dev/input/event4" [ 68515.817] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68515.817] (--) evdev: USBPS2: Found keys [ 68515.817] (II) evdev: USBPS2: Configuring as keyboard [ 68515.817] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.0/input/input17/event4" [ 68515.817] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 11) [ 68515.817] (**) Option "xkb_rules" "evdev" [ 68515.817] (**) Option "xkb_model" "pc105" [ 68515.817] (**) Option "xkb_layout" "us" [ 68515.854] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.868] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.874] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.880] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.885] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.891] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.896] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.901] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.906] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.911] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.918] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.928] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.933] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.938] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.943] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.949] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.954] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.959] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.965] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.977] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.988] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68515.999] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68763.632] (II) config/udev: removing device USBPS2 [ 68763.632] (II) evdev: USBPS2: Close [ 68763.632] (II) UnloadModule: "evdev" [ 68763.632] (II) Unloading evdev [ 68763.756] (II) config/udev: removing device USBPS2 [ 68763.756] (II) evdev: USBPS2: Close [ 68763.756] (II) UnloadModule: "evdev" [ 68763.756] (II) Unloading evdev [ 68766.049] (II) config/udev: Adding input device USBPS2 (/dev/input/mouse1) [ 68766.049] (II) No input driver specified, ignoring this device. [ 68766.049] (II) This device may have been added with another device file. [ 68766.050] (II) config/udev: Adding input device USBPS2 (/dev/input/event4) [ 68766.050] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68766.050] (II) Using input driver 'evdev' for 'USBPS2' [ 68766.050] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68766.050] (**) USBPS2: always reports core events [ 68766.050] (**) evdev: USBPS2: Device: "/dev/input/event4" [ 68766.050] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68766.050] (--) evdev: USBPS2: Found keys [ 68766.050] (II) evdev: USBPS2: Configuring as keyboard [ 68766.050] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.0/input/input19/event4" [ 68766.050] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 10) [ 68766.050] (**) Option "xkb_rules" "evdev" [ 68766.050] (**) Option "xkb_model" "pc105" [ 68766.050] (**) Option "xkb_layout" "us" [ 68766.051] (II) config/udev: Adding input device USBPS2 (/dev/input/event5) [ 68766.051] (**) USBPS2: Applying InputClass "evdev pointer catchall" [ 68766.051] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 68766.051] (II) Using input driver 'evdev' for 'USBPS2' [ 68766.051] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 68766.051] (**) USBPS2: always reports core events [ 68766.051] (**) evdev: USBPS2: Device: "/dev/input/event5" [ 68766.051] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 68766.051] (--) evdev: USBPS2: Found 9 mouse buttons [ 68766.051] (--) evdev: USBPS2: Found scroll wheel(s) [ 68766.051] (--) evdev: USBPS2: Found relative axes [ 68766.051] (--) evdev: USBPS2: Found x and y relative axes [ 68766.051] (--) evdev: USBPS2: Found absolute axes [ 68766.051] (II) evdev: USBPS2: Forcing absolute x/y axes to exist. [ 68766.051] (--) evdev: USBPS2: Found keys [ 68766.051] (II) evdev: USBPS2: Configuring as mouse [ 68766.051] (II) evdev: USBPS2: Configuring as keyboard [ 68766.051] (II) evdev: USBPS2: Adding scrollwheel support [ 68766.051] (**) evdev: USBPS2: YAxisMapping: buttons 4 and 5 [ 68766.051] (**) evdev: USBPS2: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 68766.051] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.1/input/input20/event5" [ 68766.051] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 11) [ 68766.051] (**) Option "xkb_rules" "evdev" [ 68766.051] (**) Option "xkb_model" "pc105" [ 68766.051] (**) Option "xkb_layout" "us" [ 68766.052] (II) evdev: USBPS2: initialized for relative axes. [ 68766.052] (WW) evdev: USBPS2: ignoring absolute axes. [ 68766.052] (**) USBPS2: (accel) keeping acceleration scheme 1 [ 68766.052] (**) USBPS2: (accel) acceleration profile 0 [ 68766.052] (**) USBPS2: (accel) acceleration factor: 2.000 [ 68766.052] (**) USBPS2: (accel) acceleration threshold: 4 [ 68766.086] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.096] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.102] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.107] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.113] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.121] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.130] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.135] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.140] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.146] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.151] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.157] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.167] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.174] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.182] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.190] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.196] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.203] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.212] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.223] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.230] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 68766.236] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69140.436] (II) config/udev: removing device USBPS2 [ 69140.436] (II) evdev: USBPS2: Close [ 69140.436] (II) UnloadModule: "evdev" [ 69140.436] (II) Unloading evdev [ 69140.568] (II) config/udev: removing device USBPS2 [ 69140.568] (II) evdev: USBPS2: Close [ 69140.568] (II) UnloadModule: "evdev" [ 69140.568] (II) Unloading evdev [ 69143.530] (II) config/udev: Adding input device USBPS2 (/dev/input/event4) [ 69143.530] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 69143.530] (II) Using input driver 'evdev' for 'USBPS2' [ 69143.530] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 69143.530] (**) USBPS2: always reports core events [ 69143.530] (**) evdev: USBPS2: Device: "/dev/input/event4" [ 69143.530] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 69143.530] (--) evdev: USBPS2: Found keys [ 69143.530] (II) evdev: USBPS2: Configuring as keyboard [ 69143.530] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.0/input/input21/event4" [ 69143.530] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 10) [ 69143.530] (**) Option "xkb_rules" "evdev" [ 69143.530] (**) Option "xkb_model" "pc105" [ 69143.530] (**) Option "xkb_layout" "us" [ 69143.531] (II) config/udev: Adding input device USBPS2 (/dev/input/mouse1) [ 69143.531] (II) No input driver specified, ignoring this device. [ 69143.531] (II) This device may have been added with another device file. [ 69143.532] (II) config/udev: Adding input device USBPS2 (/dev/input/event5) [ 69143.532] (**) USBPS2: Applying InputClass "evdev pointer catchall" [ 69143.532] (**) USBPS2: Applying InputClass "evdev keyboard catchall" [ 69143.532] (II) Using input driver 'evdev' for 'USBPS2' [ 69143.532] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 69143.532] (**) USBPS2: always reports core events [ 69143.532] (**) evdev: USBPS2: Device: "/dev/input/event5" [ 69143.532] (--) evdev: USBPS2: Vendor 0xd3d Product 0x1 [ 69143.532] (--) evdev: USBPS2: Found 9 mouse buttons [ 69143.532] (--) evdev: USBPS2: Found scroll wheel(s) [ 69143.532] (--) evdev: USBPS2: Found relative axes [ 69143.532] (--) evdev: USBPS2: Found x and y relative axes [ 69143.532] (--) evdev: USBPS2: Found absolute axes [ 69143.532] (II) evdev: USBPS2: Forcing absolute x/y axes to exist. [ 69143.532] (--) evdev: USBPS2: Found keys [ 69143.532] (II) evdev: USBPS2: Configuring as mouse [ 69143.532] (II) evdev: USBPS2: Configuring as keyboard [ 69143.532] (II) evdev: USBPS2: Adding scrollwheel support [ 69143.532] (**) evdev: USBPS2: YAxisMapping: buttons 4 and 5 [ 69143.532] (**) evdev: USBPS2: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200 [ 69143.532] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.8/2-1.8.1/2-1.8.1.1/2-1.8.1.1:1.1/input/input22/event5" [ 69143.532] (II) XINPUT: Adding extended input device "USBPS2" (type: KEYBOARD, id 11) [ 69143.532] (**) Option "xkb_rules" "evdev" [ 69143.532] (**) Option "xkb_model" "pc105" [ 69143.532] (**) Option "xkb_layout" "us" [ 69143.532] (II) evdev: USBPS2: initialized for relative axes. [ 69143.532] (WW) evdev: USBPS2: ignoring absolute axes. [ 69143.533] (**) USBPS2: (accel) keeping acceleration scheme 1 [ 69143.533] (**) USBPS2: (accel) acceleration profile 0 [ 69143.533] (**) USBPS2: (accel) acceleration factor: 2.000 [ 69143.533] (**) USBPS2: (accel) acceleration threshold: 4 [ 69143.570] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.582] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.587] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.593] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.599] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.605] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.614] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.623] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.631] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.638] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.649] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.660] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.672] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.683] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.694] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.701] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.713] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.724] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.733] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.740] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.745] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69143.751] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 69150.926] (II) XKB: reuse xkmfile /var/lib/xkb/server-BA7B437329BD6D7BFC68CFC4EDE8A5BB3B88FBE3.xkm [ 78283.145] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [ 78283.145] (II) RADEON(0): Using hsync ranges from config file [ 78283.145] (II) RADEON(0): Using vrefresh ranges from config file [ 78283.145] (II) RADEON(0): Printing DDC gathered Modelines: [ 78283.145] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [ 78283.145] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [ 78283.145] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [ 78283.145] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [ 78283.145] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [ 78283.145] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [ 78283.145] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [ 78283.145] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [ 78283.145] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [ 78283.145] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [252951.206] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [252951.206] (II) RADEON(0): Using hsync ranges from config file [252951.206] (II) RADEON(0): Using vrefresh ranges from config file [252951.206] (II) RADEON(0): Printing DDC gathered Modelines: [252951.206] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [252951.206] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [252951.206] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [252951.206] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [252951.206] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [252951.206] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [252951.206] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [252951.206] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [252951.206] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [252951.206] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) [252952.414] (II) RADEON(0): EDID vendor "DEL", prod id 41082 [252952.414] (II) RADEON(0): Using hsync ranges from config file [252952.414] (II) RADEON(0): Using vrefresh ranges from config file [252952.414] (II) RADEON(0): Printing DDC gathered Modelines: [252952.414] (II) RADEON(0): Modeline "1920x1200"x0.0 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync (74.0 kHz) [252952.414] (II) RADEON(0): Modeline "800x600"x0.0 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz) [252952.414] (II) RADEON(0): Modeline "640x480"x0.0 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz) [252952.414] (II) RADEON(0): Modeline "720x400"x0.0 28.32 720 738 846 900 400 412 414 449 -hsync +vsync (31.5 kHz) [252952.414] (II) RADEON(0): Modeline "1024x768"x0.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz) [252952.414] (II) RADEON(0): Modeline "1280x960"x0.0 108.00 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync (60.0 kHz) [252952.414] (II) RADEON(0): Modeline "1280x1024"x0.0 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync (64.0 kHz) [252952.414] (II) RADEON(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz) [252952.414] (II) RADEON(0): Modeline "1680x1050"x0.0 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync (64.7 kHz) [252952.414] (II) RADEON(0): Modeline "1920x1080"x60.0 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -hsync +vsync (67.1 kHz) xdiagnose-3.8.10/tests/sample.Xorg.1.log0000664000000000000000000006313513151230744014667 0ustar [ 26.505] X.Org X Server 1.13.1.901 (1.13.2 RC 1) Release Date: 2013-01-03 [ 26.505] X Protocol Version 11, Revision 0 [ 26.505] Build Operating System: Linux 3.2.0-34-generic x86_64 Ubuntu [ 26.505] Current Operating System: Linux clanfield.bryceharrington.org 3.7.0-7-generic #15-Ubuntu SMP Sat Dec 15 14:13:08 UTC 2012 x86_64 [ 26.505] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.7.0-7-generic root=UUID=9d368991-c242-422d-a48f-3587d547abed ro quiet splash vt.handoff=7 [ 26.505] Build Date: 08 January 2013 03:54:12PM [ 26.505] xorg-server 2:1.13.1.901-0ubuntu1 (For technical support please see http://www.ubuntu.com/support) [ 26.505] Current version of pixman: 0.28.2 [ 26.505] Before reporting problems, check http://wiki.x.org to make sure that you have the latest version. [ 26.505] Markers: (--) probed, (**) from config file, (==) default setting, (++) from command line, (!!) notice, (II) informational, (WW) warning, (EE) error, (NI) not implemented, (??) unknown. [ 26.505] (==) Log file: "/var/log/Xorg.0.log", Time: Thu Jan 10 11:51:38 2013 [ 26.547] (==) Using config file: "/etc/X11/xorg.conf" [ 26.547] (==) Using system config directory "/usr/share/X11/xorg.conf.d" [ 26.694] (==) No Layout section. Using the first Screen section. [ 26.694] (==) No screen section available. Using defaults. [ 26.694] (**) |-->Screen "Default Screen Section" (0) [ 26.694] (**) | |-->Monitor "" [ 26.694] (==) No device specified for screen "Default Screen Section". Using the first device section listed. [ 26.694] (**) | |-->Device "Card0" [ 26.694] (==) No monitor specified for screen "Default Screen Section". Using a default monitor configuration. [ 26.694] (==) Automatically adding devices [ 26.694] (==) Automatically enabling devices [ 26.694] (==) Automatically adding GPU devices [ 26.750] (WW) The directory "/usr/share/fonts/X11/cyrillic" does not exist. [ 26.750] Entry deleted from font path. [ 26.750] (WW) The directory "/usr/share/fonts/X11/100dpi/" does not exist. [ 26.750] Entry deleted from font path. [ 26.750] (WW) The directory "/usr/share/fonts/X11/75dpi/" does not exist. [ 26.750] Entry deleted from font path. [ 26.771] (WW) The directory "/usr/share/fonts/X11/100dpi" does not exist. [ 26.771] Entry deleted from font path. [ 26.771] (WW) The directory "/usr/share/fonts/X11/75dpi" does not exist. [ 26.771] Entry deleted from font path. [ 26.771] (WW) The directory "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType" does not exist. [ 26.771] Entry deleted from font path. [ 26.771] (==) FontPath set to: /usr/share/fonts/X11/misc, /usr/share/fonts/X11/Type1, built-ins [ 26.771] (==) ModulePath set to "/usr/lib/x86_64-linux-gnu/xorg/extra-modules,/usr/lib/xorg/extra-modules,/usr/lib/xorg/modules" [ 26.771] (II) The server relies on udev to provide the list of input devices. If no devices become available, reconfigure udev or disable AutoAddDevices. [ 26.771] (II) Loader magic: 0x7ffcb5b8bc40 [ 26.771] (II) Module ABI versions: [ 26.771] X.Org ANSI C Emulation: 0.4 [ 26.771] X.Org Video Driver: 13.1 [ 26.771] X.Org XInput driver : 18.0 [ 26.771] X.Org Server Extension : 7.0 [ 26.772] (II) config/udev: Adding drm device (/dev/dri/card0) [ 26.775] (--) PCI:*(0:0:2:0) 8086:2a42:1028:0432 rev 7, Mem @ 0xf6c00000/4194304, 0xe0000000/268435456, I/O @ 0x0000efe8/8 [ 26.777] (--) PCI: (0:0:2:1) 8086:2a43:1028:0432 rev 7, Mem @ 0xf6b00000/1048576 [ 26.778] (II) Open ACPI successful (/var/run/acpid.socket) [ 26.778] Initializing built-in extension Generic Event Extension [ 26.778] Initializing built-in extension SHAPE [ 26.778] Initializing built-in extension MIT-SHM [ 26.778] Initializing built-in extension XInputExtension [ 26.778] Initializing built-in extension XTEST [ 26.778] Initializing built-in extension BIG-REQUESTS [ 26.778] Initializing built-in extension SYNC [ 26.778] Initializing built-in extension XKEYBOARD [ 26.778] Initializing built-in extension XC-MISC [ 26.778] Initializing built-in extension SECURITY [ 26.778] Initializing built-in extension XINERAMA [ 26.778] Initializing built-in extension XFIXES [ 26.778] Initializing built-in extension RENDER [ 26.778] Initializing built-in extension RANDR [ 26.778] Initializing built-in extension COMPOSITE [ 26.778] Initializing built-in extension DAMAGE [ 26.778] Initializing built-in extension MIT-SCREEN-SAVER [ 26.778] Initializing built-in extension DOUBLE-BUFFER [ 26.778] Initializing built-in extension RECORD [ 26.778] Initializing built-in extension DPMS [ 26.778] Initializing built-in extension X-Resource [ 26.778] Initializing built-in extension XVideo [ 26.778] Initializing built-in extension XVideo-MotionCompensation [ 26.778] Initializing built-in extension XFree86-VidModeExtension [ 26.778] Initializing built-in extension XFree86-DGA [ 26.778] Initializing built-in extension XFree86-DRI [ 26.778] Initializing built-in extension DRI2 [ 26.778] (II) LoadModule: "glx" [ 26.906] (II) Loading /usr/lib/xorg/modules/extensions/libglx.so [ 27.033] (II) Module glx: vendor="X.Org Foundation" [ 27.033] compiled for 1.13.1.901, module version = 1.0.0 [ 27.033] ABI class: X.Org Server Extension, version 7.0 [ 27.033] (==) AIGLX enabled [ 27.047] Loading extension GLX [ 27.047] (II) LoadModule: "intel" [ 27.047] (II) Loading /usr/lib/xorg/modules/drivers/intel_drv.so [ 27.197] (II) Module intel: vendor="X.Org Foundation" [ 27.197] compiled for 1.13.0.902, module version = 2.20.17 [ 27.197] Module class: X.Org Video Driver [ 27.197] ABI class: X.Org Video Driver, version 13.1 [ 27.197] (II) intel: Driver for Intel Integrated Graphics Chipsets: i810, i810-dc100, i810e, i815, i830M, 845G, 854, 852GM/855GM, 865G, 915G, E7221 (i915), 915GM, 945G, 945GM, 945GME, Pineview GM, Pineview G, 965G, G35, 965Q, 946GZ, 965GM, 965GME/GLE, G33, Q35, Q33, GM45, 4 Series, G45/G43, Q45/Q43, G41, B43, B43, Clarkdale, Arrandale, Sandybridge Desktop (GT1), Sandybridge Desktop (GT2), Sandybridge Desktop (GT2+), Sandybridge Mobile (GT1), Sandybridge Mobile (GT2), Sandybridge Mobile (GT2+), Sandybridge Server, Ivybridge Mobile (GT1), Ivybridge Mobile (GT2), Ivybridge Desktop (GT1), Ivybridge Desktop (GT2), Ivybridge Server, Ivybridge Server (GT2), Haswell Desktop (GT1), Haswell Desktop (GT2), Haswell Desktop (GT2+), Haswell Mobile (GT1), Haswell Mobile (GT2), Haswell Mobile (GT2+), Haswell Server (GT1), Haswell Server (GT2), Haswell Server (GT2+), Haswell SDV Desktop (GT1), Haswell SDV Desktop (GT2), Haswell SDV Desktop (GT2+), Haswell SDV Mobile (GT1), Haswell SDV Mobile (GT2), Haswell SDV Mobile (GT2+), Haswell SDV Server (GT1), Haswell SDV Server (GT2), Haswell SDV Server (GT2+), Haswell ULT Desktop (GT1), Haswell ULT Desktop (GT2), Haswell ULT Desktop (GT2+), Haswell ULT Mobile (GT1), Haswell ULT Mobile (GT2), Haswell ULT Mobile (GT2+), Haswell ULT Server (GT1), Haswell ULT Server (GT2), Haswell ULT Server (GT2+), Haswell CRW Desktop (GT1), Haswell CRW Desktop (GT2), Haswell CRW Desktop (GT2+), Haswell CRW Mobile (GT1), Haswell CRW Mobile (GT2), Haswell CRW Mobile (GT2+), Haswell CRW Server (GT1), Haswell CRW Server (GT2), Haswell CRW Server (GT2+), ValleyView PO board [ 27.198] (++) using VT number 7 [ 27.275] (II) intel(0): SNA compiled: xserver-xorg-video-intel 2:2.20.17-0ubuntu1 (Timo Aaltonen ) [ 27.275] (II) intel(0): Creating default Display subsection in Screen section "Default Screen Section" for depth/fbbpp 24/32 [ 27.275] (==) intel(0): Depth 24, (--) framebuffer bpp 32 [ 27.275] (==) intel(0): RGB weight 888 [ 27.275] (==) intel(0): Default visual is TrueColor [ 27.275] (**) intel(0): Option "AccelMethod" "sna" [ 27.275] (--) intel(0): Integrated Graphics Chipset: Intel(R) GM45 [ 27.276] (**) intel(0): Framebuffer tiled [ 27.276] (**) intel(0): Pixmaps tiled [ 27.276] (**) intel(0): 3D buffers tiled [ 27.276] (**) intel(0): Throttling enabled [ 27.276] (**) intel(0): Delayed flush enabled [ 27.276] (**) intel(0): "Tear free" disabled [ 27.276] (**) intel(0): Forcing per-crtc-pixmaps? no [ 27.277] (II) intel(0): Output LVDS1 has no monitor section [ 27.279] (--) intel(0): found backlight control interface acpi_video0 (type 'firmware') [ 27.324] (II) intel(0): Output VGA1 has no monitor section [ 27.376] (II) intel(0): Output DP1 has no monitor section [ 27.376] (II) intel(0): EDID for output LVDS1 [ 27.376] (II) intel(0): Manufacturer: AUO Model: 112c Serial#: 0 [ 27.376] (II) intel(0): Year: 2008 Week: 1 [ 27.376] (II) intel(0): EDID Version: 1.3 [ 27.376] (II) intel(0): Digital Display Input [ 27.376] (II) intel(0): Max Image Size [cm]: horiz.: 29 vert.: 16 [ 27.376] (II) intel(0): Gamma: 2.20 [ 27.376] (II) intel(0): No DPMS capabilities specified [ 27.376] (II) intel(0): Supported color encodings: RGB 4:4:4 YCrCb 4:4:4 [ 27.376] (II) intel(0): First detailed timing is preferred mode [ 27.376] (II) intel(0): redX: 0.585 redY: 0.335 greenX: 0.330 greenY: 0.575 [ 27.376] (II) intel(0): blueX: 0.155 blueY: 0.130 whiteX: 0.313 whiteY: 0.329 [ 27.376] (II) intel(0): Manufacturer's mask: 0 [ 27.376] (II) intel(0): Supported detailed timing: [ 27.376] (II) intel(0): clock: 69.3 MHz Image Size: 293 x 164 mm [ 27.376] (II) intel(0): h_active: 1366 h_sync: 1414 h_sync_end 1446 h_blank_end 1456 h_border: 0 [ 27.376] (II) intel(0): v_active: 768 v_sync: 771 v_sync_end 777 v_blanking: 793 v_border: 0 [ 27.376] (II) intel(0): Supported detailed timing: [ 27.376] (II) intel(0): clock: 46.2 MHz Image Size: 293 x 164 mm [ 27.376] (II) intel(0): h_active: 1366 h_sync: 1414 h_sync_end 1446 h_blank_end 1456 h_border: 0 [ 27.376] (II) intel(0): v_active: 768 v_sync: 771 v_sync_end 777 v_blanking: 793 v_border: 0 [ 27.376] (II) intel(0): XX31G€B133XW1 [ 27.376] (II) intel(0): Unknown vendor-specific block 0 [ 27.376] (II) intel(0): EDID (in hex): [ 27.376] (II) intel(0): 00ffffffffffff0006af2c1100000000 [ 27.376] (II) intel(0): 01120103901d10780af9d59555549327 [ 27.376] (II) intel(0): 21505400000001010101010101010101 [ 27.376] (II) intel(0): 010101010101121b565a500019303020 [ 27.376] (II) intel(0): 360025a41000001a0c12565a50001930 [ 27.376] (II) intel(0): 3020360025a41000001a000000fe0058 [ 27.376] (II) intel(0): 58333147804231333358573100000000 [ 27.376] (II) intel(0): 00000000000000000001010a20200076 [ 27.376] (II) intel(0): Not using default mode "320x240" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "400x300" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "400x300" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "512x384" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "640x480" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "640x512" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "800x600" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "896x672" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "928x696" (doublescan mode not supported) [ 27.376] (II) intel(0): Not using default mode "960x720" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "576x432" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "680x384" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "680x384" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "700x525" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "720x450" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "800x512" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "840x525" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "840x525" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "960x540" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "960x600" (doublescan mode not supported) [ 27.377] (II) intel(0): Not using default mode "1024x768" (doublescan mode not supported) [ 27.377] (II) intel(0): Printing probed modes for output LVDS1 [ 27.377] (II) intel(0): Modeline "1366x768"x60.0 69.30 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (47.6 kHz eP) [ 27.377] (II) intel(0): Modeline "1366x768"x40.0 46.20 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (31.7 kHz e) [ 27.377] (II) intel(0): Modeline "1360x768"x59.8 84.75 1360 1432 1568 1776 768 771 781 798 -hsync +vsync (47.7 kHz d) [ 27.377] (II) intel(0): Modeline "1360x768"x60.0 72.00 1360 1408 1440 1520 768 771 781 790 +hsync -vsync (47.4 kHz d) [ 27.377] (II) intel(0): Modeline "1024x768"x60.0 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync (48.4 kHz d) [ 27.377] (II) intel(0): Modeline "800x600"x60.3 40.00 800 840 968 1056 600 601 605 628 +hsync +vsync (37.9 kHz d) [ 27.377] (II) intel(0): Modeline "800x600"x56.2 36.00 800 824 896 1024 600 601 603 625 +hsync +vsync (35.2 kHz d) [ 27.377] (II) intel(0): Modeline "640x480"x59.9 25.18 640 656 752 800 480 490 492 525 -hsync -vsync (31.5 kHz d) [ 27.424] (II) intel(0): EDID for output VGA1 [ 27.472] (II) intel(0): EDID for output DP1 [ 27.472] (II) intel(0): Output LVDS1 connected [ 27.472] (II) intel(0): Output VGA1 disconnected [ 27.472] (II) intel(0): Output DP1 disconnected [ 27.472] (II) intel(0): Using exact sizes for initial modes [ 27.472] (II) intel(0): Output LVDS1 using initial mode 1366x768 [ 27.472] (II) intel(0): Using default gamma of (1.0, 1.0, 1.0) unless otherwise stated. [ 27.472] (==) intel(0): DPI set to (96, 96) [ 27.472] (II) Loading sub module "dri2" [ 27.472] (II) LoadModule: "dri2" [ 27.472] (II) Module "dri2" already built-in [ 27.472] (==) Depth 24 pixmap format is 32 bpp [ 27.493] (II) intel(0): SNA initialized with Broadwater/Crestline backend [ 27.493] (==) intel(0): Backing store disabled [ 27.493] (==) intel(0): Silken mouse enabled [ 27.493] (II) intel(0): HW Cursor enabled [ 27.493] (II) intel(0): RandR 1.2 enabled, ignore the following RandR disabled message. [ 27.504] (==) intel(0): DPMS enabled [ 27.504] (II) intel(0): Overlay video not supported on this hardware [ 27.504] (II) intel(0): [XvMC] xvmc_vld driver initialized. [ 27.504] (II) intel(0): [DRI2] Setup complete [ 27.504] (II) intel(0): [DRI2] DRI driver: i965 [ 27.504] (II) intel(0): direct rendering: DRI2 Enabled [ 27.504] (==) intel(0): hotplug detection: "enabled" [ 27.504] (--) RandR disabled [ 27.691] (II) AIGLX: enabled GLX_MESA_copy_sub_buffer [ 27.691] (II) AIGLX: enabled GLX_INTEL_swap_event [ 27.691] (II) AIGLX: enabled GLX_ARB_create_context [ 27.691] (II) AIGLX: enabled GLX_ARB_create_context_profile [ 27.691] (II) AIGLX: enabled GLX_EXT_create_context_es2_profile [ 27.691] (II) AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control [ 27.691] (II) AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects [ 27.691] (II) AIGLX: Loaded and initialized i965 [ 27.691] (II) GLX: Initialized DRI2 GL provider for screen 0 [ 27.692] (II) intel(0): switch to mode 1366x768 on crtc 3 (pipe 0) [ 27.708] (II) intel(0): Setting screen physical size to 361 x 203 [ 27.834] (II) XKB: reuse xkmfile /var/lib/xkb/server-B20D7FC79C7F597315E3E501AEF10E0D866E8E92.xkm [ 27.849] (II) config/udev: Adding input device Video Bus (/dev/input/event6) [ 27.849] (**) Video Bus: Applying InputClass "evdev keyboard catchall" [ 27.849] (II) LoadModule: "evdev" [ 27.850] (II) Loading /usr/lib/xorg/modules/input/evdev_drv.so [ 27.891] (II) Module evdev: vendor="X.Org Foundation" [ 27.891] compiled for 1.13.0, module version = 2.7.3 [ 27.891] Module class: X.Org XInput Driver [ 27.891] ABI class: X.Org XInput driver, version 18.0 [ 27.891] (II) Using input driver 'evdev' for 'Video Bus' [ 27.891] (**) Video Bus: always reports core events [ 27.891] (**) evdev: Video Bus: Device: "/dev/input/event6" [ 27.891] (--) evdev: Video Bus: Vendor 0 Product 0x6 [ 27.891] (--) evdev: Video Bus: Found keys [ 27.891] (II) evdev: Video Bus: Configuring as keyboard [ 27.891] (**) Option "config_info" "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0A03:00/LNXVIDEO:00/input/input6/event6" [ 27.891] (II) XINPUT: Adding extended input device "Video Bus" (type: KEYBOARD, id 6) [ 27.891] (**) Option "xkb_rules" "evdev" [ 27.891] (**) Option "xkb_model" "pc105" [ 27.891] (**) Option "xkb_layout" "us" [ 27.892] (II) config/udev: Adding input device Power Button (/dev/input/event1) [ 27.892] (**) Power Button: Applying InputClass "evdev keyboard catchall" [ 27.892] (II) Using input driver 'evdev' for 'Power Button' [ 27.892] (**) Power Button: always reports core events [ 27.892] (**) evdev: Power Button: Device: "/dev/input/event1" [ 27.892] (--) evdev: Power Button: Vendor 0 Product 0x1 [ 27.892] (--) evdev: Power Button: Found keys [ 27.892] (II) evdev: Power Button: Configuring as keyboard [ 27.892] (**) Option "config_info" "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0C0C:00/input/input1/event1" [ 27.892] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD, id 7) [ 27.892] (**) Option "xkb_rules" "evdev" [ 27.893] (**) Option "xkb_model" "pc105" [ 27.893] (**) Option "xkb_layout" "us" [ 27.893] (II) config/udev: Adding input device Lid Switch (/dev/input/event0) [ 27.893] (II) No input driver specified, ignoring this device. [ 27.893] (II) This device may have been added with another device file. [ 27.894] (II) config/udev: Adding input device Sleep Button (/dev/input/event2) [ 27.894] (**) Sleep Button: Applying InputClass "evdev keyboard catchall" [ 27.894] (II) Using input driver 'evdev' for 'Sleep Button' [ 27.894] (**) Sleep Button: always reports core events [ 27.894] (**) evdev: Sleep Button: Device: "/dev/input/event2" [ 27.894] (--) evdev: Sleep Button: Vendor 0 Product 0x3 [ 27.894] (--) evdev: Sleep Button: Found keys [ 27.894] (II) evdev: Sleep Button: Configuring as keyboard [ 27.894] (**) Option "config_info" "udev:/sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input2/event2" [ 27.894] (II) XINPUT: Adding extended input device "Sleep Button" (type: KEYBOARD, id 8) [ 27.894] (**) Option "xkb_rules" "evdev" [ 27.894] (**) Option "xkb_model" "pc105" [ 27.894] (**) Option "xkb_layout" "us" [ 27.895] (II) config/udev: Adding drm device (/dev/dri/card0) [ 27.895] (II) config/udev: Adding input device HDA Intel Mic (/dev/input/event7) [ 27.895] (II) No input driver specified, ignoring this device. [ 27.895] (II) This device may have been added with another device file. [ 27.896] (II) config/udev: Adding input device HDA Intel Front Headphone (/dev/input/event8) [ 27.896] (II) No input driver specified, ignoring this device. [ 27.896] (II) This device may have been added with another device file. [ 27.896] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event3) [ 27.896] (**) AT Translated Set 2 keyboard: Applying InputClass "evdev keyboard catchall" [ 27.896] (II) Using input driver 'evdev' for 'AT Translated Set 2 keyboard' [ 27.896] (**) AT Translated Set 2 keyboard: always reports core events [ 27.896] (**) evdev: AT Translated Set 2 keyboard: Device: "/dev/input/event3" [ 27.896] (--) evdev: AT Translated Set 2 keyboard: Vendor 0x1 Product 0x1 [ 27.896] (--) evdev: AT Translated Set 2 keyboard: Found keys [ 27.896] (II) evdev: AT Translated Set 2 keyboard: Configuring as keyboard [ 27.896] (**) Option "config_info" "udev:/sys/devices/platform/i8042/serio0/input/input3/event3" [ 27.896] (II) XINPUT: Adding extended input device "AT Translated Set 2 keyboard" (type: KEYBOARD, id 9) [ 27.896] (**) Option "xkb_rules" "evdev" [ 27.897] (**) Option "xkb_model" "pc105" [ 27.897] (**) Option "xkb_layout" "us" [ 27.897] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/event5) [ 27.897] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "evdev touchpad catchall" [ 27.897] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "touchpad catchall" [ 27.897] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "Default clickpad buttons" [ 27.897] (II) LoadModule: "synaptics" [ 27.898] (II) Loading /usr/lib/xorg/modules/input/synaptics_drv.so [ 27.899] (II) Module synaptics: vendor="X.Org Foundation" [ 27.899] compiled for 1.12.99.905, module version = 1.6.2 [ 27.899] Module class: X.Org XInput Driver [ 27.899] ABI class: X.Org XInput driver, version 18.0 [ 27.899] (II) Using input driver 'synaptics' for 'SynPS/2 Synaptics TouchPad' [ 27.899] (**) SynPS/2 Synaptics TouchPad: always reports core events [ 27.899] (**) Option "Device" "/dev/input/event5" [ 27.899] (II) synaptics: SynPS/2 Synaptics TouchPad: ignoring touch events for semi-multitouch device [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: x-axis range 1472 - 5658 [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: y-axis range 1408 - 4736 [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: pressure range 0 - 255 [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: finger width range 0 - 15 [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: buttons: left right double triple [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: Vendor 0x2 Product 0x7 [ 27.899] (--) synaptics: SynPS/2 Synaptics TouchPad: touchpad found [ 27.899] (**) SynPS/2 Synaptics TouchPad: always reports core events [ 27.900] (**) Option "config_info" "udev:/sys/devices/platform/i8042/serio1/input/input5/event5" [ 27.900] (II) XINPUT: Adding extended input device "SynPS/2 Synaptics TouchPad" (type: TOUCHPAD, id 10) [ 27.900] (**) synaptics: SynPS/2 Synaptics TouchPad: (accel) MinSpeed is now constant deceleration 2.5 [ 27.900] (**) synaptics: SynPS/2 Synaptics TouchPad: MaxSpeed is now 1.75 [ 27.900] (**) synaptics: SynPS/2 Synaptics TouchPad: AccelFactor is now 0.037 [ 27.900] (**) SynPS/2 Synaptics TouchPad: (accel) keeping acceleration scheme 1 [ 27.900] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration profile 1 [ 27.900] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration factor: 2.000 [ 27.900] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration threshold: 4 [ 27.900] (--) synaptics: SynPS/2 Synaptics TouchPad: touchpad found [ 27.901] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/mouse0) [ 27.901] (**) SynPS/2 Synaptics TouchPad: Ignoring device from InputClass "touchpad ignore duplicates" [ 27.904] (II) config/udev: Adding input device Dell WMI hotkeys (/dev/input/event4) [ 27.904] (**) Dell WMI hotkeys: Applying InputClass "evdev keyboard catchall" [ 27.904] (II) Using input driver 'evdev' for 'Dell WMI hotkeys' [ 27.904] (**) Dell WMI hotkeys: always reports core events [ 27.904] (**) evdev: Dell WMI hotkeys: Device: "/dev/input/event4" [ 27.904] (--) evdev: Dell WMI hotkeys: Vendor 0 Product 0 [ 27.904] (--) evdev: Dell WMI hotkeys: Found keys [ 27.904] (II) evdev: Dell WMI hotkeys: Configuring as keyboard [ 27.904] (**) Option "config_info" "udev:/sys/devices/virtual/input/input4/event4" [ 27.904] (II) XINPUT: Adding extended input device "Dell WMI hotkeys" (type: KEYBOARD, id 11) [ 27.904] (**) Option "xkb_rules" "evdev" [ 27.904] (**) Option "xkb_model" "pc105" [ 27.904] (**) Option "xkb_layout" "us" [ 70.833] (II) intel(0): EDID vendor "AUO", prod id 4396 [ 70.833] (II) intel(0): Printing DDC gathered Modelines: [ 70.833] (II) intel(0): Modeline "1366x768"x0.0 69.30 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (47.6 kHz eP) [ 70.833] (II) intel(0): Modeline "1366x768"x0.0 46.20 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (31.7 kHz e) [ 72.499] (II) intel(0): EDID vendor "AUO", prod id 4396 [ 72.499] (II) intel(0): Printing DDC gathered Modelines: [ 72.499] (II) intel(0): Modeline "1366x768"x0.0 69.30 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (47.6 kHz eP) [ 72.499] (II) intel(0): Modeline "1366x768"x0.0 46.20 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (31.7 kHz e) [ 73.860] (II) intel(0): EDID vendor "AUO", prod id 4396 [ 73.860] (II) intel(0): Printing DDC gathered Modelines: [ 73.860] (II) intel(0): Modeline "1366x768"x0.0 69.30 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (47.6 kHz eP) [ 73.860] (II) intel(0): Modeline "1366x768"x0.0 46.20 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (31.7 kHz e) [ 74.608] (II) intel(0): EDID vendor "AUO", prod id 4396 [ 74.608] (II) intel(0): Printing DDC gathered Modelines: [ 74.608] (II) intel(0): Modeline "1366x768"x0.0 69.30 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (47.6 kHz eP) [ 74.608] (II) intel(0): Modeline "1366x768"x0.0 46.20 1366 1414 1446 1456 768 771 777 793 +hsync -vsync (31.7 kHz e) [ 81.784] (II) XKB: reuse xkmfile /var/lib/xkb/server-8C3648A5FD728529D869F46730BE1BC287DB231C.xkm [ 8480.098] (II) intel(0): switch to mode 1366x768 on crtc 3 (pipe 0) [ 10467.049] (II) intel(0): switch to mode 1366x768 on crtc 3 (pipe 0) [ 19159.568] (II) intel(0): switch to mode 1366x768 on crtc 3 (pipe 0) [ 22874.015] (II) intel(0): switch to mode 1366x768 on crtc 3 (pipe 0) xdiagnose-3.8.10/tests/sample.conf0000664000000000000000000000022713151230744013747 0ustar param_1=p1 param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 xdiagnose-3.8.10/tests/sample_grub.conf0000664000000000000000000000236213151230744014770 0ustar # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. # For full documentation of the options in this file, see: # info -f grub -n 'Simple configuration' GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT=10 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="" # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries #GRUB_DISABLE_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" GRUB_GFXPAYLOAD_LINUX=text AD_LINUX=text xdiagnose-3.8.10/tests/test_apport_gpu_hook0000775000000000000000000000061113151230744016001 0ustar #!/usr/bin/bash . data/bubu.lib echo "# Testing intel GPU hook..." lines=$(python3 apport/apport-gpu-error-intel.py --stdout --force| wc -l) if [ $? -ne 0 ]; then fail "error code non-zero" else pass "error code 0" fi if [ $lines -lt 100 ]; then fail "Insufficient output generated: ${lines} lines" else pass "Generated ${lines} lines of output" fi final_summary exit 0 xdiagnose-3.8.10/tests/test_diagnostic0000775000000000000000000000106613151230744014732 0ustar #!/usr/bin/python3 from __future__ import absolute_import, print_function, unicode_literals import sys import os.path import unittest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(__file__), ".."))) from xdiagnose.diagnostics import Diagnostic class TestDiagnostic(unittest.TestCase): def setUp(self): self.diagnostic = Diagnostic() def test_run(self): self.diagnostic.run() results = self.diagnostic.results() self.assertEqual("Results", results) if __name__ == '__main__': unittest.main() xdiagnose-3.8.10/tests/test_grub_file0000775000000000000000000002115113151230744014541 0ustar #!/usr/bin/python3 from __future__ import absolute_import, print_function, unicode_literals import sys import os.path import shutil import unittest import tempfile from io import StringIO from textwrap import dedent sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(__file__), ".."))) from xdiagnose.diagnostics import Diagnostic from xdiagnose.config_update import ( safe_backup, config_dict, config_update, ) class TestGrubFile(unittest.TestCase): def _setup_test_dir_with_file(self, filename, content): '''Creates a temporary directory with a single non-zero file''' temp_dir = tempfile.mkdtemp() temp_file = os.path.join(temp_dir, filename) f = open(temp_file, 'w') f.write(content) f.close() return temp_dir def _load_file(self, filename): f = open(filename, 'r') text = f.read() f.close() return text def test_backup_nonexistant_file(self): new_path = safe_backup('/dev/null/nonexistant') self.assertIsNone(new_path) def test_backup_existing_file(self): temp_file = tempfile.NamedTemporaryFile() new_path = safe_backup(temp_file.name) self.assertIsNotNone(new_path) self.assertNotEqual(temp_file.name, new_path) def test_backup_existing_file_already_backed_up(self): temp_file = tempfile.NamedTemporaryFile() new_path_1 = safe_backup(temp_file.name) new_path_2 = safe_backup(temp_file.name) self.assertNotEqual(new_path_1, new_path_2) self.assertNotEqual(temp_file.name, new_path_2) def test_backup_existing_symlink_file(self): temp_file = tempfile.NamedTemporaryFile() link_filename = temp_file.name+".link" os.symlink(temp_file.name, link_filename) new_path = safe_backup(link_filename) self.assertTrue(os.path.lexists(link_filename)) self.assertTrue(os.path.exists(new_path)) self.assertFalse(os.path.islink(new_path)) def test_backup_existing_dir(self): # Setup filename = 'foo.txt' content = 'bar' temp_dir = self._setup_test_dir_with_file(filename, content) # Run code new_path = safe_backup(temp_dir) new_filename = os.path.join(temp_dir, filename) # Check results self.assertTrue(os.path.exists(new_path)) self.assertTrue(os.path.exists(new_filename)) self.assertNotEqual(new_path, temp_dir) self.assertEqual(content, self._load_file(new_filename)) # Cleanup shutil.rmtree(temp_dir) shutil.rmtree(new_path) def test_backup_existing_dir_already_backed_up(self): # Setup filename = 'foo.txt' content = 'bar' temp_dir = self._setup_test_dir_with_file(filename, content) # Run code new_path_1 = safe_backup(temp_dir) new_path_2 = safe_backup(temp_dir) # Check results self.assertNotEqual(new_path_1, new_path_2) self.assertNotEqual(new_path_2, temp_dir) self.assertTrue(os.path.exists(new_path_2)) # Cleanup shutil.rmtree(temp_dir) shutil.rmtree(new_path_1) shutil.rmtree(new_path_2) def test_load_sample(self): d = config_dict('tests/sample.conf') self.assertEqual(d, { 'combo_1': 'c1,c2,c3', 'combo_2': '"c1, c2, c3"', 'param_1': 'p1', 'param_2': '"p2"', 'param_3': 'p 3', 'param_4': 'p4', 'param_5': 'True', 'param_6': 'true', }) def test_load_sample_grub(self): d = config_dict('tests/sample_grub.conf') self.assertEqual(d, { 'GRUB_DEFAULT': '0', 'GRUB_HIDDEN_TIMEOUT': '0', 'GRUB_HIDDEN_TIMEOUT_QUIET': 'true', 'GRUB_TIMEOUT': '10', 'GRUB_DISTRIBUTOR': '`lsb_release -i -s 2> /dev/null || echo Debian`', 'GRUB_CMDLINE_LINUX_DEFAULT': '""', 'GRUB_CMDLINE_LINUX': '""', 'GRUB_GFXPAYLOAD_LINUX': 'text', 'AD_LINUX': 'text', }) def test_save(self): filename = 'tests/sample.conf' sio = StringIO() config_update(filename, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=p1 param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 """)) sio.close() def test_save_overrides(self): filename = "tests/sample.conf" overrides = {'param_1': 'overridden'} sio = StringIO() output = config_update(filename, override_params=overrides, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=overridden param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 """)) sio.close() def test_save_merges(self): filename = 'tests/sample.conf' merges = {'param_1': 'merged'} sio = StringIO() config_update(filename, merge_params=merges, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=p1 merged param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 """)) sio.close() def test_save_overridden_and_merged(self): filename = 'tests/sample.conf' merges = {'param_1': 'merged'} overrides = {'param_1': 'overridden'} sio = StringIO() config_update(filename, merge_params=merges, override_params=overrides, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=overridden param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 """)) sio.close() def test_save_overrides_with_merges(self): filename = 'tests/sample.conf' merges = {'param_1': 'merged', 'param_2': 'also_merged'} overrides = {'param_3': 'overridden', 'param_4': 'overridden_too'} sio = StringIO() config_update(filename, merge_params=merges, override_params=overrides, fileio=sio) self.assertEqual(dedent( """\ param_1=p1 merged param_2="p2" also_merged param_3=overridden param_4=overridden_too param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 """), sio.getvalue()) sio.close() def test_save_additions(self): filename = 'tests/sample.conf' merges = {'new_param_1': 'merged'} overrides = {'new_param_2': 'overridden'} sio = StringIO() config_update(filename, merge_params=merges, override_params=overrides, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=p1 param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 new_param_1=merged new_param_2=overridden """)) sio.close() def test_save_additions_of_disabled(self): filename = 'tests/sample.conf' merges = {'new_param_1': 'merged'} overrides = {'new_param_2': 'overridden'} sio = StringIO() config_update(filename, merge_params=merges, override_params=overrides, fileio=sio) self.assertEqual(sio.getvalue(), dedent( """\ param_1=p1 param_2="p2" param_3=p 3 param_4 = p4 param_5=True param_6=true combo_1=c1,c2,c3 combo_2="c1, c2, c3" #new_param_1=disabled #new_param_2 new_param_1=merged new_param_2=overridden """)) sio.close() if __name__ == '__main__': unittest.main() xdiagnose-3.8.10/tests/test_py3compile.sh0000775000000000000000000000052013151230744015275 0ustar #!/bin/bash . data/bubu.lib echo "# Python3 compilation verification" display_result() { if [ $1 == 0 ]; then pass "${2} ${3}" else fail "${2} ${3}" fi } # Basic syntax checking for script in $(find . -name "*.py"); do py3compile ${script} display_result $? ${script} done final_summary exit 0 xdiagnose-3.8.10/tests/test_script_syntax.sh0000775000000000000000000000257513151230744016137 0ustar #!/bin/bash . data/bubu.lib echo "# Basic script syntax checks" display_result() { if [ $1 == 0 ]; then pass "${2} ${3}" else fail "${2} ${3}" fi } ignorable() { for ext in '~' '~c' .pyc .o ; do if [ ${file_name%${ext}} != ${file_name} ]; then return 0 fi done return 1 } # Basic syntax checking for script in bin/* apport/* ; do file_type=$(file -b ${script}) file_name=$(basename $script) # Compiled objects and other cruft if ignorable ${file_name} ; then continue fi # Bash case ${file_type} in *troff*) ;; *byte-compiled*) ;; *bash*) bash -n $script >/dev/null 2>&1 display_result $? 'bash' ${script} ;; *Bourne*) bash -n $script >/dev/null 2>&1 display_result $? 'bash' ${script} ;; *perl*) perl -c $script >/dev/null 2>&1 display_result $? 'perl' ${script} ;; *?ython*script*) python3 -m py_compile ${script} display_result $? 'python3' ${script} if [ -e ${script}c ]; then rm ${script}c fi ;; *directory*) ;; *) echo "Unknown script type '${file_type}'" display_result 1 ${script} esac done final_summary exit 0 xdiagnose-3.8.10/tests/test_xorglog_parser0000775000000000000000000000225713151230744015646 0ustar #!/usr/bin/bash . data/bubu.lib echo "# Testing log parser..." for logfile in tests/sample.Xorg.*.log; do lines=$(python3 xdiagnose/xorglog.py ${logfile}) if [ $? -ne 0 ]; then fail "${logfile}: error code non-zero" else pass "${logfile}: error code 0" fi num_lines=$(echo "$lines" | wc -l) if [ $num_lines -lt 10 ]; then fail "${logfile}: too few lines returned" else pass "${logfile}: log content returned" fi xserver_version=$(echo "$lines" | grep 'Version :') if [ -z "$xserver_version" ]; then fail "${logfile}: no xserver version indicated" else pass "${logfile}: xserver version returned" fi boot_time=$(echo "$lines" | grep 'Boot Time : ' | cut -d: -f2-) real_boot_time=$(grep "Time:" ${logfile} | cut -d: -f3-) if [ -z "$boot_time" ]; then fail "${logfile}: no boot time indicated" elif [ -z "$real_boot_time" ]; then fail "${logfile}: couldn't determine boot time from sample.Xorg.0.log" elif [ "$boot_time" != "$real_boot_time" ]; then fail "${logfile}: incorrect boot time '$boot_time'; '$real_boot_time' expected" else pass "${logfile}: parsed correct boot time" fi done final_summary exit 0 xdiagnose-3.8.10/xdiagnose/0000775000000000000000000000000013437474155012452 5ustar xdiagnose-3.8.10/xdiagnose/__init__.py0000775000000000000000000000000013151230744014537 0ustar xdiagnose-3.8.10/xdiagnose/__pycache__/0000775000000000000000000000000013437474155014662 5ustar xdiagnose-3.8.10/xdiagnose/applet.py0000775000000000000000000004212213151230744014300 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os import sys import stat import subprocess import shutil from gi.repository import Gtk from gi.repository.GdkPixbuf import Pixbuf import re import tempfile import gettext from gettext import gettext as _ from xdiagnose.config_update import ( config_update, config_dict, safe_backup, ) from xdiagnose.errors_treeview import ErrorsTreeView class XDiagnoseApplet(Gtk.Window): def __init__(self): self.__enable_debugging = None self.__enable_apport = None self.__disable_splash = None self.__disable_vesafb = None self.__disable_pat = None self.__disable_grub_graphics = None self.__grub_gfxpayload_linux = None self.__grub_config_filename = '/etc/default/grub' self.kparams = {} self.is_running = True if not os.path.exists(self.__grub_config_filename): print("Error: No %s present" %(self.__grub_config_filename)) sys.exit(1) Gtk.Window.__init__(self) self.set_title(_("X Diagnostics Settings")) self.set_size_request(300,200) self.set_border_width(10) self.connect("delete-event", self.on_close) self.connect("destroy", self.on_close) vbox = Gtk.VBox() vbox.set_spacing(20) self.add(vbox) vbox.pack_start(self.build_toolbar(), True, True, 0) vbox.pack_start(self.build_settings_list( title=_("Debug"), settings=[ {'text':_("Extra graphics _debug messages"), 'tip':_("Makes dmesg logs more verbose with details about 3d, plymouth, and monitor detection"), 'active':self.has_enable_debugging(), 'handler':self.handle_enable_debugging}, {'text':_("Display boot messages"), 'tip':_("Removes splash and quiet from kernel options so you can see kernel details during boot"), 'active':self.has_disable_splash(), 'handler':self.handle_disable_splash}, {'text':_("Enable automatic crash bug reporting"), 'tip':_("Turns on the Apport crash detection and bug reporting tool"), 'active':self.has_enable_apport(), 'handler':self.handle_enable_apport}, ]), True, True, 0) vbox.pack_start(self.build_settings_list( title=_("Workarounds"), settings=[ {'text':_("Disable bootloader _graphics"), 'tip':_("The grub bootloader has a graphics mode using the VESA framebuffer driver which can sometimes interfere with later loading of the proper video driver. Checking this forces grub to use text mode only."), 'active':self.has_disable_grub_graphics(), 'handler':self.handle_disable_grub_graphics}, {'text':_("Disable _VESA framebuffer driver"), 'tip':_("vesafb is loaded early during boot so the boot logo can display, but can cause issues when switching to a real graphics driver. Checking this prevents vesafb from loading so these issues do not occur."), 'active':self.has_disable_vesafb(), 'handler':self.handle_disable_vesafb}, {'text':_("Disable _PAT memory"), 'tip':_("This pagetable extension can interfere with the memory management of proprietary drivers under certain situations and cause lagging or failures to allocate video memory, so turning it off can prevent those problems."), 'active':self.has_disable_pat(), 'handler':self.handle_disable_pat}, ]), True, True, 0) button_box = Gtk.HBox() button_box.set_spacing(20) vbox.add(button_box) apply_button = Gtk.Button("Apply") apply_button.connect('clicked', self.on_apply) button_box.add(apply_button) close_button = Gtk.Button("Close") close_button.connect('clicked', self.on_close) button_box.add(close_button) self.show_all() # Where is our data dir? datadir = None for d in [ os.path.relpath(os.path.join(os.path.dirname(__file__), "../data")), "/usr/local/share/xdiagnose", "/usr/share/xdiagnose"]: if os.path.exists(d): datadir = d break # Icons self.set_icon_name('xdiagnose') def destroy(self, widget=None, event=None, data=None): self.is_running = False self.destroy() return False def build_toolbar(self): hbox = Gtk.HBox() hbox.set_spacing(10) b = Gtk.Button(_("View Errors")) b.connect('clicked', self.on_scan_errors) hbox.pack_start(b, False, False, 0) b = Gtk.Button(_("Report an Xorg Bug")) b.connect('clicked', self.on_report_bug_action) hbox.pack_start(b, False, False, 0) return hbox def build_settings_list(self, title, settings=None): frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.NONE) label = Gtk.Label(label="%s" %(title)) label.set_use_markup(True) frame.set_label_widget(label) alignment = Gtk.Alignment.new(0.5, 0.5, 1.0, 1.0) alignment.set_padding(5, 0, 12, 0) vbox = Gtk.VBox() for s in settings: checkbutton = Gtk.CheckButton(s['text'], use_underline=True) checkbutton.connect("toggled", s['handler']) if 'tip' in s and s['tip']: checkbutton.set_tooltip_text(s['tip']) if 'active' in s: if s['active']: checkbutton.set_active(1) else: checkbutton.set_active(0) if 'inconsistent' in s and s['inconsistent']: checkbutton.set_inconsistent(s['inconsistent']) vbox.pack_start(checkbutton, False, False, 0) alignment.add(vbox) frame.add(alignment) return frame def load_config(self): assert(os.path.exists(self.__grub_config_filename)) d = config_dict(self.__grub_config_filename) self.kparams = {} if 'GRUB_CMDLINE_LINUX_DEFAULT' in d: re_kparam = re.compile("^([\w\.]+)=(.*)") kparam_str = d['GRUB_CMDLINE_LINUX_DEFAULT'].replace('"', '') for param in kparam_str.split(' '): value = 1 m = re_kparam.match(param) if m: param = m.group(1) value = m.group(2) self.kparams[param] = value if 'GRUB_GFXPAYLOAD_LINUX' in d: re_kparam = re.compile("^([\w\.]+)=(.*)") value = d['GRUB_GFXPAYLOAD_LINUX'].replace('"', '') self.__grub_gfxpayload_linux = value if value == 'text': self.has_disable_grub_graphics(True) else: self.has_disable_grub_graphics(False) else: self.has_disable_grub_graphics(False) if 'drm.debug' in self.kparams: self.has_enable_debugging(True) else: self.has_enable_debugging(False) if 'splash' not in self.kparams: self.has_disable_splash(True) else: self.has_disable_splash(False) if 'vesafb.invalid' in self.kparams: self.has_disable_vesafb(True) else: self.has_disable_vesafb(False) if 'nopat' in self.kparams: self.has_disable_pat(True) else: self.has_disable_pat(False) def load_apport_config(self): path = "/etc/default/apport" if not os.path.exists(path): return d = config_dict(path) apport_enabled = d.get('enabled', None) if apport_enabled == '1': self.has_enable_apport(True) elif apport_enabled == '0': self.has_enable_apport(False) def has_enable_debugging(self, value=None): if value is not None: self.__enable_debugging = value elif self.__enable_debugging is None: self.load_config() return self.__enable_debugging def handle_enable_debugging(self, widget): self.has_enable_debugging(widget.get_active()) def has_disable_splash(self, value=None): if value is not None: self.__disable_splash = value elif self.__disable_splash is None: self.load_config() return self.__disable_splash def handle_disable_splash(self, widget): self.has_disable_splash(widget.get_active()) def has_disable_vesafb(self, value=None): if value is not None: self.__disable_vesafb = value elif self.__disable_vesafb is None: self.load_config() return self.__disable_vesafb def handle_disable_vesafb(self, widget): self.has_disable_vesafb(widget.get_active()) def has_disable_pat(self, value=None): if value is not None: self.__disable_pat = value elif self.__disable_pat is None: self.load_config() return self.__disable_pat def handle_disable_pat(self, widget): self.has_disable_pat(widget.get_active()) def has_enable_apport(self, value=None): if value is not None: self.__enable_apport = value elif self.__enable_apport is None: self.load_apport_config() return self.__enable_apport def handle_enable_apport(self, widget): active = widget.get_active() if active == self.__enable_apport: return print("Handling apport enabled") if self.has_enable_apport(widget.get_active()): enabled = 1 else: enabled = 0 filename = "/etc/default/apport" fd, temp_path = tempfile.mkstemp(text=True) os.chmod(temp_path, stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) fo = os.fdopen(fd, "w+") config_update(filename, override_params={'enabled': enabled}, fileio=fo) fo.close() # Move new file into place shutil.move(temp_path, filename) os.chmod(filename, stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) def has_disable_grub_graphics(self, value=None): if value is not None: self.__disable_grub_graphics = value elif self.__disable_grub_graphics is None: self.load_config() return self.__disable_grub_graphics def handle_disable_grub_graphics(self, widget): self.has_disable_grub_graphics(widget.get_active()) def update_grub(self): try: subprocess.call(['/usr/sbin/update-grub']) return True except: # TODO: Indicate error occurred return False def on_report_bug_action(self, widget): process = subprocess.Popen(['ubuntu-bug', 'xorg']) process.communicate() def on_scan_errors(self, widget): re_xorg_error = re.compile("^\[\s*([\d\.]+)\] \(EE\) (.*)$") re_dmesg_error = re.compile("^\[\s*(\d+\.\d+)\] (.*(?:BUG|ERROR|WARNING).*)$") re_jockey_error = re.compile("^(\d+\-\d+-\d+ \d+:\d+:\d+,\d+) ERROR: (.*)$") errors = [] # Xorg.0.log errors process = subprocess.Popen(['grep', '(EE)', '/var/log/Xorg.0.log'], universal_newlines=True) stdout, stderr = process.communicate() for err in str(stdout).split("\n"): m = re_jockey_error.match(err) if not m: continue timestamp = m.group(1) errmsg = m.group(2) errors.append(errmsg) # dmesg errors process = subprocess.Popen(['dmesg'], universal_newlines=True) stdout, stderr = process.communicate() for err in str(stdout).split("\n"): m = re_dmesg_error.match(err) if not m: continue timestamp = m.group(1) errmsg = m.group(2) errors.append(errmsg) # jockey errors if os.path.exists('/var/log/jockey.log'): process = subprocess.Popen(['grep', 'ERROR', '/var/log/jockey.log'], universal_newlines=True) stdout, stderr = process.communicate() for err in str(stdout).split("\n"): m = re_dmesg_error.match(err) if not m: continue timestamp = m.group(1) errmsg = m.group(2) errors.append(errmsg) errors_window = ErrorsTreeView(errors) def on_apply(self, widget): overrides = {} merges = {} cmdline_default_params = self.kparams fd, temp_grub_path = tempfile.mkstemp(text=True) os.chmod(temp_grub_path, stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) fo = os.fdopen(fd, "w+") if self.__disable_splash: if 'quiet' in cmdline_default_params: del cmdline_default_params['quiet'] if 'splash' in cmdline_default_params: del cmdline_default_params['splash'] else: cmdline_default_params['quiet'] = None cmdline_default_params['splash'] = None if self.__disable_pat: cmdline_default_params['nopat'] = None elif 'nopat' in cmdline_default_params: del cmdline_default_params['nopat'] if self.__disable_vesafb: cmdline_default_params['vesafb.invalid'] = 1 elif 'vesafb.invalid' in cmdline_default_params: del cmdline_default_params['vesafb.invalid'] if self.__enable_debugging: # TODO: Enable debug for Xorg.0.log cmdline_default_params['drm.debug'] = '0xe' cmdline_default_params['plymouth:debug'] = None elif 'drm.debug' in cmdline_default_params: del cmdline_default_params['drm.debug'] if self.__disable_grub_graphics is not None: # NOTE: Where text graphics works, this can be handled by blacklisting in grub. # Should offer to file a request for this against grub maybe. if self.__disable_grub_graphics: overrides['GRUB_GFXPAYLOAD_LINUX'] = 'text' elif self.__grub_gfxpayload_linux != 'text': overrides['GRUB_GFXPAYLOAD_LINUX'] = self.__grub_gfxpayload_linux else: overrides['GRUB_GFXPAYLOAD_LINUX'] = 'keep' kparams = [] for k,v in cmdline_default_params.items(): if not k: continue elif v is None: kparams.append(k) else: kparams.append("%s=%s" %(k, v)) overrides['GRUB_CMDLINE_LINUX_DEFAULT'] = '"%s"' %(' '.join(kparams)) assert(os.path.exists(self.__grub_config_filename)) config_update(self.__grub_config_filename, override_params=overrides, merge_params=merges, fileio=fo) fo.close() # Backup the old file try: bak_path = safe_backup(self.__grub_config_filename) if not bak_path: # TODO: Display error message dialog print("Error: Could not backup file %s. Changes not applied." %( self.__grub_config_filename)) return except IOError as err: # TODO: Display error message dialog print("Error: Failure creating backup file for %s. Changes not applied." %( self.__grub_config_filename)) print(err) return # Move new file into place shutil.move(temp_grub_path, self.__grub_config_filename) os.chmod(self.__grub_config_filename, stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) # Finally, update grub # TODO: Only do this if we change any of the grub parameters self.update_grub() # TODO: Mark Apply button insensitive def run(self): Gtk.main() def on_close(self, widget=None, event=None, data=None): Gtk.main_quit() return False # TODO: cmdline option to display grub file contents (--dryrun?) xdiagnose-3.8.10/xdiagnose/application.py0000775000000000000000000000706513151230744015325 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import gtk class Application(object): def __init__(self): self.pages = {} self.current_page = None # Top level UI containers self.window = self.create_top_window() self.frame = self.create_top_frame() # Create UI elements self.accelerators = gtk.AccelGroup() # Assemble the UI self.window.add(self.frame) # Positions self.window.set_default_size(400, 300) self.window.set_size_request(400, 300) def create_top_window(self): win = gtk.Window(gtk.WINDOW_TOPLEVEL) win.connect('delete_event', self.on_delete) win.set_border_width(10) return win def create_top_frame(self): frame = gtk.Frame("") self.page_title = gtk.Label("") frame.set_label_widget(self.page_title) frame.set_label_align(0.0, 0.0) return frame def create_button(self, primary_text, secondary_text): button = gtk.Button(primary_text) button_label = button.get_children()[0] button_label.set_markup( "%s\n%s" %(primary_text, secondary_text)) button_label.set_alignment(0.0, 0.0) button.set_relief(gtk.RELIEF_NONE) button.show() return button def create_nav_bar(self, next_page=None, prev_page=None): hbox_navigation = gtk.HButtonBox() if prev_page is not None: hbox_navigation.set_property("layout-style", gtk.BUTTONBOX_START) prev_button = gtk.Button("Back") prev_button.connect("clicked", self.on_page, prev_page) hbox_navigation.pack_start(prev_button) if next_page is not None: hbox_navigation.set_property("layout-style", gtk.BUTTONBOX_END) next_button = gtk.Button("Next") next_button.connect("clicked", self.on_page, next_page) hbox_navigation.pack_end(next_button) return hbox_navigation def create_page(self, text): page = gtk.VBox(spacing=5) page.set_border_width(10) label = gtk.Label(text) label.set_line_wrap(True) label.set_use_markup(True) label.set_alignment(0.0, 0.0) page.pack_start(label, expand=False) return page def on_delete(self, widget, event): gtk.main_quit() def on_close(self, widget): gtk.main_quit() xdiagnose-3.8.10/xdiagnose/config_update.py0000775000000000000000000001437613151230744015634 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ''' This updates lines in config files matching the following syntax. It preserves the rest of the file contents unchanged. PARAMETER_FIRST="some string values" PARAMETER_SECOND="" # This is a comment PARAMETER_THIRD="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" PARAMETER_FOURTH=false PARAMETER_FIFTH=42 ''' import re import os import sys import shutil import fileinput from .utils.debug import dbg def rotated_backup(path, count=4): """ Rename a file keeping up to prior versions """ # Rotate the old backups for i in range(count, 1, -1): old_path = "%s.bak.%d" %(path, i-1) new_path = "%s.bak.%d" %(path, i) if os.path.exists(old_path): shutil.move(old_path, new_path) new_path = old_path old_path = "%s.bak" %(path) if os.path.exists(old_path): shutil.move(old_path, new_path) new_path = old_path if os.path.isfile(path): shutil.copy(path, new_path) elif os.path.isdir(path): shutil.copytree(path, new_path) else: shutil.move(path, new_path) def safe_backup(path, keep_original=True): """ Rename a file or directory safely without overwriting an existing backup of the same name. """ count = -1 new_path = None while True: if os.path.exists(path): if count == -1: new_path = "%s.bak" % (path) else: new_path = "%s.bak.%s" % (path, count) if os.path.exists(new_path): count += 1 continue else: if keep_original: if os.path.islink(path): linkto = os.readlink(path) shutil.copy(linkto, new_path) elif os.path.isfile(path): shutil.copy(path, new_path) elif os.path.isdir(path): shutil.copytree(path, new_path) else: shutil.move(path, new_path) break else: break return new_path def config_dict(filename, delim='='): re_param = re.compile("^\s*(\w+)\s*"+delim+"\s*(.*)") data = {} for line in fileinput.input(filename): m = re_param.match(line) if m: data[m.group(1)] = m.group(2) return data # TODO: Perhaps the filename should be a fileio too? def config_update(filename, override_params=None, merge_params=None, delim='=', fileio=sys.stdout): '''filename is the input file. fileio is the output stream''' keys = [] if override_params: keys = list(override_params.keys()) if merge_params: keys.extend(list(merge_params.keys())) keys = list(set(keys)) keys.sort() dbg(filename) for line in fileinput.input(filename): dbg(line) new_line = line if merge_params is not None: dbg("Merging parameters") for key in merge_params: dbg(" - %s" %(key)) p = re.compile("^\s*"+key+"\s*"+delim+"\s*(\"?)(.*)(\"?)") m = p.match(line) if m: value = merge_params[key].replace('"', '') if len(value)>0: new_line = "%s%s%s%s %s%s\n" %(key, delim, m.group(1), m.group(2), value, m.group(3)) keys.remove(key) if override_params is not None: dbg("Overriding parameters") for key in list(override_params.keys()): dbg(" - %s" %(key)) p = re.compile("^\s*"+key+"\s*"+delim) if p.match(line): new_line = "%s%s%s\n" %(key, delim, override_params[key]) dbg(" delim: %s" %(delim)) dbg(" param: %s" %(override_params[key])) if key in keys: keys.remove(key) fileio.write(new_line) dbg("Wrote: %s" %(new_line)) # Handle case of parameters that weren't already present in the file for key in keys: dbg("Adding key %s" %(key)) if override_params and key in override_params: fileio.write("%s%s%s\n" %(key, delim, override_params[key])) elif merge_params and key in merge_params: fileio.write("%s%s%s\n" %(key, delim, merge_params[key])) if __name__ == '__main__': filename = '/etc/default/grub' override_params = { 'FOO': '"xyz"', 'BOTH': '"correct"', 'GRUB_DEFAULT': 2, 'GRUB_CMDLINE_LINUX': '"foo=bar"', 'GRUB_HIDDEN_TIMEOUT_QUIET': False, } merge_params = { 'GRUB_CMDLINE_LINUX_DEFAULT': '"vesafb.invalid=1"', 'BAR': 'f(1&&2*$i^2) # \o/', 'BOTH': '"incorrect"', } config_update(filename, override_params, None) config_update(filename, None, merge_params) config_update(filename, override_params, merge_params) # TODO: Test for if drm.debug=0x4 and we want to set it to 0xe xdiagnose-3.8.10/xdiagnose/diagnostics.py0000775000000000000000000001433013151230744015322 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. class Diagnostic: def __init__(self): self.name = None def run(self): pass def results(self): return "Results" def backup_xorg_conf(self): # xorg_conf_backup="/etc/X11/xorg.conf-backup-${timestamp}" # cp /etc/X11/xorg.conf ${xorg_conf_backup} print("Your config could not be backed up.") return False def default_config(self): if not self.backup_xorg_conf(): return False # rm /etc/X11/xorg.conf #print "Failure restoring configuration to default." #print "Your config has not been changed." print("Your configuration has been restored to default and") print("your old configuration backed up. Please restart.") return True def run_xorgconf(self): if not self.backup_xorg_conf(): return False # Xorg :99 -configure print("Could not generate a new configuration") return False def view_xorg_log(self): # zenity --text-info --filename=$xorg_log --width=640 --height=480 pass def view_gdm_log(self): # zenity --text-info --filename=${gdm_log_1} --width=640 --height=480 pass def verify_xorgconf(self): # Run Alberto's xorg.conf checker (once it's available in main) print("Sorry, this option is not implemented yet") return False def edit_config(self): if not self.backup_xorg_conf(): return False # xorg_conf_tmp=$(mktemp -t xorg.conf.XXXXXXXX) # zenity --text-info --editable --filename=/etc/X11/xorg.conf --width=640 --height=480 > "${xorg_conf_tmp}" && mv "${xorg_conf_tmp}" /etc/X11/xorg.conf # chmod 644 /etc/X11/xorg.conf def save_config_logs(self): pass #xorg_backup_name=failsafeX-backup-${timestamp} #xorg_backup_dir=$(mktemp -d -t ${xorg_backup_name}.XXX) #xorg_backup_file=/var/log/${xorg_backup_name}.tar # cp $xorg_conf $xorg_backup_dir #cp /etc/X11/xorg.conf $xorg_backup_dir #cp ${xorg_log} $xorg_backup_dir #cp ${xorg_log}.old $xorg_backup_dir #cp ${gdm_log} $xorg_backup_dir #cp ${gdm_log_1} $xorg_backup_dir #cp ${gdm_log_2} $xorg_backup_dir #lspci -vvnn > ${xorg_backup_dir}/lspci-vvnn.txt #xrandr --verbose > ${xorg_backup_dir}/xrandr-verbose.txt #tar -cf ${xorg_backup_file} ${xorg_backup_dir} #rm -rf ${xorg_backup_dir} #zenity --info --text "$(eval_gettext 'Relevant configuration and log files have been saved to:\n')"\$xorg_backup_file"\n$(gettext 'Bug reports can be submitted at http://www.launchpad.net/ubuntu/.\n')" def system_checkup(self): # * Look if user's video card pci id is not listed as supported by kernel or driver # * Look if -vesa or -fbdev has been loaded # * Look if glxgears shows software rendering # * Look if user has proprietary driver loaded # * Look for error messages in Xorg.0.log, dmesg, etc. # LOG_ERRORS=$(grep -e "^(EE)" $xorg_log) # * Look if EDID information indicates something is incorrect # * Check if user has anything in xorg.conf and using a free driver pass def measure_performance(self): # Do some basic 2D and 3D operations to get some performance measurements pass def menu(self, level): if level == "0": print("Choice:") print("1. Run in low-graphics mode for just one session") print("2. Reconfigure graphics") print("3. Troubleshoot the error") print("4. Exit to console login") elif level == "1": pass elif level == "2": print("Reconfiguration:") print("How would you like to reconfigure your display?") print("2a. Use default (generic) configuration") print("2b. Create new configuration for this hardware") print("2c. Use your backed-up configuration") elif level == "3": print("Troubleshooting:") print("What information would you like to review?") print("3a. Review the xserver log file") print("3b. Review the startup errors") print("3c. Edit configuration file") print("3d. Archive configuration and logs") else: print("xdiagnose walks you through troubleshooting a few common X errors.") print() print(" * Screen blanks when lid is closed, and never comes back") print(" * 3D performance is horrible") print(" * Maximum resolution is lower than what screen can actually perform") def lid_close_blank(self): # Examine kernel logs to see if there was any evidence of it # Turn on storing of kernel logs from boot to boot # Tell user to reproduce the lid close blanking and then come back here # Once we know the cause, generate a quirk or whatnot for the issue pass if __name__ == "__main__": diagnostic = Diagnostic() diagnostic.menu(0) xdiagnose-3.8.10/xdiagnose/edid.py0000775000000000000000000002422013151230744013717 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import sys import os import re import binascii from .utils.debug import (ERR, warn, dbg) from .utils.file_io import (load_binary, load_file) def _bytes(edid, byte1, byte2=None): if byte2: return edid[byte1*2:(byte2+1)*2] else: return edid[byte1*2:(byte1+1)*2] def binary_to_bytecode(filename): data = load_binary(filename) return [ binascii.b2a_hex(data).decode("utf-8") ] def load_edid_bytecodes(filename): """Loads a list of unique EDIDs from a given file. The file could be an Xorg.0.log with multiple bytecodes, or a binary edid retrieved from the monitor itself, or previously saved Edid data. Returns a list of bytecode strings, suitable for use with the Edid object constructor. """ if (filename is None or filename == '' or not os.path.exists(filename)): raise Exception("Invalid filename %s" %(filename)) try: # Try loading as a plain text file first (ala Xorg.0.log) lines = load_file(filename) if len(lines) < 1: raise Exception("Invalid file %s" %(filename)) if lines[0].startswith('00ffffffffffff00'): # Looks like a regular edid file return [ lines.join("\n") ] # Next, assume it's an Xorg.0.log raw_edid = "" re_head = re.compile("\(II\) .*\(\d+\): EDID \(in hex\):$") re_edid = re.compile("\(II\) .*\(\d+\):\s\t([0-9a-f]{32})$") seen_edid_header = False edid_raw = "" edids = [] # TODO: Make sure only unique edids are returned for line in lines: if re_head.search(line): seen_edid_header = True elif seen_edid_header: m = re_edid.search(line) if not m: edids.append(edid_raw) edid_raw = "" seen_edid_header = False continue edid_raw += m.group(1) return edids except UnicodeDecodeError: return binary_to_bytecode(filename) return None class EdidFirmware(object): EDID_FIRMWARE_PATH = '/lib/firmware/edid' EDID_DRM_CONF_PATH = '/etc/modprobe.d/drm-kms-helper.conf' def __init__(self): pass def list(self): try: for filename in os.listdir(self.EDID_FIRMWARE_PATH): edid_path = os.path.join(self.EDID_FIRMWARE_PATH, filename) lines = binary_to_bytecode(edid_path) edid = Edid("\n".join(lines)) edid._origin = "firmware" yield edid except FileNotFoundError: yield None def install(self, edid_filename): '''Installs the named edid file into the firmware directory''' import errno import shutil try: os.makedirs(self.EDID_FIRMWARE_PATH) except OSError as exc: if exc.errno != errno.EEXIST: warn("Could not mkdir %s" %(self.EDID_FIRMWARE_PATH)) return False # Install the EDID edid_firmware = os.path.basename(edid_filename) try: target = os.path.join(self.EDID_FIRMWARE_PATH, edid_firmware) shutil.copyfile(edid_filename, target) print("Installed %s" %(target)) return True except: warn("Could not install firmware") raise return False def uninstall(self, edid_filename): '''Uninstalls the named edid file from the firmware directory''' edid_firmware = os.path.basename(edid_filename) try: target = os.path.join(self.EDID_FIRMWARE_PATH, edid_firmware) os.remove(target) print("Uninstalled %s" %(target)) return True except: warn("Could not uninstall %s" %(target)) raise return False def activate(self, edid_name): '''Activates given edid by passing it as a kernel command line parameter''' # TODO: Install it automatically? #self._install(edid_name) f = open(self.EDID_DRM_CONF_PATH, 'w') f.write("options drm_kms_helper edid_firmware=edid/%s\n" %(edid_name)) f.close() print("Activated %s via %s" %(edid_name, self.EDID_DRM_CONF_PATH)) return True def deactivate(self, edid_name): line_to_remove = "options drm_kms_helper edid_firmware=edid/%s" %(edid_name) f = open(self.EDID_DRM_CONF_PATH, 'w') lines = f.readlines() f.close() f = open(self.EDID_DRM_CONF_PATH, 'w') for line in lines: if line != line_to_remove: f.write(line) f.close() class Edid(object): def __init__(self, bytecode=None): '''bytecode: multiline hexadecimal text such as from an Xorg.0.log''' self._items = None self._origin = None self.edid_raw = bytecode if self.edid_raw is not None: # TODO: Move this to top assert bytecode.startswith('00ffffffffffff00'), "bytecode is not valid EDID data" self._origin = "custom" def save(self, filename): file = open(filename, 'wb') file.write(self.to_binary()) file.close() return True def _parse(self, edid): if edid is None: return None return [ ("Header", _bytes(edid,0,7)), ("Manufacturer", _bytes(edid,8,9)), ("Product ID code", _bytes(edid,10,11)), ("Serial Number", _bytes(edid,12,15)), ("Week of Manufacture", _bytes(edid,16)), ("Year of Manufacture", _bytes(edid,17)), ("EDID Version", _bytes(edid,18)), ("EDID Revision", _bytes(edid,19)), ("Video input def", _bytes(edid,20)), ("Max Horiz Image(cm)", _bytes(edid,21)), ("Max Vert Image(cm)", _bytes(edid,22)), ("Gamma", _bytes(edid,23)), ("Power management", _bytes(edid,24)), ("Chromaticity", _bytes(edid,25,34)), ("Timing I", _bytes(edid,35)), ("Timing II", _bytes(edid,36)), ("Reserved Timing", _bytes(edid,37)), ("Standard Timing", _bytes(edid,38,53)), ("Horiz Active (px)", _bytes(edid,56)), ("Horiz Blanking", _bytes(edid,57)), ("Horiz high", _bytes(edid,58)), ("Vert Active", _bytes(edid,59)), ("Vert Blank", _bytes(edid,60)), ("Vert high", _bytes(edid,61)), ("Horz Sync Offset (px)", _bytes(edid,62)), ("Horiz Sync Pulse Width (px)", _bytes(edid,63)), ("Vert Sync (lines)", _bytes(edid,64)), ("high", _bytes(edid,65)), ("Horiz Image Size (mm)", _bytes(edid,66)), ("Vert Image Size (mm)", _bytes(edid,67)), ("Image Size high", _bytes(edid,68)), ("Horiz Border", _bytes(edid,69)), ("Vert Border", _bytes(edid,70)), ("Interlacing", _bytes(edid,71)), ("Descriptor Block 2", _bytes(edid,72,89)), ("Descriptor Block 3", _bytes(edid,90,107)), ("Descriptor Block 4", _bytes(edid,108,125)), ("Extension Flag", _bytes(edid,126)), ("Checksum", _bytes(edid,127)), ] def to_hex(self): return self.edid_raw def to_binary(self): return bytes.fromhex(self.edid_raw) @property def items(self): if self._items is None: self._items = self._parse(self.to_hex()) return self._items @property def manufacturer(self): code = self.items[1][1] # The ascii code bstr = str(bin(int(code, 16)))[2:] # Converted to binary bstr = bstr.zfill(15) # Fill left side with 0's s = [ # Extract and convert letter codes to chars chr(int(bstr[-15:-10],2) + ord('A') - 1), chr(int(bstr[-10:-5],2) + ord('A') - 1), chr(int(bstr[-5:],2) + ord('A') - 1) ] return ''.join(s) @property def product_id(self): return _bytes(self.to_hex(),10,11) @property def serial_number(self): return _bytes(self.to_hex(),12,15) @property def name(self): return "%s:%s SN#%s %d-%d v%s.%s %s" %( self.manufacturer, self.items[2][1], self.items[3][1], int(self.items[4][1], 16), int(self.items[5][1], 16) + 1990, self.items[6][1], self.items[7][1], self._origin ) def __str__(self): text = '' for field, value in self.items: text += "%-30s: %s\n" %(field, value) return text if __name__ == "__main__": edidfile = sys.argv[1] regex = re.compile("\(II\) .*\(\d+\):\s+(.*)$") edid_text = "" lines = load_file(edidfile) for line in lines.split("\n"): m = regex.search(line) if m: line = m.group(1) edid_text += line edid = Edid(edid_text) print(edid) xdiagnose-3.8.10/xdiagnose/errors_treeview.py0000775000000000000000000000623613151230744016247 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # example basictreeview.py from gi.repository import Gtk import gettext from gettext import gettext as _ class ErrorsTreeView(Gtk.Window): def __init__(self, data=[], top_level=False): self._is_top_level = top_level # Create a new window Gtk.Window.__init__(self) self.set_title(_("Xorg Error Messages")) self.set_size_request(500, 200) self.connect("delete-event", self.on_close) self.connect("destroy", self.on_close) # create a TreeStore with one string column to use as the model self.treestore = Gtk.TreeStore(str) for errormsg in data: self.treestore.append(None, [errormsg]) # create the TreeView using treestore self.treeview = Gtk.TreeView() self.treeview.set_model(self.treestore) # create the TreeViewColumn to display the data self.tvcolumn = Gtk.TreeViewColumn(_("Error Message")) # add tvcolumn to treeview self.treeview.append_column(self.tvcolumn) # create a CellRendererText to render the data self.cell = Gtk.CellRendererText() # add the cell to the tvcolumn and allow it to expand self.tvcolumn.pack_start(self.cell, True) # set the cell "text" attribute to column 0 - retrieve text # from that column in treestore self.tvcolumn.add_attribute(self.cell, 'text', 0) # make it searchable self.treeview.set_search_column(0) # Allow sorting on the column self.tvcolumn.set_sort_column_id(0) # Allow drag and drop reordering of rows self.treeview.set_reorderable(True) self.add(self.treeview) self.show_all() # close the window def on_close(self, widget=None, event=None, data=None): if self._is_top_level: Gtk.main_quit() return False else: self.destroy() if __name__ == "__main__": tvexample = ErrorsTreeView(top_level=True) Gtk.main() xdiagnose-3.8.10/xdiagnose/info.py0000775000000000000000000000674713151230744013763 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals '''High level package information''' PROGNAME = 'xdiagnose' VERSION = '3.0' URL = 'http://launchpad.net/xdiagnose' EMAIL = 'bryce@canonical.com' DATE_STARTED = '2010-11-04' DATE_COPYRIGHT = '2011' LICENSE_URL = 'http://www.gnu.org/copyleft/gpl.html' SHORT_DESCRIPTION = 'Analysis tools for troubleshooting X.org problems' DESCRIPTION = """ This package is a friendly GUI application for diagnosing several common X.org problems. """ class _contributor: '''Information about a person contributing to this project''' def __init__(self, name, email, started=None, roles=None, translating=None): self.name = name self.email = email self.started = started if roles is None: self.roles = [] elif type(roles) is not list: self.roles = [roles] else: self.roles = roles self.translation_languages = translating return def to_dict(self): '''Returns the object in a dict suitable for json''' return self.__dict__ @property def display_email(self): '''Formatted string version of email address''' if self.email: return '<%s>' % self.email else: return '' @property def display_roles(self): '''Formatted string version of roles list''' if self.roles: return '[%s]' % ','.join(self.roles) else: return '' LEAD_DEVELOPER = _contributor( 'Bryce Harrington', 'bryce@canonical.com', started='2010-11-04', roles=['lead', 'developer'], translating=None, ) CONTRIBUTORS = [ _contributor( 'Gabor Kelemen', 'kelemeng@ubuntu.com', started='2012-01-21', roles=['developer', 'translator'], translating=None), _contributor( 'Jeff Lane', 'jeffrey.lane@canonical.com', started='2012-08-10', roles=['developer'], translating=None), ] if __name__ == "__main__": print(PROGNAME, VERSION, URL) print("Copyright (C) %s %s <%s>" % ( DATE_COPYRIGHT, LEAD_DEVELOPER.name, LEAD_DEVELOPER.email)) print() for contributor in CONTRIBUTORS: print("%s %s %s" % ( contributor.name, contributor.display_email, contributor.display_roles)) xdiagnose-3.8.10/xdiagnose/pci_devices.py0000775000000000000000000037325313151230744015304 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import re class PciDevice(object): def __init__(self, codename, regex, drivers=None, supported=True, title=None, opengl=None, gen=None): # Short codename, suitable for prepending to bug reports self.name = codename # Long Marketing name self.title = title # Pattern to seek in lspci or other text output self.regex = regex # Set of open (DDX) and/or proprietary drivers that should work for this hardware # If none are listed, then -vesa/-fbdev should be used self.drivers = drivers # Whether Ubuntu-X provides development support for the hardware (with # any video driver). If unsupported, we redirect bug reporters upstream # instead of filing bugs at Launchpad, and we do not backport patches or # customize any settings. self.supported = supported # OpenGL support provided by the hardware. # Some drivers might support a lower level than this. self.opengl = opengl self.generation = gen # TODO: Indication of unity support? self.__rc = None @property def rc(self): if self.__rc is None: self.__rc = re.compile(self.regex, re.IGNORECASE) return self.__rc INTEL = 'xserver-xorg-video-intel' POULSBO = 'xserver-xorg-video-psb' RADEON = 'xserver-xorg-video-ati' FGLRX = 'fglrx-installer' NOUVEAU = 'xserver-xorg-video-nouveau' NVIDIA = 'nvidia-graphics-drivers' NV71 = 'nvidia-graphics-drivers-71' NV96 = 'nvidia-graphics-drivers-96' NV173 = 'nvidia-graphics-drivers-173' # Database of chip ids, current as of Jul, 2011 pci_devices = [ # Intel GPUs # # References: # http://en.wikipedia.org/wiki/Intel_GMA # Driver source code PciDevice('i740', '(8086:7800)', [], gen='i740', opengl='1.1', supported=False ), PciDevice('i810', '(8086:7121)', [], gen='i810', opengl='1.2', supported=False ), PciDevice('i810dc100', '(8086:7123)', [], gen='i810', opengl='1.2', supported=False ), PciDevice('i810e', '(8086:7125)', [], gen='i810', opengl='1.2', supported=False ), PciDevice('i815', '(8086:1132|82815)', [], gen='i810', opengl='1.2', supported=False ), PciDevice('i830m', '(8086:3577|82830)', [INTEL], gen='i830', opengl='1.3', supported=False ), PciDevice('i845g', '(8086:2562|82845G)', [INTEL], gen='i830', opengl='1.3', supported=False ), PciDevice('i854', '(8086:358e)', [INTEL], gen='i855', opengl='1.3', supported=False ), PciDevice('i855g', '(8086:2572)', [INTEL], gen='i855', opengl='1.3', supported=False ), PciDevice('i855g', '(8086:3582|855GM)', [INTEL], gen='i855', opengl='1.3', supported=False ), PciDevice('i865g', '(8086:2572|82865G)', [INTEL], gen='i855', opengl='1.3', supported=False ), PciDevice('i915g', '(8086:2582)', [INTEL], gen='i915', opengl='1.4' ), PciDevice('i915g', '(8086:2782)', [INTEL], gen='i915', opengl='1.4' ), PciDevice('i915gm', '(8086:2592|915GM)', [INTEL], gen='i915', opengl='1.4' ), PciDevice('i915gm', '(8086:2792|915GM)', [INTEL], gen='i915', opengl='1.4' ), PciDevice('e7221', '(8086:258a)', [INTEL], opengl=None, supported=False ), PciDevice('i945g', '(8086:2772|945G[ \/])', [INTEL], gen='i945', opengl='1.4' ), PciDevice('i945g', '(8086:2776)', [INTEL], gen='i945', opengl='1.4' ), PciDevice('i945gm', '(8086:27a2|945GM[ \/])', [INTEL], gen='i945', opengl='1.4' ), PciDevice('i945gme', '(8086:27a6)', [INTEL], gen='i945', opengl='1.4' ), PciDevice('i945gme', '(8086:27ae|945GME)', [INTEL], gen='i945', opengl='1.4' ), PciDevice('pineview_g', '(8086:a001)', [INTEL], gen='pineview', opengl='2.0' ), PciDevice('pineview_g', '(8086:a002)', [INTEL], gen='pineview', opengl='2.0' ), PciDevice('pineview_m', '(8086:a011)', [INTEL], gen='pineview', opengl='2.0' ), PciDevice('pineview_m', '(8086:a012)', [INTEL], gen='pineview', opengl='2.0' ), PciDevice('i946gz', '(8086:2972|82946GZ)', [INTEL], opengl='1.4' ), PciDevice('g35_g', '(8086:2982|82G35)', [INTEL], gen='i965', opengl='2.0' ), PciDevice('g35_g', '(8086:2983)', [INTEL], gen='i965', opengl='2.0' ), PciDevice('i965q', '(8086:2992|Q965)', [INTEL], gen='i965', opengl='1.4' ), PciDevice('i965g', '(8086:29a2|G965)', [INTEL], gen='i965', opengl='2.0' ), PciDevice('i965g', '(8086:29a3|G965)', [INTEL], gen='i965', opengl='2.0' ), PciDevice('q35', '(8086:29b2)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('q35', '(8086:29b3)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('g33', '(8086:29c2|82G33)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('g33', '(8086:29c3)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('q33', '(8086:29d2)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('q33', '(8086:29d3)', [INTEL], gen='bearlake', opengl='1.5' ), PciDevice('i965gm', '(8086:2a02|GM965)', [INTEL], gen='i965', opengl='2.1' ), PciDevice('i965gm', '(8086:2a03)', [INTEL], gen='i965', opengl='2.1' ), PciDevice('i965gme', '(8086:2a12)', [INTEL], gen='i965', opengl='2.1' ), PciDevice('i965gme', '(8086:2a13)', [INTEL], gen='i965', opengl='2.1' ), PciDevice('gm45_gm', '(8086:2a42)', [INTEL], gen='cantiga', opengl='2.1' ), PciDevice('gm45_gm', '(8086:2a43)', [INTEL], gen='cantiga', opengl='2.1' ), PciDevice('g45_e_g', '(8086:2e02)', [INTEL], opengl='2.1' ), PciDevice('q43', '(8086:2e12)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('q45', '(8086:2e13)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('g45', '(8086:2e22)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('g45', '(8086:2e23)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('g41', '(8086:2e32)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('g41', '(8086:2e33)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('b43', '(8086:2e42)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('b43', '(8086:2e43)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('b43g1', '(8086:2e92)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('b43', '(8086:2e93)', [INTEL], gen='eaglelake', opengl='2.1' ), PciDevice('ironlake DG','(8086:0042)', [INTEL], gen='clarkdale', opengl='2.1' ), PciDevice('ironlake MG','(8086:0046)', [INTEL], gen='arrandale', opengl='2.1' ), PciDevice('snb-gt1', '(8086:0102)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-m-gt1', '(8086:0106)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-s', '(8086:010a)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-gt2', '(8086:0112)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-m-gt2', '(8086:0116)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-gt2+', '(8086:0122)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('snb-m-gt2+', '(8086:0126)', [INTEL], gen='sandybridge', opengl='3.0' ), PciDevice('ivb', '(8086:0080)', [INTEL], gen='ivybridge', opengl='3.1' ), PciDevice('ivb-m-gt1', '(8086:0156)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('ivb-m-gt2', '(8086:0166)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('ivb-d-gt1', '(8086:0152)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('ivb-d-gt2', '(8086:0162)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('ivb-s-gt1', '(8086:015a)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('ivb-s-gt1', '(8086:016a)', [INTEL], gen='ivybridge', opengl='4.0' ), PciDevice('hsw_d_gt1', '(8086:0402)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_d_gt2', '(8086:0412)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_d_gt2+', '(8086:0422)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_m_gt1', '(8086:0406)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_m_gt2', '(8086:0416)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_m_gt2+', '(8086:0426)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_s_gt1', '(8086:040a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_s_gt2', '(8086:041a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_s_gt2+', '(8086:042a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_d_gt1', '(8086:0c02)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_d_gt2', '(8086:0c12)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_d_gt2+', '(8086:0c22)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_m_gt1', '(8086:0c06)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_m_gt2', '(8086:0c16)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_m_gt2+', '(8086:0c26)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_s_gt1', '(8086:0c0a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_s_gt2', '(8086:0c1a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_sdv_s_gt2+', '(8086:0c2a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_d_gt1', '(8086:0a02)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_d_gt2', '(8086:0a12)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_d_gt2+', '(8086:0a22)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_m_gt1', '(8086:0a06)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_m_gt2', '(8086:0a16)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_m_gt2+', '(8086:0a26)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_s_gt1', '(8086:0a0a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_s_gt2', '(8086:0a1a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_ult_s_gt2+', '(8086:0a2a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_d_gt1', '(8086:0d12)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_d_gt2', '(8086:0d22)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_d_gt2+', '(8086:0d32)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_m_gt1', '(8086:0d16)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_m_gt2', '(8086:0d26)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_m_gt2+', '(8086:0d36)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_s_gt1', '(8086:0d1a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_s_gt2', '(8086:0d2a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('hsw_crw_s_gt2+', '(8086:0d3a)', [INTEL], gen='haswell', opengl='3.2' ), PciDevice('vlv_po', '(8086:0f30)', [INTEL], gen='', opengl='' ), # Poulsbo # # References: # http://en.wikipedia.org/wiki/Comparison_of_Intel_graphics_processing_units PciDevice('psb', '(8086:8108|GMA 500)', [POULSBO], gen='poulsbo', opengl='2.0', supported=False ), PciDevice('psb', '(8086:8109)', [POULSBO], gen='poulsbo', opengl='2.0', supported=False ), PciDevice('psb_600', '(8086:4102|GMA 600)', [POULSBO], gen='lincroft', opengl='2.0', supported=False ), PciDevice('psb_3600', '(8086:0BE0|GMA 3600)', [POULSBO], gen='cedarview', opengl='3.0', supported=False ), PciDevice('psb_3600', '(8086:0BE1|GMA 3600)', [POULSBO], gen='cedarview', opengl='3.0', supported=False ), PciDevice('psb_3650', '(8086:0BE2|GMA 3650)', [POULSBO], gen='cedartrail', opengl='3.0', supported=False ), PciDevice('psb_3650', '(8086:0BE3|GMA 3650)', [POULSBO], gen='cedartrail', opengl='3.0', supported=False ), # ATI GPUs # # References: # http://xorg.freedesktop.org/wiki/RadeonFeature # http://en.wikipedia.org/wiki/Radeon # -ati driver source src/ati_pciids_gen.h # -fglrx driver source lib/modules/fglrx/build_mod/fglrxko_pci_ids.h PciDevice('rv380', '(1002:3150)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3151)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3152)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3154)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3155)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3e50)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:3e54)', [RADEON], opengl='2.1' ), PciDevice('rs100', '(1002:4136)', [RADEON], opengl='1.3', supported=False ), PciDevice('rs200', '(1002:4137)', [RADEON], opengl='1.3', supported=False ), PciDevice('r300', '(1002:4144)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4145)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4146)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4147)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4148)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4149)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:414a)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:414b)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4150)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4151)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4152)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4153)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4154)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4155)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4156)', [RADEON], opengl='2.1' ), PciDevice('rs200', '(1002:4237)', [RADEON], opengl='1.3', supported=False ), PciDevice('r200', '(1002:4242)', [RADEON], opengl='1.3', supported=False ), PciDevice('rs100', '(1002:4336)', [RADEON], opengl='1.3', supported=False ), PciDevice('rs200', '(1002:4337)', [RADEON], opengl='1.3', supported=False ), PciDevice('rs200', '(1002:4437)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv250', '(1002:4966)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv250', '(1002:4967)', [RADEON], opengl='1.3', supported=False ), PciDevice('r420', '(1002:4a48)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a49)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4a)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4b)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4c)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4d)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4e)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a4f)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a50)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4a54)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4b48)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4b49)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4b4a)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4b4b)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:4b4c)', [RADEON], opengl='2.1' ), PciDevice('rv200', '(1002:4c57)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv200', '(1002:4c58)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:4c59)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:4c5a)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv250', '(1002:4c64)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv250', '(1002:4c66)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv250', '(1002:4c67)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv280', '(1002:4c6e)', [RADEON], opengl='1.3', supported=False ), PciDevice('r300', '(1002:4e44)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4e45)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4e46)', [RADEON], opengl='2.1' ), PciDevice('r300', '(1002:4e47)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4e48)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4e49)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4e4a)', [RADEON], opengl='2.1' ), PciDevice('r350', '(1002:4e4b)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e50)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e51)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e52)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e53)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e54)', [RADEON], opengl='2.1' ), PciDevice('rv350', '(1002:4e56)', [RADEON], opengl='2.1' ), PciDevice('r200', '(1002:5148)', [RADEON], opengl='1.3', supported=False ), PciDevice('r200', '(1002:514c)', [RADEON], opengl='1.3', supported=False ), PciDevice('r200', '(1002:514d)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv200', '(1002:5157)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv200', '(1002:5158)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:5159)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:515a)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:515e)', [RADEON], opengl='1.3', supported=False ), PciDevice('RV370', '(1002:5160)', [RADEON], opengl='2.1' ), PciDevice('RV370', '(1002:5162)', [RADEON], opengl='2.1' ), PciDevice('RV370', '(1002:5164)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5460)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5462)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5464)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5548)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5549)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554a)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554b)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554c)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554d)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554e)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:554f)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5550)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5551)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5552)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5554)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:564a)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:564b)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:564f)', [RADEON], opengl='3.3' ), PciDevice('rv410', '(1002:5652)', [RADEON], opengl='3.3' ), PciDevice('rv410', '(1002:5653)', [RADEON], opengl='3.3' ), PciDevice('rv410', '(1002:5657)', [RADEON], opengl='3.3' ), PciDevice('rs300', '(1002:5834)', [RADEON], opengl='3.3' ), PciDevice('rs300', '(1002:5835)', [RADEON], opengl='3.3' ), PciDevice('rs480', '(1002:5954)', [RADEON], opengl='3.3' ), PciDevice('rs480', '(1002:5955)', [RADEON], opengl='3.3' ), PciDevice('rv280', '(1002:5960)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv280', '(1002:5961)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv280', '(1002:5962)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv280', '(1002:5964)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv280', '(1002:5965)', [RADEON], opengl='1.3', supported=False ), PciDevice('rv100', '(1002:5969)', [RADEON], opengl='1.3', supported=False ), PciDevice('rs480', '(1002:5974)', [RADEON], opengl='2.1' ), PciDevice('rs480', '(1002:5975)', [RADEON], opengl='2.1' ), PciDevice('rs400', '(1002:5a41)', [RADEON], opengl='2.1' ), PciDevice('rs400', '(1002:5a42)', [RADEON], opengl='2.1' ), PciDevice('rs400', '(1002:5a61)', [RADEON], opengl='2.1' ), PciDevice('rs400', '(1002:5a62)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5b60)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5b62)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5b63)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5b64)', [RADEON], opengl='2.1' ), PciDevice('rv380', '(1002:5b65)', [RADEON], opengl='2.1' ), PciDevice('rv280', '(1002:5c61)', [RADEON], opengl='2.1' ), PciDevice('rv280', '(1002:5c63)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d48)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d49)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d4a)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d4c)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d4d)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d4e)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d4f)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d50)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d52)', [RADEON], opengl='2.1' ), PciDevice('r420', '(1002:5d57)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e48)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e4a)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e4b)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e4c)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e4d)', [RADEON], opengl='2.1' ), PciDevice('rv410', '(1002:5e4f)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7100)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7101)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7102)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7103)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7104)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7105)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7106)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7108)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:7109)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:710a)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:710b)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:710c)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:710e)', [RADEON], opengl='2.1' ), PciDevice('r520', '(1002:710f)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7140)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7141)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7142)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7143)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7144)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7145)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7146)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7147)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7149)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714a)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714b)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714c)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714d)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714e)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:714f)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7151)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7152)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7153)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:715e)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:715f)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7180)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7181)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7183)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7186)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7187)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7188)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:718a)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:718b)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:718c)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:718d)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:718f)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7193)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7196)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:719b)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:719f)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c0)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c1)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c2)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c3)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c4)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c5)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c6)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71c7)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71cd)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71ce)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71d2)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71d4)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71d5)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71d6)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71da)', [RADEON], opengl='2.1' ), PciDevice('rv530', '(1002:71de)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7200)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7210)', [RADEON], opengl='2.1' ), PciDevice('rv515', '(1002:7211)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7240)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7243)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7244)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7245)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7246)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7247)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7248)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7249)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724a)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724b)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724c)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724d)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724e)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:724f)', [RADEON], opengl='2.1' ), PciDevice('rv570', '(1002:7280)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7281)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7283)', [RADEON], opengl='2.1' ), PciDevice('r580', '(1002:7284)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7287)', [RADEON], opengl='2.1' ), PciDevice('rv570', '(1002:7288)', [RADEON], opengl='2.1' ), PciDevice('rv570', '(1002:7289)', [RADEON], opengl='2.1' ), PciDevice('rv570', '(1002:728b)', [RADEON], opengl='2.1' ), PciDevice('rv570', '(1002:728c)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7290)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7291)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7293)', [RADEON], opengl='2.1' ), PciDevice('rv560', '(1002:7297)', [RADEON], opengl='2.1' ), PciDevice('rs300', '(1002:7834)', [RADEON], opengl='2.1' ), PciDevice('rs300', '(1002:7835)', [RADEON], opengl='2.1' ), PciDevice('rs690', '(1002:791e)', [RADEON], opengl='2.1' ), PciDevice('rs690', '(1002:791f)', [RADEON], opengl='2.1' ), PciDevice('rs600', '(1002:793f)', [RADEON], opengl='3.3' ), PciDevice('rs600', '(1002:7941)', [RADEON], opengl='3.3' ), PciDevice('rs600', '(1002:7942)', [RADEON], opengl='3.3' ), PciDevice('rs740', '(1002:796c)', [RADEON], opengl='3.3' ), PciDevice('rs740', '(1002:796d)', [RADEON], opengl='3.3' ), PciDevice('rs740', '(1002:796e)', [RADEON], opengl='3.3' ), PciDevice('rs740', '(1002:796f)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:9400)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:9401)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:9402)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:9403)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:9405)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:940a)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:940b)', [RADEON], opengl='3.3' ), PciDevice('r600', '(1002:940f)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9440)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9441)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9442)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9443)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9444)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9446)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:944a)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:944b)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:944c)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:944e)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9450)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9452)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9456)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:945a)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:945b)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:945e)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9460)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:9462)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:946a)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:946b)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:947a)', [RADEON], opengl='3.3' ), PciDevice('rv770', '(1002:947b)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9480)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9487)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9488)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9489)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:948a)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:948f)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9490)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9491)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9495)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:9498)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:949c)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:949e)', [RADEON], opengl='3.3' ), PciDevice('rv730', '(1002:949f)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94a0)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94a1)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94a3)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94b1)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94b3)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94b4)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94b5)', [RADEON], opengl='3.3' ), PciDevice('rv740', '(1002:94b9)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c0)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c1)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c3)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c4)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c5)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c6)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c7)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c8)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94c9)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94cb)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94cc)', [RADEON], opengl='3.3' ), PciDevice('rv610', '(1002:94cd)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9500)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9501)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9504)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9505)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9506)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9507)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9508)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9509)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:950f)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9511)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9515)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9517)', [RADEON], opengl='3.3' ), PciDevice('rv670', '(1002:9519)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9540)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9541)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9542)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:954e)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:954f)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9552)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9553)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9555)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:9557)', [RADEON], opengl='3.3' ), PciDevice('rv710', '(1002:955f)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9580)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9581)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9583)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9586)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9587)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9588)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:9589)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958a)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958b)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958c)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958d)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958e)', [RADEON], opengl='3.3' ), PciDevice('rv630', '(1002:958f)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c0)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c2)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c4)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c5)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c6)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c7)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95c9)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95cc)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95cd)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95ce)', [RADEON], opengl='3.3' ), PciDevice('rv620', '(1002:95cf)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9590)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9596)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9597)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9598)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9599)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9591)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9593)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:9595)', [RADEON], opengl='3.3' ), PciDevice('rv635', '(1002:959b)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9610)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9611)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9612)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9613)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9614)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9615)', [RADEON], opengl='3.3' ), PciDevice('rs780', '(1002:9616)', [RADEON], opengl='3.3' ), PciDevice('sumo', '(1002:9640)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:9641)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo2', '(1002:9642)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo2', '(1002:9643)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo2', '(1002:9644)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo2', '(1002:9645)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:9647)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:9648)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:9649)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:964a)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:964b)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:964c)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:964e)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('sumo', '(1002:964f)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9710)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9711)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9712)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9713)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9714)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('rs880', '(1002:9715)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9802)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9803)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9804)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9805)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9806)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9807)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9808)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:9809)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('palm', '(1002:980a)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:6880)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:6888)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:6889)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:688a)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:688c)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:688d)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:6898)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:6899)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:689b)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cypress', '(1002:689e)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('hemlock', '(1002:689c)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('hemlock', '(1002:689d)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68a0)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68a1)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68a8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68a9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68b0)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68b8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68b9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68ba)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68be)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('juniper', '(1002:68bf)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68c0)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68c1)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68c7)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68c8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68c9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68d8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68d9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68da)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('redwood', '(1002:68de)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e0)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e1)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e4)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e5)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68e9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68f1)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68f2)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68f8)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68f9)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68fa)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cedar', '(1002:68fe)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6700)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6701)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6702)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6703)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6704)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6705)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6706)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6707)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6708)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6709)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6718)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:6719)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:671c)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:671d)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('cayman', '(1002:671f)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6720)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6721)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6722)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6723)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6724)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6725)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6726)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6727)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6728)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6729)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6738)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:6739)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('barts', '(1002:673e)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6740)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6741)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6742)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6743)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6744)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6745)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6746)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6747)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6748)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6749)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:674a)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6750)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6751)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6758)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6759)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:675b)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:675d)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:675f)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6840)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6841)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6842)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6843)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6849)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6850)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6858)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('turks', '(1002:6859)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6760)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6761)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6762)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6763)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6764)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6765)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6766)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6767)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6768)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6770)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6771)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6772)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6778)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:6779)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('caicos', '(1002:677b)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9900)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9901)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9903)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9904)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9905)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9906)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9907)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9908)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9909)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:990a)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:990f)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9910)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9913)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9917)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9918)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9919)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9990)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9991)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9992)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9993)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:9994)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:99a0)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:99a2)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('aruba', '(1002:99a4)', [RADEON,FGLRX], opengl='4.1' ), PciDevice('tahiti', '(1002:6780)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:6784)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:6788)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:678a)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:6790)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:6798)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:6799)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:679a)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:679e)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('tahiti', '(1002:679f)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6800)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6801)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6802)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6806)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6808)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6809)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6810)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6816)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6817)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6818)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:6819)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('pitcairn', '(1002:684c)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6820)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6821)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6823)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6824)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6825)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6826)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6827)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6828)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6829)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:682b)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:682d)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:682f)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6830)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6831)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6837)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6838)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:6839)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:683b)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:683d)', [RADEON,FGLRX], opengl='4.2' ), PciDevice('verde', '(1002:683f)', [RADEON,FGLRX], opengl='4.2' ), # Nvidia # # References: # http://en.wikipedia.org/wiki/Comparison_of_Nvidia_graphics_processing_units # http://pci-ids.ucw.cz/read/PC/10de # http://nouveau.freedesktop.org/wiki/CodeNames # nvidia-current source: README.txt # # TODO: # - NVC* not indicated # - To update the list, chet source nvidia-current, then debuild PciDevice('NV40', '(10de:0040)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 Ultra',), PciDevice('NV40', '(10de:0041)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800',), PciDevice('NV40.2', '(10de:0042)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 LE',), PciDevice('NV40.3', '(10de:0043)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 XE',), PciDevice('NV40', '(10de:0044)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 XT',), PciDevice('NV40', '(10de:0045)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 GT',), PciDevice('NV45', '(10de:0046)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 GT',), PciDevice('NV40', '(10de:0047)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 GS',), PciDevice('NV40', '(10de:0048)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 XT',), PciDevice('G70', '(10de:0090)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 GTX',), PciDevice('G70', '(10de:0091)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 GTX',), PciDevice('G70', '(10de:0092)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 GT',), PciDevice('G70', '(10de:0093)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 GS',), PciDevice('G70', '(10de:0095)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 SLI',), PciDevice('G70', '(10de:0098)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7800',), PciDevice('G70', '(10de:0099)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7800 GTX',), PciDevice('NV41', '(10de:00c0)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 GS',), PciDevice('NV41.1', '(10de:00c1)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800',), PciDevice('NV41.2', '(10de:00c2)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 LE',), PciDevice('NV42', '(10de:00c3)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 XT',), PciDevice('NV41.8', '(10de:00c8)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6800',), PciDevice('NV41.9', '(10de:00c9)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6800 Ultra',), PciDevice('NV43', '(10de:00f1)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600 GT',), PciDevice('NV43', '(10de:00f2)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600',), PciDevice('NV43', '(10de:00f3)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200',), PciDevice('NV43', '(10de:00f4)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600 LE',), PciDevice('G70', '(10de:00f5)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7800 GS',), PciDevice('NV43', '(10de:00f6)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 GS',), PciDevice('NV45', '(10de:00f9)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6800 Ultra',), PciDevice('NV43', '(10de:0140)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600 GT',), PciDevice('NV43', '(10de:0141)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600',), PciDevice('NV43', '(10de:0142)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600 LE',), PciDevice('NV43', '(10de:0143)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6600 VE',), PciDevice('NV43', '(10de:0144)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6600',), PciDevice('NV43', '(10de:0145)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6610 XL',), PciDevice('NV43', '(10de:0146)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6600 TE/6200 TE',), PciDevice('NV43', '(10de:0147)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6700 XL',), PciDevice('NV43', '(10de:0148)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6600',), PciDevice('NV43', '(10de:0149)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6600 GT',), PciDevice('NV43', '(10de:014f)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200',), PciDevice('NV44', '(10de:0160)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6500',), PciDevice('NV44', '(10de:0161)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200 TurboCache(TM)',), PciDevice('NV44', '(10de:0162)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200SE TurboCache(TM)',), PciDevice('NV44', '(10de:0163)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200 LE',), PciDevice('NV44', '(10de:0164)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6200',), PciDevice('NV44', '(10de:0166)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6400',), PciDevice('NV44', '(10de:0167)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6200',), PciDevice('NV44', '(10de:0168)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6400',), PciDevice('NV44', '(10de:0169)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6250',), PciDevice('NV44', '(10de:016a)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7100 GS',), PciDevice('G80', '(10de:0191)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GTX',), PciDevice('G80', '(10de:0193)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GTS',), PciDevice('G80', '(10de:0194)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 Ultra',), PciDevice('G80', '(10de:0197)', [NOUVEAU,NVIDIA], opengl='3.3', title='Tesla C870',), PciDevice('G72', '(10de:01d0)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7350 LE',), PciDevice('G72', '(10de:01d1)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 LE',), PciDevice('G72', '(10de:01d2)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7550 LE',), PciDevice('G72', '(10de:01d3)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 SE/7200 GS',), PciDevice('G72M', '(10de:01d6)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7200',), PciDevice('G72M', '(10de:01d7)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7300',), PciDevice('G72M', '(10de:01d8)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7400',), PciDevice('G72', '(10de:01dd)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7500 LE',), PciDevice('G71', '(10de:01df)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 GS',), PciDevice('NV44A', '(10de:0221)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200',), PciDevice('NV44', '(10de:0222)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6200 A-LE',), PciDevice('C51PV', '(10de:0240)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6150',), PciDevice('C51', '(10de:0241)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6150 LE',), PciDevice('C51G', '(10de:0242)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6100',), PciDevice('C51', '(10de:0244)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6150',), PciDevice('C51', '(10de:0247)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 6100',), PciDevice('G71', '(10de:0290)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7900 GTX',), PciDevice('G71', '(10de:0291)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7900 GT/GTO',), PciDevice('G71', '(10de:0292)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7900 GS',), PciDevice('G71', '(10de:0293)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7950 GX2',), PciDevice('G71', '(10de:0294)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7950 GX2',), PciDevice('G71', '(10de:0295)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7950 GT',), PciDevice('G71', '(10de:0297)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7950 GTX',), PciDevice('G71', '(10de:0298)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7900 GS',), PciDevice('G73', '(10de:02e0)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7600 GT',), PciDevice('G73', '(10de:02e1)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7600 GS',), PciDevice('G73', '(10de:02e2)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 GT',), PciDevice('G71', '(10de:02e3)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7900 GS',), PciDevice('G71', '(10de:02e4)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7950 GT',), PciDevice('G73', '(10de:038b)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7650 GS',), PciDevice('G73', '(10de:0390)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7650 GS',), PciDevice('G73', '(10de:0391)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7600 GT',), PciDevice('G73', '(10de:0392)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7600 GS',), PciDevice('G73', '(10de:0393)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 GT',), PciDevice('G73', '(10de:0394)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7600 LE',), PciDevice('G73', '(10de:0395)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7300 GT',), PciDevice('G73', '(10de:0397)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7700',), PciDevice('G73', '(10de:0398)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7600',), PciDevice('G73', '(10de:0399)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce Go 7600 GT',), PciDevice('C61', '(10de:03d0)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6150SE nForce 430',), PciDevice('C61', '(10de:03d1)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6100 nForce 405',), PciDevice('C61', '(10de:03d2)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6100 nForce 400',), PciDevice('C61', '(10de:03d5)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 6100 nForce 420',), PciDevice('C61', '(10de:03d6)', [NOUVEAU,NVIDIA], opengl='2.1', title='GeForce 7025 / nForce 630a',), PciDevice('G84', '(10de:0400)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600 GTS',), PciDevice('G84', '(10de:0401)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600 GT',), PciDevice('G84', '(10de:0402)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600 GT',), PciDevice('G84', '(10de:0403)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600 GS',), PciDevice('G84', '(10de:0404)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 GS',), PciDevice('G84', '(10de:0405)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500M GS',), PciDevice('G84', '(10de:0406)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8300 GS',), PciDevice('G84', '(10de:0407)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600M GT',), PciDevice('G84', '(10de:0408)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9650M GS',), PciDevice('G84', '(10de:0409)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8700M GT',), PciDevice('G92', '(10de:0410)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 330',), PciDevice('G86', '(10de:0420)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 SE',), PciDevice('G86', '(10de:0421)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8500 GT',), PciDevice('G86', '(10de:0422)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 GS',), PciDevice('G86', '(10de:0423)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8300 GS',), PciDevice('G86', '(10de:0424)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 GS',), PciDevice('G86', '(10de:0425)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8600M GS',), PciDevice('G86', '(10de:0426)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400M GT',), PciDevice('G86', '(10de:0427)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400M GS',), PciDevice('G86', '(10de:0428)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400M G',), PciDevice('G86', '(10de:042c)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400 GT',), PciDevice('G86', '(10de:042e)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300M G',), PciDevice('C67', '(10de:0531)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7150M / nForce 630M',), PciDevice('C67', '(10de:0533)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7000M / nForce 610M',), PciDevice('C68', '(10de:053a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7050 PV / nForce 630a',), PciDevice('C68', '(10de:053b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7050 PV / nForce 630a',), PciDevice('C68', '(10de:053e)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7025 / nForce 630a',), PciDevice('GT200b', '(10de:05e0)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 295',), PciDevice('GT200', '(10de:05e1)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 280',), PciDevice('GT200', '(10de:05e2)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 260',), PciDevice('GT200b', '(10de:05e3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 285',), PciDevice('GT200b', '(10de:05e6)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 275',), PciDevice('GT200', '(10de:05e7)', [NOUVEAU,NVIDIA], opengl='3.3', title='Tesla C1060',), PciDevice('Tesla', '(10de:0595)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla T10 Processor',), PciDevice('Tesla', '(10de:068f)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla T10 Processor',), PciDevice('Tesla', '(10de:0697)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla M1060',), PciDevice('Tesla', '(10de:0743)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla M1060',), PciDevice('GT200', '(10de:05ea)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 260',), PciDevice('GT200', '(10de:05eb)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 295',), PciDevice('G92', '(10de:0600)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GTS 512',), PciDevice('G92', '(10de:0601)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GT',), PciDevice('G92', '(10de:0602)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GT',), PciDevice('G92', '(10de:0603)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 230',), PciDevice('G92', '(10de:0604)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GX2',), PciDevice('G92', '(10de:0605)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GT',), PciDevice('G92', '(10de:0606)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GS',), PciDevice('G92', '(10de:0607)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 240',), PciDevice('G92', '(10de:0608)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GTX',), PciDevice('G92', '(10de:0609)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800M GTS',), PciDevice('GT200', '(10de:060a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 280M',), PciDevice('G92', '(10de:060b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GT',), PciDevice('G92', '(10de:060c)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800M GTX',), PciDevice('G92', '(10de:060d)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GS',), PciDevice('G92', '(10de:060f)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 285M',), PciDevice('G92', '(10de:0610)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GSO',), PciDevice('G92', '(10de:0611)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8800 GT',), PciDevice('G92', '(10de:0612)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GTX/9800 GTX+',), PciDevice('G92', '(10de:0613)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GTX+',), PciDevice('G92', '(10de:0614)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800 GT',), PciDevice('G92', '(10de:0615)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 250',), PciDevice('G92', '(10de:0617)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GTX',), PciDevice('G92', '(10de:0618)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTX 260M',), PciDevice('G94b', '(10de:0621)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 230',), PciDevice('G94', '(10de:0622)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GT',), PciDevice('G94', '(10de:0623)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GS',), PciDevice('G94', '(10de:0625)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GSO 512',), PciDevice('G94', '(10de:0626)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 130',), PciDevice('G94', '(10de:0627)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 140',), PciDevice('G94', '(10de:0628)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GTS',), PciDevice('G94', '(10de:062a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9700M GTS',), PciDevice('G94', '(10de:062b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GS',), PciDevice('G94', '(10de:062c)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9800M GTS',), PciDevice('G94', '(10de:062d)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GT',), PciDevice('G94', '(10de:062e)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GT',), PciDevice('', '(10de:0630)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 9700 S',), PciDevice('G94M', '(10de:0631)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 160M',), PciDevice('G94M', '(10de:0632)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 150M',), PciDevice('G94', '(10de:0635)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GSO',), PciDevice('G94', '(10de:0637)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600 GT',), PciDevice('G96', '(10de:0640)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500 GT',), PciDevice('G96', '(10de:0641)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400 GT',), PciDevice('G96', '(10de:0643)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500 GT',), PciDevice('G96', '(10de:0644)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500 GS',), PciDevice('G96', '(10de:0645)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500 GS',), PciDevice('G96', '(10de:0646)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 120',), PciDevice('G96', '(10de:0647)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600M GT',), PciDevice('G96', '(10de:0648)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600M GS',), PciDevice('G96', '(10de:0649)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9600M GT',), PciDevice('G96', '(10de:064a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9700M GT',), PciDevice('G96', '(10de:064b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9500M G',), PciDevice('G96', '(10de:064c)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9650M GT',), PciDevice('G96', '(10de:0651)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G 110M',), PciDevice('G96', '(10de:0652)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 130M',), PciDevice('G96M', '(10de:0653)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 120M',), PciDevice('G96', '(10de:0654)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 220M',), PciDevice('G96b', '(10de:0633)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 120',), PciDevice('G96', '(10de:0656)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9650 S',), PciDevice('G96', '(10de:065b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400 GT',), PciDevice('GF100', '(10de:06c0)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 480',), PciDevice('GF100', '(10de:06c4)', [NOUVEAU,NVIDIA], opengl='4.3', title='GeForce GTX 465',), PciDevice('GF100', '(10de:06ca)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 480M',), PciDevice('GF100', '(10de:06cd)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 470',), PciDevice('GF100', '(10de:06d1)', [NOUVEAU,NVIDIA], opengl='4.1', title='Tesla C2050 / C2070',), PciDevice('', '(10de:0772)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla C2070 0x06D1',), PciDevice('GF100', '(10de:06d2)', [NOUVEAU,NVIDIA], opengl='4.1', title='Tesla M2070',), PciDevice('GF100', '(10de:06de)', [NOUVEAU,NVIDIA], opengl='4.1', title='Tesla T20 Processor',), PciDevice('', '(10de:082f)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla M2050 0x06DE',), PciDevice('C77', '(10de:0846)', [NOUVEAU,NVIDIA], opengl='3.3', title='Tesla M2050 0x06DE',), PciDevice('GF100', '(10de:06df)', [NOUVEAU,NVIDIA], opengl='4.1', title='Tesla M2070-Q',), PciDevice('G98', '(10de:06e0)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300 GE',), PciDevice('G98', '(10de:06e1)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300 GS',), PciDevice('G98', '(10de:06e2)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400',), PciDevice('G98', '(10de:06e3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 SE',), PciDevice('G98', '(10de:06e4)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400 GS',), PciDevice('G98', '(10de:06e5)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300M GS',), PciDevice('G98', '(10de:06e6)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G100',), PciDevice('G98', '(10de:06e7)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300 SE',), PciDevice('G98', '(10de:06e8)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9200M GS',), PciDevice('G98', '(10de:06e9)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300M GS',), PciDevice('G98M', '(10de:06ec)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G 105M',), PciDevice('G98M', '(10de:06ef)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G 103M',), PciDevice('G98', '(10de:06f1)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G105M',), PciDevice('C73', '(10de:07e0)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7150 / nForce 630i',), PciDevice('C73', '(10de:07e1)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7100 / nForce 630i',), PciDevice('C73', '(10de:07e2)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7050 / nForce 630i',), PciDevice('C73', '(10de:07e3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7050 / nForce 610i',), PciDevice('C73', '(10de:07e5)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 7050 / nForce 620i',), PciDevice('', '(10de:0840)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 8200M',), PciDevice('C77', '(10de:0844)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9100M G',), PciDevice('C77', '(10de:0845)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8200M G',), PciDevice('C77', '(10de:0846)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9200',), PciDevice('C78', '(10de:0847)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9100',), PciDevice('C77', '(10de:0848)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8300',), PciDevice('C77', '(10de:0849)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8200',), PciDevice('C77', '(10de:084a)', [NOUVEAU,NVIDIA], opengl='3.3', title='nForce 730a',), PciDevice('C77', '(10de:084b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9200',), PciDevice('C77', '(10de:084c)', [NOUVEAU,NVIDIA], opengl='3.3', title='nForce 980a/780a SLI',), PciDevice('C77', '(10de:084d)', [NOUVEAU,NVIDIA], opengl='3.3', title='nForce 750a SLI',), PciDevice('C77', '(10de:084f)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8100 / nForce 720a',), PciDevice('C79', '(10de:0860)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400',), PciDevice('C79', '(10de:0861)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400',), PciDevice('C79', '(10de:0862)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400M G',), PciDevice('C79', '(10de:0863)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400M',), PciDevice('C79', '(10de:0864)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300',), PciDevice('C79', '(10de:0865)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION',), PciDevice('C79', '(10de:0866)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400M G',), PciDevice('C79', '(10de:0867)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400',), PciDevice('C79', '(10de:0868)', [NOUVEAU,NVIDIA], opengl='3.3', title='nForce 760i SLI',), PciDevice('', '(10de:0869)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 9400',), PciDevice('C79', '(10de:086a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400',), PciDevice('C79', '(10de:086c)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9300 / nForce 730i',), PciDevice('C79', '(10de:086d)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9200',), PciDevice('C79', '(10de:086e)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9100M G',), PciDevice('C79', '(10de:086f)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8200M G',), PciDevice('C79', '(10de:0870)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400M',), PciDevice('C79', '(10de:0871)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9200',), PciDevice('C79', '(10de:0872)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G102M',), PciDevice('C79', '(10de:0873)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G102M',), PciDevice('C79', '(10de:0874)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION',), PciDevice('ION VGA', '(10de:0876)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION',), PciDevice('C79', '(10de:087a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 9400',), PciDevice('ION VGA', '(10de:087d)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION',), PciDevice('ION LE VGA', '(10de:087e)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION LE',), PciDevice('ION LE VGA', '(10de:087f)', [NOUVEAU,NVIDIA], opengl='3.3', title='ION LE',), PciDevice('', '(10de:08a0)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 320M',), PciDevice('GT216', '(10de:08a2)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 320M',), PciDevice('GT216', '(10de:08a3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 320M',), PciDevice('GT216', '(10de:08a4)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 320M',), PciDevice('GT216', '(10de:08a5)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 320M',), PciDevice('GT216', '(10de:0a20)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 220',), PciDevice('', '(10de:0a22)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 315',), PciDevice('GT218', '(10de:0a23)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce 210',), PciDevice('', '(10de:0a26)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 405',), PciDevice('', '(10de:0a27)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 405',), PciDevice('GT216', '(10de:0a28)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 230M',), PciDevice('GT216', '(10de:0a29)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 330M',), PciDevice('GT216', '(10de:0a2a)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 230M',), PciDevice('GT216', '(10de:0a2b)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 330M',), PciDevice('GT216', '(10de:0a2d)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 320M',), PciDevice('', '(10de:0a32)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 415',), PciDevice('GT216', '(10de:0a34)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 240M',), PciDevice('GT216', '(10de:0a35)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 325M',), PciDevice('GT218', '(10de:0a60)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce G210',), PciDevice('GT218', '(10de:0a62)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 205',), PciDevice('GT218', '(10de:0a63)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 310',), PciDevice('GT218', '(10de:0a64)', [NOUVEAU,NVIDIA], opengl='4.1', title='Second Generation ION',), PciDevice('GT218', '(10de:0a65)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce 210',), PciDevice('GT218', '(10de:0a66)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 310',), PciDevice('', '(10de:0a67)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 315',), PciDevice('G98M', '(10de:0a68)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G105M',), PciDevice('G98M', '(10de:0a69)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G105M',), PciDevice('GT218', '(10de:0a6e)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 305M',), PciDevice('GT218', '(10de:0a6f)', [NOUVEAU,NVIDIA], opengl='4.1', title='Second Generation ION',), PciDevice('GT218', '(10de:0a70)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 310M',), PciDevice('GT218', '(10de:0a71)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 305M',), PciDevice('GT218', '(10de:0a72)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 310M',), PciDevice('GT218', '(10de:0a73)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 305M',), PciDevice('GT218', '(10de:0a74)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce G210M',), PciDevice('GT218', '(10de:0a75)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 310M',), PciDevice('', '(10de:0a76)', [NOUVEAU,NVIDIA], opengl='None', title='Second Generation ION',), PciDevice('', '(10de:0a7a)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 315M',), PciDevice('GT215', '(10de:0ca0)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 330',), PciDevice('GT215', '(10de:0ca2)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 320',), PciDevice('GT215', '(10de:0ca3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 240',), PciDevice('GT215', '(10de:0ca4)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 340',), PciDevice('', '(10de:0ca5)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 220',), PciDevice('GT215', '(10de:0ca7)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 330',), PciDevice('GT215', '(10de:0ca8)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 260M',), PciDevice('GT215', '(10de:0ca9)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 250M',), PciDevice('', '(10de:0cac)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 220',), PciDevice('GT215', '(10de:0caf)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GT 335M',), PciDevice('GT215', '(10de:0cb0)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 350M',), PciDevice('GT215', '(10de:0cb1)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce GTS 360M',), PciDevice('', '(10de:0dc0)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 440',), PciDevice('GF106', '(10de:0dc4)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTS 450',), PciDevice('', '(10de:0dc5)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTS 450',), PciDevice('', '(10de:0dc6)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTS 450',), PciDevice('GF106', '(10de:0dcd)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('GF106', '(10de:0dce)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('GF106', '(10de:0dd1)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 460M',), PciDevice('GF106', '(10de:0dd2)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GT 445M',), PciDevice('', '(10de:0dd3)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 435M',), PciDevice('', '(10de:0dd6)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 550M',), PciDevice('GF108', '(10de:0de0)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 440',), PciDevice('GF108', '(10de:0de1)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GT 430',), PciDevice('GF108', '(10de:0de2)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 420',), PciDevice('', '(10de:0de4)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 520',), PciDevice('', '(10de:0de5)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 530',), PciDevice('', '(10de:0de8)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 620M',), PciDevice('', '(10de:0de9)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 630M',), PciDevice('', '(10de:0dea)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 610M',), PciDevice('GF108', '(10de:0deb)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('', '(10de:0dec)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 525M',), PciDevice('', '(10de:0ded)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 520M',), PciDevice('GF108', '(10de:0dee)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GT 415M',), PciDevice('GF108', '(10de:0df0)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 425M',), PciDevice('GF108', '(10de:0df1)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 420M',), PciDevice('GF108', '(10de:0df2)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 435M',), PciDevice('GF108', '(10de:0df3)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 420M',), PciDevice('GF106', '(10de:0df4)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GT 540M',), PciDevice('GF106', '(10de:0df5)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 525M',), PciDevice('GF108', '(10de:0df6)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 550M',), PciDevice('GF106', '(10de:0df7)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 520M',), PciDevice('GF104', '(10de:0e22)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 460',), PciDevice('', '(10de:0e23)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 460 SE',), PciDevice('', '(10de:0e24)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 460',), PciDevice('GF104', '(10de:0e30)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 470M',), PciDevice('GF104', '(10de:0e31)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 485M',), PciDevice('', '(10de:0f00)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 630',), PciDevice('', '(10de:0f01)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 620',), PciDevice('', '(10de:0fc0)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640',), PciDevice('', '(10de:0fc1)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640',), PciDevice('', '(10de:0fc2)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 630',), PciDevice('', '(10de:0fce)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640M LE',), PciDevice('', '(10de:0fd1)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 650M',), PciDevice('GK107', '(10de:0fd2)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640M',), PciDevice('', '(10de:0fd3)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640M LE',), PciDevice('', '(10de:0fd4)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 660M',), PciDevice('', '(10de:0fd5)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 650M',), PciDevice('', '(10de:0fd8)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 640M',), PciDevice('', '(10de:0fe0)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 660M',), PciDevice('GF119', '(10de:1040)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 520',), PciDevice('', '(10de:1042)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 510',), PciDevice('', '(10de:1048)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 605',), PciDevice('', '(10de:1049)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 620',), PciDevice('', '(10de:104a)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 610',), PciDevice('GF119', '(10de:1050)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 520M',), PciDevice('GF119', '(10de:1051)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 520MX',), PciDevice('', '(10de:1052)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 520M',), PciDevice('', '(10de:1054)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 410M',), PciDevice('', '(10de:1055)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 410M',), PciDevice('', '(10de:1058)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 610M',), PciDevice('', '(10de:1059)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 610M',), PciDevice('GF119', '(10de:105a)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce 610M',), PciDevice('GF110', '(10de:1080)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 580',), PciDevice('GF110', '(10de:1081)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 570',), PciDevice('GF110', '(10de:1082)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 560 Ti',), PciDevice('', '(10de:1084)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 560',), PciDevice('GF110', '(10de:1086)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 570',), PciDevice('GF110', '(10de:1087)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 560 Ti',), PciDevice('', '(10de:1088)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 590',), PciDevice('', '(10de:1089)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 580',), PciDevice('', '(10de:108b)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 580',), PciDevice('Tesla', '(10de:1091)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla M2090',), PciDevice('Tesla', '(10de:0974)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla X2090',), PciDevice('Tesla', '(10de:1094)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla M2075',), PciDevice('Tesla', '(10de:1096)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla C2075',), PciDevice('', '(10de:10c0)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce 9300 GS',), PciDevice('GT218', '(10de:10c3)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 8400GS',), PciDevice('GT218', '(10de:10c5)', [NOUVEAU,NVIDIA], opengl='3.3', title='GeForce 405',), PciDevice('', '(10de:0565)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 630M',), PciDevice('', '(10de:0568)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 630M',), PciDevice('', '(10de:067a)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 620M',), PciDevice('', '(10de:0680)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 620M',), PciDevice('', '(10de:20dd)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 620M',), PciDevice('GK104', '(10de:1180)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 680',), PciDevice('', '(10de:1188)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 690',), PciDevice('', '(10de:1189)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 670',), PciDevice('', '(10de:118f)', [NOUVEAU,NVIDIA], opengl='None', title='Tesla K10',), PciDevice('', '(10de:11a0)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 680M',), PciDevice('GF114', '(10de:1200)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 560 Ti',), PciDevice('GF114', '(10de:1201)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 560',), PciDevice('', '(10de:1203)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 460 SE v2',), PciDevice('GF114', '(10de:1205)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 460 v2',), PciDevice('', '(10de:1206)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 555',), PciDevice('', '(10de:1207)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 645',), PciDevice('', '(10de:1208)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTX 560 SE',), PciDevice('', '(10de:1210)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 570M',), PciDevice('', '(10de:1211)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 580M',), PciDevice('', '(10de:1212)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 675M',), PciDevice('', '(10de:1213)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 670M',), PciDevice('', '(10de:1241)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 545',), PciDevice('', '(10de:1243)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 545',), PciDevice('GF116', '(10de:1244)', [NOUVEAU,NVIDIA], opengl='4.1', title='GeForce GTX 550 Ti',), PciDevice('GF116', '(10de:1245)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTS 450',), PciDevice('', '(10de:1246)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 550M',), PciDevice('GF116', '(10de:1247)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('', '(10de:212a)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 635M',), PciDevice('', '(10de:212b)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 635M',), PciDevice('', '(10de:212c)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 635M',), PciDevice('', '(10de:1248)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('', '(10de:1249)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GTS 450',), PciDevice('', '(10de:124b)', [NOUVEAU,NVIDIA], opengl='None', title='GeForce GT 640',), PciDevice('', '(10de:124d)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 555M',), PciDevice('', '(10de:10cc)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GT 635M',), PciDevice('', '(10de:1251)', [NOUVEAU,NVIDIA], opengl='4.2', title='GeForce GTX 560M',), PciDevice('NV40GL', '(10de:004e)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 4000',), PciDevice('G70GL', '(10de:009d)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 4500',), PciDevice('NV41', '(10de:00cc)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX Go1400',), PciDevice('NV41', '(10de:00cd)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 3450/4000 SDI',), PciDevice('NV41GL', '(10de:00ce)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 1400',), PciDevice('NV45GL', '(10de:00f8)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 3400/Quadro FX 4000',), PciDevice('NV43', '(10de:014a)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 440',), PciDevice('NV43', '(10de:014c)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 540M',), PciDevice('NV43GL', '(10de:014d)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 550',), PciDevice('NV43GL', '(10de:014e)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 540',), PciDevice('NV44', '(10de:0165)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 285',), PciDevice('G80', '(10de:019d)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 5600',), PciDevice('G80', '(10de:019e)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 4600',), PciDevice('G72M', '(10de:01da)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 110M',), PciDevice('G72M', '(10de:01db)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 120M',), PciDevice('G72GL', '(10de:01dc)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 350M',), PciDevice('G72GL', '(10de:01de)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 350',), PciDevice('C51', '(10de:0245)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 210S / GeForce 6150LE',), PciDevice('G71', '(10de:0299)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro NVS 510M',), PciDevice('G71', '(10de:029a)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 2500M',), PciDevice('G71', '(10de:029b)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 1500M',), PciDevice('G71', '(10de:029c)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 5500',), PciDevice('G71GL', '(10de:029d)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 3500',), PciDevice('G71', '(10de:029e)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 1500',), PciDevice('G70', '(10de:029f)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 4500 X2',), PciDevice('G73', '(10de:039c)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 560M',), PciDevice('G73GL', '(10de:039e)', [NOUVEAU,NVIDIA], opengl='2.1', title='Quadro FX 560',), PciDevice('G84', '(10de:040a)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 370',), PciDevice('G84M', '(10de:040b)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 320M',), PciDevice('G84M', '(10de:040c)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 570M',), PciDevice('G84', '(10de:040d)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 1600M',), PciDevice('G84', '(10de:040e)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 570',), PciDevice('G84', '(10de:040f)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 1700',), PciDevice('G84M', '(10de:0429)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 140M',), PciDevice('G86M', '(10de:042a)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 130M',), PciDevice('G86M', '(10de:042b)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 135M',), PciDevice('G86M', '(10de:042d)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 360M',), PciDevice('G86', '(10de:042f)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 290',), PciDevice('GT200GL', '(10de:05ed)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadroplex 2200 D2',), PciDevice('GT200GL', '(10de:05f8)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadroplex 2200 S4',), PciDevice('GT200GL', '(10de:05f9)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro CX',), PciDevice('GT200GL', '(10de:05fd)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 5800',), PciDevice('GT200GL', '(10de:05fe)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 4800',), PciDevice('GT200GL', '(10de:05ff)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 3800',), PciDevice('G92GL', '(10de:0619)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 4700 X2',), PciDevice('G92', '(10de:061a)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 3700',), PciDevice('G92GL', '(10de:061b)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro VX 200',), PciDevice('G92M', '(10de:061c)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 3600M',), PciDevice('G92', '(10de:061d)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 2800M',), PciDevice('G92', '(10de:061e)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 3700M',), PciDevice('G92', '(10de:061f)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 3800M',), PciDevice('G94', '(10de:0638)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 1800',), PciDevice('G94M', '(10de:063a)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 2700M',), PciDevice('G96', '(10de:0658)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 380',), PciDevice('G96', '(10de:0659)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 580',), PciDevice('G96', '(10de:065a)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 1700M',), PciDevice('G96M', '(10de:065c)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 770M',), PciDevice('GF100', '(10de:06d8)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 6000',), PciDevice('GF100', '(10de:06d9)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 5000',), PciDevice('', '(10de:06da)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 5000M',), PciDevice('', '(10de:06dc)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 6000',), PciDevice('GF100', '(10de:06dd)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 4000',), PciDevice('G86M', '(10de:06ea)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 150M',), PciDevice('G98M', '(10de:06eb)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 160M',), PciDevice('G98', '(10de:06f8)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 420',), PciDevice('G98', '(10de:06f9)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 370 LP',), PciDevice('G98', '(10de:06fa)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 450',), PciDevice('G98', '(10de:06fb)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 370M',), PciDevice('G98', '(10de:06fd)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro NVS 295',), PciDevice('G98', '(10de:06ff)', [NOUVEAU,NVIDIA], opengl='3.3', title='HICx16 + Graphics',), PciDevice('GT216', '(10de:0a2c)', [NOUVEAU,NVIDIA], opengl='3.3', title='NVS 5100M',), PciDevice('GT216GL', '(10de:0a38)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro 400',), PciDevice('GT216', '(10de:0a3c)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 880M',), PciDevice('GT218', '(10de:0a6a)', [NOUVEAU,NVIDIA], opengl='4.1', title='NVS 2100M',), PciDevice('GT218', '(10de:0a6c)', [NOUVEAU,NVIDIA], opengl='4.1', title='NVS 3100M',), PciDevice('GT218GL', '(10de:0a78)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 380 LP',), PciDevice('GT218', '(10de:0a7c)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 380M',), PciDevice('GT215', '(10de:0cbc)', [NOUVEAU,NVIDIA], opengl='3.3', title='Quadro FX 1800M',), PciDevice('GF106GL', '(10de:0dd8)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 2000',), PciDevice('', '(10de:0914)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 2000D 0x0DD8',), PciDevice('GF106', '(10de:0dda)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 2000M',), PciDevice('', '(10de:0def)', [NOUVEAU,NVIDIA], opengl='None', title='NVS 5400M',), PciDevice('GF108', '(10de:0df8)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 600',), PciDevice('', '(10de:0df9)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 500M',), PciDevice('GF108', '(10de:0dfa)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 1000M',), PciDevice('', '(10de:0dfc)', [NOUVEAU,NVIDIA], opengl='None', title='NVS 5200M',), PciDevice('GF104', '(10de:0e3a)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 3000M',), PciDevice('GF104', '(10de:0e3b)', [NOUVEAU,NVIDIA], opengl='4.1', title='Quadro 4000M',), PciDevice('', '(10de:0ffb)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro K2000M',), PciDevice('', '(10de:0ffc)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro K1000M',), PciDevice('', '(10de:0fff)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 410',), PciDevice('GF108', '(10de:1056)', [NOUVEAU,NVIDIA], opengl='4.1', title='NVS 4200M',), PciDevice('', '(10de:1057)', [NOUVEAU,NVIDIA], opengl='None', title='NVS 4200M',), PciDevice('', '(10de:107d)', [NOUVEAU,NVIDIA], opengl='None', title='NVS 310',), PciDevice('', '(10de:109a)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 5010M',), PciDevice('', '(10de:109b)', [NOUVEAU,NVIDIA], opengl='None', title='Quadro 7000',), PciDevice('GT218', '(10de:10d8)', [NOUVEAU,NVIDIA], opengl='4.1', title='NVS 300',), PciDevice('NV36', '(10de:00fa)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce PCX 5750',), PciDevice('NV35', '(10de:00fb)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce PCX 5900',), PciDevice('NV37GL', '(10de:00fc)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 330/GeForce PCX 5300',), PciDevice('NV37GL', '(10de:00fd)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 330/Quadro NVS 280 PCI-E',), PciDevice('NV38GL', '(10de:00fe)', [NOUVEAU,NV173], opengl='2.1', title='Quadro FX 1300',), PciDevice('NV30', '(10de:0301)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5800 Ultra',), PciDevice('NV30', '(10de:0302)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5800',), PciDevice('NV30GL', '(10de:0308)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 2000',), PciDevice('NV30GL', '(10de:0309)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 1000',), PciDevice('NV31', '(10de:0311)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5600 Ultra',), PciDevice('NV31', '(10de:0312)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5600',), PciDevice('NV31', '(10de:0314)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5600XT',), PciDevice('NV31M', '(10de:031a)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go5600',), PciDevice('NV31M', '(10de:031b)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go5650',), PciDevice('NV31', '(10de:031c)', [NOUVEAU,NV173], opengl='2.1**', title='Quadro FX Go700',), PciDevice('NV34', '(10de:0320)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5200',), PciDevice('NV34', '(10de:0321)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5200 Ultra',), PciDevice('NV34', '(10de:0322)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5200',), PciDevice('NV34', '(10de:0323)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5200LE',), PciDevice('NV34M', '(10de:0324)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go5200',), PciDevice('NV34M', '(10de:0325)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go5250',), PciDevice('NV34', '(10de:0326)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5500',), PciDevice('NV34', '(10de:0327)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5100',), PciDevice('NV34M', '(10de:0328)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go5200 32M/64M',), PciDevice('NV34GL', '(10de:032a)', [NOUVEAU,NV173], opengl='1.5', title='Quadro NVS 55/280 PCI',), PciDevice('NV34GL', '(10de:032b)', [NOUVEAU,NV173], opengl='1.5', title='Quadro FX 500/FX 600',), PciDevice('NV34GLM', '(10de:032c)', [NOUVEAU,NV173], opengl='1.5', title='GeForce FX Go53xx',), PciDevice('NV34', '(10de:032d)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX Go5100',), PciDevice('NV35', '(10de:0330)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5900 Ultra',), PciDevice('NV35', '(10de:0331)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5900',), PciDevice('NV35', '(10de:0332)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5900XT',), PciDevice('NV38', '(10de:0333)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5950 Ultra',), PciDevice('NV35', '(10de:0334)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5900ZT',), PciDevice('NV35GL', '(10de:0338)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 3000',), PciDevice('NV35GL', '(10de:033f)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 700',), PciDevice('NV36.1', '(10de:0341)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5700 Ultra',), PciDevice('NV36.2', '(10de:0342)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5700',), PciDevice('NV36', '(10de:0343)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5700LE',), PciDevice('NV36.4', '(10de:0344)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX 5700VE',), PciDevice('NV36', '(10de:0347)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX Go5700',), PciDevice('NV36', '(10de:0348)', [NOUVEAU,NV173], opengl='2.1**', title='GeForce FX Go5700',), PciDevice('NV36', '(10de:034c)', [NOUVEAU,NV173], opengl='2.1**', title='Quadro FX Go1000',), PciDevice('NV36GL', '(10de:034e)', [NOUVEAU,NV173], opengl='2.0', title='Quadro FX 1100',), PciDevice('NV11', '(10de:0110)', [NOUVEAU,NV96], opengl='1.2', title='GeForce2 MX/MX 400',), PciDevice('NV11DDR', '(10de:0111)', [NOUVEAU,NV96], opengl='1.2', title='GeForce2 MX 100/200',), PciDevice('NV11', '(10de:0112)', [NOUVEAU,NV96], opengl='1.2', title='GeForce2 Go',), PciDevice('NV11GL', '(10de:0113)', [NOUVEAU,NV96], opengl='1.2', title='Quadro2 MXR/EX/Go',), PciDevice('NV17', '(10de:0170)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 460',), PciDevice('NV17', '(10de:0171)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 440',), PciDevice('NV17', '(10de:0172)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 420',), PciDevice('NV17', '(10de:0173)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 440-SE',), PciDevice('NV17', '(10de:0174)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 440 Go',), PciDevice('NV17', '(10de:0175)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 420 Go',), PciDevice('NV17', '(10de:0176)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 420 Go 32M',), PciDevice('NV17', '(10de:0177)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 460 Go',), PciDevice('NV17GL', '(10de:0178)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 550 XGL',), PciDevice('NV17', '(10de:0179)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 440 Go 64M',), PciDevice('NV17GL', '(10de:017a)', [NOUVEAU,NV96], opengl='1.4', title='Quadro NVS 400',), PciDevice('NV17GL', '(10de:017c)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 500 GoGL',), PciDevice('NV17', '(10de:017d)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 410 Go 16M',), PciDevice('NV18', '(10de:0181)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 440 with AGP8X',), PciDevice('NV18', '(10de:0182)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 440SE with AGP8X',), PciDevice('NV18', '(10de:0183)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 420 with AGP8X',), PciDevice('NV18', '(10de:0185)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX 4000',), PciDevice('NV18GL', '(10de:0188)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 580 XGL',), PciDevice('NV18GL', '(10de:018a)', [NOUVEAU,NV96], opengl='1.4', title='Quadro NVS 280 SD',), PciDevice('NV18GL', '(10de:018b)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 380 XGL',), PciDevice('NV18GL', '(10de:018c)', [NOUVEAU,NV96], opengl='1.4', title='Quadro NVS 50 PCI',), PciDevice('NVCrush11', '(10de:01a0)', [NOUVEAU,NV96], opengl='3.3', title='GeForce2 Integrated GPU',), PciDevice('NV18', '(10de:01f0)', [NOUVEAU,NV96], opengl='1.2', title='GeForce4 MX Integrated GPU',), PciDevice('NV20', '(10de:0200)', [NOUVEAU,NV96], opengl='1.3', title='GeForce3',), PciDevice('NV20', '(10de:0201)', [NOUVEAU,NV96], opengl='1.3', title='GeForce3 Ti 200',), PciDevice('NV20', '(10de:0202)', [NOUVEAU,NV96], opengl='1.3', title='GeForce3 Ti 500',), PciDevice('NV20DCC', '(10de:0203)', [NOUVEAU,NV96], opengl='1.4', title='Quadro DCC',), PciDevice('NV25', '(10de:0250)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4600',), PciDevice('NV25', '(10de:0251)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4400',), PciDevice('NV25', '(10de:0253)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4200',), PciDevice('NV25GL', '(10de:0258)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 900 XGL',), PciDevice('NV25GL', '(10de:0259)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 750 XGL',), PciDevice('NV25GL', '(10de:025b)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 700 XGL',), PciDevice('NV28', '(10de:0280)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4800',), PciDevice('NV28', '(10de:0281)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4200 with AGP8X',), PciDevice('NV28', '(10de:0282)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 Ti 4800 SE',), PciDevice('NV28', '(10de:0286)', [NOUVEAU,NV96], opengl='1.4', title='GeForce4 4200 Go',), PciDevice('NV28GL', '(10de:0288)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 980 XGL',), PciDevice('NV28GL', '(10de:0289)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 780 XGL',), PciDevice('NV28GLM', '(10de:028c)', [NOUVEAU,NV96], opengl='1.4', title='Quadro4 700 GoGL',), PciDevice('NV4', '(10de:0020)', [NOUVEAU,NV71], opengl='1.1', title='RIVA TNT',), PciDevice('NV5', '(10de:0028)', [NOUVEAU,NV71], opengl='1.1', title='RIVA TNT2/TNT2 Pro',), PciDevice('NV5', '(10de:0029)', [NOUVEAU,NV71], opengl='1.1', title='RIVA TNT2 Ultra',), PciDevice('NV6', '(10de:002c)', [NOUVEAU,NV71], opengl='1.1', title='Vanta/Vanta LT',), PciDevice('NV5M64', '(10de:002d)', [NOUVEAU,NV71], opengl='1.1', title='RIVA TNT2 Model 64/Model 64 Pro',), PciDevice('NV5', '(10de:00a0)', [NOUVEAU,NV71], opengl='1.1', title='Aladdin TNT2',), PciDevice('NV10', '(10de:0100)', [NOUVEAU,NV71], opengl='1.2', title='GeForce 256',), PciDevice('NV10DDR', '(10de:0101)', [NOUVEAU,NV71], opengl='1.2', title='GeForce DDR',), PciDevice('NV10GL', '(10de:0103)', [NOUVEAU,NV71], opengl='1.2', title='Quadro',), PciDevice('NV15', '(10de:0150)', [NOUVEAU,NV71], opengl='1.2', title='GeForce2 GTS/GeForce2 Pro',), PciDevice('NV15DDR', '(10de:0151)', [NOUVEAU,NV71], opengl='1.2', title='GeForce2 Ti',), PciDevice('NV15BR', '(10de:0152)', [NOUVEAU,NV71], opengl='1.2', title='GeForce2 Ultra',), PciDevice('NV15GL', '(10de:0153)', [NOUVEAU,NV71], opengl='1.2', title='Quadro2 Pro',), ] def get_pci_devices(text): devices = [] if type(text) is list: items = list else: text = text.decode('utf8') if '\n' in text: regex_vga = re.compile('VGA compatible controller (.*)', re.IGNORECASE) items = regex_vga.findall(text) else: items = text.split(' ') if len(items) <= 0: return None for item in items: item = item.strip() if len(item) <= 0: continue for device in pci_devices: if device.rc.search(item): devices.append(device) return devices # For debugging if __name__ == '__main__': from subprocess import Popen, PIPE pci_text = """ 00:02.0 VGA compatible controller [0300]: Intel Corporation Core Processor Integrated Graphics Controller [8086:0046] (rev 02) (prog-if 00 [VGA controller]) Subsystem: Lenovo Device [17aa:215a] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- TAbort- SERR- TAbort- SERR- # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals from datetime import ( datetime, timedelta ) def week_start(dt=None): """ Calculates the ISO week start datetime for the given time @param dt: Datetime to calculate from (defaults to now) @returns: datetime of week start """ if dt is None: dt = datetime.today() week_days = datetime.isoweekday(dt) % 7 week_start = dt - timedelta(days=week_days) return week_start.replace(hour=0, minute=0, second=0, microsecond=0) def utc_date_to_local_datetime(dt): if dt is None: return None utc_offset = datetime.utcnow() - datetime.now() return datetime.strptime(dt, "%Y%m%dT%H%M%SZ") - utc_offset def utc_date_to_isocalendar(timestamp): """Converts '20120216T025651Z' into (year, week, weekday) tuple""" if timestamp is None: return None elif type(timestamp) is tuple: # Assume already in tuple form, just pass-thru return timestamp dt = utc_date_to_local_datetime(timestamp) if dt is None: return None return dt.isocalendar() def total_seconds(td): tsec = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10**6 return tsec if __name__ == '__main__': print(week_start()) td = timedelta(days=10, seconds=2.999) dt = datetime.today() - td print(week_start(dt)) print("%d == %d\n" %(total_seconds(td), td.total_seconds())) xdiagnose-3.8.10/xdiagnose/utils/debug.py0000775000000000000000000000343413151230744015244 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals import sys import time from .text import o2str DEBUGGING = False def _flatten(l): assert type(l) in (list, tuple) return ' '.join(o2str(l)) def stderr_msg(*msg): sys.stderr.write(_flatten(msg) + "\n") sys.stderr.flush() def dbg(*msg): if DEBUGGING: stderr_msg("[%f] " %(time.time()), _flatten(msg)) def warn(*msg): stderr_msg("Warning:", _flatten(msg)) def ERR(*msg): stderr_msg("ERROR:", _flatten(msg)) def die(msg, code=1): import sys ERR(msg) sys.exit(code) xdiagnose-3.8.10/xdiagnose/utils/dicts.py0000775000000000000000000000066213151230744015264 0ustar #!/usr/bin/env python # -*- coding: utf-8 -*- def dicts_equal(dict_a, dict_b): if dict_a is None or dict_b is None: return False # Check if keys are the same if set(dict_a.keys()) != set(dict_b.keys()): return False # Check if values are the same for a,b in zip(dict_a.iteritems(), dict_b.iteritems()): if a != b: return False return True # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/xdiagnose/utils/file_io.py0000775000000000000000000000146013151230744015561 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- from os.path import exists class FileDoesntExist(BaseException): def __init__(self, file_name=None): self.file_name = file_name def __str__(self): return "The file (%s) does not exist" %(self.file_name) def load_binary(filename): assert(filename) if not exists(filename): raise FileDoesntExist(filename) with open(filename, 'rb') as file: data = file.read() return data def load_file(filename): assert(filename) if not exists(filename): raise FileDoesntExist(filename) with open(filename, 'r') as file: lines = file.readlines() return lines def write_file(filename, text): f = open(filename, "w") f.write(text.encode('utf-8')) f.close() # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/xdiagnose/utils/json_io.py0000775000000000000000000000427513151230744015622 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- """JsonIO provides a convenient wrapper to load and save JSON data to files""" import os import json import jsonpickle from debug import ERR from file_io import load_file # TODO: Tests class JsonIO(object): def __init__(self, filename): self.filename = filename jsonpickle.set_encoder_options('simplejson', sort_keys=True, indent=4) def convert_from_dict(self): '''Provides handling of post-processing of data. By default, this just passes through the data unchanged. Subclasses can override this routine to define their own custom conversion logic. This routine must return a function which takes a data dict and return a class object. ''' def converter(data): return data return converter def convert_to_dict(self): '''Handles conversion of an object to a serializable dict. By default, this just passes through the data unchanged. Subclasses can override this routine to define their own custom conversion logic. This routine must return a function that converts a data object into a plain dict. ''' def converter(data): return data return converter def read(self): lines = load_file(self.filename) if not lines: return None json_data = jsonpickle.decode('\n'.join(lines)) return json_data def write(self, data): ftmp = self.filename+'.tmp' pathname = os.path.dirname(self.filename) if pathname and not os.path.exists(pathname): os.makedirs(pathname) try: if os.path.exists(ftmp): os.unlink(ftmp) file = open(ftmp, 'w') text = jsonpickle.encode(data) file.write(text + "\n") file.close() except IOError: ERR("Failed to save %s to file %s" %(type(data), ftmp)) raise return try: os.rename(ftmp, self.filename) except IOError: os.unlink(self.filename) os.rename(ftmp, self.filename) # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/xdiagnose/utils/lists.py0000775000000000000000000000040013151230744015302 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- def to_list(value): if type(value) is list: return value if value.endswith(','): value = value[:-1].strip() return [x.strip() for x in value.split(',')] # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/xdiagnose/utils/math.py0000775000000000000000000000325213151230744015105 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals def clamp(x, low, high): """ Ensures that x is between the limits set by low and high. For example, * clamp(5, 10, 15) is 10. * clamp(15, 5, 10) is 10. * clamp(20, 15, 25) is 20. @param x: the value to clamp. @param low: the minimum value allowed. @param high: the maximum value allowed. @returns: the clamped value """ return min(max(x, low), high) xdiagnose-3.8.10/xdiagnose/utils/node.py0000775000000000000000000001634013151230744015103 0ustar #!/usr/bin/python3 # TODO: Switch to a dict data structure for children # See logic in config.py as example. # This will give faster lookups using less code. # But loses ordering... # Ordering could be handled by separate list of keys class Node(object): '''Wraps an object for storing into a tree structure. For identification purposes, value needs to either be a simple string, a dict with an id field, or an instance of a class that has an id attribute. The value item must also be convertable to str. ''' def __init__(self, value): self.value = value self.children = [] def __str__(self): """ Return a text representation of the node and its children, shown in a bulleted outline format. """ text = '' for depth, item in self.flatten(): if depth: text += "%s+ %s\n" %(' '*depth, item) else: text += "%s\n" %(item) return text def add_child(parent_node, fields): """Append a descendants to the parent's child list. fields is a lineage of child, grandchild, etc. """ assert(parent_node) if len(fields)<=0: return field = fields[0] node = None for child in parent_node.children: assert(child) if child.value == field: node = child if node is None: node = Node(field) parent_node.children.append(node) if len(fields) > 1: node.add_child(fields[1:]) def find(self, key): """ Locate the item with the value matching the given key. If multiple items have the same key, returns the first one found. """ if self.value is not None: if type(self.value) == type(key): if self.value == key: return self elif type(self.value) is dict: id = self.value.get('id', None) if id == key: return self elif hasattr(obj, 'id'): id = self.value.id if id == key: return self for node in self.children: result = node.find(key) if result is not None: return result return None def flatten(self, current_level=0): """ Creates a list representation of the tree. Each element of the list is a tuple of the depth and value. """ items = [] if self.value: items.append((current_level, self.value)) for node in self.children: child_items = node.flatten(current_level+1) items.extend(child_items) return items def list_to_tree(items): root = Node('root') for item in items: root.add_child(item.split('.')) return root if __name__ == "__main__": def test_create_node(): node = Node("parent") node.add_child("child") assert(1 == len(node.children)) def test_add_child(): node = Node("parent") node.add_child("child") assert(1 == len(node.children)) def test_add_child(): node = Node("parent") node.add_child("a") node.add_child("b") node.add_child( "c") assert(3 == len(node.children)) def test_create_tree(): node = Node("parent") node.add_child("a") node.children[0].add_child("1") node.children[0].add_child("2") node.add_child("b") node.children[1].add_child("1") node.children[1].add_child("2") assert(2 == len(node.children)) def test_children_one_level(): data = [ 'a', 'b', 'c', ] repr = """root + a + b + c """ tree = list_to_tree(data) assert(repr == str(tree)) def test_children_two_levels(): data = [ 'a.1', 'a.2', 'a.3', ] repr = """root + a + 1 + 2 + 3 """ tree = list_to_tree(data) assert(repr == str(tree)) def test_children_three_levels(): data = [ 'a.1.1', 'a.2.1', 'a.3.1', ] repr = """root + a + 1 + 1 + 2 + 1 + 3 + 1 """ tree = list_to_tree(data) assert(repr == str(tree)) def test_children_tree(): data = [ 'a.1.1', 'a.1.2', 'a.2.1', ] repr = """root + a + 1 + 1 + 2 + 2 + 1 """ tree = list_to_tree(data) assert(repr == str(tree)) def test_flatten_empty(): data = [] tree = list_to_tree(data) items = tree.flatten() assert((0,'root') == items[0]) def test_flatten_single(): data = ['a'] tree = list_to_tree(data) items = tree.flatten() assert((1,'a') == items[1]) def test_flatten_set(): data = ['a', 'b', 'c'] tree = list_to_tree(data) items = tree.flatten() assert(4 == len(items)) def test_flatten_deep(): data = ['a.b.c.d.e'] tree = list_to_tree(data) items = tree.flatten() assert(6 == len(items)) def test_flatten_tree(): data = ['a.1.1', 'a.1.2', 'a.2', 'a.2.1', 'b.1', 'c.1.1', ] tree = list_to_tree(data) items = tree.flatten() assert(12 == len(items)) def test_find(): data = ['a'] tree = list_to_tree(data) node = tree.find('a') assert('a' == node.value) def test_find_fail(): data = ['a'] tree = list_to_tree(data) node = tree.find('b') assert(None == node) def test_find_deep(): data = ['a.b.c.d.e.f'] tree = list_to_tree(data) node = tree.find('e') assert('e' == node.value) def test_find_in_set(): data = ['a.1', 'a.2', 'a.3', 'b.4', 'b.5', 'c.6' ] tree = list_to_tree(data) node = tree.find('5') assert('5' == node.value) def test_find_from_multiple(): data = ['a.1', 'a.2', 'a.3', 'b.1', 'b.2', 'c.1' ] tree = list_to_tree(data) node = tree.find('2') assert('2' == node.value) test_create_node() test_add_child() test_add_child() test_create_tree() test_children_one_level() test_children_two_levels() test_children_three_levels() test_children_tree() test_flatten_empty() test_flatten_single() test_flatten_set() test_flatten_deep() test_flatten_tree() test_find() test_find_fail() test_find_deep() test_find_in_set() test_find_from_multiple() data = [ 'a.a.a', 'a.b.a', 'a.b.b', 'a.b.c', 'b.a', 'c', 'd', 'd.a.a', ] tree = list_to_tree(data) print(tree) # TODO: Convert back to dotted list xdiagnose-3.8.10/xdiagnose/utils/option_handler.py0000775000000000000000000000522113151230744017157 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals '''Command line options''' import os.path from optparse import OptionParser class OptionHandler(OptionParser): '''Subclass of OptionParser that also tracks descriptions''' def __init__(self, info, app_name=None, arg_names=''): '''Creates an OptionParser instance for the options in this module''' prog = info.PROGNAME usage = None if app_name: app_name = os.path.basename(app_name) prog = "%s %s" %(app_name, info.PROGNAME) usage = "%s %s" %(app_name, arg_names) version = info.VERSION or "(UNRELEASED)" OptionParser.__init__( self, usage=usage, version="%s %s" %(prog, version), epilog="%s - %s" %(info.PROGNAME, info.SHORT_DESCRIPTION) ) self.descriptions = [] def add(self, short_opt, long_opt, **kwargs): '''Adds an option. Example:: opt_hand.add("-d", "--debug", help="Enable debug output", action="store_true", default=False, dest="debug", desc="Turns on verbose debugging output") ''' item = { 'opts': [short_opt, long_opt], 'text': kwargs.get('desc', ''), } self.descriptions.append(item) del kwargs['desc'] self.add_option(short_opt, long_opt, **kwargs) xdiagnose-3.8.10/xdiagnose/utils/paths.py0000775000000000000000000000375213151230744015300 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals import os import fnmatch def find_datadir(program): for d in [ os.path.relpath(os.path.join(os.path.dirname(__file__), "../../data")), os.path.expanduser("~/.local/share/%s" %(program)), "/usr/local/share/%s" %(program), "/usr/share/%s" %(program)]: if os.path.exists(d): return d return None def locate(pattern, root=os.curdir): '''Locate all files matching supplied filename pattern in and below supplied root directory.''' for path, dirs, files in os.walk(os.path.abspath(root)): for filename in fnmatch.filter(files, pattern): yield os.path.join(path, filename) if __name__ == "__main__": print(find_datadir('xdiagnose')) xdiagnose-3.8.10/xdiagnose/utils/processes.py0000775000000000000000000000712713151230744016167 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals from exceptions import Exception from time import sleep from subprocess import (Popen, PIPE) from debug import (stderr_msg, dbg, ERR) # TODO: Make *_with_input be aliases calling the base routines # TODO: Integrate use of dbg and ERR from utils class ReturnCode(Exception): def __init__(self, code, errors=None): self.code = code if type(errors) in (list, tuple): self.errors = errors else: self.errors = [errors] def __str__(self): text = '\n'.join(self.errors) return "%sReturned error code %d" %(text, self.code) def shell(command): """Executes command in a shell, returns stdout; prints errors to stderr""" dbg("shell: %s" %(' '.join(command))) p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) output = "\n".join(p.stdout.readlines()) if p.returncode: raise ReturnCode(p.returncode, p.stderr.readlines()) return output def shell_with_input(command, in_text): dbg("shell_with_input: %s" %(' '.join(command))) p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, stdin=PIPE) output, stderr = p.communicate(input=in_text) if p.returncode: raise ReturnCode(p.returncode, stderr) return output def execute(command, in_text=None): """Executes command, returns stdout; prints errors to stderr""" dbg("execute: `%s`" %(' '.join(command))) if in_text is None: p = Popen(command, shell=False, stdout=PIPE, stderr=PIPE) else: p = Popen(command, shell=False, stdout=PIPE, stderr=PIPE, stdin=PIPE) dbg("execute: polling (%s)..." %(in_text)) while p.poll() is None and p.stdin is not None: dbg("execute: Sending to process stdin") p.stdin.write(in_text) dbg("execute: sleeping") sleep(0.01) output = p.stdout.read() if p.returncode: dbg("Received return code %d" %(p.returncode)) raise ReturnCode(p.returncode, p.stderr.readlines()) return output def execute_with_input(command, in_text): """Executes command, passing in_text to stdin if provided""" execute(command, in_text) def is_X_running(): # TODO: Reuse one of the above commands p = Popen(["xset", "-q"], stdout=PIPE, stderr=PIPE) p.communicate() if p.returncode != 0: print("Error") return p.returncode == 0 xdiagnose-3.8.10/xdiagnose/utils/readurl.py0000775000000000000000000000034213151230744015607 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- import urllib2 def readurl(url): try: fin = urllib2.urlopen(url) content = fin.read() fin.close() return content except: return None xdiagnose-3.8.10/xdiagnose/utils/screen.py0000775000000000000000000000316213151230744015433 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import, print_function, unicode_literals from gi.repository.Gdk import Screen def X_is_running(): '''Returns true if X.org is running''' try: if Screen().get_default(): return True except RuntimeError: pass return False if __name__ == "__main__": if X_is_running(): print("X is running") else: print("X is not running") xdiagnose-3.8.10/xdiagnose/utils/text.py0000775000000000000000000001060413151230744015137 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. '''Routines to encode or convert to and from text''' from __future__ import absolute_import, print_function, unicode_literals from decimal import Decimal def quote(msg): """ Similar to urllib.quote but for glibs GMarkup @param msg: string to quote @returns: quoted string """ msg = msg.replace('&', '&') msg = msg.replace('<', '<') msg = msg.replace('>', '>') return msg def o2str(obj): """ Convert a unicode, decimal.Decimal, datetime object, etc. to a str. Converts lists and tuples of objects into lists of strings. """ retval = None if type(obj) == str: return obj # Type 'unicode' no longer exists in python3 # elif type(obj) == unicode: # return obj.encode('ascii', 'ignore') elif type(obj) == Decimal: return str(obj) elif type(obj) == list or type(obj) is tuple: new_list = [] for item in obj: new_list.append(o2str(item)) return new_list elif str(type(obj)) == "": return obj.ctime() else: #print str(type(obj)) return obj def to_bool(value): """ Converts 'something' to boolean. Raises exception for invalid formats Possible True values: 1, True, '1', 'TRue', 'yes', 'y', 't' Possible False values: 0, False, None, [], {}, '', '0', 'faLse', 'no', 'n', 'f', 0.0 """ if type(value) == type(''): if value.lower() in ("yes", "y", "true", "t", "1"): return True if value.lower() in ("no", "n", "false", "f", "0", "none", ""): return False raise Exception('Invalid value for boolean conversion: ' + value) return bool(value) def o2float(value): '''Converts strings like 42%, 123M, 1.2B into floating point numbers Returned values are in millions, so '1.2B' returns 1200 ''' if value is None: return 0.0 elif type(value) is float: return value elif type(value) is int: return float(value) elif value == '--': return 0.0 value = value.replace(',','') last = value[len(value)-1] if last == 'M': return float(value[:-1]) elif last == 'B': return float(value[:-1]) * 1000 elif last == '%': return float(value[:-1])/100.0 elif last == ')' and value[0] == '(': return -1 * o2float(value[1:-1]) try: return float(value) except ValueError: sys.stderr.write("ofloat: Could not convert '%s' to float\n" %(value)) raise if __name__ == "__main__": test_cases = [ ('true', True), ('t', True), ('yes', True), ('y', True), ('1', True), ('false', False), ('f', False), ('no', False), ('n', False), ('0', False), ('', False), (1, True), (0, False), (1.0, True), (0.0, False), ([], False), ({}, False), ((), False), ([1], True), ({1:2}, True), ((1,), True), (None, False), (object(), True), ] for test, expected in test_cases: assert to_bool(test) == expected, "to_bool("+test+") failed to return "+expected xdiagnose-3.8.10/xdiagnose/utils/url_io.py0000775000000000000000000000152513151230744015446 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- import urllib import lxml.html from text import o2str def tables_from_url(url): data = urllib.urlopen(url).read().decode('utf-8', 'replace') tree = lxml.html.fromstring(o2str(data)) tables = [] for tbl in tree.iterfind('.//table'): tele = [] for tr in tbl.iterfind('.//tr'): try: text = [e.strip() for e in tr.xpath('.//text()') if len(e.strip()) > 0] tele.append(text) except: print(tr) raise yield tele def data_from_url(url): '''Looks up first non-trivial data table from url''' for t in tables_from_url(url): if len(t) >= 5: return t raise Exception("No usable data returned from %s" %(url)) # vi:set ts=4 sw=4 expandtab: xdiagnose-3.8.10/xdiagnose/welcome.py0000775000000000000000000002250213151230744014446 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import os from gi.repository import Gtk import shutil import gettext from gettext import gettext as _ gettext.textdomain('xdiagnose') from .application import Application from .utils.debug import dbg from .utils.processes import execute class XDiagnoseApplication(Application): def __init__(self): Application.__init__(self) self.xorg_conf_path = "/etc/X11/xorg.conf" self.xorg_conf_d_path = "/etc/X11/xorg.conf.d" self.xorg_conf_backup_path = "%s-backup" %(self.xorg_conf_path) self.xorg_conf_d_backup_path = "%s-backup" %(self.xorg_conf_d_path) self.pages['welcome'] = self.create_welcome_page() self.pages['actions'] = self.create_actions_page() self.pages['reconfigure'] = self.create_reconfigure_page() self.pages['troubleshoot'] = self.create_troubleshoot_page() # Refresh self.update_frame() self.window.show_all() self.on_page(None, 'welcome') def create_welcome_page(self): page = self.create_page( 'The system is running in low-graphics mode\n\n' + 'Your graphics and input devices could not be detected correctly. You will need to configure these yourself.') nav_bar = self.create_nav_bar(next_page="actions") page.pack_end(nav_bar, expand=False) return page def create_actions_page(self): page = self.create_page("What would you like to try?") hbox = Gtk.HBox() button1 = self.create_button("Run in low-graphics mode", "Use low-graphics for just one session") button1.connect("clicked", self.on_low_res_mode) button2 = self.create_button("Reconfigure", "Try to automatically fix the problem") button2.connect("clicked", self.on_page, "reconfigure") button3 = self.create_button("Troubleshoot", "Review errors, configs, and logs") button3.connect("clicked", self.on_page, "troubleshoot") button4 = self.create_button("Console", "Exit to the console login") button4.connect("clicked", self.on_exit_to_console) table = Gtk.Table(rows=4, columns=3, homogeneous=False) table.set_border_width(0) table.attach(Gtk.Label(''), 0, 1, 0, 1, xoptions=Gtk.EXPAND) table.attach(button1, 1, 2, 0, 1) table.attach(button2, 1, 2, 1, 2) table.attach(button3, 1, 2, 2, 3) table.attach(button4, 1, 2, 3, 4) table.attach(Gtk.Label(''), 2, 3, 0, 1, xoptions=Gtk.EXPAND) page.pack_start(table, expand=False) nav_bar = self.create_nav_bar(prev_page="welcome") page.pack_end(nav_bar, expand=False) return page def create_reconfigure_page(self): page = self.create_page("How would you like to reconfigure your display?") hbox = Gtk.HBox() button1 = self.create_button("Reset to defaults", "Use default (generic) configuration") button1.connect("clicked", self.on_reset_to_default_xorg_conf) button2 = self.create_button("Generate xorg.conf", "Creates a new configuration for this hardware") button2.connect("clicked", self.on_generate_xorg_conf) button3 = self.create_button("Restore backup", "Use your backed-up configuration") button3.connect("clicked", self.on_restore_backup) table = Gtk.Table(rows=3, columns=3, homogeneous=False) table.set_border_width(0) table.attach(Gtk.Label(''), 0, 1, 0, 1, xoptions=Gtk.EXPAND) table.attach(button1, 1, 2, 0, 1) table.attach(button2, 1, 2, 1, 2) table.attach(button3, 1, 2, 2, 3) table.attach(Gtk.Label(''), 2, 3, 0, 1, xoptions=Gtk.EXPAND) page.pack_start(table, expand=False) nav_bar = self.create_nav_bar(prev_page="actions") page.pack_end(nav_bar, expand=False) return page def create_troubleshoot_page(self): page = self.create_page("What information would you like to review?") hbox = Gtk.HBox() button1 = self.create_button("X server log", "Review the failed session Xorg.0.log") button1.connect("clicked", self.on_view_file, "/var/log/Xorg.0.log") button2 = self.create_button("lightdm's X startup log", "Review the display manager log") button2.connect("clicked", self.on_view_file, "/var/log/lightdm/x-0.log") button3 = self.create_button("Edit X Config", "Edit xorg.conf configuration file") button3.connect("clicked", self.on_edit_file, "/etc/X11/xorg.conf") table = Gtk.Table(rows=4, columns=3, homogeneous=False) table.set_border_width(0) table.attach(Gtk.Label(''), 0, 1, 0, 1, xoptions=Gtk.EXPAND) table.attach(button1, 1, 2, 0, 1) table.attach(button2, 1, 2, 1, 2) table.attach(button3, 1, 2, 2, 3) table.attach(button4, 1, 2, 3, 4) table.attach(Gtk.Label(''), 2, 3, 0, 1, xoptions=Gtk.EXPAND) page.pack_start(table, expand=False) nav_bar = self.create_nav_bar(prev_page="actions") page.pack_end(nav_bar, expand=False) return page def has_backup(self): if (os.path.exists(self.xorg_conf_backup_path) or os.path.exists(self.xorg_conf_d_backup_path)): return True return False def backup_xorg_conf(self): '''Backs up xorg.conf and xorg.conf.d, overwriting any pre-existing backups''' if os.path.exists(self.xorg_conf_path): if os.path.exists(self.xorg_conf_backup_path): shutil.rm(self.xorg_conf_backup_path) shutil.copy(self.xorg_conf_path, self.xorg_conf_backup_path) if os.path.exists(self.xorg_conf_d_path): if os.path.exists(self.xorg_conf_d_backup_path): shutil.rmtree(self.xorg_conf_d_backup_path) shutil.copytree(self.xorg_conf_d_path, self.xorg_conf_d_backup_path) def update_frame(self): self.window.ensure_style() style = self.window.get_style() color = style.bg[Gtk.STATE_SELECTED] self.frame.modify_bg(Gtk.STATE_NORMAL, color) self.page_title.modify_fg(Gtk.STATE_NORMAL, color) def on_page(self, widget, page_name): new_page = self.pages[page_name] if self.current_page is not None: self.frame.remove(self.current_page) if page_name == "welcome": self.page_title.set_markup("Failsafe-X") else: self.page_title.set_markup("Failsafe-X: %s" %(page_name.capitalize())) self.frame.add(new_page) self.current_page = new_page self.frame.show_all() def on_low_res_mode(self, widget): pass def on_exit_to_console(self, widget): pass def on_reset_to_default_xorg_conf(self, widget): if not self.backup_xorg_conf(): dbg("Error: Could not backup the config") return shutils.rm(self.xorg_conf) shutils.rmtree(self.xorg_conf_d) def on_generate_xorg_conf(self, widget): if not self.backup_xorg_conf(): dbg("Error: Could not backup the config") return pass def on_restore_backup(self, widget): pass def on_view_file(self, widget, filename): execute(["zenity", "--text-info", "--filename=%s" %(filename), "--width=640", "--height=480"]) def on_edit_file(self, widget, filename): if not os.path.exists(self.xorg_conf_path): # TODO: Stub in an xorg.conf pass execute(["zenity", "--text-info", "--filename=%s" %(self.xorg_conf_path), "--width=640", "--height=480"]) if __name__ == "__main__": import sys dbg("main: Starting program") app = XDiagnoseApplication() Gtk.main() dbg("main: Ending program") sys.exit(0) xdiagnose-3.8.10/xdiagnose/x_pkg_names.py0000775000000000000000000001074013151230744015307 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2010-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # Required dependency for: # + xorg-pkg-tools # + upstreamer # + upstream-versions # + xgit-checkout import re def compile_table(table): for regex in table: regex['rc'] = re.compile(regex['re'], re.IGNORECASE) def invert_dict(d): return dict([[v,k] for k,v in d.items()]) def group_match_capitalize(match): return match.group(1).capitalize() def group_match_lower(match): return match.group(1).lower() deb_to_fdo_mapping = { # Identically named 'libdmx': 'libdmx', 'libfontenc': 'libfontenc', 'liblbxutil': 'liblbxutil', 'libpciaccess': 'libpciaccess', 'libxkbcommon': 'libxkbcommon', 'libxkbui': 'libxkbui', 'libxkbfile': 'libxkbfile', 'libxtrans': 'libxtrans', 'wayland': 'wayland', # Changed names that don't follow the standard rules 'wayland-demos': 'wayland', 'libdrm': 'drm', 'drm-snapshot': 'drm', 'xorg-server': 'xserver', 'x11proto-core': 'x11proto', 'xfonts-encodings': 'encodings', 'libfs': 'libFS', 'libice': 'libICE', 'libsm': 'libSM', 'libxcalibrate': 'libXCalibrate', 'libxres': 'libXRes', 'libxscrnsaver': 'libXScrnSaver', 'libxtrap': 'libXTrap', 'libxprintapputil': 'libXprintAppUtil', 'libxvmc': 'libXvMC', 'libxprintutil': 'libXprintUtil', } # Note: Duplicate values will get mapped to just one key fdo_to_deb_mapping = invert_dict(deb_to_fdo_mapping) # "Standard" Debian-X renaming rules fdo_to_deb_rename_rules = [ { 're': r'^xf86-(.*)$', 'sub': r'xserver-xorg-\1', }, { 're': r'^(.*)proto$', 'sub': r'x11proto-\1', }, ] compile_table(fdo_to_deb_rename_rules) # Inverse of Debian-X renaming rules deb_to_fdo_rename_rules = [ { 're': r'^lib([a-z])', 'sub': r'lib\1', 'func': group_match_capitalize}, { 're': r'^lib(.*)wm$', 'sub': r'lib\1WM', }, { 're': r'^xtrans(.*)', 'sub': r'libxtrans\1', }, { 're': r'^x11proto-(.*)$', 'sub': r'\1proto', }, { 're': r'^xserver-xorg-(.*)$', 'sub': r'xf86-\1', }, ] compile_table(deb_to_fdo_rename_rules) def lookup(name, mapping, rules): if name is None: return None # Lookup the package name pkg = mapping.get(name, None) if pkg is not None: return pkg # Use standard rename rules for rule in rules: m = rule['rc'].search(name) if not m: continue if 'func' in rule: text = re.sub(rule['re'], rule['func'], name) pat = str(rule.get('sub',None)) return str.replace(pat, '\\1', text) else: return rule['rc'].sub(rule['sub'], name) # Not found; assume the same package name applies return name def debpkg_to_fdopkg(name): return lookup(name, deb_to_fdo_mapping, deb_to_fdo_rename_rules) def fdopkg_to_debpkg(name): return lookup(name, fdo_to_deb_mapping, fdo_to_deb_rename_rules) if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage: %prog ") sys.exit(1) package = sys.argv[1] print(lookup(package, deb_to_fdo_mapping, deb_to_fdo_rename_rules)) xdiagnose-3.8.10/xdiagnose/xorglog.py0000775000000000000000000003126413151230744014501 0ustar #!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- #======================================================================== # # xlogparse # # DESCRIPTION # # Parses Xlog.*.log format files and allows looking up data from it # # AUTHOR # Bryce W. Harrington # # COPYRIGHT # Copyright (C) 2010-2012 Bryce W. Harrington # All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # #======================================================================== import re class XorgLog(object): def __init__(self, logfile=None): self.devices = [ ] self.modules = [ ] self.errors = [ ] self.warnings = [ ] self.info = [ ] self.notimpl = [ ] self.notices = [ ] self.displays = { } self.xserver_version = None self.boot_time = None self.boot_logfile = None self.kernel_version = None self.video_driver = None self.xorg_conf_path = None self.logfile = logfile if logfile: self.parse(logfile) def add_device(self, device, devclass, devtype): device = { 'name': device, 'class': devclass, 'type': devtype } self.devices.append(device) def parse(self, filename): self.displays = {} display = {} display_name = "Unknown" in_file = open(filename, "r") gathering_module = False found_ddx = False module = None for line in in_file.readlines(): #print("Line: %s" % (line)) # TODO: PCI # TODO: extensions # Modules and Devices m = re.search(r'\(..\)', line) if m: if gathering_module and module is not None: self.modules.append(module) gathering_module = False module = None m = re.search('\(II\) Loading.*modules\/drivers\/(.+)_drv\.so', line) if m: found_ddx = True m = re.search(r'\(II\) Module (\w+):', line) if m: module = { 'name': m.group(1), 'vendor': None, 'version': None, 'class': None, 'abi_name': None, 'abi_version': None, 'ddx': found_ddx, } found_ddx = False gathering_module = True if gathering_module: m = re.search(r'vendor="(.*:?)"', line) if m: module['vendor'] = m.group(1) m = re.search(r'module version = (.*)', line) if m: module['version'] = m.group(1) m = re.search(r'class: (.*)', line) if m: module['class'] = m.group(1) m = re.search(r'ABI class:\s+(.*:?), version\s+(.*:?)', line) if m: if m.group(1)[:5] == "X.Org": module['abi_name'] = m.group(1)[6:] else: module['abi_name'] = m.group(1) module['abi_version'] = m.group(2) continue # General details m = re.search(r'Current Operating System: (.*)$', line) if m: uname = m.group(1) self.kernel_version = uname.split()[2] continue m = re.search(r'Kernel command line: (.*)$', line) if m: self.kernel_command_line = m.group(1) continue m = re.search(r'Build Date: (.*)$', line) if m: self.kernel_command_line = m.group(1) continue m = re.search(r'Log file: "(.*)", Time: (.*)$', line) if m: self.boot_logfile = m.group(1) self.boot_time = m.group(2) m = re.search(r'xorg-server ([^ ]+) .*$', line) if m: self.xserver_version = m.group(1) continue m = re.search(r'Using a default monitor configuration.', line) if m and self.xorg_conf_path is None: self.xorg_conf_path = 'default' continue m = re.search(r'Using config file: "(.*)"', line) if m: self.xorg_conf_path = m.group(1) continue # EDID and Modelines m = re.search(r'\(II\) (.*)\(\d+\): EDID for output (.*)', line) if m: self.displays[display_name] = display self.video_driver = m.group(1) display_name = m.group(2) display = {'Output': display_name} continue m = re.search(r'\(II\) (.*)\(\d+\): Assigned Display Device: (.*)$', line) if m: self.displays[display_name] = display self.video_driver = m.group(1) display_name = m.group(2) display = {'Output': display_name} continue m = re.search(r'Manufacturer: (.*) *Model: (.*) *Serial#: (.*)', line) if m: display['display manufacturer'] = m.group(1) display['display model'] = m.group(2) display['display serial no.'] = m.group(3) m = re.search(r'EDID Version: (.*)', line) if m: display['display edid version'] = m.group(1) m = re.search(r'EDID vendor \"(.*)\", prod id (.*)', line) if m: display['vendor'] = m.group(1) display['product id'] = m.group(2) m = re.search(r'Max Image Size \[(.*)\]: *horiz.: (.*) *vert.: (.*)', line) if m: display['size max horizontal'] = "%s %s" %(m.group(2), m.group(1)) display['size max vertical'] = "%s %s" %(m.group(3), m.group(1)) m = re.search(r'Image Size: *(.*) x (.*) (.*)', line) if m: display['size horizontal'] = "%s %s" %(m.group(1), m.group(3)) display['size vertical'] = "%s %s" %(m.group(2), m.group(3)) m = re.search(r'(.*) is preferred mode', line) if m: display['mode preferred'] = m.group(1) m = re.search(r'Modeline \"(\d+)x(\d+)\"x([0-9\.]+) *(.*)$', line) if m: key = "mode %sx%s@%s" %(m.group(1), m.group(2), m.group(3)) display[key] = m.group(4) continue # Errors and Warnings m = re.search(r'\(WW\) (.*)$', line) if m: self.warnings.append(m.group(1)) continue m = re.search(r'\(EE\) (.*)$', line) if m: self.errors.append(m.group(1)) continue m = re.search(r'XINPUT: Adding extended input device "(.*:?)" \(type:\s+(.*:?)\)', line) if m: self.add_device(m.group(1), 'input', m.group(2)) if display_name not in self.displays.keys(): self.displays[display_name] = display in_file.close() def outputs_table(self): s = '' values = {} n = 0 outputs = list(self.displays.keys()) outputs.sort() for output in outputs: display = self.displays[output] if display == {}: continue for key in display.keys(): val = display.get(key, '') if key not in values.keys(): values[key] = [] for i in range(0,n): values[key].append('') values[key].append(val.strip()) n += 1 keys = list(values.keys()) keys.sort() for key in keys: if key[:4] == 'mode': continue s += "%-30s " %(key) for val in values[key]: s += "%15s " %(val) s += "\n" return s def devices_table(self): s = '' for device in self.devices: s += "%-12s %-20s %-s\n" %(device['class'], device['name'], device['type']) return s def modules_table(self): s = '' s += "%-10s %-10s %5s %-30s %-s\n" %("Module", "Version", "ABI", "", "Vendor") lines = [] for module in self.modules: abi_name = module['abi_name'] lines.append("%-10s %-10s %5s %-30s %-s" %( module['name'], module['version'], module['abi_version'], module['abi_name'], module['vendor'])) lines = list(set(lines)) lines.sort() s += "\n".join(lines) s += "\n" return s def errors_filtered(self): excludes = set([ 'error, (NI) not implemented, (??) unknown.', 'Failed to load module "fglrx" (module does not exist, 0)', 'Failed to load module "nv" (module does not exist, 0)', ]) return [err for err in self.errors if err not in excludes] def warnings_filtered(self): excludes = set([ 'warning, (EE) error, (NI) not implemented, (??) unknown.', 'The directory "/usr/share/fonts/X11/cyrillic" does not exist.', 'The directory "/usr/share/fonts/X11/100dpi/" does not exist.', 'The directory "/usr/share/fonts/X11/75dpi/" does not exist.', 'The directory "/usr/share/fonts/X11/100dpi" does not exist.', 'The directory "/usr/share/fonts/X11/75dpi" does not exist.', 'Warning, couldn\'t open module nv', 'Warning, couldn\'t open module fglrx', 'Falling back to old probe method for vesa', 'Falling back to old probe method for fbdev', ]) return [err for err in self.warnings if err not in excludes] def __str__(self): s = self.logfile + ":\n" s += "%15s : %s\n" %("Version", self.xserver_version) s += "%15s : %s\n" %("Boot Time", self.boot_time) s += "%15s : %s\n" %("Logfile", self.boot_logfile) s += "%15s : %s\n" %("Config File", self.xorg_conf_path) if self.video_driver is None: s += "%15s : Unknown\n" %("Video Driver") else: s += "%15s : %s\n" %("Video Driver", self.video_driver.lower()) s += "%15s : %s\n" %("Kernel", self.kernel_version) s += "\n" s += self.modules_table() s += "\n" s += "Outputs:\n" s += self.outputs_table() s += "\n" s += "Devices:\n" s += self.devices_table() s += "\n" s += "Errors:\n" s += "\n".join(self.errors_filtered()) s += "\n" s += "Warnings:\n" s += "\n".join(self.warnings_filtered()) return s def process_record(self, text): print("TODO") self.add_device(device) self.add_module(module) def loadfile(filename, binary=False): opentype = "r" if binary: opentype += "b" in_file = open(filename, opentype) text = in_file.read() in_file.close() return text if __name__ == "__main__": import sys if len(sys.argv) < 2: xlog = XorgLog("/var/log/Xorg.0.log") else: xlog = XorgLog(sys.argv[1]) print(xlog) # TODO: If size == 0x0, handle as a no-edid bug # TODO: If no mode preferred mentioned # TODO: If no modes found # TODO: If max size <10 or >80 # TODO: Look up errors on http://www.x.org/wiki/FAQErrorMessages xdiagnose-3.8.10/xdiagnose.desktop.in0000664000000000000000000000036613151230744014442 0ustar [Desktop Entry] _Name=xdiagnose _GenericName=Diagnose Graphics Issues _Comment=X.org Diagnostic and Repair Utility Exec=xdiagnose-pkexec Icon=xdiagnose Terminal=false Type=Application Categories=System;Settings; X-Ubuntu-Gettext-Domain=xdiagnose