# srec: A simple GUI for screen recording # # 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, version 3. from dataclasses import dataclass import subprocess from typing import Callable import gi gi.require_version("Gtk", "4.0") from gi.repository import Gtk # nopep8 pylint: disable=wrong-import-position @dataclass class Recording: process: subprocess.Popen[bytes] recording: Recording | None = None def on_start_recording(_: Gtk.Button, stack: Gtk.Stack) -> None: global recording # pylint: disable=global-statement assert recording is None screen_size = '1366x768' # TODO command = [ 'ffmpeg', '-video_size', screen_size, '-framerate', '25', '-f', 'x11grab', '-i', ':0.0+0,0', '-f', 'pulse', '-ac', '2', '-i', 'default', 'screen-recording.mkv'] # nopep8 # pylint: disable=consider-using-with recording = Recording( process=subprocess.Popen(command, stdin=subprocess.PIPE)) stack.set_visible_child_name("recording") def on_stop_recording(_: Gtk.Button, stack: Gtk.Stack) -> None: global recording # pylint: disable=global-statement assert recording is not None stdin = recording.process.stdin assert stdin is not None stdin.write(b'q') stdin.flush() recording.process.wait() recording = None stack.set_visible_child_name("not_recording") def make_button(label: str, action: Callable[[ Gtk.Button, Gtk.Stack], None], stack: Gtk.Stack) -> Gtk.Button: button = Gtk.Button(label=label) button.connect('clicked', action, stack) button.set_margin_top(10) button.set_margin_start(10) button.set_margin_end(10) button.set_margin_bottom(10) return button def on_activate(app: Gtk.Application) -> None: win = Gtk.ApplicationWindow(application=app) win.set_title('SRec') stack = Gtk.Stack() start_recording = make_button("Start Recording", on_start_recording, stack) stack.add_named(start_recording, "not_recording") box = Gtk.Box() box.set_orientation(Gtk.Orientation.VERTICAL) stop_recording = make_button("Stop Recording", on_stop_recording, stack) box.append(stop_recording) stack.add_named(box, "recording") win.set_child(stack) win.present() def main() -> None: app = Gtk.Application(application_id='net.chkno.srec') app.connect('activate', on_activate) app.run(None) if __name__ == '__main__': main()