def __init__(self): super().__init__(title="Navbar") GtkLayerShell.init_for_window(self) GtkLayerShell.auto_exclusive_zone_enable(self) css_provider = Gtk.CssProvider() Gtk.CssProvider.load_from_path(css_provider, "navbar/themes/default/style.css") #Gtk.StyleContext.add_provider(self.get_style_context(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) self.add(self.main_box) self.left_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) self.main_box.pack_start(self.left_box, False, False, 0) self.center_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) self.main_box.set_center_widget(self.center_box) self.right_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) self.main_box.pack_end(self.right_box, False, False, 0) self.load_config() self.set_horizontal()
def main(): common.config_dir = get_config_dir() common.defaults = get_defaults() parser = argparse.ArgumentParser() parser.add_argument("-c", "--config", type=str, default="config", help="config filename (in {}/)".format(common.config_dir)) parser.add_argument("-s", "--style", type=str, default="style.css", help="css filename (in {}/)".format(common.config_dir)) parser.add_argument("-r", "--restore", action="store_true", help="restore default config files") parser.add_argument("-v", "--version", action="version", version="%(prog)s {}".format(__version__), help="display version information") args = parser.parse_args() try: from pyalsa import alsamixer common.dependencies["pyalsa"] = True except: print("pylsa module not found, will try amixer") global restart_cmd restart_cmd = "nwg-panel -c {} -s {}".format(args.config, args.style) # Try and kill already running instance if any pid_file = os.path.join(temp_dir(), "nwg-panel.pid") if os.path.isfile(pid_file): try: pid = int(load_text_file(pid_file)) os.kill(pid, signal.SIGINT) print("Running instance killed, PID {}".format(pid)) except: pass save_string(str(os.getpid()), pid_file) save_string("-c {} -s {}".format(args.config, args.style), os.path.join(local_dir(), "args")) common.app_dirs = get_app_dirs() common.dependencies["amixer"] = is_command("amixer") config_file = os.path.join(common.config_dir, args.config) copy_files(os.path.join(dir_name, "icons_light"), os.path.join(common.config_dir, "icons_light")) copy_files(os.path.join(dir_name, "icons_dark"), os.path.join(common.config_dir, "icons_dark")) copy_executors(os.path.join(dir_name, "executors"), os.path.join(common.config_dir, "executors")) copy_files(os.path.join(dir_name, "config"), common.config_dir, args.restore) common.outputs = list_outputs(sway=sway) panels = load_json(config_file) screen = Gdk.Screen.get_default() provider = Gtk.CssProvider() style_context = Gtk.StyleContext() style_context.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) try: provider.load_from_path(os.path.join(common.config_dir, args.style)) except Exception as e: print(e) for panel in panels: check_key(panel, "icons", "") icons_path = "" if panel["icons"] == "light": icons_path = os.path.join(common.config_dir, "icons_light") elif panel["icons"] == "dark": icons_path = os.path.join(common.config_dir, "icons_dark") check_key(panel, "output", "") # This is to allow width "auto" value. Actually all non-numeric values will be removed. if "width" in panel and not isinstance(panel["width"], int): panel.pop("width") if panel["output"] in common.outputs or not panel["output"]: check_key(panel, "spacing", 6) check_key(panel, "css-name", "") check_key(panel, "padding-horizontal", 0) check_key(panel, "padding-vertical", 0) window = Gtk.Window() if panel["css-name"]: window.set_property("name", panel["css-name"]) if "output" not in panel or not panel["output"]: display = Gdk.Display.get_default() monitor = display.get_monitor(0) for key in common.outputs: if common.outputs[key]["monitor"] == monitor: panel["output"] = key # Width undefined or "auto" if "output" in panel and panel["output"] and "width" not in panel: panel["width"] = common.outputs[panel["output"]]["width"] check_key(panel, "width", 0) w = panel["width"] check_key(panel["controls-settings"], "window-width", 0) controls_width = panel["controls-settings"]["window-width"] if panel["controls-settings"][ "window-width"] > 0 else int(w / 5) check_key(panel, "height", 0) h = panel["height"] check_key(panel, "controls", "off") if panel["controls"]: check_key(panel, "controls-settings", {}) if "controls-settings" in panel: controls_settings = panel["controls-settings"] check_key(controls_settings, "show-values", False) Gtk.Widget.set_size_request(window, w, h) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) vbox.pack_start(hbox, True, True, panel["padding-vertical"]) check_key(panel, "modules-left", []) check_key(panel, "modules-center", []) check_key(panel, "modules-right", []) # This is to allow the "auto" value. Actually all non-numeric values will be removed. if "homogeneous" in panel and not isinstance(panel["homogeneous"], bool): panel.pop("homogeneous") # set equal columns width by default if "modules-center" not empty; this may be overridden in config if panel["modules-center"]: check_key(panel, "homogeneous", True) else: check_key(panel, "homogeneous", False) inner_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) inner_box.set_homogeneous(panel["homogeneous"]) hbox.pack_start(inner_box, True, True, panel["padding-horizontal"]) left_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=panel["spacing"]) inner_box.pack_start(left_box, False, True, 0) if panel["controls"] and panel["controls"] == "left": monitor = None try: monitor = common.outputs[panel["output"]]["monitor"] except KeyError: pass cc = Controls(panel["controls-settings"], panel["position"], panel["controls"], controls_width, monitor=monitor, icons_path=icons_path) common.controls_list.append(cc) left_box.pack_start(cc, False, False, 0) instantiate_content(panel, left_box, panel["modules-left"], icons_path=icons_path) center_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=panel["spacing"]) inner_box.pack_start(center_box, True, False, 0) check_key(panel, "modules-center", []) instantiate_content(panel, center_box, panel["modules-center"], icons_path=icons_path) right_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=panel["spacing"]) # Damn on the guy who invented `pack_start(child, expand, fill, padding)`! helper_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) helper_box.pack_end(right_box, False, False, 0) inner_box.pack_start(helper_box, False, True, 0) check_key(panel, "modules-right", []) instantiate_content(panel, right_box, panel["modules-right"], icons_path=icons_path) if panel["controls"] and panel["controls"] == "right": monitor = None try: monitor = common.outputs[panel["output"]]["monitor"] except KeyError: pass cc = Controls(panel["controls-settings"], panel["position"], panel["controls"], controls_width, monitor=monitor, icons_path=icons_path) common.controls_list.append(cc) right_box.pack_end(cc, False, False, 0) window.add(vbox) GtkLayerShell.init_for_window(window) monitor = None try: monitor = common.outputs[panel["output"]]["monitor"] except KeyError: pass check_key(panel, "layer", "top") o = panel["output"] if "output" in panel else "undefined" print("Display: {}, position: {}, layer: {}, width: {}, height: {}".format(o, panel["position"], panel["layer"], panel["width"], panel["height"])) if monitor: GtkLayerShell.set_monitor(window, monitor) GtkLayerShell.auto_exclusive_zone_enable(window) if panel["layer"] == "top": GtkLayerShell.set_layer(window, GtkLayerShell.Layer.TOP) else: GtkLayerShell.set_layer(window, GtkLayerShell.Layer.BOTTOM) check_key(panel, "margin-top", 0) GtkLayerShell.set_margin(window, GtkLayerShell.Edge.TOP, panel["margin-top"]) check_key(panel, "margin-bottom", 0) GtkLayerShell.set_margin(window, GtkLayerShell.Edge.BOTTOM, panel["margin-bottom"]) if panel["position"] == "top": GtkLayerShell.set_anchor(window, GtkLayerShell.Edge.TOP, 1) else: GtkLayerShell.set_anchor(window, GtkLayerShell.Edge.BOTTOM, 1) window.show_all() Gdk.threads_add_timeout(GLib.PRIORITY_DEFAULT_IDLE, 150, check_tree) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) Gtk.main()
gi.require_version('Gtk', '3.0') try: gi.require_version('GtkLayerShell', '0.1') except ValueError: import sys raise RuntimeError( '\n\n' + 'If you haven\'t installed GTK Layer Shell, you need to point Python to the\n' + 'library by setting GI_TYPELIB_PATH and LD_LIBRARY_PATH to <build-dir>/src/.\n' + 'For example you might need to run:\n\n' + 'GI_TYPELIB_PATH=build/src LD_LIBRARY_PATH=build/src python3 ' + ' '.join(sys.argv)) from gi.repository import Gtk, GtkLayerShell window = Gtk.Window() label = Gtk.Label(label='GTK Layer Shell with Python!') window.add(label) GtkLayerShell.init_for_window(window) GtkLayerShell.auto_exclusive_zone_enable(window) GtkLayerShell.set_margin(window, GtkLayerShell.Edge.TOP, 10) GtkLayerShell.set_margin(window, GtkLayerShell.Edge.BOTTOM, 10) GtkLayerShell.set_anchor(window, GtkLayerShell.Edge.BOTTOM, 1) window.show_all() window.connect('destroy', Gtk.main_quit) Gtk.main()