~nhoad/luna

6b6afe624643844513f6badbe17f6c1257a5edb1 — Nathan Hoad 2 years ago 4c6f047 master
Implement a version of iTerm2's broadcasting.
1 files changed, 29 insertions(+), 0 deletions(-)

M luna.py
M luna.py => luna.py +29 -0
@@ 25,6 25,8 @@ base0D = "#01a0e4"
base0E = "#a16a94"
base0F = "#cdab53"


BROADCAST = base03
FOREGROUND = '#fff'
BACKGROUND = base00
FONTS = [


@@ 84,6 86,7 @@ def change_font(terminal, *, left=None, name=None):

class Luna(Gtk.Application):
    terminals = weakref.WeakValueDictionary()
    broadcast_to = weakref.WeakSet()

    def __init__(self):
        super().__init__(


@@ 98,6 101,7 @@ class Luna(Gtk.Application):
        terminal = Vte.Terminal.new()
        terminal.connect('child-exited', self.on_child_exited, window)
        terminal.connect('window-title-changed', self.set_window_title, window)
        terminal.connect('commit', self.broadcast_to_terminals)

        self.setup_terminal(terminal)
        self.configure_terminal(terminal)


@@ 160,10 164,33 @@ class Luna(Gtk.Application):
            elif keyval == Gdk.KEY_V:
                terminal.paste_primary()
                return True
        elif event.state & Gdk.ModifierType.SHIFT_MASK:
            if keyval == Gdk.KEY_space:
                self.broadcast_add_or_remove(terminal)
                return True

    def on_selection_changed(self, terminal):
        terminal.copy_clipboard()

    def broadcast_add_or_remove(self, terminal):
        if terminal in self.broadcast_to:
            self.broadcast_to.remove(terminal)
            terminal.set_color_background(self.bg)
        else:
            self.broadcast_to.add(terminal)
            terminal.set_color_background(self.broadcast_bg)

    def broadcast_to_terminals(self, source, data, length):
        if source not in self.broadcast_to:
            return

        for terminal in self.broadcast_to:
            if terminal is source:
                continue
            terminal.handler_block_by_func(self.broadcast_to_terminals)
            terminal.feed_child(data, len(data))
            terminal.handler_unblock_by_func(self.broadcast_to_terminals)

    def resize_font(self, terminal, step):
        font = terminal.get_font()
        font.set_size((font.get_size() / Pango.SCALE + step) * Pango.SCALE)


@@ 203,9 230,11 @@ class Luna(Gtk.Application):
    def setup(self):
        self.fg = Gdk.RGBA()
        self.bg = Gdk.RGBA()
        self.broadcast_bg = Gdk.RGBA()

        self.fg.parse(FOREGROUND)
        self.bg.parse(BACKGROUND)
        self.broadcast_bg.parse(BROADCAST)

        self.colors = [Gdk.RGBA() for c in COLORS]
        [color.parse(s) for (color, s) in zip(self.colors, COLORS)]