├── prefs.gwrp ├── LICENSE ├── README.md ├── converter.py ├── presets.gwrp ├── COPYING ├── gwinwrap.py └── gwinwrap.glade /prefs.gwrp: -------------------------------------------------------------------------------- 1 | (lp0 2 | S'-s' 3 | p1 4 | aS'-st' 5 | p2 6 | aS'-sp' 7 | p3 8 | aS'-b' 9 | p4 10 | aS'-ni' 11 | p5 12 | aS'-fs' 13 | p6 14 | aS'-nf' 15 | p7 16 | aS'-ov' 17 | p8 18 | a. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This program and all files included in this package are free software; 2 | you can redistribute it and/or modify it under the terms 3 | of the GNU General Public License as published by the Free 4 | Software Foundation; either version 2 of the License, 5 | or (at your option) any later version. 6 | 7 | This program is distributed in the hope that it will be useful, 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 | GNU General Public License for more details. 11 | 12 | You should have received a copy of the GNU General Public License 13 | along with this program; if not, write to the Free Software 14 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Easily add motion to your desktop! 2 | === 3 | 4 | ![](http://farm4.static.flickr.com/3274/2809972354_141e952e3b_o.png) ![](http://farm4.static.flickr.com/3174/2809972350_9c3ac30c85_o.png) ![](http://farm4.static.flickr.com/3012/2809983006_78f320136b_o.png) 5 | 6 | Choose, set, and run--it's that simple. 7 | 8 | A simpler alternative to xwinwrap's confusing commands, this unofficial chooser panel currently supports both xscreensavers and videos (through mplayer). It offers a few options (opacity and whether to use nice) and starts xwinwrap with a screensaver or video of choice (+ optional arguments). If the chosen screensaver allows the "--speed" option, it will detect that and enable the slider (this is not always reliable). 9 | 10 | A few example presets are included, but it's easy to create your own new effects and save them to use again. 11 | 12 | For now, execute it in the directory. It requires xscreensaver and xwinwrap, and mplayer for video support. 13 | 14 | TODO (in order of priority) 15 | === 16 | 17 | - Add a button to show the manpage of the effect the user wishes to use (for easier options reference) 18 | - Add an Import/Export option so that users can share their own custom presets with others. 19 | - Detect screensaver arguments and add widgets accordingly, along with a brief description and the name, rather than filename, of the saver (this would be quite a task). 20 | - Code is written by newbie coder (me), perhaps it needs cleanup. 21 | -------------------------------------------------------------------------------- /converter.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | import pickle, os 5 | 6 | # This is just to be used to convert old presets.gwrp files so that they can work with new gwinwrap. Use if 7 | # you get an error on trying to run an effect. This will not cause a problem if run on already converted files. 8 | 9 | picklefile = "presets.gwrp" 10 | string = "" 11 | newlist = [] 12 | 13 | if os.path.exists(picklefile): 14 | pickleRead = open(picklefile,"r") 15 | settinglist = pickle.load(pickleRead) 16 | pickleRead.close() 17 | if len(settinglist[0]) == 10: 18 | string = "\n\n *** WARNING: it looks like you are either using a new %s or you have already converted it. This will overwrite any video's Loop or Sound settings to default.\n"%picklefile 19 | 20 | print "\nconverter.py will convert all presets in \"%s\".%s"%(picklefile,string) 21 | confirm = raw_input(">>> Continue? (y/n) > ") 22 | if confirm == "y" or confirm == "Y": 23 | print "\n" 24 | for index in range(len(settinglist)): 25 | newlist.append([]) 26 | newlist[index] = settinglist[index][:8] + [True,False] 27 | print "Converted:", settinglist[index][0] 28 | 29 | pickleWrite = open(picklefile,"w") 30 | pickle.dump(newlist,pickleWrite) 31 | pickleWrite.close() 32 | 33 | print "\nDone. Your %s file is now ready to be used with the latest version of gwinwrap."%picklefile 34 | 35 | else: 36 | print "Quitting." 37 | 38 | else: 39 | print "You do not have a %s file."%picklefile 40 | -------------------------------------------------------------------------------- /presets.gwrp: -------------------------------------------------------------------------------- 1 | (lp0 2 | (lp1 3 | S'Atlantis' 4 | p2 5 | aS'fishies swimming around' 6 | p3 7 | aI01 8 | aI0 9 | aS'atlantis' 10 | p4 11 | aF100.0 12 | aI01 13 | aS'' 14 | p5 15 | aI01 16 | aI00 17 | aa(lp6 18 | S'Blocktube' 19 | p7 20 | aS'sliding panes in a tube' 21 | p8 22 | aI01 23 | aI0 24 | aS'blocktube' 25 | p9 26 | aF100.0 27 | aI01 28 | ag5 29 | aI01 30 | aI00 31 | aa(lp10 32 | S'Deco' 33 | p11 34 | aS'art deco on your desktop' 35 | p12 36 | aI01 37 | aI0 38 | aS'deco' 39 | p13 40 | aF100.0 41 | aI01 42 | ag5 43 | aI01 44 | aI00 45 | aa(lp14 46 | S'FuzzyFlakes' 47 | p15 48 | aS'yellow snow in a pink world' 49 | p16 50 | aI01 51 | aI0 52 | aS'fuzzyflakes' 53 | p17 54 | aF100.0 55 | aI01 56 | ag5 57 | aI01 58 | aI00 59 | aa(lp18 60 | S'Lockward' 61 | p19 62 | aS'a simple effect' 63 | p20 64 | aI01 65 | aI0 66 | aS'lockward' 67 | p21 68 | aF100.0 69 | aI01 70 | ag5 71 | aI01 72 | aI00 73 | aa(lp22 74 | S'MatrixView' 75 | p23 76 | aS"it's the matrix too!" 77 | p24 78 | aI01 79 | aI0 80 | aS'matrixview' 81 | p25 82 | aF100.0 83 | aI01 84 | ag5 85 | aI01 86 | aI00 87 | aa(lp26 88 | S'Molecule' 89 | p27 90 | aS'study for chemistry' 91 | p28 92 | aI01 93 | aI0 94 | aS'molecule' 95 | p29 96 | aF100.0 97 | aI01 98 | ag5 99 | aI01 100 | aI00 101 | aa(lp30 102 | S'Penrose' 103 | p31 104 | aS'colored tiles' 105 | p32 106 | aI01 107 | aI0 108 | aS'penrose' 109 | p33 110 | aF100.0 111 | aI01 112 | ag5 113 | aI01 114 | aI00 115 | aa(lp34 116 | S'PopSquares' 117 | p35 118 | aS'wonderful blue squares' 119 | p36 120 | aI01 121 | aI0 122 | aS'popsquares' 123 | p37 124 | aF100.0 125 | aI01 126 | ag5 127 | aI01 128 | aI00 129 | aa(lp38 130 | S'Ripples' 131 | p39 132 | aS'brown raindrops' 133 | p40 134 | aI01 135 | aI0 136 | aS'ripples' 137 | p41 138 | aF100.0 139 | aI01 140 | ag5 141 | aI01 142 | aI00 143 | aa(lp42 144 | S'SkyRocket' 145 | p43 146 | aS'launch your very own rocket!' 147 | p44 148 | aI01 149 | aI0 150 | aS'skyrocket' 151 | p45 152 | aF100.0 153 | aI01 154 | ag5 155 | aI01 156 | aI00 157 | aa(lp46 158 | S'GLMatrix' 159 | p47 160 | aS"it's the matrix!" 161 | p48 162 | aI01 163 | aI0 164 | aS'glmatrix' 165 | p49 166 | aF100.0 167 | aI01 168 | ag5 169 | aI01 170 | aI00 171 | aa(lp50 172 | S'Euphoria' 173 | p51 174 | aS'slow euphoria' 175 | p52 176 | aI01 177 | aF2.7777777777777777 178 | aS'euphoria' 179 | p53 180 | aF100.0 181 | aI01 182 | ag5 183 | aI01 184 | aI00 185 | aa(lp54 186 | S'Helios' 187 | p55 188 | aS'bubbly thingies' 189 | p56 190 | aI01 191 | aI0 192 | aS'helios' 193 | p57 194 | aF100.0 195 | aI01 196 | ag5 197 | aI01 198 | aI00 199 | aa(lp58 200 | S'Lattice' 201 | p59 202 | aS'chains or donuts or something...' 203 | p60 204 | aI01 205 | aI0 206 | aS'lattice' 207 | p61 208 | aF100.0 209 | aI01 210 | ag5 211 | aI01 212 | aI00 213 | aa(lp62 214 | S'Hyperspace' 215 | p63 216 | aS'where are we?' 217 | p64 218 | aI01 219 | aI0 220 | aS'hyperspace' 221 | p65 222 | aF100.0 223 | aI01 224 | ag5 225 | aI01 226 | aI00 227 | aa(lp66 228 | S'CWaves' 229 | p67 230 | aS'smooth horizontalness' 231 | p68 232 | aI01 233 | aI0 234 | aS'cwaves' 235 | p69 236 | aF100.0 237 | aI01 238 | ag5 239 | aI01 240 | aI00 241 | aa(lp70 242 | S'XMatrix' 243 | p71 244 | aS'the ultimate geek dream desktop' 245 | p72 246 | aI01 247 | aI0 248 | aS'xmatrix' 249 | p73 250 | aF100.0 251 | aI01 252 | ag5 253 | aI01 254 | aI00 255 | aa(lp74 256 | S'Flocks' 257 | p75 258 | aS'are they fish or triangles?' 259 | p76 260 | aI01 261 | aI0 262 | aS'flocks' 263 | p77 264 | aF100.0 265 | aI01 266 | ag5 267 | aI01 268 | aI00 269 | aa(lp78 270 | S'Cool Plasma' 271 | p79 272 | aS'plasma with a slow setting' 273 | p80 274 | aI01 275 | aF2.2000000000000002 276 | aS'plasma' 277 | p81 278 | aF50.0 279 | aI01 280 | ag5 281 | aI01 282 | aI00 283 | aa(lp82 284 | S'Circuit' 285 | p83 286 | aS'for the geek in all of us' 287 | p84 288 | aI01 289 | aI0 290 | aS'circuit' 291 | p85 292 | aF100.0 293 | aI01 294 | ag5 295 | aI01 296 | aI00 297 | aa(lp86 298 | S'FieldLines' 299 | p87 300 | aS'colored lines' 301 | p88 302 | aI01 303 | aI0 304 | aS'fieldlines' 305 | p89 306 | aF100.0 307 | aI01 308 | ag5 309 | aI01 310 | aI00 311 | aa(lp90 312 | S'Voronoi' 313 | p91 314 | aS'stars and shapes' 315 | p92 316 | aI01 317 | aI0 318 | aS'voronoi' 319 | p93 320 | aF100.0 321 | aI01 322 | ag5 323 | aI01 324 | aI00 325 | aa(lp94 326 | S'Noof' 327 | p95 328 | aS'swirling stars of color' 329 | p96 330 | aI01 331 | aI0 332 | aS'noof' 333 | p97 334 | aF80.0 335 | aI01 336 | ag5 337 | aI01 338 | aI00 339 | aa. -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 5 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Library General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License 307 | along with this program; if not, write to the Free Software 308 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 309 | 310 | 311 | Also add information on how to contact you by electronic and paper mail. 312 | 313 | If the program is interactive, make it output a short notice like this 314 | when it starts in an interactive mode: 315 | 316 | Gnomovision version 69, Copyright (C) year name of author 317 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 318 | This is free software, and you are welcome to redistribute it 319 | under certain conditions; type `show c' for details. 320 | 321 | The hypothetical commands `show w' and `show c' should show the appropriate 322 | parts of the General Public License. Of course, the commands you use may 323 | be called something other than `show w' and `show c'; they could even be 324 | mouse-clicks or menu items--whatever suits your program. 325 | 326 | You should also get your employer (if you work as a programmer) or your 327 | school, if any, to sign a "copyright disclaimer" for the program, if 328 | necessary. Here is a sample; alter the names: 329 | 330 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 331 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 332 | 333 | , 1 April 1989 334 | Ty Coon, President of Vice 335 | 336 | This General Public License does not permit incorporating your program into 337 | proprietary programs. If your program is a subroutine library, you may 338 | consider it more useful to permit linking proprietary applications with the 339 | library. If this is what you want to do, use the GNU Library General 340 | Public License instead of this License. 341 | -------------------------------------------------------------------------------- /gwinwrap.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of the GNU General Public License 6 | # as published by the Free Software Foundation; either version 2 7 | # of the License, or (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 17 | # 18 | # Author: Gavin Langdon (fusioncast@gmail.com) 19 | # Copyright (C) 2008 Gavin Langdon 20 | 21 | 22 | # TODO:Add filter combobox for movies/savers/all? 23 | 24 | 25 | import sys, subprocess, os, string, re, signal, pickle 26 | try: 27 | import pygtk 28 | pygtk.require("2.6") 29 | except: 30 | pass 31 | try: 32 | import gtk 33 | import gtk.glade 34 | except: 35 | sys.exit(1) 36 | 37 | from optparse import OptionParser 38 | 39 | 40 | class Main: 41 | """This is a GUI to xwinwrap...gwinrwap!""" 42 | 43 | def __init__(self): 44 | print "\n[ Gavin Langdon's GWINWRAP -- Keep it Simple Stupid! ]" 45 | 46 | # TODO: Add a filechooserbutton to choose a custom directory? 47 | if os.path.isdir("/usr/libexec/xscreensaver/"): 48 | self.XSSDir = "/usr/libexec/xscreensaver/" 49 | elif os.path.isdir("/usr/lib64/xscreensaver/"): 50 | self.XSSDir = "/usr/lib64/xscreensaver/" 51 | else: 52 | self.XSSDir = "/usr/lib/xscreensaver/" 53 | 54 | ### ADJUSTABLE VARIABLES -- It won't hurt to edit these a bit 55 | # The nice command 56 | self.nice = ["nice","-n","15"] 57 | # Pickle files 58 | self.pickle = ["presets.gwrp","prefs.gwrp"] 59 | # Startup items directory 60 | self.startupDir = "/.config/autostart/" 61 | ### END AJUSTABLE VARIABLES ### 62 | 63 | print " * Loading Presets..." 64 | self.settingLists = self.ReadFromDisk() 65 | self.PrefCommand = self.ReadFromDisk("preferences") 66 | 67 | # Set the Glade file 68 | print " * Setting up GUI..." 69 | self.gladefile = "gwinwrap.glade" 70 | self.gladeXML = gtk.glade.XML(self.gladefile) 71 | 72 | # Initialize some program variables 73 | self.PreviewShowing = False 74 | self.selectedSaver = "" 75 | self.selectedEffect = "" 76 | self.MakingNew = False 77 | self.CancelPressed = False 78 | self.PresetSelectionProcess = False 79 | self.ScreenSavers = [] 80 | self.OldName = "" 81 | self.MovieFile = "" 82 | 83 | # Create our dictionary and connect it 84 | dic = {"on_Main_destroy" : self.Quit 85 | , "on_Close_clicked" : self.Quit 86 | 87 | , "on_Apply_clicked" : self.Apply 88 | , "on_Refresh_clicked" : self.Refresh 89 | , "on_SaverList_cursor_changed" : self.SaverListSelect 90 | , "on_EffectsList_cursor_changed" : self.EffectsListSelect 91 | , "on_Stop_clicked" : self.Stop 92 | 93 | , "on_Speed_value_changed" : self.OptionChange 94 | , "on_Opacity_value_changed" : self.OptionChange 95 | , "on_CPUPriority_toggled" : self.OptionChange 96 | , "on_SpeedCheckBox_toggled" : self.OptionChange 97 | , "on_ArgLabel_changed" : self.OptionChange 98 | , "on_Loop_toggled" : self.OptionChange 99 | , "on_Sound_toggled" : self.OptionChange 100 | 101 | , "on_XscreensaverClose_clicked" : self.Quit 102 | , "on_XwinwrapClose_clicked" : self.Quit 103 | 104 | , "on_Remove_clicked" : self.Remove 105 | , "on_RemoveConfirm_response" : self.RemoveConfirmResponse 106 | 107 | , "on_New_clicked" : self.PaneChange 108 | , "on_Edit_clicked" : self.PaneChange 109 | , "on_CancelEdit_clicked" : self.PaneChange 110 | , "on_SaveEdit_clicked" : self.PaneChange 111 | , "on_Add_clicked" : self.PaneChange 112 | 113 | , "on_EffectName_changed" : self.EffectSaveableCheck 114 | , "on_EffectDescr_changed" : self.EffectSaveableCheck 115 | 116 | , "on_MovieRadio_toggled" : self.MovieRadioToggled 117 | , "on_SSRadio_toggled" : self.SaverRadioToggled 118 | 119 | , "on_Preferences_clicked" : self.PrefPane 120 | , "on_ClosePrefs_clicked" : self.PrefPane 121 | 122 | , "on_StartupCombo_changed" : self.CheckStartupBox 123 | } 124 | self.gladeXML.signal_autoconnect(dic) 125 | 126 | # Get the widgets we need 127 | # > Explanation for those who don't understand glade: 128 | # This is assigning the xml stuff that the program Glade creates 129 | # to memory so that the program can interact with it. The string names 130 | # come from the widget's name defined in Glade. 131 | 132 | self.Main = self.gladeXML.get_widget("Main") 133 | self.SpeedCheckBox = self.gladeXML.get_widget("SpeedCheckBox") 134 | self.Speed = self.gladeXML.get_widget("Speed") 135 | self.Opacity = self.gladeXML.get_widget("Opacity") 136 | self.Stop = self.gladeXML.get_widget("Stop") 137 | self.Apply = self.gladeXML.get_widget("Apply") 138 | self.Refresh = self.gladeXML.get_widget("Refresh") 139 | self.SpeedHBox = self.gladeXML.get_widget("SpeedHBox") 140 | self.WelcomeBox = self.gladeXML.get_widget("WelcomeBox") 141 | self.Preview = self.gladeXML.get_widget("Preview") 142 | self.NoXscreensavers = self.gladeXML.get_widget("NoXscreensavers") 143 | self.NoXwinwrap = self.gladeXML.get_widget("NoXwinwrap") 144 | self.SaverList = self.gladeXML.get_widget("SaverList") 145 | self.Preview = self.gladeXML.get_widget("Preview") 146 | self.ArgLabel = self.gladeXML.get_widget("ArgLabel") 147 | self.CPUPriority = self.gladeXML.get_widget("CPUPriority") 148 | self.RemoveConfirm = self.gladeXML.get_widget("RemoveConfirm") 149 | self.CustomFrame = self.gladeXML.get_widget("CustomFrame") 150 | self.EditFrame = self.gladeXML.get_widget("EditFrame") 151 | self.SSRadio = self.gladeXML.get_widget("SSRadio") 152 | self.MovieHBox = self.gladeXML.get_widget("MovieHBox") 153 | self.MovieRadio = self.gladeXML.get_widget("MovieRadio") 154 | self.SaveEdit = self.gladeXML.get_widget("SaveEdit") 155 | self.Add = self.gladeXML.get_widget("Add") 156 | self.New = self.gladeXML.get_widget("New") 157 | self.CancelEdit = self.gladeXML.get_widget("CancelEdit") 158 | self.EffectsList = self.gladeXML.get_widget("EffectsList") 159 | self.EffectName = self.gladeXML.get_widget("EffectName") 160 | self.NewHelpBox = self.gladeXML.get_widget("NewHelpBox") 161 | self.Remove = self.gladeXML.get_widget("Remove") 162 | self.EffectDescr = self.gladeXML.get_widget("EffectDescr") 163 | self.Edit = self.gladeXML.get_widget("Edit") 164 | self.DuplicateWarning = self.gladeXML.get_widget("DuplicateWarning") 165 | self.Prefs = self.gladeXML.get_widget("Prefs") 166 | self.Preferences = self.gladeXML.get_widget("Preferences") 167 | self.noinput = self.gladeXML.get_widget("noinput") 168 | self.nofocus = self.gladeXML.get_widget("nofocus") 169 | self.sticky = self.gladeXML.get_widget("sticky") 170 | self.fullscreen = self.gladeXML.get_widget("fullscreen") 171 | self.skiptaskbar = self.gladeXML.get_widget("skiptaskbar") 172 | self.skippager = self.gladeXML.get_widget("skippager") 173 | self.above = self.gladeXML.get_widget("above") 174 | self.below = self.gladeXML.get_widget("below") 175 | self.overrideredirect = self.gladeXML.get_widget("overrideredirect") 176 | self.InfoName = self.gladeXML.get_widget("InfoName") 177 | self.InfoDescr = self.gladeXML.get_widget("InfoDescr") 178 | self.InfoSet = self.gladeXML.get_widget("InfoSet") 179 | self.MovieOptionsHBox = self.gladeXML.get_widget("MovieOptionsHBox") 180 | self.Loop = self.gladeXML.get_widget("Loop") 181 | self.Sound = self.gladeXML.get_widget("Sound") 182 | self.StartupCombo = self.gladeXML.get_widget("StartupCombo") 183 | self.StartupCheckBox = self.gladeXML.get_widget("StartupCheckBox") 184 | 185 | # Check for Xwinwrap 186 | print " * Checking for Xwinwrap and MPlayer..." 187 | if not self.is_installed("xwinwrap"): 188 | self.NoXwinwrap.show() 189 | print " ** You don't have Xwinwrap installed!" 190 | 191 | else: 192 | self.ShantzCheck() 193 | 194 | if not self.is_installed("mplayer"): 195 | self.MovieHBox.set_sensitive(False) 196 | print " ** Disabling video support -- you don't have mplayer installed" 197 | 198 | # Enable RGBA colormap 199 | # > This is so that we have transparent windows. We need to check so we don't 200 | # crash if the theme doesn't support it. 201 | self.gtk_screen = self.Main.get_screen() 202 | self.rgbcolormap = self.gtk_screen.get_rgb_colormap() 203 | self.colormap = self.gtk_screen.get_rgba_colormap() 204 | if self.colormap == None: 205 | self.colormap = self.rgbcolormap 206 | gtk.widget_set_default_colormap(self.colormap) 207 | 208 | print " * Loading global preferences..." 209 | self.PrefButtonID = {self.noinput:"-ni",self.nofocus:"-nf",self.sticky:"-s", 210 | self.fullscreen:"-fs",self.skiptaskbar:"-st", 211 | self.skippager:"-sp",self.above:"-a",self.below:"-b", 212 | self.overrideredirect:"-ov" 213 | } 214 | 215 | self.InitializeChoosers() 216 | 217 | # Enable stopping the already running xwinwrap process 218 | if self.xwinwrap_running(): 219 | self.Stop.set_sensitive(True) 220 | if startOptions.options.stop: 221 | self.KillAll() 222 | if not startOptions.args and not startOptions.options.window: 223 | quit() 224 | if startOptions.options.stop == True and not startOptions.args and not startOptions.options.window: 225 | print " * No need to stop anything, nothing's running.\n" 226 | quit() 227 | 228 | self.SetUpTreeView("effects") 229 | self.SetUpTreeView("screensavers") 230 | 231 | self.StartupCombo.set_model(self.EffectListstore) 232 | 233 | self.startupeffect = self.DesktopEntry() 234 | 235 | self.UpdateStartup() 236 | 237 | # Express Mode 238 | # > This is used to start the effect without the window opening (used for startup command, etc). 239 | if startOptions.args: 240 | if startOptions.args[0] in self.EffectNameList(): 241 | print " * GWINWRAP ** Express mode enabled, launching preset \"%s\" now."%startOptions.args[0] 242 | nameindex = self.EffectNameList(startOptions.args[0]) 243 | self.EffectsListSelection.select_path(nameindex) 244 | self.PresetSelectionProcess = True 245 | self.SetSettings(startOptions.args[0]) 246 | 247 | if self.MovieRadio.get_active(): 248 | self.ComposeCommand("movie",express=True) 249 | else: 250 | self.ComposeCommand("xscreensaver",express=True) 251 | 252 | self.ApplyEffect() 253 | else: 254 | print " * GWINWRAP ** ERROR: The chosen preset \"%s\" does not exist." %startOptions.args[0] 255 | if not startOptions.options.window: 256 | quit() 257 | 258 | self.SetPrefCheckBoxes() 259 | 260 | print " * Showing Main window..." 261 | self.Main.show() 262 | 263 | def UpdateStartup(self): 264 | if self.startupeffect: 265 | self.SettingStartup = True 266 | sortedlist = self.EffectNameList() 267 | newlist = [] 268 | for name in sortedlist: 269 | newlist.append(name.lower()) 270 | newlist.sort() 271 | self.StartupCombo.set_active(newlist.index(self.startupeffect.lower())) 272 | else: 273 | self.StartupCombo.set_active(0) 274 | self.StartupCheckBox.set_active(False) 275 | 276 | def SetPrefCheckBoxes(self): 277 | for pref in self.PrefButtonID: 278 | if self.PrefButtonID[pref] in self.PrefCommand: 279 | pref.set_active(True) 280 | 281 | def PrefPane(self,widget): 282 | if widget == self.Preferences: 283 | self.Prefs.show() 284 | else: 285 | self.Prefs.hide() 286 | self.PrefCommand = [] 287 | for pref in self.PrefButtonID: 288 | if pref.get_active(): 289 | self.PrefCommand = self.PrefCommand + [self.PrefButtonID[pref]] 290 | # FIXME: We should refresh the apply button now if an effect is ready. 291 | 292 | if self.StartupCheckBox.get_active(): 293 | self.DesktopEntry("write",self.StartupCombo.get_active_text()) 294 | else: 295 | self.DesktopEntry("remove") 296 | 297 | def CheckStartupBox(self,widget): 298 | if widget == self.StartupCombo: 299 | self.StartupCheckBox.set_active(True) 300 | self.SettingStartup = False 301 | else: 302 | self.StartupCheckBox.set_active(False) 303 | 304 | def MovieRadioToggled(self,widget): 305 | if widget.get_active() and self.MovieChooser.get_filename(): 306 | self.EffectSaveableCheck(None) 307 | self.ChooseMovie(widget) 308 | 309 | def SaverRadioToggled(self,widget): 310 | if widget.get_active(): 311 | self.EffectSaveableCheck(None) 312 | self.SaverListSelect(None) 313 | 314 | def PaneChange(self,widget): 315 | if widget == self.CancelEdit or widget == self.New: 316 | self.CleanUpPreview() 317 | 318 | if widget == self.New: 319 | self.Preview.hide() 320 | self.Add.show() 321 | self.SaveEdit.hide() 322 | self.ResetSettings() 323 | self.NewHelpBox.show() 324 | 325 | if widget == self.Edit: 326 | self.SaveEdit.show() 327 | self.Add.hide() 328 | self.SaveEdit.set_sensitive(False) 329 | # Save a copy of the label for identification later 330 | self.OldName = self.EffectName.get_text() 331 | 332 | if widget == self.CancelEdit: 333 | self.CancelPressed = True 334 | self.EffectsListSelect(widget) 335 | self.CloseEditing() 336 | 337 | if widget == self.SaveEdit: 338 | self.Save() 339 | 340 | if widget == self.Add: 341 | self.Save(overwrite=False) 342 | 343 | if widget == self.New or widget == self.Edit: 344 | self.CustomFrame.hide() 345 | self.EditFrame.show() 346 | 347 | def Save(self,overwrite=True): 348 | if not self.SpeedCheckBox.get_active(): 349 | speed = 0 350 | else: 351 | speed = self.Speed.get_value() 352 | 353 | if self.SSRadio.get_active(): 354 | selectedrow, locInRow = self.SaverListSelection.get_selected() 355 | if locInRow: 356 | coreEffect = selectedrow.get_value(locInRow,0) 357 | else: 358 | coreEffect = self.MovieChooser.get_filename() 359 | 360 | self.TempSettings = [self.EffectName.get_text(),self.EffectDescr.get_text(),self.SSRadio.get_active(),speed,coreEffect, 361 | self.Opacity.get_value(),self.CPUPriority.get_active(),self.ArgLabel.get_text(),self.Loop.get_active(), 362 | self.Sound.get_active()] 363 | if overwrite: 364 | self.EffectManager(self.OldName,mode="remove") 365 | self.EffectManager(mode="add") 366 | self.GetSavedEffects() 367 | sortednames = [] 368 | for name in self.EffectNameList(): 369 | sortednames = sortednames + [name.lower()] 370 | sortednames.sort() 371 | newname = self.TempSettings[0] 372 | nameindex = sortednames.index(newname.lower()) 373 | self.EffectsListSelection.select_path(nameindex) 374 | self.EffectsList.scroll_to_cell(nameindex,use_align=True) 375 | self.CloseEditing() 376 | self.UpdateStartup() 377 | self.OldName = "" 378 | 379 | def CloseEditing(self): 380 | self.EditFrame.hide() 381 | self.CustomFrame.show() 382 | 383 | if self.is_selected(self.EffectsListSelection): 384 | self.EffectsListSelect(None) 385 | else: 386 | self.WelcomeBox.show() 387 | self.ResetSettings() 388 | 389 | def StripPath(self,moviefile): 390 | 'Strips the path from the filename so it just displays the name' 391 | strippedfilename = "" 392 | for letterindex in range(len(moviefile)-1,0,-1): 393 | if moviefile[letterindex] == "/": 394 | return strippedfilename 395 | else: 396 | strippedfilename = moviefile[letterindex] + strippedfilename 397 | return strippedfilename 398 | 399 | def SetInfoSet(self): 400 | string = "" 401 | select = True 402 | 403 | 404 | if self.SSRadio.get_active() and self.selectedSaver: 405 | string = "\"%s\" screensaver"%self.selectedSaver 406 | elif self.MovieRadio.get_active() and self.MovieFile: 407 | string = "\"%s\" video"%self.StripPath(self.MovieFile) 408 | 409 | else: 410 | select = False 411 | self.InfoSet.set_markup(" ") 412 | 413 | if select: 414 | 415 | if self.SpeedCheckBox.get_active(): 416 | speedsetting = ", custom speed ~%u"%self.Speed.get_value() 417 | else: speedsetting = "" 418 | 419 | if self.ArgLabel.get_text() != "": 420 | args = ", custom options \"%s\""%self.ArgLabel.get_text() 421 | else: args = "" 422 | 423 | if self.CPUPriority.get_active(): 424 | cpu = ", low CPU priority" 425 | else: cpu = "" 426 | 427 | if self.MovieRadio.get_active(): 428 | if self.Loop.get_active(): 429 | loop = ", looping" 430 | else: loop = "" 431 | 432 | if self.Sound.get_active(): 433 | sound = ", with sound" 434 | else: sound = "" 435 | 436 | else: 437 | sound = "" 438 | loop = "" 439 | 440 | string = string + "%s%s, %i%% opacity%s%s%s"%(loop,sound,self.Opacity.get_value(),speedsetting,cpu,args) 441 | 442 | self.InfoSet.set_markup("%s"%string) 443 | 444 | def EffectSaveableCheck(self,widget): 445 | if widget == self.EffectName: 446 | # Avoid a resize when textbox is filled and emptied 447 | if widget.get_text() == "": 448 | self.InfoName.set_markup(" ") 449 | else: 450 | self.InfoName.set_markup("%s"%widget.get_text()) 451 | 452 | elif widget == self.EffectDescr: 453 | self.InfoDescr.set_markup("%s"%widget.get_text()) 454 | 455 | DupeShowing = False 456 | if not self.PresetSelectionProcess: 457 | self.SetInfoSet() 458 | 459 | lowerlist = [] 460 | for name in self.EffectNameList(): 461 | lowerlist.append(name.lower()) 462 | 463 | if self.EffectName.get_text().lower() in lowerlist and self.EffectName.get_text() != self.OldName: 464 | self.DuplicateWarning.show() 465 | DupeShowing = True 466 | else: 467 | DupeShowing = False 468 | 469 | if self.EffectName.get_text() != "" and not DupeShowing: 470 | 471 | if self.is_selected(self.SaverListSelection) and self.SSRadio.get_active() or self.movieSetAndChosen(): 472 | self.Add.set_sensitive(True) 473 | self.SaveEdit.set_sensitive(True) 474 | else: 475 | self.Add.set_sensitive(False) 476 | self.SaveEdit.set_sensitive(False) 477 | else: 478 | self.Add.set_sensitive(False) 479 | self.SaveEdit.set_sensitive(False) 480 | 481 | if not DupeShowing: 482 | self.DuplicateWarning.hide() 483 | 484 | def ChooseMovie(self,widget): 485 | if self.MovieChooser.get_filename(): 486 | self.MovieOptionsHBox.show() 487 | self.EffectSaveableCheck(None) 488 | self.SpeedHBox.hide() 489 | self.MovieRadio.set_active(True) 490 | self.MovieFile = self.MovieChooser.get_filename() 491 | self.ShowPreview() 492 | 493 | def Remove(self,widget): 494 | self.RemoveConfirm.show() 495 | 496 | def RemoveConfirmResponse(self,widget,response): 497 | self.RemoveConfirm.hide() 498 | if response==0: 499 | selectedRow, locInRow = self.EffectsListSelection.get_selected() 500 | if locInRow: 501 | self.EffectManager(selectedRow.get_value(locInRow,0),"remove") 502 | self.Remove.set_sensitive(False) 503 | self.CleanUpPreview() 504 | self.ResetSettings() 505 | self.WelcomeBox.show() 506 | self.Edit.set_sensitive(False) 507 | self.GetSavedEffects() 508 | self.UpdateStartup() 509 | 510 | 511 | def InitializeChoosers(self): 512 | self.MovieFilter = gtk.FileFilter() 513 | self.MovieFilter.add_mime_type("video/*") 514 | 515 | self.MovieChooser = gtk.FileChooserDialog(title="Choose a video file",buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) 516 | self.MovieChooser.set_current_folder(os.getenv("HOME")) 517 | self.MovieChooser.set_filter(self.MovieFilter) 518 | 519 | self.MovieChooserButton = gtk.FileChooserButton(self.MovieChooser) 520 | self.MovieChooserButton.connect("file_set",self.ChooseMovie) 521 | self.MovieChooserButton.show() 522 | 523 | self.MovieHBox.add(self.MovieChooserButton) 524 | 525 | def ShowPreview(self): 526 | 'Shows a preview of the selected xscreensaver within a gtk.Socket' 527 | self.Apply.set_sensitive(True) 528 | self.CleanUpPreview() 529 | self.Preview.show() 530 | 531 | self.Socket = self.SetUpSocket("socket") 532 | 533 | if self.MovieRadio.get_active(): 534 | previewcommand = self.ComposeCommand("movie") 535 | else: 536 | previewcommand = self.ComposeCommand("xscreensaver") 537 | 538 | self.previewShow = self.Run(previewcommand) 539 | self.Socket.show() 540 | 541 | self.SetInfoSet() 542 | 543 | self.PreviewShowing = True 544 | 545 | def ApplyEffect(self, New=True): 546 | 'If the effect is a new one, compose a new xwinwrap command. Then quit any currently running instances, then(finally), run the xwinwrap command.' 547 | if New: 548 | self.command = self.ComposeCommand() 549 | self.Refresh.set_sensitive(True) 550 | self.RunEffect() 551 | 552 | def RunEffect(self): 553 | self.KillAll() 554 | if self.MovieRadio.get_active(): 555 | self.CleanUpPreview() 556 | cmd = "" 557 | for item in self.command: 558 | cmd = cmd + item + " " 559 | print " * GWINWRAP ** Running: " + cmd 560 | self.Run(self.command) 561 | 562 | def Refresh(self, widget): 563 | self.ApplyEffect(False) 564 | 565 | def Apply(self, widget): 566 | self.Apply.set_sensitive(False) 567 | self.Stop.set_sensitive(True) 568 | self.ApplyEffect() 569 | 570 | def Stop(self, widget): 571 | self.Stop.set_sensitive(False) 572 | if self.is_selected(self.EffectsListSelection) or self.MovieFile: 573 | self.Apply.set_sensitive(True) 574 | self.Refresh.set_sensitive(False) 575 | self.KillAll() 576 | 577 | def SaverListSelect(self, widget): 578 | 'Get the new label, change the preview and buttons accordingly. Also, check for speed now so we don t need to so frequently.' 579 | selectedRow, locInRow = self.SaverListSelection.get_selected() 580 | if locInRow: 581 | if widget != self.SSRadio or self.SSRadio.get_active(): 582 | if not self.SSRadio.get_active(): 583 | self.SSRadio.set_active(True) 584 | self.MovieOptionsHBox.hide() 585 | self.EffectSaveableCheck(widget) 586 | self.selectedSaver = selectedRow.get_value(locInRow,0) 587 | self.UsingSpeed, self.UsingFPS = self.UsingCheck() 588 | self.ShowPreview() 589 | 590 | def GetScreenSavers(self): 591 | 'Get a list of the screensavers in the xscreensaver directory' 592 | filelist = os.listdir(self.XSSDir) 593 | for item in filelist: 594 | if self.is_saver(item): 595 | self.ScreenSavers.append(item) 596 | if len(self.ScreenSavers) == 0: 597 | self.NoXscreensavers.show() 598 | print "You don't have any Xscreensavers in %s" %self.XSSDir 599 | self.ScreenSavers.sort() 600 | for item in self.ScreenSavers: 601 | 602 | self.SaverListstore.append([item]) 603 | 604 | def CleanUpPreview(self): 605 | 'Clean up the old preview/welcome note in preparation for the new preview' 606 | if self.PreviewShowing: 607 | self.Socket.destroy() 608 | self.Run(["kill","%s"%self.previewShow.pid]) 609 | self.PreviewShowing = False 610 | else: 611 | self.WelcomeBox.hide() 612 | self.NewHelpBox.hide() 613 | 614 | def movieSetAndChosen(self): 615 | if self.MovieRadio.get_active() and self.MovieChooser.get_filename(): 616 | return True 617 | else: return False 618 | 619 | def OptionChange(self,widget): 620 | 'This is in order to save changes like opacity' 621 | if widget == self.SaverList: 622 | self.SSRadio.set_active(True) 623 | 624 | if self.is_selected(self.SaverListSelection) or self.movieSetAndChosen(): 625 | self.SetInfoSet() 626 | self.Apply.set_sensitive(True) 627 | self.SaveEdit.set_sensitive(True) 628 | if widget in [self.Speed,self.SpeedCheckBox,self.Loop,self.Sound]: 629 | if widget == self.Speed: 630 | self.SpeedCheckBox.set_active(True) 631 | 632 | if not self.PresetSelectionProcess: 633 | self.ShowPreview() 634 | 635 | def KillAll(self,item="xwinwrap"): 636 | if self.xwinwrap_running(): 637 | print " * GWINWRAP ** Killing current %s process."%item 638 | self.Run(["killall",item]) 639 | 640 | def xwinwrap_running(self): 641 | 'Use pidof and pgrep to determine if xwinwrap is running' 642 | if subprocess.call(['pidof','xwinwrap'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0 or subprocess.call(['pgrep','xwinwrap'], stdout=subprocess.PIPE) == 0: 643 | return True 644 | 645 | def is_installed(self,app): 646 | 'Use which to determine if xwinwrap is installed' 647 | if subprocess.call(['which',app], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0: 648 | return True 649 | 650 | def UsingCheck(self): 651 | 'Check the selected screensaver for an option by reading its --help output' 652 | helpfile = subprocess.Popen(["%s%s" %(self.XSSDir,self.selectedSaver),"--help"], stdout=subprocess.PIPE,stderr=subprocess.STDOUT).communicate()[0] 653 | 654 | if string.find(helpfile,"-speed") >= 0: 655 | speed = True 656 | else: speed = False 657 | 658 | if string.find(helpfile,"-maxfps") >= 0: 659 | maxfps = True 660 | else: maxfps = False 661 | 662 | return speed,maxfps 663 | 664 | def ShantzCheck(self): 665 | #FIXME: Move to UsingCheck (I'm lazy) 666 | helpfile = subprocess.Popen(["xwinwrap","--help"], stdout=subprocess.PIPE,stderr=subprocess.STDOUT).communicate()[0] 667 | if string.find(helpfile,"-ov") >= 0: 668 | self.overrideredirect.set_sensitive(True) 669 | else: 670 | print " * Gwinwrap suggests installing Shantz Xwinwrap for a better experience." 671 | if self.overrideredirect.get_active(): 672 | self.overrideredirect.set_active(False) 673 | self.PrefPane(None) 674 | 675 | 676 | 677 | def SetUpSpeedList(self): 678 | 'Custom values in order to make the speed-affected screensavers slower. Roughly merges the --maxfps option with the --speed option.' 679 | if self.SpeedCheckBox.get_active(): 680 | speedvalue = self.Speed.get_value() 681 | speedArg = [] 682 | fpsArg = None 683 | if speedvalue >= 5.0: 684 | speed = speedvalue - 5 685 | elif self.UsingFPS: 686 | speed = 1 687 | fps = speedvalue + 10 688 | fpsArg = ["--maxfps","%f"%fps] 689 | else: 690 | speed = speedvalue 691 | 692 | speedArg = speedArg + ["--speed","%i"%speed] 693 | self.Command = self.Command + speedArg 694 | 695 | if fpsArg: 696 | self.Command = self.Command + fpsArg 697 | 698 | def SetUpTreeView(self,treeview="screensavers"): 699 | if treeview == "screensavers": 700 | treewidget = self.SaverList 701 | columns = ["screensavers"] 702 | self.SaverListstore = gtk.ListStore(str) 703 | self.GetScreenSavers() 704 | self.SaverList.set_model(self.SaverListstore) 705 | self.SaverListSelection = self.SaverList.get_selection() 706 | 707 | if treeview == "effects": 708 | treewidget = self.EffectsList 709 | columns = ["Name","Description"] 710 | 711 | self.EffectListstore = gtk.ListStore(str,str) 712 | 713 | self.GetSavedEffects() 714 | self.EffectsList.set_model(self.EffectListstore) 715 | self.EffectsListSelection = self.EffectsList.get_selection() 716 | 717 | for column in columns: 718 | treewidget.insert_column_with_attributes(-1,column,gtk.CellRendererText(),text=columns.index(column)) 719 | 720 | if treeview == "effects": 721 | self.EffectListstore.set_sort_column_id(0,gtk.SORT_ASCENDING) 722 | 723 | def EffectManager(self,name=None,mode="add"): 724 | 'Adds settings, or removes settings.' 725 | if mode == "remove": 726 | self.settingLists.pop(self.EffectNameList(name)) 727 | 728 | if mode == "add": 729 | self.settingLists = self.settingLists + [self.TempSettings] 730 | 731 | def DesktopEntry(self,mode="read",effect=None): 732 | 'Adds a desktop entry in [home]/.config/autostart/ linking to a bash script in the gwinwrap directory...' 733 | # FIXME: this is probably not the best way to do it. The bash script changes directories so that gwinwrap 734 | # knows where the gladefile is. 735 | 736 | gwrpdir = os.getcwd() 737 | home = os.getenv("HOME") 738 | twofiles = ["%s/startup"%gwrpdir,"%s%sgwinwrap.desktop"%(home,self.startupDir)] 739 | 740 | if mode == "write": 741 | for onefile in twofiles: 742 | if os.path.exists(onefile): 743 | os.remove(onefile) 744 | 745 | bashstring = "#!/bin/bash\ncd %s\n./gwinwrap.py \"%s\""%(gwrpdir,effect) 746 | 747 | write = open(twofiles[0], "w") 748 | write.write(bashstring) 749 | write.close() 750 | 751 | self.Run(["chmod","+x","%s/startup"%gwrpdir]) 752 | 753 | desktopstring = "\n[Desktop Entry]\nType=Application\nEncoding=UTF-8\nVersion=1.0\nName=Gwinwrap Startup\nName[en_US]=Gwinwrap Startup\nComment[en_US]=Required for effect auto-start.\nComment=Required for effect auto-start.\nExec=%s/startup\nX-Gnome-Autostart-enabled=true"%gwrpdir 754 | 755 | write = open(twofiles[1],"w") 756 | write.write(desktopstring) 757 | write.close() 758 | 759 | self.startupeffect = effect 760 | 761 | print " * GWINWRAP ** Created a bash script in %s and added a desktop entry to %s which launches it. The effect \"%s\" will now start at login."%(gwrpdir,self.startupDir,effect) 762 | 763 | elif mode == "read": 764 | if os.path.exists(twofiles[0]) and os.path.exists(twofiles[1]): 765 | read = open(twofiles[0],"r") 766 | bashstring = read.read() 767 | counter = -1 768 | for letter in bashstring: 769 | counter = counter + 1 770 | if letter == "\"": 771 | return string.strip(bashstring[counter:],"\"\n") 772 | 773 | 774 | elif os.path.exists(twofiles[0]): 775 | os.remove(twofiles[0]) 776 | return None 777 | 778 | elif os.path.exists(twofiles[1]): 779 | os.remove(twofiles[1]) 780 | return None 781 | else: 782 | return None 783 | 784 | elif mode == "remove": 785 | removed = False 786 | for onefile in twofiles: 787 | if os.path.exists(onefile): 788 | removed = True 789 | os.remove(onefile) 790 | if removed: 791 | print " * GWINWRAP ** Removed desktop entry and bash script." 792 | 793 | 794 | def SaveToDisk(self, mode="presets"): 795 | if mode == "presets": 796 | picklefile = self.pickle[0] 797 | dump = self.settingLists 798 | elif mode == "preferences": 799 | picklefile = self.pickle[1] 800 | dump = self.PrefCommand 801 | 802 | pickleWrite = open(picklefile,"w") 803 | pickle.dump(dump,pickleWrite) 804 | pickleWrite.close() 805 | 806 | def ReadFromDisk(self,mode="presets"): 807 | if mode == "presets": 808 | picklefile = self.pickle[0] 809 | elif mode == "preferences": 810 | picklefile = self.pickle[1] 811 | 812 | if os.path.exists(picklefile): 813 | pickleRead = open(picklefile,"r") 814 | readitems = pickle.load(pickleRead) 815 | pickleRead.close() 816 | 817 | if mode == "presets": 818 | returnableitems = [] 819 | 820 | # Make sure all effects use installed savers or are movies 821 | 822 | # FIXME: This results in effects with uninstalled screensavers or incorrect filepaths getting deleted from the pickle. 823 | # It might be better to just ignore them. 824 | 825 | for index in range(len(readitems)): 826 | if self.is_saver(readitems[index][4]): 827 | returnableitems = returnableitems + [readitems[index]] 828 | elif not readitems[index][2] and os.path.exists(readitems[index][4]): 829 | returnableitems = returnableitems + [readitems[index]] 830 | return returnableitems 831 | 832 | elif mode == "preferences": 833 | return readitems 834 | 835 | else: 836 | return [] 837 | 838 | def EffectNameList(self,name=None): 839 | namelist = [] 840 | for effectid in range(len(self.settingLists)): 841 | namelist.append(self.settingLists[effectid][0]) 842 | 843 | if name: 844 | return namelist.index(name) 845 | else: 846 | return namelist 847 | 848 | def GetSavedEffects(self): 849 | self.EffectListstore.clear() 850 | for effectid in range(len(self.settingLists)): 851 | self.EffectListstore.append([self.settingLists[effectid][0],self.settingLists[effectid][1]]) 852 | 853 | def EffectsListSelect(self,widget): 854 | selectedRow, locInRow = self.EffectsListSelection.get_selected() 855 | if locInRow: 856 | if selectedRow.get_value(locInRow,0) != self.selectedEffect or self.CancelPressed: 857 | self.PresetSelectionProcess = True 858 | 859 | self.CancelPressed = False 860 | self.Remove.set_sensitive(True) 861 | self.Edit.set_sensitive(True) 862 | self.selectedEffect = selectedRow.get_value(locInRow,0) 863 | self.SetSettings(self.selectedEffect) 864 | self.ShowPreview() 865 | self.PresetSelectionProcess = False 866 | 867 | 868 | def ResetSettings(self): 869 | self.selectedSaver = "" 870 | self.EffectName.set_text("") 871 | self.EffectDescr.set_text("") 872 | self.Opacity.set_value(100) 873 | self.Speed.set_value(1.0) 874 | self.CPUPriority.set_active(True) 875 | self.SpeedHBox.hide() 876 | self.SpeedCheckBox.set_active(False) 877 | self.ArgLabel.set_text("") 878 | self.SaveEdit.set_sensitive(False) 879 | self.Add.set_sensitive(False) 880 | self.SaverListSelection.unselect_all() 881 | self.SaverList.scroll_to_cell(0,use_align=True) 882 | self.Apply.set_sensitive(False) 883 | self.MovieChooser.unselect_all() 884 | self.MovieRadio.set_active(True) 885 | self.DuplicateWarning.hide() 886 | self.OldName = "" 887 | self.InfoName.set_markup(" ") 888 | self.InfoDescr.set_text("") 889 | self.InfoSet.set_markup(" ") 890 | self.MovieOptionsHBox.hide() 891 | 892 | def SetSettings(self,name): 893 | self.ResetSettings() 894 | settingslist = self.settingLists[self.EffectNameList(name)] 895 | 896 | self.EffectName.set_text(settingslist[0]) 897 | self.EffectDescr.set_text(settingslist[1]) 898 | 899 | if settingslist[2]: 900 | # If using a screensaver 901 | self.SSRadio.set_active(True) 902 | self.selectedSaver = settingslist[4] 903 | self.UsingSpeed,self.UsingFPS = self.UsingCheck() 904 | saverid = self.ScreenSavers.index(settingslist[4]) 905 | self.SaverListSelection.select_path(saverid) 906 | self.SaverList.scroll_to_cell(saverid,use_align=True) 907 | self.MovieOptionsHBox.hide() 908 | else: 909 | self.MovieFile = settingslist[4] 910 | self.MovieChooser.set_filename(self.MovieFile) 911 | self.MovieRadio.set_active(True) 912 | 913 | if settingslist[3] > 0: 914 | # If the speed is set at higher than or equal to 1, count it. 915 | self.Speed.set_value(settingslist[3]) 916 | 917 | if not settingslist[6]: 918 | # If the priority setting is not on 919 | self.CPUPriority.set_active(False) 920 | 921 | # Set looping 922 | self.Loop.set_active(settingslist[8]) 923 | # Set sound 924 | self.Sound.set_active(settingslist[9]) 925 | 926 | # Set any saved arguments 927 | self.ArgLabel.set_text(settingslist[7]) 928 | 929 | # Set opacity 930 | self.Opacity.set_value(settingslist[5]) 931 | 932 | 933 | def is_selected(self,TreeViewSelection): 934 | selectedRow, locInRow = TreeViewSelection.get_selected() 935 | if locInRow: 936 | return True 937 | 938 | def is_saver(self,saver): 939 | 'Just checking to make sure there arent any directories in the list.' 940 | #FIXME: Check more carefully (not just for dirs) 941 | if os.path.exists(self.XSSDir + saver) and not os.path.isdir(self.XSSDir + saver): 942 | return True 943 | else: 944 | return False 945 | 946 | def SetUpSocket(self,mode="socket"): 947 | 'Attach the socket and color it black to avoid flashes when changing previews' 948 | # Disable alpha colormap 949 | gtk.widget_set_default_colormap(self.rgbcolormap) 950 | if mode == "socket": 951 | Socket = gtk.Socket() 952 | 953 | elif mode == "drawingarea": 954 | Socket = gtk.DrawingArea() 955 | 956 | self.Preview.add(Socket) 957 | black = gtk.gdk.Color(red=0, green=0, blue=0, pixel=0) 958 | Socket.modify_bg(gtk.STATE_NORMAL,black) 959 | 960 | # Re-enable alpha colormap 961 | gtk.widget_set_default_colormap(self.colormap) 962 | 963 | return Socket 964 | 965 | def ComposeCommand(self,mode="xwinwrap",express=False): 966 | 'Create the command to use when launching either xwinwrap or the previews' 967 | baseCommand = ["xwinwrap"] + self.PrefCommand 968 | 969 | # Screensavers that use images -- they can't run with -argb option 970 | imagesavers = ["antspotlight","blitspin","bumps","carousel","decayscreen","distort","flipscreen3d","gleidescope","glslideshow","jigsaw", 971 | "mirrorblob","rotzoomer","slidescreen","spotlight","twang","zoom","pacman","bubbles","xmatrix"] 972 | 973 | if mode == "xwinwrap": 974 | opacity = float(self.Opacity.get_value()) 975 | opacity = opacity/100 976 | 977 | Args = self.ArgLabel.get_text() 978 | 979 | if self.CPUPriority.get_active(): 980 | baseCommand = self.nice + baseCommand 981 | 982 | if not self.selectedSaver in imagesavers and self.SSRadio.get_active(): 983 | baseCommand.append("-argb") 984 | 985 | command = baseCommand + ["-o","%f"%opacity,"--"] + self.Command 986 | 987 | if Args: 988 | command = command + [Args] 989 | 990 | 991 | if self.MovieRadio.get_active(): 992 | command = command + ["-wid","WID"] 993 | else: 994 | command = command + ["-window-id","WID"] 995 | 996 | elif mode == "xscreensaver": 997 | 998 | self.Command = ["%s%s"%(self.XSSDir,self.selectedSaver)] 999 | 1000 | if self.UsingSpeed: 1001 | self.SpeedHBox.show() 1002 | self.SetUpSpeedList() 1003 | 1004 | else: 1005 | self.SpeedHBox.hide() 1006 | self.Speed.set_value(1.00) 1007 | self.SpeedCheckBox.set_active(False) 1008 | 1009 | if not express: 1010 | command = self.Command + ["-window-id","%i"%self.Socket.window.xid] 1011 | command = self.nice + command 1012 | 1013 | elif mode == "movie": 1014 | self.Command = ["mplayer","%s"%self.MovieFile,"-quiet","-noconsolecontrols"] 1015 | if self.Loop.get_active(): 1016 | self.Command = self.Command + ["-loop","0"] 1017 | if not self.Sound.get_active(): 1018 | self.Command.append("-nosound") 1019 | 1020 | if not express: 1021 | command = self.Command + ["-wid","%i"%self.Socket.window.xid] 1022 | 1023 | elif mode == "all": 1024 | command = baseCommand + ["1","--","%s%s"%(self.XSSDir,self.selectedSaver),"-window-id","WID"] 1025 | 1026 | if not express: 1027 | return command 1028 | 1029 | 1030 | def Run(self,command): 1031 | 'Launch quietly, and return the object for PID referencing so that we can kill it later' 1032 | # signal.signal(signal.SIGCHLD, signal.SIG_IGN) 1033 | popen_object = subprocess.Popen(command, stdout=open(os.devnull, 'w'),stderr=open(os.devnull,'w')) 1034 | 1035 | return popen_object 1036 | 1037 | 1038 | def Quit(self, widget): 1039 | self.CleanUpPreview() 1040 | self.SaveToDisk() 1041 | self.SaveToDisk("preferences") 1042 | gtk.widget_pop_colormap() 1043 | gtk.main_quit() 1044 | 1045 | class startOptions: 1046 | """This is a separate class which checks the startup command for options.""" 1047 | parser = OptionParser(usage="usage: %prog SCREENSAVER [options]",description="QUICK START: If you want, you can use %prog to automatically run one of your preset effects by adding the name (including case, spaces require quotation marks) after ./%prog. For example: ./%prog \"Cool Plasma\" will start the Cool Plasma preset effect. This option disables the rest of the interface.") 1048 | 1049 | parser.add_option("-w", "--window", action="store_true", dest="window", default=False, 1050 | help="Show the interface even if running an effect directly.") 1051 | parser.add_option("-s", "--stop", action="store_true", dest="stop", default=False, 1052 | help="An 'off' button. Quits any xwinwrap instances, then quits itself.") 1053 | 1054 | options, args = parser.parse_args() 1055 | 1056 | 1057 | if __name__ == "__main__": 1058 | run = Main() 1059 | gtk.main() 1060 | -------------------------------------------------------------------------------- /gwinwrap.glade: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 800 7 | 500 8 | True 9 | Gwinwrap 10 | GTK_WIN_POS_CENTER 11 | 12 | 13 | 14 | True 15 | 10 16 | 17 | 18 | 300 19 | True 20 | True 21 | 22 | 23 | 300 24 | True 25 | 5 26 | 27 | 28 | 29 | 30 | True 31 | What the effect should be called. This must be unique. 32 | 5 33 | 34 | 35 | True 36 | Name: 37 | 38 | 39 | False 40 | 41 | 42 | 43 | 44 | True 45 | True 46 | 20 47 | True 48 | 49 | 50 | 51 | 1 52 | 53 | 54 | 55 | 56 | False 57 | 5 58 | 59 | 60 | 61 | 62 | True 63 | The description of the effect (optional) 64 | 5 65 | 66 | 67 | True 68 | Description: 69 | 70 | 71 | False 72 | 73 | 74 | 75 | 76 | True 77 | True 78 | 79 | 80 | 81 | 1 82 | 83 | 84 | 85 | 86 | False 87 | 5 88 | 1 89 | 90 | 91 | 92 | 93 | True 94 | 5 95 | 96 | 97 | True 98 | True 99 | Video: 100 | 0 101 | True 102 | True 103 | 104 | 105 | 106 | False 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | False 115 | 5 116 | 2 117 | 118 | 119 | 120 | 121 | True 122 | 123 | 124 | True 125 | True 126 | Screen Saver: 127 | 0 128 | True 129 | True 130 | MovieRadio 131 | 132 | 133 | 134 | False 135 | 136 | 137 | 138 | 139 | True 140 | True 141 | GTK_POLICY_AUTOMATIC 142 | GTK_POLICY_AUTOMATIC 143 | GTK_SHADOW_ETCHED_IN 144 | 145 | 146 | True 147 | True 148 | True 149 | False 150 | True 151 | 152 | 153 | 154 | 155 | 156 | 5 157 | 1 158 | 159 | 160 | 161 | 162 | This slider attempts to adjust the speed of the screensaver. Use the Terminal Options bar below for exact numbers. 163 | 5 164 | 165 | 166 | True 167 | True 168 | Custom Speed 169 | 0 170 | True 171 | 172 | 173 | 174 | False 175 | 176 | 177 | 178 | 179 | True 180 | True 181 | GTK_UPDATE_DELAYED 182 | 1 1 75 15 10 10 183 | False 184 | 185 | 186 | 187 | 1 188 | 189 | 190 | 191 | 192 | False 193 | 2 194 | 195 | 196 | 197 | 198 | 3 199 | 200 | 201 | 202 | 203 | True 204 | 5 205 | 206 | 207 | True 208 | True 209 | Adjusts the opacity of the effect (how much the real desktop shows through) 210 | 211 | 212 | True 213 | Adjust the opacity of the effect 214 | Opacity 215 | 216 | 217 | False 218 | 219 | 220 | 221 | 222 | True 223 | True 224 | Adjust the opacity of the effect 225 | GTK_UPDATE_DELAYED 226 | 100 0 110 1 10 10 227 | False 228 | 100 229 | 0 230 | GTK_POS_RIGHT 231 | 232 | 233 | 234 | 5 235 | 1 236 | 237 | 238 | 239 | 240 | False 241 | 242 | 243 | 244 | 245 | True 246 | 247 | 248 | True 249 | True 250 | True 251 | Choose whether or not to be nice to other processes (nice -n 15) 252 | Low CPU priority 253 | 0 254 | True 255 | True 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | True 264 | True 265 | Whether or not to loop the video 266 | Loop 267 | 0 268 | True 269 | True 270 | 271 | 272 | 273 | 274 | 275 | True 276 | True 277 | Whether the video should have sound or not. 278 | Sound 279 | 0 280 | True 281 | 282 | 283 | 284 | 1 285 | 286 | 287 | 288 | 289 | 1 290 | 291 | 292 | 293 | 294 | False 295 | 1 296 | 297 | 298 | 299 | 300 | True 301 | Extra options for the effect. Common options include "-speed #" and "-maxfps #". Consult the man pages of the effect for more details. 302 | 5 303 | 304 | 305 | True 306 | Options: 307 | 308 | 309 | False 310 | 311 | 312 | 313 | 314 | True 315 | True 316 | True 317 | 318 | 319 | 320 | 1 321 | 322 | 323 | 324 | 325 | True 326 | False 327 | True 328 | True 329 | Apply the current options to the preview 330 | 0 331 | 332 | 333 | True 334 | gtk-apply 335 | 1 336 | 337 | 338 | 339 | 340 | False 341 | 2 342 | 343 | 344 | 345 | 346 | True 347 | False 348 | True 349 | True 350 | Run the manual for this effect to find information about possible commands 351 | 0 352 | 353 | 354 | True 355 | gtk-find 356 | 1 357 | 358 | 359 | 360 | 361 | False 362 | 3 363 | 364 | 365 | 366 | 367 | False 368 | 2 369 | 370 | 371 | 372 | 373 | False 374 | 10 375 | 4 376 | 377 | 378 | 379 | 380 | 381 | 382 | True 383 | gtk-dialog-error 384 | 385 | 386 | False 387 | 388 | 389 | 390 | 391 | True 392 | 0.05000000074505806 393 | <b>You are already using this name for another preset. Names must be unique.</b> 394 | True 395 | True 396 | 397 | 398 | 5 399 | 1 400 | 401 | 402 | 403 | 404 | False 405 | 5 406 | 5 407 | 408 | 409 | 410 | 411 | True 412 | 10 413 | GTK_BUTTONBOX_EDGE 414 | 415 | 416 | True 417 | True 418 | True 419 | Cancel editing this effect 420 | gtk-cancel 421 | True 422 | 0 423 | 424 | 425 | 426 | 427 | 428 | True 429 | False 430 | True 431 | Add this effect to the list 432 | gtk-add 433 | True 434 | 0 435 | 436 | 437 | 438 | 1 439 | 440 | 441 | 442 | 443 | False 444 | True 445 | Save changes to this effect. 446 | gtk-save 447 | True 448 | 0 449 | 450 | 451 | 452 | 2 453 | 454 | 455 | 456 | 457 | False 458 | 6 459 | 460 | 461 | 462 | 463 | 464 | 465 | True 466 | 467 | 468 | 5 469 | 470 | 471 | True 472 | All 473 | Screensavers 474 | Videos 475 | 476 | 477 | False 478 | 479 | 480 | 481 | 482 | True 483 | True 484 | Filter... 485 | 486 | 487 | 1 488 | 489 | 490 | 491 | 492 | False 493 | 494 | 495 | 496 | 497 | True 498 | True 499 | GTK_POLICY_AUTOMATIC 500 | GTK_POLICY_AUTOMATIC 501 | GTK_SHADOW_ETCHED_IN 502 | 503 | 504 | True 505 | True 506 | 507 | 508 | 509 | 510 | 511 | 5 512 | 1 513 | 514 | 515 | 516 | 517 | True 518 | 10 519 | GTK_BUTTONBOX_EDGE 520 | 521 | 522 | True 523 | False 524 | True 525 | True 526 | Remove this effect permanently 527 | gtk-remove 528 | True 529 | 0 530 | 531 | 532 | 533 | 534 | 535 | True 536 | False 537 | True 538 | True 539 | Edit this effect 540 | gtk-edit 541 | True 542 | 0 543 | 544 | 545 | 546 | 1 547 | 548 | 549 | 550 | 551 | True 552 | True 553 | True 554 | Add a new effect 555 | gtk-new 556 | True 557 | 0 558 | 559 | 560 | 561 | 2 562 | 563 | 564 | 565 | 566 | False 567 | 2 568 | 569 | 570 | 571 | 572 | 1 573 | 574 | 575 | 576 | 577 | False 578 | False 579 | 580 | 581 | 582 | 583 | True 584 | 4 585 | 5 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 5 594 | 595 | 596 | 597 | 598 | True 599 | 10 600 | 601 | 602 | True 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | True 611 | 612 | 613 | True 614 | 15 615 | gtk-dialog-info 616 | 6 617 | 618 | 619 | False 620 | 621 | 622 | 623 | 624 | True 625 | 626 | 627 | True 628 | 0 629 | 10 630 | <b><big><big>Getting Started</big></big></b> 631 | True 632 | 633 | 634 | 635 | 636 | True 637 | 5 638 | 639 | 640 | True 641 | 642 | 643 | False 644 | 645 | 646 | 647 | 648 | True 649 | 0 650 | <b>Choose an effect from the list</b> 651 | True 652 | True 653 | 654 | 655 | 1 656 | 657 | 658 | 659 | 660 | 5 661 | 1 662 | 663 | 664 | 665 | 666 | True 667 | 5 668 | 669 | 670 | True 671 | 672 | 673 | False 674 | 675 | 676 | 677 | 678 | True 679 | 0 680 | <b>Apply the effect</b> 681 | True 682 | 683 | 684 | 1 685 | 686 | 687 | 688 | 689 | 5 690 | 2 691 | 692 | 693 | 694 | 695 | True 696 | 5 697 | 698 | 699 | True 700 | GTK_SHADOW_ETCHED_IN 701 | 702 | 703 | False 704 | 705 | 706 | 707 | 708 | True 709 | 0 710 | <b>Create your own custom effects</b> 711 | True 712 | True 713 | 714 | 715 | 1 716 | 717 | 718 | 719 | 720 | 5 721 | 3 722 | 723 | 724 | 725 | 726 | True 727 | 5 728 | 729 | 730 | True 731 | GTK_SHADOW_ETCHED_IN 732 | 733 | 734 | False 735 | 736 | 737 | 738 | 739 | True 740 | 0 741 | <b>Set an effect to run on startup in the Preferences</b> 742 | True 743 | True 744 | 745 | 746 | 1 747 | 748 | 749 | 750 | 751 | 5 752 | 4 753 | 754 | 755 | 756 | 757 | False 758 | 5 759 | 1 760 | 761 | 762 | 763 | 764 | False 765 | 5 766 | 1 767 | 768 | 769 | 770 | 771 | True 772 | 773 | 774 | 775 | 776 | 777 | 2 778 | 779 | 780 | 781 | 782 | 1 783 | 784 | 785 | 786 | 787 | 788 | 789 | True 790 | 791 | 792 | 793 | 794 | 795 | 1 796 | 797 | 798 | 799 | 800 | True 801 | 802 | 803 | True 804 | 5 805 | 806 | 807 | True 808 | 15 809 | gtk-dialog-info 810 | 6 811 | 812 | 813 | False 814 | 815 | 816 | 817 | 818 | True 819 | 820 | 821 | True 822 | 0 823 | 10 824 | <b><big><big>Adding a New Effect</big></big></b> 825 | True 826 | 827 | 828 | 829 | 830 | True 831 | 5 832 | 833 | 834 | True 835 | 836 | 837 | False 838 | 839 | 840 | 841 | 842 | True 843 | 0 844 | <b>Type in a name and description</b> 845 | True 846 | True 847 | 848 | 849 | 1 850 | 851 | 852 | 853 | 854 | 5 855 | 1 856 | 857 | 858 | 859 | 860 | True 861 | 5 862 | 863 | 864 | True 865 | 866 | 867 | False 868 | 869 | 870 | 871 | 872 | True 873 | 0 874 | <b>Choose a video or screensaver</b> 875 | True 876 | 877 | 878 | 1 879 | 880 | 881 | 882 | 883 | 5 884 | 2 885 | 886 | 887 | 888 | 889 | True 890 | 5 891 | 892 | 893 | True 894 | GTK_SHADOW_ETCHED_IN 895 | 896 | 897 | False 898 | 899 | 900 | 901 | 902 | True 903 | 0 904 | <b>Set options for your effect</b> 905 | True 906 | True 907 | 908 | 909 | 1 910 | 911 | 912 | 913 | 914 | 5 915 | 3 916 | 917 | 918 | 919 | 920 | True 921 | 5 922 | 923 | 924 | True 925 | GTK_SHADOW_ETCHED_IN 926 | 927 | 928 | False 929 | 930 | 931 | 932 | 933 | True 934 | 0 935 | <b>Test your effect on the desktop by clicking Apply</b> 936 | True 937 | True 938 | 939 | 940 | 1 941 | 942 | 943 | 944 | 945 | 5 946 | 4 947 | 948 | 949 | 950 | 951 | True 952 | 5 953 | 954 | 955 | True 956 | GTK_SHADOW_ETCHED_IN 957 | 958 | 959 | False 960 | 961 | 962 | 963 | 964 | True 965 | 0 966 | <b>Save your effect by clicking Add</b> 967 | True 968 | True 969 | 970 | 971 | 1 972 | 973 | 974 | 975 | 976 | 5 977 | 5 978 | 979 | 980 | 981 | 982 | False 983 | 5 984 | 1 985 | 986 | 987 | 988 | 989 | False 990 | 991 | 992 | 993 | 994 | False 995 | 1 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 2 1004 | 1005 | 1006 | 1007 | 1008 | 120 1009 | True 1010 | 0 1011 | 1012 | 1013 | True 1014 | 5 1015 | 3 1016 | 2 1017 | 5 1018 | 5 1019 | 1020 | 1021 | True 1022 | 0 1023 | True 1024 | True 1025 | 1026 | 1027 | 1 1028 | 2 1029 | 1 1030 | 2 1031 | GTK_FILL 1032 | 1033 | 1034 | 1035 | 1036 | True 1037 | 0 1038 | <b> </b> 1039 | True 1040 | True 1041 | 1042 | 1043 | 1 1044 | 2 1045 | 2 1046 | 3 1047 | 1048 | 1049 | 1050 | 1051 | True 1052 | 0 1053 | <big><b> </b></big> 1054 | True 1055 | True 1056 | 1057 | 1058 | 1 1059 | 2 1060 | GTK_FILL 1061 | 1062 | 1063 | 1064 | 1065 | True 1066 | 1 1067 | Name: 1068 | 1069 | 1070 | GTK_FILL 1071 | GTK_FILL 1072 | 1073 | 1074 | 1075 | 1076 | True 1077 | 1 1078 | Description: 1079 | 1080 | 1081 | 1 1082 | 2 1083 | GTK_FILL 1084 | GTK_FILL 1085 | 1086 | 1087 | 1088 | 1089 | True 1090 | 1 1091 | Launch: 1092 | 1093 | 1094 | 2 1095 | 3 1096 | GTK_FILL 1097 | GTK_FILL 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | True 1105 | <b>Effect Information</b> 1106 | True 1107 | 1108 | 1109 | label_item 1110 | 1111 | 1112 | 1113 | 1114 | False 1115 | 3 1116 | 1117 | 1118 | 1119 | 1120 | True 1121 | False 1122 | 1123 | 1124 | 1125 | 1126 | 5 1127 | 1128 | 1129 | 1130 | 1131 | True 1132 | 5 1133 | GTK_BUTTONBOX_END 1134 | 1135 | 1136 | True 1137 | True 1138 | True 1139 | True 1140 | Close the window without saving changes 1141 | gtk-close 1142 | True 1143 | 0 1144 | 1145 | 1146 | 1147 | False 1148 | 1149 | 1150 | 1151 | 1152 | True 1153 | False 1154 | True 1155 | True 1156 | True 1157 | Apply the new settings and close the window 1158 | gtk-refresh 1159 | True 1160 | 0 1161 | 1162 | 1163 | 1164 | False 1165 | 1 1166 | 1167 | 1168 | 1169 | 1170 | True 1171 | False 1172 | True 1173 | True 1174 | Stop the currently running effect 1175 | gtk-stop 1176 | True 1177 | 0 1178 | 1179 | 1180 | 1181 | 2 1182 | 1183 | 1184 | 1185 | 1186 | True 1187 | False 1188 | True 1189 | True 1190 | True 1191 | Apply the new settings to the desktop 1192 | gtk-apply 1193 | True 1194 | 0 1195 | 1196 | 1197 | 1198 | False 1199 | 3 1200 | 1201 | 1202 | 1203 | 1204 | True 1205 | True 1206 | True 1207 | Show the Preferences pane 1208 | gtk-preferences 1209 | True 1210 | 0 1211 | 1212 | 1213 | 1214 | 4 1215 | True 1216 | 1217 | 1218 | 1219 | 1220 | False 1221 | 1 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | 5 1229 | Xscreensavers Not Found! 1230 | False 1231 | True 1232 | GTK_WIN_POS_CENTER_ON_PARENT 1233 | True 1234 | gtk-dialog-error 1235 | GDK_WINDOW_TYPE_HINT_DIALOG 1236 | True 1237 | True 1238 | False 1239 | 1240 | 1241 | True 1242 | 1243 | 1244 | True 1245 | 2 1246 | 2 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | True 1253 | 10 1254 | If you haven't already, please install some xscreensaver and/or gnome-screensaver packages and restart Gwinwrap to continue. 1255 | 1256 | Alternatively, your xscreensavers may be located elsewhere than /usr/lib/xscreensaver/. If that is the case, edit the variables in gwinwrap.py accordingly. 1257 | 1258 | True 1259 | True 1260 | 1261 | 1262 | 1 1263 | 2 1264 | 1 1265 | 2 1266 | 1267 | 1268 | 1269 | 1270 | True 1271 | 0 1272 | 10 1273 | 20 1274 | <b><big>Couldn't find any Xscreensavers.</big></b> 1275 | True 1276 | 1277 | 1278 | 1 1279 | 2 1280 | 1281 | 1282 | 1283 | 1284 | True 1285 | gtk-dialog-error 1286 | 6 1287 | 1288 | 1289 | 1290 | 1291 | 15 1292 | 1 1293 | 1294 | 1295 | 1296 | 1297 | True 1298 | GTK_BUTTONBOX_END 1299 | 1300 | 1301 | True 1302 | True 1303 | True 1304 | gtk-close 1305 | True 1306 | 0 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | False 1313 | GTK_PACK_END 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 5 1321 | Xwinwrap not installed! 1322 | False 1323 | True 1324 | GTK_WIN_POS_CENTER_ON_PARENT 1325 | True 1326 | gtk-dialog-error 1327 | GDK_WINDOW_TYPE_HINT_DIALOG 1328 | True 1329 | True 1330 | False 1331 | 1332 | 1333 | True 1334 | 1335 | 1336 | True 1337 | 2 1338 | 2 1339 | 1340 | 1341 | 1342 | 1343 | 1344 | True 1345 | 10 1346 | Gwinwrap uses Xwinwrap to run all effects. It cannot run them by itself. Please install xwinwrap and restart gwinwrap to continue. 1347 | 1348 | <b>Note:</b> Xwinwrap is not included in the Ubuntu repositories. Ubuntu users may try searching GetDeb.net for a package. Shantz Xwinwrap (available elsewhere) is recommended for a better experience. 1349 | True 1350 | True 1351 | 1352 | 1353 | 1 1354 | 2 1355 | 1 1356 | 2 1357 | 1358 | 1359 | 1360 | 1361 | True 1362 | 0 1363 | 0.25 1364 | 10 1365 | 20 1366 | <b><big>Xwinwrap does not appear to be installed.</big></b> 1367 | True 1368 | 1369 | 1370 | 1 1371 | 2 1372 | 1373 | 1374 | 1375 | 1376 | True 1377 | 0.25 1378 | gtk-dialog-error 1379 | 6 1380 | 1381 | 1382 | 1383 | 1384 | 15 1385 | 1 1386 | 1387 | 1388 | 1389 | 1390 | True 1391 | GTK_BUTTONBOX_END 1392 | 1393 | 1394 | True 1395 | True 1396 | True 1397 | gtk-quit 1398 | True 1399 | 0 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | False 1406 | GTK_PACK_END 1407 | 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 5 1414 | Remove Effect 1415 | False 1416 | True 1417 | GTK_WIN_POS_CENTER_ON_PARENT 1418 | gtk-dialog-warning 1419 | GDK_WINDOW_TYPE_HINT_DIALOG 1420 | True 1421 | True 1422 | False 1423 | 1424 | 1425 | 1426 | True 1427 | 1428 | 1429 | True 1430 | 2 1431 | 1432 | 1433 | True 1434 | 0 1435 | 0.25 1436 | 10 1437 | 20 1438 | <b><big>Permanently remove this customized effect?</big></b> 1439 | True 1440 | 1441 | 1442 | 1 1443 | 2 1444 | 1445 | 1446 | 1447 | 1448 | True 1449 | 0.25 1450 | gtk-dialog-warning 1451 | 6 1452 | 1453 | 1454 | 1455 | 1456 | 15 1457 | 1 1458 | 1459 | 1460 | 1461 | 1462 | True 1463 | GTK_BUTTONBOX_END 1464 | 1465 | 1466 | True 1467 | True 1468 | True 1469 | gtk-cancel 1470 | True 1471 | -1 1472 | 1473 | 1474 | 1475 | 1476 | True 1477 | True 1478 | True 1479 | gtk-ok 1480 | True 1481 | 0 1482 | 1483 | 1484 | 1 1485 | 1486 | 1487 | 1488 | 1489 | False 1490 | GTK_PACK_END 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1497 | 10 1498 | Preferences 1499 | False 1500 | True 1501 | GTK_WIN_POS_CENTER_ON_PARENT 1502 | True 1503 | gtk-preferences 1504 | GDK_WINDOW_TYPE_HINT_DIALOG 1505 | True 1506 | 1507 | 1508 | True 1509 | 5 1510 | 1511 | 1512 | True 1513 | 10 1514 | 1515 | 1516 | True 1517 | gtk-preferences 1518 | 5 1519 | 1520 | 1521 | False 1522 | 1523 | 1524 | 1525 | 1526 | True 1527 | 0 1528 | <big><b>Preferences</b></big> 1529 | True 1530 | 1531 | 1532 | 1 1533 | 1534 | 1535 | 1536 | 1537 | False 1538 | 1539 | 1540 | 1541 | 1542 | True 1543 | 0 1544 | 1545 | 1546 | True 1547 | 5 1548 | 5 1549 | 1550 | 1551 | True 1552 | You can choose to run a preset effect when your computer starts: 1553 | 1554 | 1555 | 1556 | 1557 | True 1558 | 5 1559 | 1560 | 1561 | True 1562 | True 1563 | Run on startup: 1564 | 0 1565 | True 1566 | 1567 | 1568 | False 1569 | 1570 | 1571 | 1572 | 1573 | True 1574 | 1575 | 1576 | 1577 | 1578 | 1 1579 | 1580 | 1581 | 1582 | 1583 | 1 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | True 1591 | <b>Run on Startup</b> 1592 | True 1593 | 1594 | 1595 | label_item 1596 | 1597 | 1598 | 1599 | 1600 | 1 1601 | 1602 | 1603 | 1604 | 1605 | True 1606 | True 1607 | 5 1608 | 1609 | 1610 | True 1611 | 0 1612 | 1613 | 1614 | True 1615 | 4 1616 | 5 1617 | 2 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | True 1624 | False 1625 | True 1626 | Override Redirect 1627 | 0 1628 | True 1629 | 1630 | 1631 | 4 1632 | 5 1633 | 1634 | 1635 | 1636 | 1637 | True 1638 | True 1639 | No Input 1640 | 0 1641 | True 1642 | 1643 | 1644 | 1645 | 1646 | True 1647 | True 1648 | Full Screen 1649 | 0 1650 | True 1651 | 1652 | 1653 | 1 1654 | 2 1655 | 1 1656 | 2 1657 | 1658 | 1659 | 1660 | 1661 | True 1662 | True 1663 | Sticky 1664 | 0 1665 | True 1666 | 1667 | 1668 | 1 1669 | 2 1670 | 1671 | 1672 | 1673 | 1674 | True 1675 | True 1676 | No Focus 1677 | 0 1678 | True 1679 | 1680 | 1681 | 1 1682 | 2 1683 | 1684 | 1685 | 1686 | 1687 | True 1688 | True 1689 | Skip Taskbar 1690 | 0 1691 | True 1692 | 1693 | 1694 | 2 1695 | 3 1696 | 1697 | 1698 | 1699 | 1700 | True 1701 | True 1702 | Skip Pager 1703 | 0 1704 | True 1705 | 1706 | 1707 | 1 1708 | 2 1709 | 2 1710 | 3 1711 | 1712 | 1713 | 1714 | 1715 | True 1716 | True 1717 | Above 1718 | 0 1719 | True 1720 | 1721 | 1722 | 3 1723 | 4 1724 | 1725 | 1726 | 1727 | 1728 | True 1729 | True 1730 | Below 1731 | 0 1732 | True 1733 | 1734 | 1735 | 1 1736 | 2 1737 | 3 1738 | 4 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | label_item 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | True 1754 | Xwinwrap Options (Advanced) 1755 | 1756 | 1757 | label_item 1758 | 1759 | 1760 | 1761 | 1762 | 2 1763 | 1764 | 1765 | 1766 | 1767 | True 1768 | GTK_BUTTONBOX_END 1769 | 1770 | 1771 | True 1772 | True 1773 | True 1774 | gtk-close 1775 | True 1776 | 0 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | False 1783 | 3 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 350 1791 | 250 1792 | 10 1793 | Manpage Reference 1794 | True 1795 | gtk-find 1796 | GDK_WINDOW_TYPE_HINT_DIALOG 1797 | True 1798 | 1799 | 1800 | True 1801 | 5 1802 | 1803 | 1804 | True 1805 | 10 1806 | 1807 | 1808 | True 1809 | gtk-find 1810 | 5 1811 | 1812 | 1813 | False 1814 | 1815 | 1816 | 1817 | 1818 | True 1819 | 0 1820 | <big><b>Manpage Reference</b></big> 1821 | True 1822 | 1823 | 1824 | 1 1825 | 1826 | 1827 | 1828 | 1829 | False 1830 | 1831 | 1832 | 1833 | 1834 | True 1835 | True 1836 | GTK_POLICY_AUTOMATIC 1837 | GTK_POLICY_AUTOMATIC 1838 | GTK_SHADOW_ETCHED_IN 1839 | 1840 | 1841 | True 1842 | True 1843 | False 1844 | 5 1845 | 5 1846 | False 1847 | Loading Manual... 1848 | 1849 | 1850 | 1851 | 1852 | 1 1853 | 1854 | 1855 | 1856 | 1857 | True 1858 | GTK_BUTTONBOX_END 1859 | 1860 | 1861 | True 1862 | True 1863 | True 1864 | gtk-close 1865 | True 1866 | 0 1867 | 1868 | 1869 | 1870 | 1871 | False 1872 | 2 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | --------------------------------------------------------------------------------