diff --git a/python/LICENSE b/python/LICENSE new file mode 100644 index 0000000..23cb790 --- /dev/null +++ b/python/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..92049d4 --- /dev/null +++ b/python/README.md @@ -0,0 +1,20 @@ +# GWinWrap +GWinWrap is a Gtk with Python gui to select videos for XWinWrap, images for Nitrogen Wallpaper Manager, and gifs for Gifsicle. +It includes the XWinWrap binary and source code for Shantanu Goel's version of XWinWrap. + + +# Notes + + +# Images +![1 Default view starting out. ](images/pic1.jpg) +![2 Video thumbnails in image grid. ](images/pic2.jpg) +![3 Image thumbnails in image grid with xscreensaver checked. ](images/pic3.jpg) + +# TODO +Confirm Nitrogen works and that the glitch seen is due to SpaceFM. + +# Credit +GWinWrap python and glade by: Maxim Stewart -- https://www.itdominator.com/ +
+XWinWrap binary by: Shantanu Goel -- http://tech.shantanugoel.com diff --git a/python/bin/gwinwrap-0-0-1-x64.deb b/python/bin/gwinwrap-0-0-1-x64.deb new file mode 100644 index 0000000..981d704 Binary files /dev/null and b/python/bin/gwinwrap-0-0-1-x64.deb differ diff --git a/python/images/pic1.png b/python/images/pic1.png new file mode 100644 index 0000000..5920591 Binary files /dev/null and b/python/images/pic1.png differ diff --git a/python/images/pic2.png b/python/images/pic2.png new file mode 100644 index 0000000..9cd41ff Binary files /dev/null and b/python/images/pic2.png differ diff --git a/python/images/pic3.png b/python/images/pic3.png new file mode 100644 index 0000000..e84fd0b Binary files /dev/null and b/python/images/pic3.png differ diff --git a/python/src/debs/build.sh b/python/src/debs/build.sh new file mode 100755 index 0000000..229f961 --- /dev/null +++ b/python/src/debs/build.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Fixes ownershp +function main() { + sudo find . -type f -exec chmod 644 {} + + sudo find . -type d -exec chmod 755 {} + + + # Set postrm permissions + for i in `find . -name postrm`; do + sudo chmod 755 "${i}" + done + + # Set fxwinwrap permissions + for i in `find . -name fxwinwrap`; do + sudo chmod 755 "${i}" + done + + # Set xwinwrap permissions + for i in `find . -name xwinwrap`; do + sudo chmod 755 "${i}" + done + + sudo chmod 755 fxwinwrap*/opt/FXWinWrap/resources/bin/* + + sudo chown -R root:root ./*/ +builder; +} + +#builds debs +function builder() { + for i in `ls`; do + if [[ -d "${i}" ]]; then + dpkg --build "${i}" + else + echo "Not a dir." + fi + done +} +main; diff --git a/python/src/debs/chownAll.sh b/python/src/debs/chownAll.sh new file mode 100644 index 0000000..44bef62 --- /dev/null +++ b/python/src/debs/chownAll.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +function main() { + sudo chown -R abaddon:abaddon . +} +main; diff --git a/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/control b/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/control new file mode 100644 index 0000000..119f3bb --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/control @@ -0,0 +1,8 @@ +Package: gwinwrap64 +Version: 0.0-1 +Section: python +Priority: optional +Architecture: amd64 +Depends: ffmpegthumbnailer (>= 2.0.10-0.1), mplayer (>=2.0-728-g2c378c7-4), gifsicle (>=1.86-1), nitrogen (>=1.5.2-2) +Maintainer: Maxim Stewart <1itdominator@gmail.com> +Description: GWinWrap is a GUI to handle setting XWinWrap options. diff --git a/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/postrm b/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/postrm new file mode 100755 index 0000000..c65bdd9 --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/DEBIAN/postrm @@ -0,0 +1,20 @@ +#!/bin/bash +#postrm (script executed after uninstalling the package) +#set -e + +if [ -f /bin/xwinwrap ]; then + rm /bin/xwinwrap +fi + +if [ -f /bin/gwinwrap ]; then + rm /bin/gwinwrap +fi + +if [ -d /opt/GWinWrap ]; then + rm -rf /opt/GWinWrap +fi + +if [ -x "`which xdg-desktop-menu 2>/dev/null`" ]; then + xdg-desktop-menu uninstall /usr/share/applications/GWinWrap.desktop + xdg-desktop-menu forceupdate --mode user +fi diff --git a/python/src/debs/gwinwrap-0-0-1-x64/bin/gwinwrap b/python/src/debs/gwinwrap-0-0-1-x64/bin/gwinwrap new file mode 100755 index 0000000..eeb78ae Binary files /dev/null and b/python/src/debs/gwinwrap-0-0-1-x64/bin/gwinwrap differ diff --git a/python/src/debs/gwinwrap-0-0-1-x64/bin/xwinwrap b/python/src/debs/gwinwrap-0-0-1-x64/bin/xwinwrap new file mode 100755 index 0000000..26eafd7 Binary files /dev/null and b/python/src/debs/gwinwrap-0-0-1-x64/bin/xwinwrap differ diff --git a/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/GWinWrap.py b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/GWinWrap.py new file mode 100644 index 0000000..64d548e --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/GWinWrap.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python + +import os, cairo, sys, gi, re, threading, subprocess + +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') + +from gi.repository import Gtk as gtk +from gi.repository import Gdk as gdk +from gi.repository import GObject as gobject +from gi.repository import Gtk, GdkPixbuf + +from os import listdir +from os.path import isfile, join +from threading import Thread + +from utils import SaveState + +gdk.threads_init() + + +class GWinWrap: + def __init__(self): + self.builder = gtk.Builder() + self.builder.add_from_file("resources/GWinWrap.glade") + + # Get window and connect signals + self.window = self.builder.get_object("Main") + self.builder.connect_signals(self) + self.window.connect("delete-event", gtk.main_quit) + + self.screen = self.window.get_screen() + self.visual = self.screen.get_rgba_visual() + if self.visual != None and self.screen.is_composited(): + self.window.set_visual(self.visual) + + self.window.set_app_paintable(True) + self.window.connect("draw", self.area_draw) + + # Add filter to allow only folders to be selected + dialog = self.builder.get_object("selectedDirDialog") + filefilter = self.builder.get_object("Folders") + dialog.add_filter(filefilter) + + # Get reference to remove and add it back... + self.gridLabel = self.builder.get_object("gridLabel") + + self.stateSaver = SaveState() + self.xScreenVal = None + self.toSavePath = None # Global file path and type for saving to file + self.applyType = 1 # 1 is XWinWrap and 2 is Nitrogen + + self.window.show() + + def area_draw(self, widget, cr): + cr.set_source_rgba(0, 0, 0, 0.64) + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + cr.set_operator(cairo.OPERATOR_OVER) + + + + + def setNewDir(self, widget, data=None): + dir = widget.get_filename() + Thread(target=self.newDir, args=(dir,)).start() + + def newDir(self, dir): + self.clear() + imageGrid = self.builder.get_object("imageGrid") + path = dir + files = [] + list = [f for f in listdir(path) if isfile(join(path, f))] + row = 0 + col = 0 + + for file in list: + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')): + files.append(file) + + imageGrid.remove_column(0) + for file in files: + fullPathFile = path + "/" + file + eveBox = gtk.EventBox() + thumbnl = gtk.Image() + + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')): + subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"]) + thumbnl = self.createImage("/tmp/image.png") + eveBox.connect("button_press_event", self.runMplayerProcess, fullPathFile) + elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): + thumbnl = self.createImage(fullPathFile) + eveBox.connect("button_press_event", self.runImageViewerProcess, fullPathFile) + else: + print("Not a video or image file.") + return + + gobject.idle_add(self.preGridSetup, (eveBox, thumbnl, )) + gobject.idle_add(self.addToGrid, (imageGrid, eveBox, col, row,)) + + col += 1 + if col == 2: + col = 0 + row += 1 + + def preGridSetup(self, args): + args[0].show() + args[1].show() + args[0].add(args[1]) + + def createImage(self, arg): + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename = arg, + width = 310, + height = 310, + preserve_aspect_ratio = True) + return gtk.Image.new_from_pixbuf(pixbuf) + + def addToGrid(self, args): + args[0].attach(args[1], args[2], args[3], 1, 1) + + def runMplayerProcess(self, widget, eve, fullPathFile): + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + subprocess.call(["mplayer", "-really-quiet", "-ao", "null", "-loop", "0", fullPathFile]) + + self.toSavePath = fullPathFile + self.applyType = 1 # Set to XWinWrap + + def runImageViewerProcess(self, widget, eve, fullPathFile): + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + subprocess.call(["xdg-open", fullPathFile]) + + self.toSavePath = fullPathFile + self.applyType = 2 # Set to Nitrogen + + def toggleXscreenUsageField(self, widget, data=None): + useXscreenSaver = self.builder.get_object("useXScrnList") + if useXscreenSaver.get_active(): + self.builder.get_object("xScreenSvrList").set_sensitive(True) + else: + self.builder.get_object("xScreenSvrList").set_sensitive(False) + + def saveToFile(self, widget, data=None): + saveLoc = self.builder.get_object("saveLoc").get_active_text() + useXscreenSaver = self.builder.get_object("useXScrnList").get_active() + plyBckRes = self.builder.get_object("playbackResolution") + offset4Res = self.builder.get_object("posOffset") + resolution = plyBckRes.get_active_text() + offset4Res.get_active_text() + self.applyType = self.stateSaver.saveToFile(self.toSavePath, resolution, + saveLoc, useXscreenSaver, self.xScreenVal) + + def applySttngs(self, widget, data=None): + os.system("killall xwinwrap &") + if self.applyType == 1: + os.system("bash -c '~/.animatedBGstarter.sh' &") + os.system("bash -c '~/.animatedBGstarter2.sh' &") + elif self.applyType == 2: + os.system("nitrogen --restore &") + else: + os.system("nitrogen --restore &") + + + def killXWinWrp(self, widget, data=None): + os.system("killall xwinwrap &") + + def passXScreenVal(self, widget): + xSvrListStore = self.builder.get_object("XScreensaver List") + row = widget.get_cursor() + path = gtk.TreePath(row.path) + treeiter = xSvrListStore.get_iter(path[0]) + self.xScreenVal = xSvrListStore.get_value(treeiter, 0) + + def clearSelection(self, widget, data=None): + self.clear() + + def clear(self): + imageGrid = self.builder.get_object("imageGrid") + + while True: + if imageGrid.get_child_at(0,0)!= None: + imageGrid.remove_row(0) + else: + break + + imageGrid.attach(self.gridLabel, 0, 0, 1, 1) + self.toSavePath = None + self.applyType = 1 # Default to XWinWrap + + def closeProgram(self, widget, data=None): + sys.exit(0) + + + +if __name__ == "__main__": + main = GWinWrap() + gtk.main() diff --git a/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.glade b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.glade new file mode 100644 index 0000000..23c5eb7 --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.glade @@ -0,0 +1,699 @@ + + + + + + + inode/directory + + + + + + + + + + electricsheep + + + atlantis + + + atunnel + + + blinkbox + + + blocktube + + + bouncingcow + + + boxfit + + + bsod + + + bubble3d + + + bumps + + + cage + + + carousel + + + cube21 + + + cubenetic + + + cubicgrid + + + cwaves + + + dangerball + + + fiberlamp + + + fireworkx + + + flipflop + + + fliptext + + + flow + + + flurry + + + flyingtoasters + + + gflux + + + glcells + + + gleidescope + + + glknots + + + glmatrix + + + glschool + + + glslideshow + + + glsnake + + + hypertorus + + + hypnowheel + + + interaggregate + + + intermomentary + + + jigglypuff + + + jigsaw + + + julia + + + lament + + + lockward + + + metaballs + + + moebiusgears + + + molecule + + + morph3d + + + noof + + + phosphor + + + photopile + + + pinion + + + popsquares + + + ripples + + + skytentacles + + + slidescreen + + + stonerview + + + strange + + + substrate + + + tangram + + + whirlwindwarp + + + wormhole + + + xflame + + + xrayswarm + + + companioncube + + + fuzzyflakes + + + galaxy + + + glplanet + + + penetrate + + + + + 950 + 600 + False + GWinWrap + center + 950 + 600 + GWinWrap.png + center + + + + + + True + False + + + True + False + 15 + 15 + 15 + vertical + + + True + False + 5 + + + True + False + Note: Double click an image to view the video or image. + + + True + True + 0 + + + + + Clear + True + True + True + + + + False + True + 1 + + + + + True + False + False + Chose Dream Scene / Image Directory + select-folder + False + Folders + False + Dream Scene / Image Dir + + + + False + True + 2 + + + + + False + True + 0 + + + + + True + True + in + + + True + False + + + True + False + vertical + 10 + 10 + True + True + + + 640 + 525 + True + False + Choose Image/Video Directory... + + + + + + 0 + 0 + + + + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + 300 + True + False + 10 + 15 + 15 + 15 + False + vertical + + + True + False + vertical + + + Use XScreenSaver + True + True + False + center + 5 + True + + + + False + True + 0 + + + + + True + True + in + + + True + False + True + XScreensaver List + False + + + + + + + XScreensaves + + + + 0 + + + + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + True + False + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 10 + 10 + Playback Resolutions + + + True + True + 0 + + + + + True + False + 10 + 10 + Position Offset + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + False + 3 + + 7680x4320 + 3840x2160 + 2048x1080 + 1920x1080 + 1440x720 + 1600x900 + 1280x720 + 800x600 + + + + True + True + 0 + + + + + True + False + 18 + + Left + -7680+0 + -3840+0 + -2048+0 + -1920+0 + -1440+0 + -1600+0 + -1280+0 + -800+0 + Right + +7680+0 + +3840+0 + +2048+0 + +1920+0 + +1440+0 + +1600+0 + +1280+0 + +800+0 + +0+0 + Top + +0+7680 + +0+3840 + +0+2048 + +0+1920 + +0+1440 + +0+1600 + 0+1280 + +0+800 + Bottum + +0-7680 + +0-3840 + +0-2048 + +0-1920 + +0-1440 + +0-1600 + 0-1280 + +0-800 + + + + True + True + 1 + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + True + False + 10 + 5 + Save Path + + + True + True + 0 + + + + + True + False + 0 + + .animatedBGstarter.sh + .animatedBGstarter2.sh + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + + + Save Selection + True + True + True + True + True + + + + 0 + 0 + + + + + Apply + True + True + True + True + True + + + + 1 + 0 + + + + + Kill XWinWrap + True + True + True + True + True + + + + 0 + 1 + + + + + Close + True + True + True + True + True + + + + 1 + 1 + + + + + False + True + 2 + + + + + False + False + end + 1 + + + + + False + True + 1 + 1 + + + + + + diff --git a/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.png b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.png new file mode 100644 index 0000000..cdd708d Binary files /dev/null and b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/resources/GWinWrap.png differ diff --git a/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/SaveState.pyc b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/SaveState.pyc new file mode 100644 index 0000000..0aa7323 Binary files /dev/null and b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/SaveState.pyc differ diff --git a/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/__init__.pyc b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/__init__.pyc new file mode 100644 index 0000000..ba4d3be Binary files /dev/null and b/python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/utils/__init__.pyc differ diff --git a/python/src/debs/gwinwrap-0-0-1-x64/usr/share/applications/GWinWrap.desktop b/python/src/debs/gwinwrap-0-0-1-x64/usr/share/applications/GWinWrap.desktop new file mode 100644 index 0000000..1d130b6 --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/usr/share/applications/GWinWrap.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=GWinWrap +Comment=Glade gui with python controls for XWinWrap +Exec=/bin/gwinwrap +Icon=/opt/GWinWrap/resources/GWinWrap.png +Terminal=false +Type=Application +Categories=System; diff --git a/python/src/debs/gwinwrap-0-0-1-x64/usr/share/doc/fxwinwrap/copyright b/python/src/debs/gwinwrap-0-0-1-x64/usr/share/doc/fxwinwrap/copyright new file mode 100644 index 0000000..03e69e2 --- /dev/null +++ b/python/src/debs/gwinwrap-0-0-1-x64/usr/share/doc/fxwinwrap/copyright @@ -0,0 +1,22 @@ +FXWinWrap is copyright 2016, 2017 Maxim Stewart. +FXWinWrap is currently developed by ITDominator <1itdominator@gmail.com>. + +License: GPLv2+ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +See /usr/share/common-licenses/GPL-2, or + for the terms of the latest version +of the GNU General Public License. diff --git a/python/src/versions/0.0.1/GWinWrap/GWinWrap.py b/python/src/versions/0.0.1/GWinWrap/GWinWrap.py new file mode 100755 index 0000000..64d548e --- /dev/null +++ b/python/src/versions/0.0.1/GWinWrap/GWinWrap.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python + +import os, cairo, sys, gi, re, threading, subprocess + +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') + +from gi.repository import Gtk as gtk +from gi.repository import Gdk as gdk +from gi.repository import GObject as gobject +from gi.repository import Gtk, GdkPixbuf + +from os import listdir +from os.path import isfile, join +from threading import Thread + +from utils import SaveState + +gdk.threads_init() + + +class GWinWrap: + def __init__(self): + self.builder = gtk.Builder() + self.builder.add_from_file("resources/GWinWrap.glade") + + # Get window and connect signals + self.window = self.builder.get_object("Main") + self.builder.connect_signals(self) + self.window.connect("delete-event", gtk.main_quit) + + self.screen = self.window.get_screen() + self.visual = self.screen.get_rgba_visual() + if self.visual != None and self.screen.is_composited(): + self.window.set_visual(self.visual) + + self.window.set_app_paintable(True) + self.window.connect("draw", self.area_draw) + + # Add filter to allow only folders to be selected + dialog = self.builder.get_object("selectedDirDialog") + filefilter = self.builder.get_object("Folders") + dialog.add_filter(filefilter) + + # Get reference to remove and add it back... + self.gridLabel = self.builder.get_object("gridLabel") + + self.stateSaver = SaveState() + self.xScreenVal = None + self.toSavePath = None # Global file path and type for saving to file + self.applyType = 1 # 1 is XWinWrap and 2 is Nitrogen + + self.window.show() + + def area_draw(self, widget, cr): + cr.set_source_rgba(0, 0, 0, 0.64) + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + cr.set_operator(cairo.OPERATOR_OVER) + + + + + def setNewDir(self, widget, data=None): + dir = widget.get_filename() + Thread(target=self.newDir, args=(dir,)).start() + + def newDir(self, dir): + self.clear() + imageGrid = self.builder.get_object("imageGrid") + path = dir + files = [] + list = [f for f in listdir(path) if isfile(join(path, f))] + row = 0 + col = 0 + + for file in list: + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')): + files.append(file) + + imageGrid.remove_column(0) + for file in files: + fullPathFile = path + "/" + file + eveBox = gtk.EventBox() + thumbnl = gtk.Image() + + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')): + subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"]) + thumbnl = self.createImage("/tmp/image.png") + eveBox.connect("button_press_event", self.runMplayerProcess, fullPathFile) + elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): + thumbnl = self.createImage(fullPathFile) + eveBox.connect("button_press_event", self.runImageViewerProcess, fullPathFile) + else: + print("Not a video or image file.") + return + + gobject.idle_add(self.preGridSetup, (eveBox, thumbnl, )) + gobject.idle_add(self.addToGrid, (imageGrid, eveBox, col, row,)) + + col += 1 + if col == 2: + col = 0 + row += 1 + + def preGridSetup(self, args): + args[0].show() + args[1].show() + args[0].add(args[1]) + + def createImage(self, arg): + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename = arg, + width = 310, + height = 310, + preserve_aspect_ratio = True) + return gtk.Image.new_from_pixbuf(pixbuf) + + def addToGrid(self, args): + args[0].attach(args[1], args[2], args[3], 1, 1) + + def runMplayerProcess(self, widget, eve, fullPathFile): + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + subprocess.call(["mplayer", "-really-quiet", "-ao", "null", "-loop", "0", fullPathFile]) + + self.toSavePath = fullPathFile + self.applyType = 1 # Set to XWinWrap + + def runImageViewerProcess(self, widget, eve, fullPathFile): + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + subprocess.call(["xdg-open", fullPathFile]) + + self.toSavePath = fullPathFile + self.applyType = 2 # Set to Nitrogen + + def toggleXscreenUsageField(self, widget, data=None): + useXscreenSaver = self.builder.get_object("useXScrnList") + if useXscreenSaver.get_active(): + self.builder.get_object("xScreenSvrList").set_sensitive(True) + else: + self.builder.get_object("xScreenSvrList").set_sensitive(False) + + def saveToFile(self, widget, data=None): + saveLoc = self.builder.get_object("saveLoc").get_active_text() + useXscreenSaver = self.builder.get_object("useXScrnList").get_active() + plyBckRes = self.builder.get_object("playbackResolution") + offset4Res = self.builder.get_object("posOffset") + resolution = plyBckRes.get_active_text() + offset4Res.get_active_text() + self.applyType = self.stateSaver.saveToFile(self.toSavePath, resolution, + saveLoc, useXscreenSaver, self.xScreenVal) + + def applySttngs(self, widget, data=None): + os.system("killall xwinwrap &") + if self.applyType == 1: + os.system("bash -c '~/.animatedBGstarter.sh' &") + os.system("bash -c '~/.animatedBGstarter2.sh' &") + elif self.applyType == 2: + os.system("nitrogen --restore &") + else: + os.system("nitrogen --restore &") + + + def killXWinWrp(self, widget, data=None): + os.system("killall xwinwrap &") + + def passXScreenVal(self, widget): + xSvrListStore = self.builder.get_object("XScreensaver List") + row = widget.get_cursor() + path = gtk.TreePath(row.path) + treeiter = xSvrListStore.get_iter(path[0]) + self.xScreenVal = xSvrListStore.get_value(treeiter, 0) + + def clearSelection(self, widget, data=None): + self.clear() + + def clear(self): + imageGrid = self.builder.get_object("imageGrid") + + while True: + if imageGrid.get_child_at(0,0)!= None: + imageGrid.remove_row(0) + else: + break + + imageGrid.attach(self.gridLabel, 0, 0, 1, 1) + self.toSavePath = None + self.applyType = 1 # Default to XWinWrap + + def closeProgram(self, widget, data=None): + sys.exit(0) + + + +if __name__ == "__main__": + main = GWinWrap() + gtk.main() diff --git a/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.glade b/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.glade new file mode 100644 index 0000000..23c5eb7 --- /dev/null +++ b/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.glade @@ -0,0 +1,699 @@ + + + + + + + inode/directory + + + + + + + + + + electricsheep + + + atlantis + + + atunnel + + + blinkbox + + + blocktube + + + bouncingcow + + + boxfit + + + bsod + + + bubble3d + + + bumps + + + cage + + + carousel + + + cube21 + + + cubenetic + + + cubicgrid + + + cwaves + + + dangerball + + + fiberlamp + + + fireworkx + + + flipflop + + + fliptext + + + flow + + + flurry + + + flyingtoasters + + + gflux + + + glcells + + + gleidescope + + + glknots + + + glmatrix + + + glschool + + + glslideshow + + + glsnake + + + hypertorus + + + hypnowheel + + + interaggregate + + + intermomentary + + + jigglypuff + + + jigsaw + + + julia + + + lament + + + lockward + + + metaballs + + + moebiusgears + + + molecule + + + morph3d + + + noof + + + phosphor + + + photopile + + + pinion + + + popsquares + + + ripples + + + skytentacles + + + slidescreen + + + stonerview + + + strange + + + substrate + + + tangram + + + whirlwindwarp + + + wormhole + + + xflame + + + xrayswarm + + + companioncube + + + fuzzyflakes + + + galaxy + + + glplanet + + + penetrate + + + + + 950 + 600 + False + GWinWrap + center + 950 + 600 + GWinWrap.png + center + + + + + + True + False + + + True + False + 15 + 15 + 15 + vertical + + + True + False + 5 + + + True + False + Note: Double click an image to view the video or image. + + + True + True + 0 + + + + + Clear + True + True + True + + + + False + True + 1 + + + + + True + False + False + Chose Dream Scene / Image Directory + select-folder + False + Folders + False + Dream Scene / Image Dir + + + + False + True + 2 + + + + + False + True + 0 + + + + + True + True + in + + + True + False + + + True + False + vertical + 10 + 10 + True + True + + + 640 + 525 + True + False + Choose Image/Video Directory... + + + + + + 0 + 0 + + + + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + 300 + True + False + 10 + 15 + 15 + 15 + False + vertical + + + True + False + vertical + + + Use XScreenSaver + True + True + False + center + 5 + True + + + + False + True + 0 + + + + + True + True + in + + + True + False + True + XScreensaver List + False + + + + + + + XScreensaves + + + + 0 + + + + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + True + False + False + vertical + + + True + False + vertical + + + True + False + + + True + False + 10 + 10 + Playback Resolutions + + + True + True + 0 + + + + + True + False + 10 + 10 + Position Offset + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + False + 3 + + 7680x4320 + 3840x2160 + 2048x1080 + 1920x1080 + 1440x720 + 1600x900 + 1280x720 + 800x600 + + + + True + True + 0 + + + + + True + False + 18 + + Left + -7680+0 + -3840+0 + -2048+0 + -1920+0 + -1440+0 + -1600+0 + -1280+0 + -800+0 + Right + +7680+0 + +3840+0 + +2048+0 + +1920+0 + +1440+0 + +1600+0 + +1280+0 + +800+0 + +0+0 + Top + +0+7680 + +0+3840 + +0+2048 + +0+1920 + +0+1440 + +0+1600 + 0+1280 + +0+800 + Bottum + +0-7680 + +0-3840 + +0-2048 + +0-1920 + +0-1440 + +0-1600 + 0-1280 + +0-800 + + + + True + True + 1 + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + True + False + 10 + 5 + Save Path + + + True + True + 0 + + + + + True + False + 0 + + .animatedBGstarter.sh + .animatedBGstarter2.sh + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + + + Save Selection + True + True + True + True + True + + + + 0 + 0 + + + + + Apply + True + True + True + True + True + + + + 1 + 0 + + + + + Kill XWinWrap + True + True + True + True + True + + + + 0 + 1 + + + + + Close + True + True + True + True + True + + + + 1 + 1 + + + + + False + True + 2 + + + + + False + False + end + 1 + + + + + False + True + 1 + 1 + + + + + + diff --git a/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.png b/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.png new file mode 100644 index 0000000..cdd708d Binary files /dev/null and b/python/src/versions/0.0.1/GWinWrap/resources/GWinWrap.png differ diff --git a/python/src/versions/0.0.1/GWinWrap/utils/SaveState.py b/python/src/versions/0.0.1/GWinWrap/utils/SaveState.py new file mode 100644 index 0000000..0eac2af --- /dev/null +++ b/python/src/versions/0.0.1/GWinWrap/utils/SaveState.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import os + +class SaveState: + def __init__(self): + self.fileWriter = None + self.filePath = None + self.useXSvrn = None + self.xScreenVal = None + self.sveFileLoc = None + self.resolution = None + + def saveToFile(self, filePath, resolution, + saveLoc, useXSvrn, xScreenVal): + + self.filePath = filePath + self.useXSvrn = useXSvrn + self.xScreenVal = xScreenVal + self.resolution = resolution + userPth = os.path.expanduser('~') + + # Saves to file with selected and needed settings + if filePath: + if filePath.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): + self.sveFileLoc = userPth + "/" + ".config/nitrogen/bg-saved.cfg" + else: + self.sveFileLoc = userPth + "/" + saveLoc + else: + self.filePath = '' + if self.sveFileLoc: + self.fileWriter = open(self.sveFileLoc, "w") + + return self.startSave() + + def startSave(self): + applyType = 1 + output = None + + # XSCREENSAVER + if self.useXSvrn: + output = "xwinwrap -ov -g " + self.resolution + " -st -sp -b -nf -s -ni -- /usr/lib/xscreensaver/" + self.xScreenVal + " -window-id WID -root"; + # GIF + elif self.filePath.lower().endswith(('.gif')): + output = "xwinwrap -ov -g " + self.resolution + " -st -sp -b -nf -s -ni -- gifview -a -w WID " + self.filePath; + # Standard images using nitrogen + elif self.filePath.lower().endswith(('.png', 'jpg', '.jpeg')): + output = "[xin_0] \n file=" + self.filePath + "\nmode=0 \nbgcolor=#000000\n[xin_1] \nfile=" + self.filePath + "\nmode=0 \nbgcolor=#000000"; + applyType = 2; + # VIDEO + else: + output = "xwinwrap -ov -g " + self.resolution + " -st -sp -b -nf -s -ni -- mplayer -wid WID -really-quiet -ao null -loop 0 " + self.filePath; + pass + + if self.fileWriter: + self.fileWriter.write(output) + self.fileWriter.close() + + return applyType; diff --git a/python/src/versions/0.0.1/GWinWrap/utils/SaveState.pyc b/python/src/versions/0.0.1/GWinWrap/utils/SaveState.pyc new file mode 100644 index 0000000..e506d34 Binary files /dev/null and b/python/src/versions/0.0.1/GWinWrap/utils/SaveState.pyc differ diff --git a/python/src/versions/0.0.1/GWinWrap/utils/__init__.py b/python/src/versions/0.0.1/GWinWrap/utils/__init__.py new file mode 100644 index 0000000..e0242e1 --- /dev/null +++ b/python/src/versions/0.0.1/GWinWrap/utils/__init__.py @@ -0,0 +1 @@ +from utils.SaveState import SaveState diff --git a/python/src/versions/0.0.1/GWinWrap/utils/__init__.pyc b/python/src/versions/0.0.1/GWinWrap/utils/__init__.pyc new file mode 100644 index 0000000..ba4d3be Binary files /dev/null and b/python/src/versions/0.0.1/GWinWrap/utils/__init__.pyc differ diff --git a/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/SaveState.cpython-36.pyc b/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/SaveState.cpython-36.pyc new file mode 100644 index 0000000..11110f8 Binary files /dev/null and b/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/SaveState.cpython-36.pyc differ diff --git a/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/__init__.cpython-36.pyc b/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..8f97365 Binary files /dev/null and b/python/src/versions/0.0.1/GWinWrap/utils/__pycache__/__init__.cpython-36.pyc differ diff --git a/python/src/versions/0.0.1/XWinWrap/Makefile b/python/src/versions/0.0.1/XWinWrap/Makefile new file mode 100644 index 0000000..4a67078 --- /dev/null +++ b/python/src/versions/0.0.1/XWinWrap/Makefile @@ -0,0 +1,20 @@ +all: all64 all32 + +all64: + gcc -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -lX11 -lXext -lXrender xwinwrap.c -o xwinwrap + -mkdir x86_64 + mv ./xwinwrap ./x86_64 + +all32: + gcc -m32 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -lX11 -lXext -lXrender xwinwrap.c -o xwinwrap + -mkdir i386 + mv ./xwinwrap ./i386 + +install64: + cp x86_64/xwinwrap /usr/bin + +install32: + cp i386/xwinwrap /usr/bin + +clean: + -rm -rf x86_64/ i386/ diff --git a/python/src/versions/0.0.1/XWinWrap/xwinwrap.c b/python/src/versions/0.0.1/XWinWrap/xwinwrap.c new file mode 100644 index 0000000..a2daa04 --- /dev/null +++ b/python/src/versions/0.0.1/XWinWrap/xwinwrap.c @@ -0,0 +1,459 @@ +/* + * Copyright © 2005 Novell, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Novell, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * Novell, Inc. makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: David Reveman + */ + +/* + * Modified by: Shantanu Goel + * Tech Blog: http://tech.shantanugoel.com + * Blog: http://blog.shantanugoel.com + * Home Page: http://tech.shantanugoel.com/projects/linux/shantz-xwinwrap + * + * Changelog: + * 15-Jan-09: 1. Fixed the bug where XFetchName returning a NULL for "name" + * resulted in a crash. + * 2. Provided an option to specify the desktop window name. + * 3. Added debug messages + * + * 24-Aug-08: 1. Fixed the geometry option (-g) so that it works + * 2. Added override option (-ov), for seamless integration with + * desktop like a background in non-fullscreen modes + * 3. Added shape option (-sh), to create non-rectangular windows. + * Currently supporting circlular and triangular windows + */ + + /* + * Modified by: Maxim Stewart + * Tech Blog: https://www.itdominator.com/ + * + * Changelog: + * 3-March-19: 1. Cleaned up code formatting. + * 2. Removed unused DEBUG_MSG reference. + * 3. Moved functions to a more reasonable order. + * 4. Compile dev library list 32 & 64 bit: + * # 32 + * sudo apt install libxext-dev:i386 libxrender-dev:i386 libc6-dev-i386 + * + * # 64 + * sudo apt install libxext-dev libxrender-dev libc6-dev + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define WIDTH 512 +#define HEIGHT 384 +#define OPAQUE 0xffffffff +#define NAME "xwinwrap" +#define VERSION "0.3" +#define DESKTOP_WINDOW_NAME_MAX_SIZE 25 +#define DEFAULT_DESKTOP_WINDOW_NAME "Desktop" +#define DEBUG_MSG(x) if(debug) { fprintf(stderr, x); } + +typedef enum { + SHAPE_RECT = 0, + SHAPE_CIRCLE, + SHAPE_TRIG, +} win_shape; + +static pid_t pid = 0; +static char **childArgv = 0; +static int nChildArgv = 0; +int debug = 0; +char desktop_window_name[DESKTOP_WINDOW_NAME_MAX_SIZE]; + +static int addArguments(char **argv, int n) { + char **newArgv; + int i; + + newArgv = realloc (childArgv, sizeof (char *) * (nChildArgv + n)); + if (!newArgv) + return 0; + + for (i = 0; i < n; i++) + newArgv[nChildArgv + i] = argv[i]; + + childArgv = newArgv; + nChildArgv += n; + + return n; +} + +static void setWindowOpacity(Display *dpy, Window win, unsigned int opacity) { + CARD32 o; + o = opacity; + XChangeProperty (dpy, win, XInternAtom (dpy, "_NET_WM_WINDOW_OPACITY", 0), + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &o, 1); +} + +static Visual * findArgbVisual(Display *dpy, int scr) { + XVisualInfo *xvi; + XVisualInfo template; + int nvi; + int i; + XRenderPictFormat *format; + Visual *visual; + + template.screen = scr; + template.depth = 32; + template.class = TrueColor; + + xvi = XGetVisualInfo (dpy, + VisualScreenMask | + VisualDepthMask | + VisualClassMask, + &template, + &nvi); + + if (!xvi) + return 0; + + visual = 0; + for (i = 0; i < nvi; i++) { + format = XRenderFindVisualFormat (dpy, xvi[i].visual); + if (format->type == PictTypeDirect && format->direct.alphaMask) { + visual = xvi[i].visual; + break; + } + } + + XFree (xvi); + return visual; +} + +static Window find_desktop_window(Display *display, int screen, + Window *root, Window *p_desktop) { + int i; + unsigned int n; + Window win = *root; + Window troot, parent, *children; + char *name; + int status; + int width = DisplayWidth(display, screen); + int height = DisplayHeight(display, screen); + XWindowAttributes attrs; + + XQueryTree(display, *root, &troot, &parent, &children, &n); + for (i = 0; i < (int) n; i++) { + status = XFetchName(display, children[i], &name); + status |= XGetWindowAttributes(display, children[i], &attrs); + + if ((status != 0) && (NULL != name)) { + if( (attrs.map_state != 0) && (attrs.width == width) && + (attrs.height == height) && (!strcmp(name, desktop_window_name)) ) { + win = children[i]; + XFree(children); + XFree(name); + *p_desktop = win; + return win; + } + + if(name) + XFree(name); + } + } + + DEBUG_MSG("Desktop Window Not found\n"); + return 0; +} + +static void usage (void) { + fprintf(stderr, "%s v%s- Modified by Shantanu Goel. Visit http://tech.shantanugoel.com for updates, queries and feature requests\n", NAME, VERSION); + fprintf (stderr, "\nUsage: %s [-g {w}x{h}+{x}+{y}] [-ni] [-argb] [-fs] [-s] [-st] [-sp] [-a] " + "[-b] [-nf] [-o OPACITY] [-sh SHAPE] [-ov]-- COMMAND ARG1...\n", NAME); + fprintf (stderr, "Options:\n \ + -g - Specify Geometry (w=width, h=height, x=x-coord, y=y-coord. ex: -g 640x480+100+100)\n \ + -ni - Ignore Input\n \ + -d - Desktop Window Hack. Provide name of the \"Desktop\" window as parameter \ + -argb - RGB\n \ + -fs - Full Screen\n \ + -s - Sticky\n \ + -st - Skip Taskbar\n \ + -sp - Skip Pager\n \ + -a - Above\n \ + -b - Below\n \ + -nf - No Focus\n \ + -o - Opacity value between 0 to 1 (ex: -o 0.20)\n \ + -sh - Shape of window (choose between rectangle, circle or triangle. Default is rectangle)\n \ + -ov - Set override_redirect flag (For seamless desktop background integration in non-fullscreenmode)\n \ + -debug - Enable debug messages\n"); +} + +static void sigHandler (int sig) { kill(pid, sig); } + +int main (int argc, char **argv) { + Display *dpy; + Window win; + Window root; + Window p_desktop = 0; + int screen; + XSizeHints xsh; + XWMHints xwmh; + char widArg[256]; + char *widArgv[] = { widArg }; + char *endArg = NULL; + int i; + int status = 0; + unsigned int opacity = OPAQUE; + int x = 0; + int y = 0; + unsigned int width = WIDTH; + unsigned int height = HEIGHT; + int argb = 0; + int fullscreen = 0; + int noInput = 0; + int noFocus = 0; + Atom state[256]; + int nState = 0; + int override = 0; + win_shape shape = SHAPE_RECT; + Pixmap mask; + GC mask_gc; + XGCValues xgcv; + + + dpy = XOpenDisplay (NULL); + if (!dpy) { + fprintf (stderr, "%s: Error: couldn't open display\n", argv[0]); + return 1; + } + + screen = DefaultScreen (dpy); + root = RootWindow (dpy, screen); + strcpy(desktop_window_name, DEFAULT_DESKTOP_WINDOW_NAME); + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-g") == 0) { + if (++i < argc) + XParseGeometry (argv[i], &x, &y, &width, &height); + } else if (strcmp(argv[i], "-ni") == 0) { + noInput = 1; + } else if (strcmp(argv[i], "-d") == 0) { + ++i; + strcpy(desktop_window_name, argv[i]); + } else if (strcmp(argv[i], "-argb") == 0) { + argb = 1; + } else if (strcmp(argv[i], "-fs") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_FULLSCREEN", 0); + fullscreen = 1; + } else if (strcmp(argv[i], "-s") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_STICKY", 0); + } else if (strcmp(argv[i], "-st") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_SKIP_TASKBAR", 0); + } else if (strcmp(argv[i], "-sp") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_SKIP_PAGER", 0); + } else if (strcmp(argv[i], "-a") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_ABOVE", 0); + } else if (strcmp(argv[i], "-b") == 0) { + state[nState++] = XInternAtom (dpy, "_NET_WM_STATE_BELOW", 0); + } else if (strcmp(argv[i], "-nf") == 0) { + noFocus = 1; + } else if (strcmp(argv[i], "-o") == 0) { + if (++i < argc) + opacity = (unsigned int) (atof (argv[i]) * OPAQUE); + } else if (strcmp(argv[i], "-sh") == 0) { + if (++i < argc) { + if(strcasecmp(argv[i], "circle") == 0) { + shape = SHAPE_CIRCLE; + } else if(strcasecmp(argv[i], "triangle") == 0) { + shape = SHAPE_TRIG; + } + } + } else if (strcmp(argv[i], "-ov") == 0) { + override = 1; + } else if (strcmp(argv[i], "-debug") == 0) { + debug = 1; + } else if (strcmp(argv[i], "--") == 0) { + break; + } else { + usage (); + return 1; + } + } + + for (i = i + 1; i < argc; i++) { + if (strcmp(argv[i], "WID") == 0) + addArguments (widArgv, 1); + else + addArguments (&argv[i], 1); + } + + if (!nChildArgv) { + fprintf (stderr, "%s: Error: couldn't create command line\n", argv[0]); + usage (); + return 1; + } + + addArguments (&endArg, 1); + + if (fullscreen) { + xsh.flags = PSize | PPosition; + xsh.width = DisplayWidth (dpy, screen); + xsh.height = DisplayHeight (dpy, screen); + } else { + xsh.flags = PSize; + xsh.width = width; + xsh.height = height; + } + + xwmh.flags = InputHint; + xwmh.input = !noFocus; + + if (argb) { + XSetWindowAttributes attr; + Visual *visual; + + visual = findArgbVisual (dpy, screen); + if (!visual) { + fprintf (stderr, "%s: Error: couldn't find argb visual\n", argv[0]); + return 1; + } + + attr.background_pixel = 0; + attr.border_pixel = 0; + attr.colormap = XCreateColormap (dpy, root, visual, AllocNone); + + win = XCreateWindow (dpy, root, 0, 0, xsh.width, xsh.height, 0, 32, + InputOutput, visual, + CWBackPixel | CWBorderPixel | CWColormap, &attr); + } else { + XSetWindowAttributes attr; + attr.override_redirect = override; + + if( override && find_desktop_window(dpy, screen, &root, &p_desktop) ) { + win = XCreateWindow (dpy, p_desktop, x, y, xsh.width, xsh.height, 0, + CopyFromParent, InputOutput, CopyFromParent, + CWOverrideRedirect, &attr); + } else { + win = XCreateWindow (dpy, root, x, y, xsh.width, xsh.height, 0, + CopyFromParent, InputOutput, CopyFromParent, + CWOverrideRedirect, &attr); + } + } + + XSetWMProperties (dpy, win, NULL, NULL, argv, argc, &xsh, &xwmh, NULL); + + if (opacity != OPAQUE) + setWindowOpacity (dpy, win, opacity); + + if (noInput) { + Region region; + + region = XCreateRegion (); + if (region) { + XShapeCombineRegion (dpy, win, ShapeInput, 0, 0, region, ShapeSet); + XDestroyRegion (region); + } + } + + if (nState) + XChangeProperty (dpy, win, XInternAtom (dpy, "_NET_WM_STATE", 0), + XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); + + if (shape) { + mask = XCreatePixmap(dpy, win, width, height, 1); + mask_gc = XCreateGC(dpy, mask, 0, &xgcv); + + switch(shape) { + //Nothing special to be done if it's a rectangle + case SHAPE_CIRCLE: + /* fill mask */ + XSetForeground(dpy, mask_gc, 0); + XFillRectangle(dpy, mask, mask_gc, 0, 0, width, height); + + XSetForeground(dpy, mask_gc, 1); + XFillArc(dpy, mask, mask_gc, 0, 0, width, height, 0, 23040); + break; + + case SHAPE_TRIG: + { + XPoint points[3] = { {0, height}, + {width/2, 0}, + {width, height} }; + + XSetForeground(dpy, mask_gc, 0); + XFillRectangle(dpy, mask, mask_gc, 0, 0, width, height); + + XSetForeground(dpy, mask_gc, 1); + XFillPolygon(dpy, mask, mask_gc, points, 3, Complex, CoordModeOrigin); + } + break; + default: + break; + } + /* combine */ + XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, mask, ShapeSet); + } + + XMapWindow (dpy, win); + + if(p_desktop == 0) + XLowerWindow(dpy, win); + + XSync (dpy, win); + sprintf (widArg, "0x%x", (int) win); + pid = fork (); + + switch (pid) { + case -1: + perror ("fork"); + return 1; + case 0: + execvp (childArgv[0], childArgv); + perror (childArgv[0]); + exit (2); + break; + default: + break; + } + + signal (SIGTERM, sigHandler); + signal (SIGINT, sigHandler); + + for (;;) { + if (waitpid (pid, &status, 0) != -1) { + if (WIFEXITED (status)) + fprintf (stderr, "%s died, exit status %d\n", childArgv[0], + WEXITSTATUS (status)); + break; + } + } + + XDestroyWindow (dpy, win); + XCloseDisplay (dpy); + return 0; +} diff --git a/python/src/versions/0.0.1/compileBin.sh b/python/src/versions/0.0.1/compileBin.sh new file mode 100755 index 0000000..fdd8222 --- /dev/null +++ b/python/src/versions/0.0.1/compileBin.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +function main() { + gcc -no-pie -s gwinwrap_exec_bin.cpp -o gwinwrap +} +main; diff --git a/python/src/versions/0.0.1/gwinwrap_exec_bin.cpp b/python/src/versions/0.0.1/gwinwrap_exec_bin.cpp new file mode 100644 index 0000000..8022fbf --- /dev/null +++ b/python/src/versions/0.0.1/gwinwrap_exec_bin.cpp @@ -0,0 +1,10 @@ +#include +#include +#include +using namespace std; + +int main() { + chdir("/opt/GWinWrap/"); + system("python GWinWrap.py"); +return 0; +}