diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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. + + , 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/README.md b/README.md new file mode 100644 index 0000000..32c98a8 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +## Brightness Adjuster +*A GTK based brightness adjuster 1.0.0* +![Icon](icons/64x64/brightness-adjuster) +## Description +----------- +Brightness Adjuster is a gtk based brightness ajuster made for linux based distros. It is a subtitute for Brightness Controller made using Qt. It features +* Red, green and blue sliders for adjusting the screen colors. +* A notebook based UI for switching between screens. +* A normal white brightness slider. +* Light weight +* Instant changes +* Auto screen updates (Customizable) + +## Install +------- +Install using pip +``` +pip install brightness-adjuster +``` +Install from source +``` +$ git clone https://github.com/astraldev/Brightness-Adjuster +$ cd Brightness-Adjuster +$ pip install . +``` +_Coming soon to snapstore_ + +## Requirements +--------------- +This tool requires +- Python3 and above +`$ sudo apt install dev-python` +- PyGObect `pip3 install pygobject` +- Configparser `pip3 install configparser` +- xrandr + +## Draw backs +------------- +1. This tool does not work on Wayland +2. Must not be installed globally. It must have this path format `{$HOME}/.local` +3. If not correctly installed, file links may be broken + +## License +--------- +This tool is shipped with the GNU Lesser public license GPL. Also see [COPYING](COPYING) + +## Changelog +------------ +v1.0.0 +- App created diff --git a/brightness-adjuster b/brightness-adjuster new file mode 100644 index 0000000..2e94a01 --- /dev/null +++ b/brightness-adjuster @@ -0,0 +1,399 @@ +#! /usr/bin/env python3 +import gi, os +import subprocess +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib, Gio +import configparser + +builder = Gtk.Builder() + +config_dir = f"{os.path.expandvars('$HOME')}/.brightness-adjuster/config.cfg" +config_text = "[settings]\nrefresh=5\nred=rgb(230, 33, 33)\ngreen=rgb(47, 207, 32)\nblue=rgb(35, 97, 212)\nwhite=rgb(240, 248, 255)" +def load_config(): + if not os.path.exists(config_dir): + try: + os.mkdir(f"{os.path.expandvars('$HOME')}/.brightness-adjuster") + except: + pass + fd = open(config_dir, "w") + fd.write(config_text) + +def test_config(): + try: + configuration.get("settings", "red") + configuration.get("settings", "refresh") + configuration.get("settings", "green") + configuration.get("settings", "blue") + configuration.get("settings", "white") + except: + fd = open(config_dir, "w") + fd.write(config_text) + +load_config() +test_config() + +directory = f"{os.path.expandvars('$HOME')}/.local" + +css_provider = Gtk.CssProvider() +css_provider.load_from_path(f"{directory}/brightness-adjuster/ui/style.css") +main_display_screen = Gdk.Display.get_default_screen(Gdk.Display.get_default()) +Gtk.StyleContext().add_provider_for_screen(main_display_screen, css_provider, 600) + +builder.add_from_file(f"{directory}/brightness-adjuster/ui/ui.glade") +configuration = configparser.ConfigParser() +configuration.read(config_dir) + +def execute_command(command): + return subprocess.check_output(command.split()) + +def get_screens(): + txt = execute_command("xrandr --verbose") + txt = txt.split(b"\n") + screens = [] + screen = [] + for line in txt: + if line.find(b" connected ") != -1: + screen.append(str(line.split(b" connected")[0]).replace("b'", "").replace("'", "")) + if line.find(b"Brightness:") != -1: + screen.append(str(line.split(b"Brightness: ")[1]).replace("b'", "").replace("'", "")) + if line.find(b"Gamma:") != -1: + screen.append(str(line.split(b"Gamma:"+b" "*6)[1]).replace("b'", "").replace("'", "")) + if len(screen) == 3: + screens.append(screen) + screen = [] + + return screens + +class SigHandler: + def __init__(self): + self.notebook = builder.get_object("_screen_notebook") + self.screens = {} + self.window = builder.get_object("main_window") + self.window.set_icon_name("brightness-adjuster") + self.preference = builder.get_object("pref_window") + + self.about = builder.get_object("about_window") + self.red = Gdk.RGBA() + self.red.parse(configuration.get("settings", "red")) + self.green = Gdk.RGBA() + self.green.parse(configuration.get("settings", "green")) + self.blue = Gdk.RGBA() + self.blue.parse(configuration.get("settings", "blue")) + self.white = Gdk.RGBA() + self.white.parse(configuration.get("settings", "white")) + self.refresh_num = configuration.getint("settings","refresh") + self._load_pref() + + def _load_pref(self, *args): + builder.get_object("-ref-time").set_value(self.refresh_num) + builder.get_object("r-color").set_rgba(self.red) + builder.get_object("g-color").set_rgba(self.green) + builder.get_object("b-color").set_rgba(self.blue) + builder.get_object("w-color").set_rgba(self.white) + + def _refresh_handler(self, widget, *args): + self.refresh_num = widget.get_value_as_int() + + def _red_color_changed(self, *args): + widget = args[0] + color = widget.get_rgba() + self.red = color + + def _close_pref(self, window, *args): + builder.get_object("pref_window").hide() + + def _green_color_changed(self, widget, *args): + color = widget.get_rgba() + self.green = color + + def _blue_color_changed(self, widget, *args): + color = widget.get_rgba() + self.blue = color + + def _white_changed(self, widget, *args): + color = widget.get_rgba() + self.white = color + + def save_preference(self, *args): + open(config_dir, "w").write(f"[settings]\nrefresh={self.refresh_num}\nred={self.red.to_string()}\ngreen={self.green.to_string()}\nblue={self.blue.to_string()}\nwhite={self.white.to_string()}") + fdat = None + dd = f"{directory}/brightness-adjuster/ui/style.css" + with open(dd, "r+") as fd: + data = fd.read() + lines = [(ln, num) for num, ln in enumerate(data.split("\n")) \ + if ln.find("/*") != -1 and ln.find("*/") != -1] + red_ln = lines[0][1] + green_ln = lines[1][1] + blue_ln = lines[2][1] + white_ln = lines[3][1] + + red = " background-color: " + self.red.to_string() + "; /*red*/" + green = " background-color: " + self.green.to_string() + "; /*green*/" + blue = " background-color: " + self.blue.to_string() + "; /*blue*/" + white = " background-color: " + self.white.to_string() + "; /*white*/" + + file = [x for x in data.split("\n")] + file[red_ln] = red + file[green_ln] = green + file[blue_ln] = blue + file[white_ln] = white + fdat = "\n".join(file) + with open(dd, "w+") as fd: + fd.write(fdat) + + + def _run(self, screen, brightness, r, g, b): + "Changes the brightness and gamma" + cmd = f"xrandr --output {screen} --brightness {brightness} --gamma {r}:{g}:{b}" + execute_command(cmd) + + def _brightness_changed(self, scale, scrolltype, number, screen): + "Handler for changed brightness and adjust using xrandr" + number = round(number, 5) + number /= 100 + number = round(number, 5) + if number < 0.09 or number > 3.0: + return False + self.screens[screen]["default"] = number + self._run(screen, + self.screens[screen]["default"], \ + self.screens[screen]["red"], \ + self.screens[screen]["green"], \ + self.screens[screen]["blue"] + ) + + + def _gamma_changed(self, widget, scrolltype, number, color, screen): + "Handler for changed gamma and adjust gamma color" + if number < 0.0 or number > 255.0: + return False + + number /= 255 + number = round(number, 5) + self.screens[screen][color] = number + self._run(screen, + self.screens[screen]['default'], \ + self.screens[screen]["red"], \ + self.screens[screen]["green"], \ + self.screens[screen]["blue"] + ) + + def _on_quit(self, *args): + self.window.hide() + self.save_preference() + + def _get_screens(self, *args): + return get_screens() + + def _split_gamma(self, gamma, *args): + r, g, b = gamma.split(":") + r, g, b = float(r)*255, float(g)*255, float(b)*255 + return r, g, b + + def _join_gamma(self, r, g, b, *args): + return f"{r}:{g}:{b}" + + def _refresh(self, *args): + screens = [x[0] for x in get_screens()] + screen_list = list(self.screens.keys()) + + for index, screen in enumerate(screen_list): + if screen not in screens: + self.notebook.remove_page(index) + del self.screens[screen] + if self.screens.get(screen, False): + self._run(screen, + self.screens[screen]['default'], \ + self.screens[screen]["red"], \ + self.screens[screen]["green"], \ + self.screens[screen]["blue"] + ) + screens = self._get_screens() + for screen in screens: + if screen[0] in screen_list: + continue + control = self._create_control(screen) + self.notebook.append_page(control, Gtk.Label(label=screen[0])) + self.notebook.show_all() + return True + + def _create_control(self, screen, *args): + box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + + b2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + b3 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + + b4 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + + b_r = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + b_g = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + b_b = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + + lb_slider = Gtk.Label(label="Brightness") + g_slider = Gtk.Label(label="Gamma") + + l_r_slider = Gtk.Label(label="R") + l_g_slider = Gtk.Label(label="G") + l_b_slider = Gtk.Label(label="B") + + gamma = self._split_gamma(screen[1]) + display = screen[0] + brightness = float(screen[2])*100 + + + b_slider = Gtk.Scale() + b_slider.set_name("slider-default") + adj = Gtk.Adjustment( + value=0, lower=0, upper=100, step_increment=1, page_increment=25, page_size=0 #red adj + ) + b_slider.set_restrict_to_fill_level(True) + adj.set_value(brightness) + b_slider.connect("change-value", self._brightness_changed, display) + + b_slider.set_adjustment(adj) + b_slider.set_digits(0) + b_slider.set_inverted(True) + b_slider.set_orientation(Gtk.Orientation.VERTICAL) + + g_r = Gtk.Scale() + g_r.set_name("slider-red") + g_r.connect("change-value", self._gamma_changed, "red", display) + + g_g = Gtk.Scale() + g_g.set_name("slider-green") + g_g.connect("change-value", self._gamma_changed, "green", display) + + g_b = Gtk.Scale() + g_b.set_name("slider-blue") + g_b.connect("change-value", self._gamma_changed, "blue", display) + + + adj1 = Gtk.Adjustment( + value=0, lower=0, upper=255, step_increment=1, page_increment=25, page_size=0 #red adj + ) + adj1.set_value(gamma[0]) + adj2 = Gtk.Adjustment( + value=0, lower=0, upper=255, step_increment=1, page_increment=25, page_size=0 #green adj + ) + adj2.set_value(gamma[1]) + adj3 = Gtk.Adjustment( + value=0, lower=0, upper=255, step_increment=1, page_increment=25, page_size=0 #blue adj + ) + adj3.set_value(gamma[2]) + + g_r.set_adjustment(adj1) + g_g.set_adjustment(adj2) + g_b.set_adjustment(adj3) + + g_r.set_orientation(Gtk.Orientation.VERTICAL) + g_g.set_orientation(Gtk.Orientation.VERTICAL) + g_b.set_orientation(Gtk.Orientation.VERTICAL) + + g_r.set_inverted(True) + g_g.set_inverted(True) + g_b.set_inverted(True) + + g_r.set_digits(0) + g_g.set_digits(0) + g_b.set_digits(0) + + b2.pack_start(lb_slider, False, True, 0) + b2.pack_start(b_slider, True, True, 0) + + b3.pack_start(g_slider, False, True, 0) + + b4.pack_start(b_r, True, True, 0) + b4.pack_start(b_g, True, True, 0) + b4.pack_start(b_b, True, True, 0) + + b_r.pack_start(l_r_slider, False, True, 0) + b_r.pack_start(g_r, True, True, 0) + + b_g.pack_start(l_g_slider, False, True, 0) + b_g.pack_start(g_g, True, True, 0) + + b_b.pack_start(l_b_slider, False, True, 0) + b_b.pack_start(g_b, True, True, 0) + + box.pack_start(b2, False, True, 0) + + b5 = Gtk.Box() + b5.pack_start(b4, True, True, 0) + b4.set_spacing(10) + b4.set_name("slider-box") + b3.pack_start(b5, True, True, 0) + box.pack_start(b3, True, True, 0) + + box.set_margin_start(10) + box.set_margin_end(10) + box.set_margin_bottom(10) + box.set_margin_top(10) + + box.show_all() + + self.screens[display] = {} + self.screens[display]["default"] = round(brightness/100, 3) + self.screens[display]["red"] = round(gamma[0]/255, 3) + self.screens[display]["green"] = round(gamma[1]/255, 3) + self.screens[display]["blue"] = round(gamma[2]/255, 3) + + return box + + def _show(self, *args): + screens = self._get_screens() + for screen in screens: + control = self._create_control(screen) + self.notebook.append_page(control, Gtk.Label(label=screen[0])) + self.notebook.show_all() + GLib.timeout_add_seconds(configuration.getint("settings", "refresh"), self._refresh) + + +class BrightnessApp(Gtk.Application): + def __init__(self,id, *args, **kwargs): + super().__init__(*args, application_id=id, **kwargs) + self.window = None + + def do_startup(self, *args): + Gtk.Application.do_startup(self) + action = Gio.SimpleAction.new("about", None) + action.connect("activate", self.about) + self.add_action(action) + action = Gio.SimpleAction.new("exit", None) + action.connect("activate", self.on_quit) + self.add_action(action) + action = Gio.SimpleAction.new("preference", None) + action.connect("activate", self.preference) + self.add_action(action) + + def do_activate(self, *args): + if not self.window: + builder.connect_signals(SigHandler()) + self.window = builder.get_object("main_window") + self.about = builder.get_object("about_window") + self.add_window(self.window) + self.window.present() + + def on_quit(self, *args): + self.quit() + + def preference(self, *args): + pw = builder.get_object("pref_window") + pw.run() + pw.hide() + + + def about(self, *args): + self.about.run() + self.about.hide() + + + +def main(): + key = "BRIGHTNESS-APP-astral.co" + app = BrightnessApp(key) + sleep(0.5) + app.run() + +if __name__=="__main__": + from time import sleep + main() diff --git a/brightness-adjuster.desktop b/brightness-adjuster.desktop new file mode 100644 index 0000000..01abc0a --- /dev/null +++ b/brightness-adjuster.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Brightness Adjuster +Comment=Adjusts primary and all secondary brightness +Exec=brightness-adjuster +Terminal=false +Type=Application +StartupNotify=false +Categories=Utility;Accessories +Icon=brightness-adjuster.png +X-Desktop-File-Install-Version=0.24 \ No newline at end of file diff --git a/icons/128x128/brightness-adjuster.png b/icons/128x128/brightness-adjuster.png new file mode 100644 index 0000000..06d7cc9 Binary files /dev/null and b/icons/128x128/brightness-adjuster.png differ diff --git a/icons/256x256/brightness-adjuster.png b/icons/256x256/brightness-adjuster.png new file mode 100644 index 0000000..08c3689 Binary files /dev/null and b/icons/256x256/brightness-adjuster.png differ diff --git a/icons/512x512/brightness-adjuster.png b/icons/512x512/brightness-adjuster.png new file mode 100644 index 0000000..08c3689 Binary files /dev/null and b/icons/512x512/brightness-adjuster.png differ diff --git a/icons/64x64/brightness-adjuster.png b/icons/64x64/brightness-adjuster.png new file mode 100644 index 0000000..130c6da Binary files /dev/null and b/icons/64x64/brightness-adjuster.png differ diff --git a/icons/scalable/brightness-adjuster.svg b/icons/scalable/brightness-adjuster.svg new file mode 100644 index 0000000..a57c9c7 --- /dev/null +++ b/icons/scalable/brightness-adjuster.svg @@ -0,0 +1,385 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9fa0dd2 --- /dev/null +++ b/setup.py @@ -0,0 +1,21 @@ + +from setuptools import setup +setup( + name="brightness-adjuster", + version="1.0.0", + author="AstralDev", + author_email="ekureedem480@gmail.com", + license="GPL", + keywords="controller adjuster brightness", + python_requires=">=3", + requires=["pygobject", "configparser"], + scripts=["brightness-adjuster"], + data_files=[("brightness-adjuster/ui", ["ui/style.css", "ui/ui.glade"]), + (".brightness-adjuster", ["config.cfg"]), + ("share/applications", ["brightness-adjuster.desktop"]), + ("share/icons/hicolor/512x512/apps",["icons/512x512/brightness-adjuster.png"]), + ("share/icons/hicolor/128x128/apps", ["icons/128x128/brightness-adjuster.png"]), + ("share/icons/hicolor/64x64/apps", ["icons/64x64/brightness-adjuster.png"]), + ("share/icons/hicolor/256x256/apps", ["icons/256x256/brightness-adjuster.png"]), + ("share/icons/hicolor/scalable/apps", ["icons/scalable/brightness-adjuster.svg"])] +) \ No newline at end of file diff --git a/ui/style.css b/ui/style.css new file mode 100644 index 0000000..d6aed3b --- /dev/null +++ b/ui/style.css @@ -0,0 +1,34 @@ + +#slider-red highlight{ + background-color: rgb(230, 33, 33); /*red*/ +}#slider-green highlight{ + background-color: rgb(47, 207, 32); /*green*/ +}#slider-blue highlight{ + background-color: rgb(35, 97, 212); /*blue*/ +}#slider-default highlight{ + background-color: rgb(240, 248, 255); /*white*/ +} + +#slider-red trough, +#slider-green trough, +#slider-blue trough, +#slider-default trough{ + background-color: #1b1b1b; + color: #1b1b1b; + padding-right: 1px; + padding-left: 1px; +} +#slider-box{ + padding-top: 5px; + padding-right: 5px; + padding-left: 5px; + padding-bottom: 5px; + margin-top: 5px; + margin-left: 5px; + margin-right: 5px; + margin-bottom: 5px; + border-width: 1px; + border-style: solid; + border-color: #1b1b1b; + border-radius: 3px; +} \ No newline at end of file diff --git a/ui/ui.glade b/ui/ui.glade new file mode 100644 index 0000000..b02e30d --- /dev/null +++ b/ui/ui.glade @@ -0,0 +1,484 @@ + + + + + + + True + False + + + 100 + 100 + 1 + 10 + + + 100 + 100 + 1 + 10 + + + 60 + 1 + 5 + + + False + + + 70 + 0 + True + False + 5 + 5 + 5 + 4 + vertical + 1 + + + True + True + True + app.preference + Preference + + + False + True + 0 + + + + + True + True + True + app.about + About + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + True + True + app.exit + Exit + + + False + True + 3 + + + + + main + 1 + + + + + False + False + 400 + 450 + + + + True + False + Brightness Adjuster + True + + + True + True + False + True + none + popovermenu1 + + + + + + + + + + True + False + vertical + + + True + True + + + + + + + + + + + + + + + True + True + 1 + + + + + + + False + dialog + main_window + Brightness Adjuster + 1.0.0 + A very basic PyGtk based brightness adjuster +for multiple screens + brightness-adjuster + lgpl-3-0 + 0 + + + True + False + About + True + + + + + False + vertical + 2 + + + False + end + + + Close + True + True + True + app.about_quit + + + True + True + 1 + + + + + False + False + 0 + + + + + + + False + Preference + dialog + main_window + 0 + + + True + False + Preference + True + + + + + False + vertical + 2 + + + False + end + + + Save + True + True + True + + + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + 10 + + + True + False + vertical + + + True + False + Timing + + + + + + + False + True + 0 + + + + + True + False + + + True + False + Refresh timing (min) + + + True + True + 0 + + + + + True + True + 0 + adjustment3 + + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + 5 + + + True + False + Sliders + + + + + + + False + True + 0 + + + + + True + False + 5 + 10 + True + + + True + False + Red + + + 0 + 0 + + + + + True + False + Green + + + 1 + 0 + + + + + True + False + Blue + + + 2 + 0 + + + + + True + False + White + + + 3 + 0 + + + + + True + True + True + + + + 0 + 1 + + + + + True + True + True + + + + 1 + 1 + + + + + True + True + True + + + + 2 + 1 + + + + + True + True + True + + + + 3 + 1 + + + + + True + True + 1 + + + + + False + True + 1 + + + + + True + False + Changes will take place after app restarts!. + + + True + True + 2 + + + + + True + True + 1 + + + + + +