├── share └── kazam ├── po ├── POTFILES.skip ├── POTFILES.in ├── fo.po ├── eo.po ├── pt_PT.po ├── bn.po ├── is.po ├── en_CA.po ├── ku.po └── uk.po ├── kazam ├── tests │ ├── __init__.py │ └── test_app.py ├── backend │ ├── __init__.py │ ├── __pycache__ │ │ ├── prefs.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ ├── config.cpython-37.pyc │ │ └── webcam.cpython-37.pyc │ ├── utils.py │ ├── keypress.py │ ├── listkeys-subprocess.py │ ├── webcam.py │ └── config.py ├── frontend │ ├── __init__.py │ ├── widgets.py │ ├── main_menu.py │ ├── about_dialog.py │ ├── save_dialog.py │ ├── window_webcam.py │ ├── combobox.py │ ├── done_recording.py │ ├── window_select.py │ └── window_outline.py ├── pulseaudio │ ├── __init__.py │ ├── error_handling.py │ └── ctypes_pulseaudio.py ├── __init__.py ├── __pycache__ │ ├── app.cpython-37.pyc │ ├── utils.cpython-37.pyc │ ├── __init__.cpython-37.pyc │ └── version.cpython-37.pyc ├── version.py ├── utils.py └── instant.py ├── kazam.png ├── img ├── Kazam_001.png └── Kazam_002.png ├── data ├── sounds │ ├── Canon 7D.ogg │ └── Nikon D80.ogg ├── icons │ ├── 14x14 │ │ └── kazam.png │ ├── 192x192 │ │ └── kazam.png │ ├── 16x16 │ │ └── apps │ │ │ └── kazam.png │ ├── 22x22 │ │ ├── apps │ │ │ └── kazam.png │ │ └── status │ │ │ ├── kazam-paused.png │ │ │ ├── kazam-stopped.png │ │ │ ├── kazam-countdown.png │ │ │ └── kazam-recording.png │ ├── 32x32 │ │ └── apps │ │ │ ├── kazam.png │ │ │ ├── kazam-area.png │ │ │ ├── kazam-window.png │ │ │ ├── kazam-all-screens.png │ │ │ ├── kazam-fullscreen.png │ │ │ ├── kazam-screencast.png │ │ │ └── kazam-screenshot.png │ ├── 48x48 │ │ └── apps │ │ │ └── kazam.png │ ├── 64x64 │ │ ├── apps │ │ │ └── kazam.png │ │ └── icons │ │ │ └── kazam.png │ ├── dark │ │ ├── kazam-area.png │ │ ├── kazam-window.png │ │ ├── kazam-fullscreen.png │ │ ├── kazam-screencast.png │ │ ├── kazam-screenshot.png │ │ └── kazam-all-screens.png │ ├── 128x128 │ │ └── apps │ │ │ └── kazam.png │ └── scalable │ │ ├── kazam-screencast-symbolic.svg │ │ ├── kazam-area-symbolic.svg │ │ ├── kazam-broadcast-symbolic.svg │ │ ├── kazam-screenshot-symbolic.svg │ │ ├── kazam-window-symbolic.svg │ │ ├── kazam-ocr-symbolic.svg │ │ ├── kazam-fullscreen-symbolic.svg │ │ ├── kazam-all-screens-symbolic.svg │ │ └── kazam-webcam-symbolic.svg └── kazam.desktop.in ├── requirements.txt ├── MANIFEST.in ├── .pypirc ├── TODO ├── AUTHORS ├── snapcraft.yaml ├── NEWS ├── setup.py ├── .gitignore ├── bin └── kazam ├── README.md └── COPYING.LGPL /share/kazam: -------------------------------------------------------------------------------- 1 | ../data -------------------------------------------------------------------------------- /po/POTFILES.skip: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kazam/tests/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kazam/backend/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kazam/frontend/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kazam/pulseaudio/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam.png -------------------------------------------------------------------------------- /kazam/__init__.py: -------------------------------------------------------------------------------- 1 | from .version import VERSION 2 | 3 | __version__ = VERSION 4 | -------------------------------------------------------------------------------- /img/Kazam_001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/img/Kazam_001.png -------------------------------------------------------------------------------- /img/Kazam_002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/img/Kazam_002.png -------------------------------------------------------------------------------- /data/sounds/Canon 7D.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/sounds/Canon 7D.ogg -------------------------------------------------------------------------------- /data/icons/14x14/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/14x14/kazam.png -------------------------------------------------------------------------------- /data/sounds/Nikon D80.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/sounds/Nikon D80.ogg -------------------------------------------------------------------------------- /data/icons/192x192/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/192x192/kazam.png -------------------------------------------------------------------------------- /data/icons/16x16/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/16x16/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/22x22/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/22x22/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/48x48/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/48x48/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/64x64/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/64x64/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-area.png -------------------------------------------------------------------------------- /data/icons/128x128/apps/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/128x128/apps/kazam.png -------------------------------------------------------------------------------- /data/icons/64x64/icons/kazam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/64x64/icons/kazam.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-window.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-area.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-fullscreen.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-screencast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-screencast.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-screenshot.png -------------------------------------------------------------------------------- /kazam/__pycache__/app.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/__pycache__/app.cpython-37.pyc -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-window.png -------------------------------------------------------------------------------- /data/icons/dark/kazam-all-screens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/dark/kazam-all-screens.png -------------------------------------------------------------------------------- /kazam/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /data/icons/22x22/status/kazam-paused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/22x22/status/kazam-paused.png -------------------------------------------------------------------------------- /data/icons/22x22/status/kazam-stopped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/22x22/status/kazam-stopped.png -------------------------------------------------------------------------------- /kazam/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /kazam/__pycache__/version.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/__pycache__/version.cpython-37.pyc -------------------------------------------------------------------------------- /data/icons/22x22/status/kazam-countdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/22x22/status/kazam-countdown.png -------------------------------------------------------------------------------- /data/icons/22x22/status/kazam-recording.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/22x22/status/kazam-recording.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-all-screens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-all-screens.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-fullscreen.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-screencast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-screencast.png -------------------------------------------------------------------------------- /data/icons/32x32/apps/kazam-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/data/icons/32x32/apps/kazam-screenshot.png -------------------------------------------------------------------------------- /kazam/backend/__pycache__/prefs.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/backend/__pycache__/prefs.cpython-37.pyc -------------------------------------------------------------------------------- /kazam/backend/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/backend/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /kazam/backend/__pycache__/config.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/backend/__pycache__/config.cpython-37.pyc -------------------------------------------------------------------------------- /kazam/backend/__pycache__/webcam.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrywoo/kazam/HEAD/kazam/backend/__pycache__/webcam.cpython-37.pyc -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | cmake 2 | distutils-extra-python 3 | python-xlib 4 | dbus-python 5 | hiq-python 6 | PyGObject 7 | pyxdg 8 | pycairo 9 | distro 10 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS COPYING COPYING.LGPL README setup.cfg setup.py TODO MANIFEST.in 2 | recursive-include bin * 3 | recursive-include data * 4 | recursive-include kazam * 5 | recursive-include po * 6 | 7 | -------------------------------------------------------------------------------- /.pypirc: -------------------------------------------------------------------------------- 1 | [distutils] 2 | index-servers = 3 | pypi 4 | testpypi 5 | 6 | [pypi] 7 | repository: https://upload.pypi.org/legacy/ 8 | username: wufuheng 9 | 10 | [testpypi] 11 | repository = https://test.pypi.org/legacy/ 12 | username = wufuheng 13 | 14 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | TODO 2 | ---- 3 | 4 | Whishlist (by BigWhale) and reasons why is something still on a whishlist 5 | 6 | - Memory consuption issues with VP8 (needs checking) 7 | - Detection of avenc_aac and x264enc, if one of them is missing, disable 8 | broadcast mode. 9 | 10 | -------------------------------------------------------------------------------- /po/POTFILES.in: -------------------------------------------------------------------------------- 1 | [type: python] bin/kazam 2 | [type: gettext/glade] data/ui/kazam.ui 3 | [type: gettext/glade] data/ui/preferences.ui 4 | data/kazam.desktop.in 5 | kazam/app.py 6 | kazam/frontend/window_select.py 7 | kazam/frontend/done_recording.py 8 | kazam/frontend/about_dialog.py 9 | kazam/frontend/save_dialog.py 10 | kazam/frontend/main_menu.py 11 | kazam/frontend/preferences.py 12 | kazam/frontend/window_area.py 13 | kazam/frontend/window_countdown.py 14 | kazam/frontend/indicator.py 15 | kazam/backend/grabber.py 16 | kazam/backend/prefs.py 17 | 18 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | 2 | The following people worked on Kazam: 3 | 4 | Henry Fuheng Wu - Coding, Fixes, Updates 5 | Matthew Paul Thomas - Design, Testing 6 | Michael Vogt - Coding 7 | Sebastian Heinlein - Widgets 8 | Matthew McGowan - Pathbar, Widgets, Fixes, Coding 9 | Andrew Higginson - Coding, Artwork, Bughelp, Design 10 | K.Vishnoo Charan Reddy - Artwork, Bughelp, Design 11 | Gary Lasker - Coding 12 | David Klasinc - Coding 13 | Georgi Karavasilev - Design, Testing 14 | Alan Pope - Testing 15 | Ken VanDine - Packaging 16 | Mirco "MacSlow" Müller - old-school countdown widget 17 | Stuart Langridge - countdown fixes, on-screen keyboard 18 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-screencast-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-area-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/kazam.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | _Name=Kazam 3 | _GenericName=Screencast and Screenshot tool 4 | _Comment=Record a video or take a screenshot of your screen 5 | _Keywords=screenshot;screencast;videorecord;desktop recording; 6 | Categories=GNOME;AudioVideo; 7 | Exec=kazam 8 | Icon=kazam 9 | X-Unity-IconBackgroundColor=#F56991 10 | Terminal=false 11 | Type=Application 12 | 13 | Actions=SSF;SSA;SSW;Prefs; 14 | 15 | [Desktop Action SSF] 16 | _Name=Take a screenshot of entire workspace 17 | Exec=kazam -f 18 | OnlyShowIn=Unity 19 | 20 | [Desktop Action SSA] 21 | _Name=Select an area to screenshot 22 | Exec=kazam -a 23 | OnlyShowIn=Unity 24 | 25 | [Desktop Action SSW] 26 | _Name=Select a window to screenshot 27 | Exec=kazam -s 28 | OnlyShowIn=Unity 29 | 30 | [Desktop Action Prefs] 31 | _Name=Preferences 32 | Exec=kazam -p 33 | OnlyShowIn=Unity 34 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-broadcast-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /kazam/version.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # utils.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 20 | # MA 02110-1301, USA. 21 | 22 | VERSION = '2.0.0' 23 | CODENAME = 'Jammy' 24 | DISTRO = 'Ubuntu' 25 | RELEASE = '22.04' 26 | -------------------------------------------------------------------------------- /kazam/pulseaudio/error_handling.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # error_handling.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | class PAError(Exception): 24 | """Used for reporting various Pulse Audio Errors""" 25 | def __init__(self, value, msg): 26 | self.value = value 27 | self.msg = msg 28 | 29 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-screenshot-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /kazam/tests/test_app.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # test_app.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | import sys 24 | from unittest import TestCase, main 25 | 26 | from gi.repository import Gtk 27 | 28 | from kazam.app import KazamApp 29 | 30 | def refresh_gui(): 31 | while Gtk.events_pending(): 32 | Gtk.main_iteration_do(False) 33 | 34 | 35 | class KazamAppTest(TestCase): 36 | 37 | def setUp(self): 38 | TestCase.setUp(self) 39 | datadir = "../../data" 40 | dist = ('Ubuntu', '12.10', 'quantal') 41 | 42 | sys.path.insert(0, "..") 43 | 44 | self._tApp = KazamApp(datadir, dist, False, False, False, False) 45 | 46 | 47 | def test_maintoolbar(self): 48 | self.assertEqual(self._tApp.main_mode, 0) 49 | self._tApp.btn_shot.changed() 50 | refresh_gui() 51 | self.assertEqual(self._tApp.main_mode, 1) 52 | 53 | if __name__ == '__main__': 54 | main() 55 | -------------------------------------------------------------------------------- /kazam/backend/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # utils.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 20 | # MA 02110-1301, USA. 21 | 22 | def show_popup(message, title="Kazam Notification"): 23 | from gi.repository import Gtk 24 | full_message = f"{title}:\n\n{message}" # Combine title and message with spacing 25 | dialog = Gtk.MessageDialog( 26 | transient_for=None, 27 | flags=0, 28 | message_type=Gtk.MessageType.ERROR, 29 | buttons=Gtk.ButtonsType.OK, 30 | text=full_message, # Display the formatted message 31 | ) 32 | dialog.set_title(title) # Set the actual window title 33 | dialog.run() 34 | dialog.destroy() 35 | 36 | 37 | 38 | def is_xdotool_installed(): 39 | import subprocess 40 | try: 41 | subprocess.run(["xdotool", "--version"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 42 | return True 43 | except subprocess.CalledProcessError: 44 | return False 45 | except PermissionError: 46 | return False 47 | 48 | -------------------------------------------------------------------------------- /kazam/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # utils.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import os 25 | import math 26 | import logging 27 | import time 28 | import datetime 29 | 30 | logger = logging.getLogger("Utils") 31 | 32 | 33 | def get_next_filename(sdir, prefix, ext): 34 | for _ in range(0, 99999): 35 | now = '{0:%Y-%m-%d_%H-%M-%S}'.format(datetime.datetime.now()) 36 | fname = os.path.join(sdir, "{}_{}{}".format(prefix, now, ext)) 37 | if os.path.isfile(fname): 38 | time.sleep(1) 39 | continue 40 | else: 41 | return fname 42 | 43 | return "Kazam_recording{0}".format(ext) 44 | 45 | 46 | def in_circle(center_x, center_y, radius, x, y): 47 | dist = math.sqrt((center_x - x) ** 2 + (center_y - y) ** 2) 48 | return dist <= radius 49 | 50 | 51 | def get_by_idx(lst, index): 52 | return filter(lambda s: s[0] == index, lst) 53 | -------------------------------------------------------------------------------- /snapcraft.yaml: -------------------------------------------------------------------------------- 1 | name: kazam 2 | summary: Linux Screen Recorder, Broadcaster, Capture and OCR with AI in mind 3 | description: | 4 | kazam is a versatile tool for screen recording, broadcasting, capturing and optical character recognition(OCR). 5 | version: 2.0.0 6 | base: core22 7 | confinement: strict 8 | 9 | parts: 10 | kazam: 11 | plugin: python 12 | source: . 13 | stage-packages: 14 | - python3-gst-1.0 15 | - gir1.2-wnck-3.0 16 | - gir1.2-gudev-1.0 17 | - gir1.2-keybinder-3.0 18 | - gnome-session-canberra # canberra-gtk-play 19 | python-packages: 20 | - kazam 21 | override-prime: | 22 | craftctl default 23 | sed -i 's|/usr/bin/canberra-gtk-play|canberra-gtk-play|g' lib/python3.10/site-packages/kazam/backend/grabber.py 24 | 25 | 26 | cleanup: 27 | after: [kazam] # Make this part run last; list all your other parts here 28 | plugin: nil 29 | build-snaps: [gnome-42-2204] # List all content-snaps you're using here 30 | override-prime: | 31 | set -eux 32 | for snap in "gnome-42-2204"; do # List all content-snaps you're using here 33 | cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" "$SNAPCRAFT_PRIME/usr/{}" \; 34 | done 35 | for CRUFT in bug lintian man; do 36 | rm -rf $SNAPCRAFT_PRIME/usr/share/$CRUFT 37 | done 38 | find $SNAPCRAFT_PRIME/usr/share/doc/ -type f -not -name 'copyright' -delete 39 | find $SNAPCRAFT_PRIME/usr/share -type d -empty -delete 40 | 41 | 42 | slots: 43 | dbus-svc: 44 | interface: dbus 45 | bus: session 46 | name: org.kazam 47 | 48 | apps: 49 | kazam: 50 | command: bin/kazam 51 | extensions: [gnome] 52 | plugs: 53 | - home 54 | - audio-playback 55 | - audio-record 56 | - camera 57 | environment: 58 | GI_TYPELIB_PATH: $SNAP/usr/lib/x86_64-linux-gnu/girepository-1.0 59 | slots: [ dbus-svc ] 60 | -------------------------------------------------------------------------------- /kazam/frontend/widgets.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # widgets.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | from gi.repository import Gtk 24 | 25 | class _Tile(object): 26 | def __init__(self): 27 | self.set_focus_on_click(False) 28 | self.set_relief(Gtk.ReliefStyle.NONE) 29 | self.box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) 30 | self.box.set_size_request(62, -1) 31 | self.add(self.box) 32 | 33 | def create_default(self, label, icon): 34 | if icon is not None: 35 | if isinstance(icon, Gtk.Image): 36 | self.image = icon 37 | else: 38 | self.image = Gtk.Image() 39 | self.box.pack_start(self.image, True, True, 0) 40 | 41 | self.label = Gtk.Label.new(label) 42 | self.box.pack_start(self.label, True, True, 0) 43 | 44 | 45 | class TileToggleButton(Gtk.RadioButton, _Tile): 46 | def __init__(self): 47 | Gtk.RadioButton.__init__(self) 48 | self.set_mode(False) 49 | _Tile.__init__(self) 50 | 51 | 52 | class ModeButton(TileToggleButton): 53 | def __init__(self, label, icon): 54 | TileToggleButton.__init__(self) 55 | html = "%s" % label 56 | self.create_default(html, icon) 57 | self.label.set_use_markup(True) 58 | self.label.set_justify(Gtk.Justification.CENTER) 59 | 60 | #def do_draw(self, cr): 61 | #for child in self: 62 | # self.propagate_draw(child, cr) 63 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-window-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /NEWS: -------------------------------------------------------------------------------- 1 | Kazam 1.5.3 - NX-72307 2 | 3 | - Rudimentary broadcasting to YouTube Live 4 | - On screen display of mouse clicks and keystrokes 5 | - Some code cleanups here and there 6 | 7 | Kazam 1.5.0 - NX-72307 8 | ---------------------- 9 | 10 | - Planned support for webcams 11 | - Planned support for broadcasting directly to YouTube Live and Twitch 12 | 13 | 14 | Kazam 1.4.0 - NCC-2000 15 | ---------------------- 16 | 17 | - When recording an area a red rectangle will be displayed to mark 18 | the recording area during the recording if you are using Ubuntu 19 | 13.04 or higher. 20 | 21 | - New program icon. 22 | 23 | - Kazam is now using symbolic icons for toolbars. 24 | 25 | - Minor changes to countdown screen. 26 | 27 | - Various minor bug fixes: 28 | #1096331 29 | #1104888 30 | #1105618 31 | #1116294 32 | #1099942 33 | #1096370 34 | #1073818 35 | #1073572 36 | 37 | 38 | Kazam 1.3.99 - NX-01 39 | -------------------- 40 | 41 | - Switch to python3 is complete and all necessary dependencies are 42 | taken care of. 43 | 44 | - Audio sources are now separated in two groups 'monitor sources' 45 | which can be used for capturing computer audio and 'standar input' 46 | sources which can be used to capture microphone and other inputs. 47 | 48 | - The following launchpad bugs were addresed: 49 | 50 | #1085437 51 | #1073712 52 | #1079962 53 | #1083041 54 | #1037538 55 | #1072256 56 | #1074354 57 | #1080636 58 | #1082865 59 | #1083047 60 | 61 | Kazam 1.3.4 - NCC-2893 (Stargazer Edition) 62 | ------------------------------------------ 63 | 64 | - Instant mode, to capture screenshots from command line, use 65 | the following switches: 66 | -f / --fullscreen capture full screen 67 | -w / --window capture currently active window 68 | -a / --area capture a preselected screen area 69 | -g / --godmode disable sounds, use automatic file saving and 70 | capture full screen & active window at the same 71 | time 72 | 73 | - New area and window selection screens. 74 | - Unity Launcher quicklist added. 75 | 76 | Kazam 1.3.1 - NCC-2893 (Stargazer Edition) 77 | ------------------------------------------ 78 | 79 | - GStreamer 1.0 support, Kazam will no longer work with older versions 80 | of GStreamer. This includes 0.11 (1.0 alpha/beta/rc) version. Some 81 | encoders were changed in transition from beta to final release which 82 | messed up a lot of things. 83 | 84 | - Completely new GUI. Designed by https://launchpad.net/~kokoto-java with 85 | the omnipresent guiding hand of https://launchpad.net/~mpt 86 | 87 | - Support for taking still screen captures, also known as screenshots. 88 | 89 | - Support for automatic file saving. You can set the prefix filename 90 | separately for screenshots and screencasts. 91 | 92 | - Support for selecting a single window to screencast. Screenshots are 93 | still limited to full screen and/or area selection. 94 | 95 | - Theme-able shutter sounds. Right now you can choose between Canon 7D 96 | and Nikon D80. ;) 97 | 98 | -------------------------------------------------------------------------------- /kazam/backend/keypress.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # keypress.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2014 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | import logging 24 | logger = logging.getLogger("KeypressViewer") 25 | import os 26 | import sys 27 | import signal 28 | 29 | from gi.repository import GObject, GLib 30 | 31 | from kazam.backend.prefs import * 32 | 33 | 34 | class KeypressViewer(GObject.GObject): 35 | __gsignals__ = { 36 | "keypress": (GObject.SIGNAL_RUN_LAST, 37 | None, 38 | [GObject.TYPE_PYOBJECT, 39 | GObject.TYPE_PYOBJECT, 40 | GObject.TYPE_PYOBJECT],) 41 | } 42 | 43 | def __init__(self): 44 | GObject.GObject.__init__(self) 45 | logger.debug("Creating KeypressViewer.") 46 | self.child_pid = None 47 | 48 | def start(self): 49 | def readline(io, condition): 50 | if condition is GLib.IO_IN: 51 | line = io.readline() 52 | parts = line.strip().split() 53 | if len(parts) != 3: 54 | logger.debug("Unexpected line from keypress viewer: {}".format(parts)) 55 | else: 56 | logger.debug("Got keypress details: '{}'".format(line)) 57 | self.emit("keypress", parts[0], parts[1], parts[2]) 58 | return True 59 | elif condition is GLib.IO_HUP | GLib.IO_IN: 60 | GLib.source_remove(self.source_id) 61 | return False 62 | 63 | keypress_viewer_exe = os.path.abspath( 64 | os.path.join(os.path.dirname(__file__), "listkeys-subprocess.py")) 65 | logger.info("Starting KeypressViewer ({}).".format(keypress_viewer_exe)) 66 | argv = [sys.executable, keypress_viewer_exe] 67 | self.child_pid, stdin, stdout, stderr = GLib.spawn_async(argv, standard_output=True) 68 | io = GLib.IOChannel(stdout) 69 | self.source_id = io.add_watch(GLib.IO_IN | GLib.IO_HUP, 70 | readline, priority=GLib.PRIORITY_HIGH) 71 | 72 | def stop(self): 73 | if self.child_pid: 74 | logger.info("Stopping KeypressViewer") 75 | os.kill(self.child_pid, signal.SIGTERM) 76 | self.child_pid = None 77 | -------------------------------------------------------------------------------- /kazam/frontend/main_menu.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # main_menu.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | from gettext import gettext as _ 24 | 25 | from gi.repository import Gtk, GObject 26 | 27 | MENUBAR = """ 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | """ 40 | 41 | 42 | class MainMenu(GObject.GObject): 43 | __gsignals__ = { 44 | "file-preferences": (GObject.SIGNAL_RUN_LAST, 45 | None, 46 | (), 47 | ), 48 | "file-quit": (GObject.SIGNAL_RUN_LAST, 49 | None, 50 | (), 51 | ), 52 | "help-about": (GObject.SIGNAL_RUN_LAST, 53 | None, 54 | (), 55 | ), 56 | } 57 | 58 | def __init__(self): 59 | GObject.GObject.__init__(self) 60 | 61 | self.action_group = Gtk.ActionGroup("kazam_actions") 62 | self.action_group.add_actions([ 63 | ("FileMenu", None, _("File")), 64 | ("FileQuit", Gtk.STOCK_QUIT, _("Quit"), None, _("Quit Kazam"), 65 | self.cb_file_quit), 66 | ("FilePreferences", Gtk.STOCK_PREFERENCES, _("Preferences"), None, _("Open preferences"), 67 | self.cb_file_preferences), 68 | ("HelpMenu", None, _("Help")), 69 | ("HelpAbout", None, _("About"), None, _("About Kazam"), 70 | self.cb_help_about) 71 | ]) 72 | 73 | self.uimanager = Gtk.UIManager() 74 | self.uimanager.add_ui_from_string(MENUBAR) 75 | self.uimanager.insert_action_group(self.action_group) 76 | self.menubar = self.uimanager.get_widget("/MenuBar") 77 | 78 | def cb_file_quit(self, action): 79 | self.emit("file-quit") 80 | 81 | def cb_file_preferences(self, action): 82 | self.emit("file-preferences") 83 | 84 | def cb_help_about(self, action): 85 | self.emit("help-about") 86 | -------------------------------------------------------------------------------- /kazam/frontend/about_dialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # authenticate.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | from gettext import gettext as _ 25 | from gi.repository import Gtk 26 | from kazam.version import * 27 | 28 | AUTHORS = """ 29 | Henry Fuheng Wu 30 | Andrew Higginson 31 | David Klasinc 32 | """ 33 | 34 | ARTISTS = """ 35 | Matthew Paul Thomas 36 | Georgi Karavasilev 37 | Frank Souza 38 | Sam Hewitt 39 | Robert McKenna 40 | Andrew Higginson 41 | """ 42 | 43 | LICENSE = """ 44 | This program is free software: you can redistribute it and/or modify 45 | it under the terms of the GNU General Public License as published by 46 | the Free Software Foundation, either version 3 of the License, or 47 | (at your option) any later version. 48 | 49 | This program is distributed in the hope that it will be useful, 50 | but WITHOUT ANY WARRANTY; without even the implied warranty of 51 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 52 | GNU General Public License for more details. 53 | 54 | You should have received a copy of the GNU General Public License 55 | along with this program. If not, see . 56 | """ 57 | 58 | 59 | def AboutDialog(icons): 60 | dialog = Gtk.AboutDialog() 61 | dialog.set_program_name(_("Kazam") + " - \"" + CODENAME + "\"") 62 | dialog.set_comments(_("Linux Screen Recorder, Broadcaster and OCR")) 63 | dialog.set_license(LICENSE) 64 | dialog.set_version(VERSION) 65 | dialog.set_copyright("Henry Fuheng Wu\nDavid Klasinc\nAndrew Higginson\n") 66 | dialog.set_website("https://github.com/henrywoo/kazam") 67 | dialog.set_authors(AUTHORS.split("\n")) 68 | dialog.set_artists(ARTISTS.split("\n")) 69 | try: 70 | icon = icons.load_icon("kazam", 96, Gtk.IconLookupFlags.GENERIC_FALLBACK) 71 | dialog.set_logo(icon) 72 | except: 73 | # Not important, we just don't get to show our lovely logo.. :) 74 | pass 75 | dialog.show_all() 76 | dialog.set_position(Gtk.WindowPosition.CENTER) 77 | dialog.run() 78 | dialog.hide() 79 | -------------------------------------------------------------------------------- /kazam/frontend/save_dialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # save_dialog.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import os 25 | import logging 26 | logger = logging.getLogger("Save Dialog") 27 | 28 | from datetime import datetime 29 | from gettext import gettext as _ 30 | 31 | from gi.repository import Gtk 32 | 33 | from kazam.backend.prefs import * 34 | 35 | def SaveDialog(title, old_path, codec, main_mode=MODE_SCREENCAST): 36 | logger.debug("Save dialog called with path: {0}".format(old_path)) 37 | dialog = Gtk.FileChooserDialog(title, None, 38 | Gtk.FileChooserAction.SAVE, 39 | (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 40 | _("Save"), Gtk.ResponseType.OK)) 41 | 42 | dt = datetime.today().strftime("%Y-%m-%d-%H-%M-%S") 43 | if main_mode == MODE_SCREENCAST: 44 | dialog.set_current_name("{0}_{1}{2}".format(_("Screencast"), dt, CODEC_LIST[codec][3])) 45 | elif main_mode == MODE_SCREENSHOT: 46 | dialog.set_current_name("{0}_{1}.png".format(_("Screenshot"), dt)) 47 | elif main_mode == MODE_OCR: 48 | # Use ".png" for images and ".txt" for text files 49 | file_extension = ".txt" if codec == "text" else ".png" 50 | dialog.set_current_name("{0}_{1}{2}".format(_("OCR"), dt, file_extension)) 51 | 52 | dialog.set_do_overwrite_confirmation(True) 53 | 54 | if old_path and os.path.isdir(old_path): 55 | dialog.set_current_folder(old_path) 56 | logger.debug("Previous path is a valid destination") 57 | else: 58 | if main_mode in [MODE_SCREENCAST, MODE_WEBCAM, MODE_BROADCAST]: 59 | dialog.set_current_folder(prefs.video_dest) 60 | logger.debug("Previous path invalid, setting it to: {0}".format(prefs.video_dest)) 61 | elif main_mode == MODE_SCREENSHOT: 62 | dialog.set_current_folder(prefs.picture_dest) 63 | logger.debug("Previous path invalid, setting it to: {0}".format(prefs.picture_dest)) 64 | elif main_mode == MODE_OCR: 65 | dialog.set_current_folder(prefs.picture_dest) 66 | logger.debug("Previous path invalid, setting it to: {0}".format(prefs.picture_dest)) 67 | 68 | dialog.show_all() 69 | result = dialog.run() 70 | old_path = dialog.get_current_folder() 71 | return dialog, result, old_path 72 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-ocr-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | 5 | if sys.version_info < (3, 2): 6 | sys.exit('Kazam requires Python 3.2 or newer') 7 | 8 | import os 9 | 10 | here = os.path.dirname(os.path.realpath(__file__)) 11 | 12 | from distutils.core import setup 13 | from DistUtilsExtra.command import build_extra, build_i18n, build_help, build_icons 14 | import hiq 15 | 16 | import re 17 | import glob 18 | 19 | try: 20 | lines = open("kazam/version.py").readlines() 21 | for line in lines: 22 | if line.startswith('VERSION'): 23 | VERSION = re.search(r"VERSION = '(.*)'", line).group(1) 24 | break 25 | except: 26 | VERSION = "1.0.0" 27 | 28 | def read_file(filename: str): 29 | try: 30 | lines = [] 31 | with open(filename) as file: 32 | lines = file.readlines() 33 | lines = [line.rstrip() for line in lines if not line.startswith("#")] 34 | return lines 35 | except: 36 | return [] 37 | 38 | 39 | setup(name='kazam', 40 | version=VERSION, 41 | description='A screencasting program created with design in mind.', 42 | author='Henry Fuheng Wu, David Klasinc', 43 | author_email='wufuheng@gmail.com', 44 | long_description=open("README.md", "r", encoding="utf-8").read(), 45 | long_description_content_type="text/markdown", 46 | install_requires=read_file(f"{here}/requirements.txt"), 47 | classifiers=['Development Status :: 5 - Production/Stable', 48 | 'Environment :: X11 Applications :: GTK', 49 | 'Intended Audience :: End Users/Desktop', 50 | 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 51 | 'Operating System :: POSIX :: Linux', 52 | 'Programming Language :: Python', 53 | 'Topic :: Multimedia :: Graphics :: Capture :: Screen Capture', 54 | 'Topic :: Multimedia :: Sound/Audio :: Capture/Recording', 55 | 'Topic :: Multimedia :: Video :: Capture', 56 | "Programming Language :: Python :: 3", 57 | "Programming Language :: Python :: 3.3", 58 | "Programming Language :: Python :: 3.4", 59 | "Programming Language :: Python :: 3.5", 60 | "Programming Language :: Python :: 3.6", 61 | "Programming Language :: Python :: 3.7", 62 | "Programming Language :: Python :: 3.8", 63 | "Programming Language :: Python :: 3.9", 64 | "Programming Language :: Python :: 3.10", 65 | "Programming Language :: Python :: 3.11", 66 | "Programming Language :: Python :: 3.12", 67 | ], 68 | keywords='screencast screenshot capture audio sound video recorder kazam OCR webcam', 69 | url='https://github.com/henrywoo/kazam', 70 | license='Apache-2.0', 71 | scripts=['bin/kazam'], 72 | packages=['kazam', 73 | 'kazam.pulseaudio', 74 | 'kazam.backend', 75 | 'kazam.frontend', 76 | 'kazam.data', 77 | ], 78 | data_files=[('share/kazam/ui/', glob.glob('data/ui/*ui')), 79 | ('share/kazam/sounds/', glob.glob('data/sounds/*ogg')), 80 | ('share/icons/gnome/scalable/apps/', glob.glob('data/icons/scalable/*svg')), 81 | ], 82 | package_data={ 83 | 'kazam': ['data/ui/*ui', 'data/sounds/*ogg', 'data/icons/scalable/*svg'], 84 | }, 85 | include_package_data=True, 86 | cmdclass={'build': build_extra.build_extra, 87 | 'build_i18n': build_i18n.build_i18n, 88 | 'build_help': build_help.build_help, 89 | 'build_icons': build_icons.build_icons} 90 | ) 91 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ -------------------------------------------------------------------------------- /data/icons/scalable/kazam-fullscreen-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 61 | 68 | 69 | 71 | 72 | 74 | image/svg+xml 75 | 77 | 78 | 79 | 80 | 81 | 86 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-all-screens-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 61 | 68 | 69 | 71 | 72 | 74 | image/svg+xml 75 | 77 | 78 | 79 | 80 | 81 | 86 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /kazam/frontend/window_webcam.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # window_select.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 20 | # MA 02110-1301, USA. 21 | 22 | import logging 23 | logger = logging.getLogger("Window Webcam") 24 | 25 | from gi.repository import Gtk, GObject, Gdk, GdkX11 26 | from kazam.backend.prefs import * 27 | 28 | class WebcamWindow(GObject.GObject): 29 | def __init__(self, width, height, position, x_offset, y_offset): 30 | super(WebcamWindow, self).__init__() 31 | logger.debug("Initializing Webcam window.") 32 | 33 | self.xid = None 34 | self.drag_offset_x = 0 35 | self.drag_offset_y = 0 36 | 37 | self.window = Gtk.Window() 38 | self.window.set_default_size(width, height) 39 | self.webcam_area = Gtk.DrawingArea() 40 | self.window.add(self.webcam_area) 41 | self.window.set_decorated(False) 42 | self.window.set_property("skip-taskbar-hint", True) 43 | self.window.set_keep_above(True) 44 | 45 | # Connect to the realize signal to safely access the window's XID 46 | self.webcam_area.connect("realize", self.on_realize) 47 | self.webcam_area.set_double_buffered(True) 48 | self.webcam_area.set_app_paintable(True) 49 | self.window.set_app_paintable(True) 50 | 51 | # Connect mouse events for dragging 52 | self.window.connect("button-press-event", self.on_button_press) 53 | self.window.connect("motion-notify-event", self.on_motion_notify) 54 | 55 | self.window.show_all() 56 | 57 | screen = HW.screens[prefs.current_screen] 58 | self.window.set_size_request(width, height) 59 | if position == CAM_PREVIEW_TL: 60 | self.window.set_gravity(Gdk.Gravity.NORTH_WEST) 61 | self.window.move(screen['x'] + x_offset, screen['y'] + y_offset) 62 | elif position == CAM_PREVIEW_TR: 63 | self.window.set_gravity(Gdk.Gravity.NORTH_EAST) 64 | self.window.move(screen['x'] + screen['width'] - width - x_offset, screen['y'] + y_offset) 65 | elif position == CAM_PREVIEW_BR: 66 | self.window.set_gravity(Gdk.Gravity.SOUTH_EAST) 67 | self.window.move(screen['x'] + screen['width'] - width - x_offset, screen['y'] + screen['height'] - height - y_offset) 68 | elif position == CAM_PREVIEW_BL: 69 | self.window.set_gravity(Gdk.Gravity.SOUTH_WEST) 70 | self.window.move(screen['x'] + x_offset, screen['y'] + screen['height'] - height - y_offset) 71 | else: 72 | pass 73 | 74 | def on_realize(self, widget): 75 | # Ensure the GDK window is realized before accessing XID 76 | self.xid = widget.get_property('window').get_xid() 77 | logger.debug(f"Webcam area XID: {self.xid}") 78 | 79 | def on_button_press(self, widget, event): 80 | # Store the initial click position for dragging 81 | if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 1: # Left click 82 | self.drag_offset_x = event.x 83 | self.drag_offset_y = event.y 84 | 85 | def on_motion_notify(self, widget, event): 86 | # Update window position based on mouse movement 87 | if event.state & Gdk.ModifierType.BUTTON1_MASK: # Left button is held 88 | x, y = self.window.get_position() 89 | new_x = x + (event.x - self.drag_offset_x) 90 | new_y = y + (event.y - self.drag_offset_y) 91 | self.window.move(new_x, new_y) 92 | -------------------------------------------------------------------------------- /kazam/backend/listkeys-subprocess.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | # 5 | # Modified by Stuart Langridge to 6 | # be a separate process for Kazam 7 | # 8 | # Some additional hacking by David Klasinc 9 | # 10 | 11 | # 12 | # This script is an modification of the script below. 13 | # 14 | 15 | # 16 | # examples/record_demo.py -- demonstrate record extension 17 | # 18 | # Copyright 2018 Henry Fuheng Wu 19 | # Copyright (C) 2006 Alex Badea 20 | # 21 | # This program is free software; you can redistribute it and/or modify 22 | # it under the terms of the GNU General Public License as published by 23 | # the Free Software Foundation; either version 2 of the License, or 24 | # (at your option) any later version. 25 | # 26 | # This program is distributed in the hope that it will be useful, 27 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 28 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29 | # GNU General Public License for more details. 30 | # 31 | # You should have received a copy of the GNU General Public License 32 | # along with this program; if not, write to the Free Software 33 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 34 | 35 | # Simple demo for the RECORD extension 36 | # Not very much unlike the xmacrorec2 program in the xmacro package. 37 | 38 | # Original source code (examples/recode_demo.py) is available at: 39 | # The Python X Library 40 | # http://python-xlib.sourceforge.net/ 41 | 42 | # TODO: ~/.keylogger.yaml のロード、ログのパーミッション、パスワード欄からの取得制限 43 | 44 | import sys 45 | from Xlib import X, XK, display 46 | from Xlib.ext import record 47 | from Xlib.protocol import rq 48 | 49 | local_dpy = display.Display() 50 | record_dpy = display.Display() 51 | 52 | 53 | def lookup_keysym(keysym): 54 | for name in dir(XK): 55 | if name[:3] == "XK_" and getattr(XK, name) == keysym: 56 | return name[3:] 57 | return "[%d]" % keysym 58 | 59 | 60 | def record_callback(reply): 61 | if reply.category != record.FromServer: 62 | return 63 | if reply.client_swapped: 64 | print("* received swapped protocol data, cowardly ignored") 65 | return 66 | if not len(reply.data) or reply.data[0] < 0x02: 67 | # not an event 68 | return 69 | 70 | data = reply.data 71 | while len(data): 72 | event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None) 73 | 74 | if event.type in [X.KeyPress, X.KeyRelease]: 75 | 76 | pr = event.type == X.KeyPress and "Press" or "Release" 77 | 78 | keysym = local_dpy.keycode_to_keysym(event.detail, 0) 79 | if not keysym: 80 | print("KeyCode {} {}".format(pr, event.detail)) 81 | else: 82 | print("KeyStr {} {}".format(pr, lookup_keysym(keysym))) 83 | sys.stdout.flush() 84 | elif event.type == X.ButtonPress: 85 | print("MouseButton Press {}".format(event.detail)) 86 | sys.stdout.flush() 87 | 88 | elif event.type == X.ButtonRelease: 89 | print("MouseButton Release {}".format(event.detail)) 90 | sys.stdout.flush() 91 | 92 | # Check if the extension is present 93 | if not record_dpy.has_extension("RECORD"): 94 | print("RECORD extension not found") 95 | sys.exit(1) 96 | r = record_dpy.record_get_version(0, 0) 97 | print("RECORD extension version %d.%d" % (r.major_version, r.minor_version)) 98 | 99 | # Create a recording context; we only want key and mouse events 100 | ctx = record_dpy.record_create_context( 101 | 0, 102 | [record.AllClients], 103 | [{ 104 | 'core_requests': (0, 0), 105 | 'core_replies': (0, 0), 106 | 'ext_requests': (0, 0, 0, 0), 107 | 'ext_replies': (0, 0, 0, 0), 108 | 'delivered_events': (0, 0), 109 | 'device_events': (X.KeyPress, X.MotionNotify), 110 | 'errors': (0, 0), 111 | 'client_started': False, 112 | 'client_died': False, 113 | }]) 114 | 115 | # Enable the context; this only returns after a call to record_disable_context, 116 | # while calling the callback function in the meantime 117 | record_dpy.record_enable_context(ctx, record_callback) 118 | 119 | # Finally free the context 120 | record_dpy.record_free_context(ctx) 121 | -------------------------------------------------------------------------------- /kazam/backend/webcam.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # webcam.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2014 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | import logging 24 | import gi 25 | 26 | gi.require_version('GUdev', '1.0') 27 | 28 | from gi.repository import GObject, GUdev 29 | 30 | logger = logging.getLogger("Webcam") 31 | 32 | 33 | class Webcam(GObject.GObject): 34 | 35 | """docstring for Webcam.""" 36 | 37 | __gsignals__ = {"webcam-change": (GObject.SIGNAL_RUN_LAST, 38 | None, 39 | (),), 40 | } 41 | 42 | def __init__(self): 43 | super(Webcam, self).__init__() 44 | 45 | self.device_list = {} 46 | self.has_webcam = False 47 | 48 | logger.debug("Initializing webcam support.") 49 | try: 50 | self.udev_client = GUdev.Client.new(subsystems=['video4linux']) 51 | self.udev_client.connect("uevent", self.watch) 52 | except: 53 | logger.warning("Unable to initialize webcam support.") 54 | self.detect() 55 | 56 | def watch(self, client, action, device): 57 | logger.debug("Webcam device list: {}".format(self.device_list)) 58 | logger.debug("Webcam change detected: {}".format(action)) 59 | if action == 'add': 60 | try: 61 | c_name = device.get_property('ID_V4L_PRODUCT') 62 | c_devname = device.get_property('DEVNAME') 63 | if (c_devname, c_name) not in self.device_list: 64 | self.device_list.append((c_devname, c_name)) 65 | logger.debug("New webcam found: {}".format(c_name)) 66 | else: 67 | logger.warning("Duplicate cam detected!? {} {}".format(c_devname, c_name)) 68 | 69 | except Exception as e: 70 | logger.debug("Unable to register new webcam. {}".format(e.str)) 71 | elif action == 'remove': 72 | try: 73 | c_name = device.get_property('ID_V4L_PRODUCT') 74 | c_devname = device.get_property('DEVNAME') 75 | logger.debug("Removing webcam {}".format(c_name)) 76 | for cam in self.device_list: 77 | if c_devname == cam[0]: 78 | self.device_list.remove(cam) 79 | logger.debug("Removed webcam {}".format(c_name)) 80 | except Exception as e: 81 | logger.debug("Unable to de-register a webcam. {}".format(e.str)) 82 | 83 | else: 84 | logger.debug("Unknown UDEV action {}.".format(action)) 85 | self.emit("webcam-change") 86 | 87 | def detect(self): 88 | self.device_list = [] 89 | #try: 90 | cams = self.udev_client.query_by_subsystem(subsystem='video4linux') 91 | if cams: 92 | for c in cams: 93 | c_name = c.get_property('ID_V4L_PRODUCT') 94 | c_devname = c.get_property('DEVNAME') 95 | logger.debug(" Webcam found: {0}".format(c_name)) 96 | self.device_list.append((c_devname, c_name)) 97 | else: 98 | logger.info("Webcam not detected.") 99 | # except: 100 | # logger.debug("Error while detecting webcams.") 101 | 102 | if self.device_list: 103 | self.has_webcam = True 104 | 105 | return self.device_list 106 | 107 | def get_device_file(self, num): 108 | try: 109 | return self.device_list[num][2] 110 | except: 111 | return None 112 | -------------------------------------------------------------------------------- /data/icons/scalable/kazam-webcam-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 61 | 68 | 69 | 71 | 72 | 74 | image/svg+xml 75 | 77 | 78 | 79 | 80 | 81 | 86 | 93 | 100 | 106 | 111 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /kazam/frontend/combobox.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # combobox.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import os 25 | 26 | from xdg.DesktopEntry import DesktopEntry 27 | from gi.repository import Gtk, GdkPixbuf, GObject 28 | 29 | from kazam.backend.prefs import * 30 | 31 | 32 | class EditComboBox(Gtk.ComboBox): 33 | # 34 | # This really needs to be done differently ... 35 | # 36 | if prefs.dist[2] == 'quantal' or prefs.dist[2] == 'raring': 37 | EDITORS = { 38 | "/usr/share/app-install/desktop/openshot:openshot.desktop": [], 39 | "/usr/share/app-install/desktop/pitivi:pitivi.desktop": ["-i", "-a"], 40 | "/usr/share/app-install/desktop/avidemux:avidemux-gtk.desktop": [], 41 | "/usr/share/app-install/desktop/kdenlive:kde4__kdenlive.desktop": ["-i"], 42 | } 43 | else: 44 | EDITORS = { 45 | "/usr/share/applications/openshot.desktop": [], 46 | "/usr/share/applications/pitivi.desktop": ["-i", "-a"], 47 | "/usr/share/applications/avidemux-gtk.desktop": [], 48 | "/usr/share/applications/kde4/kdenlive.desktop": ["-i"], 49 | } 50 | 51 | def __init__(self, icons): 52 | Gtk.ComboBox.__init__(self) 53 | self.icons = icons 54 | self.empty = True 55 | cr_pixbuf = Gtk.CellRendererPixbuf() 56 | self.pack_start(cr_pixbuf, True) 57 | self.add_attribute(cr_pixbuf, 'pixbuf', 0) 58 | cr_text = Gtk.CellRendererText() 59 | self.pack_start(cr_text, True) 60 | self.add_attribute(cr_text, 'text', 1) 61 | 62 | self.box_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, 63 | GObject.TYPE_PYOBJECT, 64 | GObject.TYPE_PYOBJECT 65 | ) 66 | self.set_model(self.box_model) 67 | self._populate() 68 | self.set_active(0) 69 | self.set_sensitive(True) 70 | self.show() 71 | 72 | def get_active_value(self): 73 | i = self.get_active() 74 | model = self.get_model() 75 | model_iter = model.get_iter(i) 76 | return (model.get_value(model_iter, 2), 77 | model.get_value(model_iter, 3)) 78 | 79 | def _populate(self): 80 | for item in self.EDITORS: 81 | if os.path.isfile(item): 82 | args = self.EDITORS[item] 83 | desktop_entry = DesktopEntry(item) 84 | command = desktop_entry.getExec() 85 | 86 | # For .desktop files with ' %U' or ' # %F' 87 | command = command.split(" ")[0] 88 | 89 | name = desktop_entry.getName() 90 | icon_name = desktop_entry.getIcon() 91 | 92 | self._add_item(icon_name, name, command, args) 93 | 94 | if len(self.get_model()): 95 | self.empty = False 96 | else: 97 | self.empty = True 98 | 99 | def _add_item(self, icon_name, name, command, args): 100 | liststore = self.get_model() 101 | try: 102 | pixbuf = self.icons.load_icon(icon_name, 16, Gtk.IconLookupFlags.GENERIC_FALLBACK) 103 | except: 104 | pixbuf = self.icons.load_icon("application-x-executable", 16, Gtk.IconLookupFlags.GENERIC_FALLBACK) 105 | 106 | liststore.append([pixbuf, name, command, args]) 107 | 108 | def _version_is_gte(self, required_version, current_version): 109 | i = 0 110 | for digit in current_version: 111 | required_digit = required_version[i] 112 | current_digit = int(digit) 113 | if current_digit < required_digit: 114 | return False 115 | return True 116 | -------------------------------------------------------------------------------- /kazam/instant.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # instant.py 5 | # 6 | # Copyright 2018 Henry Fuheng Wu 7 | # Copyright 2012 David Klasinc 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import sys 25 | import logging 26 | 27 | from gi.repository import Gtk, GObject 28 | 29 | from kazam.utils import * 30 | from kazam.backend.prefs import * 31 | from kazam.backend.grabber import Grabber 32 | 33 | logger = logging.getLogger("Instant") 34 | 35 | 36 | class InstantApp(GObject.GObject): 37 | 38 | def __init__(self, datadir, dist, debug, mode, preferences=False): 39 | GObject.GObject.__init__(self) 40 | logger.debug("Setting variables.{0}".format(datadir)) 41 | 42 | self.mode = mode 43 | self.take = 0 44 | 45 | prefs.datadir = datadir 46 | prefs.debug = debug 47 | prefs.dist = dist 48 | prefs.get_sound_files() 49 | 50 | if preferences: 51 | logger.debug("Preferences requested.") 52 | from kazam.frontend.preferences import Preferences 53 | from kazam.pulseaudio.pulseaudio import pulseaudio_q 54 | prefs.pa_q = pulseaudio_q() 55 | prefs.pa_q.start() 56 | prefs.get_audio_sources() 57 | 58 | self.preferences_window = Preferences() 59 | self.preferences_window.connect("prefs-quit", self.cb_prefs_quit) 60 | self.preferences_window.open() 61 | 62 | else: 63 | self.old_path = None 64 | 65 | if HW.combined_screen: 66 | self.video_source = HW.combined_screen 67 | else: 68 | screen = HW.get_current_screen() 69 | self.video_source = HW.screens[screen] 70 | 71 | self.grabber = Grabber() 72 | self.grabber.connect("flush-done", self.cb_flush_done) 73 | self.grabber.connect("save-done", self.cb_save_done) 74 | 75 | if self.mode == MODE_AREA: 76 | logger.debug("Area ON.") 77 | from kazam.frontend.window_area import AreaWindow 78 | self.area_window = AreaWindow() 79 | self.area_window.connect("area-selected", self.cb_area_selected) 80 | self.area_window.connect("area-canceled", self.cb_area_canceled) 81 | self.area_window.window.show_all() 82 | elif self.mode == MODE_ALL: 83 | self.grabber.setup_sources(self.video_source, None, None) 84 | logger.debug("Grabbing screen") 85 | self.grabber.grab() 86 | elif self.mode == MODE_ACTIVE: 87 | self.grabber.setup_sources(self.video_source, None, None, active=True) 88 | logger.debug("Grabbing screen") 89 | self.grabber.grab() 90 | elif self.mode == MODE_WIN: 91 | logger.debug("Window Selection ON.") 92 | from kazam.frontend.window_select import SelectWindow 93 | self.select_window = SelectWindow() 94 | self.select_window.connect("window-selected", self.cb_window_selected) 95 | self.select_window.connect("window-canceled", self.cb_window_canceled) 96 | self.select_window.window.show_all() 97 | elif self.mode == MODE_GOD: 98 | logger.debug("Grabbing in god mode.") 99 | self.grabber.setup_sources(self.video_source, None, None, god=True) 100 | self.grabber.grab() 101 | self.grabber.setup_sources(self.video_source, None, None, active=True, god=True) 102 | self.grabber.grab() 103 | else: 104 | sys.exit(0) 105 | 106 | def cb_area_selected(self, widget): 107 | logger.debug("Area selected: SX: {0}, SY: {1}, EX: {2}, EY: {3}".format( 108 | self.area_window.startx, 109 | self.area_window.starty, 110 | self.area_window.endx, 111 | self.area_window.endy)) 112 | prefs.area = (self.area_window.startx, 113 | self.area_window.starty, 114 | self.area_window.endx, 115 | self.area_window.endy, 116 | self.area_window.width, 117 | self.area_window.height) 118 | self.grabber.setup_sources(self.video_source, prefs.area, None) 119 | logger.debug("Grabbing screen") 120 | self.grabber.grab() 121 | 122 | def cb_area_canceled(self, widget): 123 | Gtk.main_quit() 124 | sys.exit(0) 125 | 126 | def cb_window_selected(self, widget): 127 | xid = self.select_window.xid 128 | # xid_geometry = self.select_window.geometry 129 | logger.debug("Window selected: {0} - {1}".format(self.select_window.win_name, prefs.xid)) 130 | logger.debug("Window geometry: {0}".format(self.select_window.geometry)) 131 | self.grabber.setup_sources(self.video_source, None, xid) 132 | logger.debug("Grabbing screen") 133 | self.grabber.grab() 134 | 135 | def cb_window_canceled(self, widget): 136 | Gtk.main_quit() 137 | sys.exit(0) 138 | 139 | def cb_flush_done(self, widget): 140 | if prefs.autosave_picture or self.mode == MODE_GOD: 141 | fname = get_next_filename(prefs.picture_dest, prefs.autosave_picture_file, ".png") 142 | self.grabber.autosave(fname) 143 | else: 144 | self.grabber.save_capture(None) 145 | 146 | def cb_save_done(self, widget, result): 147 | logger.debug("Save Done, result: {0}".format(result)) 148 | self.old_path = result 149 | 150 | if self.take == 1 or self.mode != MODE_GOD: 151 | Gtk.main_quit() 152 | sys.exit(0) 153 | 154 | self.take += 1 155 | 156 | def cb_prefs_quit(self, widget): 157 | logger.debug("Saving settings.") 158 | prefs.pa_q.end() 159 | prefs.save_config() 160 | Gtk.main_quit() 161 | sys.exit(0) 162 | -------------------------------------------------------------------------------- /kazam/frontend/done_recording.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # app.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import os 25 | import shutil 26 | import logging 27 | logger = logging.getLogger("Done Recording") 28 | 29 | from gettext import gettext as _ 30 | from gi.repository import Gtk, GObject 31 | 32 | from kazam.backend.prefs import * 33 | from kazam.frontend.combobox import EditComboBox 34 | from kazam.frontend.save_dialog import SaveDialog 35 | 36 | 37 | class DoneRecording(Gtk.Window): 38 | 39 | __gsignals__ = { 40 | "save-done": (GObject.SIGNAL_RUN_LAST, 41 | None, 42 | [GObject.TYPE_PYOBJECT],), 43 | "edit-request": (GObject.SIGNAL_RUN_LAST, 44 | None, 45 | [GObject.TYPE_PYOBJECT],), 46 | "save-cancel": (GObject.SIGNAL_RUN_LAST, 47 | None, 48 | (),) 49 | } 50 | 51 | def __init__(self, icons, tempfile, codec, old_path): 52 | Gtk.Window.__init__(self, title="Kazam - " + _("Recording finished")) 53 | self.icons = icons 54 | self.tempfile = tempfile 55 | self.codec = codec 56 | self.action = ACTION_SAVE 57 | self.old_path = old_path 58 | self.set_position(Gtk.WindowPosition.NONE) 59 | 60 | # Setup UI 61 | self.set_border_width(10) 62 | self.vbox = Gtk.Box(spacing=20, orientation=Gtk.Orientation.VERTICAL) 63 | self.label_box = Gtk.Box() 64 | self.done_label = Gtk.Label(_("Kazam finished recording.\nWhat do you want to do now?")) 65 | self.label_box.add(self.done_label) 66 | self.grid = Gtk.Grid(row_spacing=10, column_spacing=5) 67 | self.radiobutton_edit = Gtk.RadioButton.new_with_label_from_widget(None, _("Edit with:")) 68 | self.combobox_editor = EditComboBox(self.icons) 69 | self.grid.add(self.radiobutton_edit) 70 | self.grid.attach_next_to(self.combobox_editor, 71 | self.radiobutton_edit, 72 | Gtk.PositionType.RIGHT, 73 | 1, 1) 74 | self.radiobutton_save = Gtk.RadioButton.new_from_widget(self.radiobutton_edit) 75 | self.radiobutton_save.set_label(_("Save for later")) 76 | 77 | if self.combobox_editor.empty: 78 | self.radiobutton_edit.set_active(False) 79 | self.radiobutton_edit.set_sensitive(False) 80 | 81 | self.radiobutton_save.set_active(True) 82 | 83 | self.radiobutton_save.connect("toggled", self.cb_radiobutton_save_toggled) 84 | self.radiobutton_edit.connect("toggled", self.cb_radiobutton_edit_toggled) 85 | self.btn_cancel = Gtk.Button(label=_("Cancel")) 86 | self.btn_cancel.set_size_request(100, -1) 87 | self.btn_continue = Gtk.Button(label=_("Continue")) 88 | self.btn_continue.set_size_request(100, -1) 89 | 90 | self.btn_continue.connect("clicked", self.cb_continue_clicked) 91 | self.btn_cancel.connect("clicked", self.cb_cancel_clicked) 92 | 93 | self.hbox = Gtk.Box(spacing=10) 94 | self.left_hbox = Gtk.Box() 95 | self.right_hbox = Gtk.Box(spacing=5) 96 | 97 | self.right_hbox.pack_start(self.btn_cancel, False, True, 0) 98 | self.right_hbox.pack_start(self.btn_continue, False, True, 0) 99 | 100 | self.hbox.pack_start(self.left_hbox, True, True, 0) 101 | self.hbox.pack_start(self.right_hbox, False, False, 0) 102 | 103 | self.vbox.pack_start(self.label_box, True, True, 0) 104 | self.vbox.pack_start(self.grid, True, True, 0) 105 | self.vbox.pack_start(self.radiobutton_save, True, True, 0) 106 | self.vbox.pack_start(self.hbox, True, True, 0) 107 | self.add(self.vbox) 108 | self.connect("delete-event", self.cb_delete_event) 109 | self.set_resizable(False) 110 | self.show_all() 111 | self.present() 112 | 113 | def cb_continue_clicked(self, widget): 114 | if self.action == ACTION_EDIT: 115 | logger.debug("Continue - Edit.") 116 | (command, args) = self.combobox_editor.get_active_value() 117 | self.emit("edit-request", (command, args)) 118 | self.destroy() 119 | else: 120 | self.set_sensitive(False) 121 | logger.debug("Continue - Save ({0}).".format(self.codec)) 122 | (dialog, result, self.old_path) = SaveDialog(_("Save screencast"), 123 | self.old_path, self.codec) 124 | 125 | if result == Gtk.ResponseType.OK: 126 | uri = os.path.join(dialog.get_current_folder(), dialog.get_filename()) 127 | 128 | if not uri.endswith(CODEC_LIST[self.codec][3]): 129 | uri += CODEC_LIST[self.codec][3] 130 | 131 | logger.debug("Moving from {} to {}".format(self.tempfile, uri)) 132 | shutil.move(self.tempfile, uri) 133 | dialog.destroy() 134 | self.emit("save-done", self.old_path) 135 | self.destroy() 136 | else: 137 | logger.debug("Save cancelled.") 138 | self.set_sensitive(True) 139 | dialog.destroy() 140 | 141 | def cb_cancel_clicked(self, widget): 142 | self.emit("save-cancel") 143 | self.destroy() 144 | 145 | def cb_delete_event(self, widget, data): 146 | self.emit("save-cancel") 147 | self.destroy() 148 | 149 | def cb_radiobutton_save_toggled(self, widget): 150 | if not widget.get_active(): 151 | return 152 | else: 153 | self.action = ACTION_SAVE 154 | self.combobox_editor.set_sensitive(False) 155 | 156 | def cb_radiobutton_edit_toggled(self, widget): 157 | if not widget.get_active(): 158 | return 159 | else: 160 | self.action = ACTION_EDIT 161 | self.combobox_editor.set_sensitive(True) 162 | -------------------------------------------------------------------------------- /bin/kazam: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | # 4 | # kazam 5 | # 6 | # Copyright 2020 Henry Fuheng Wu 7 | # Copyright 2012 David Klasinc 8 | # Copyright 2010 Andrew 9 | # 10 | # This program is free software; you can redistribute it and/or modify 11 | # it under the terms of the GNU General Public License as published by 12 | # the Free Software Foundation; either version 3 of the License, or 13 | # (at your option) any later version. 14 | # 15 | # This program is distributed in the hope that it will be useful, 16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | # GNU General Public License for more details. 19 | # 20 | # You should have received a copy of the GNU General Public License 21 | # along with this program; if not, write to the Free Software 22 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 23 | # MA 02110-1301, USA. 24 | 25 | import os 26 | import sys 27 | import dbus 28 | import logging 29 | import dbus.service 30 | from argparse import ArgumentParser 31 | from dbus.mainloop.glib import DBusGMainLoop 32 | 33 | import gi 34 | gi.require_version('Gtk', '3.0') 35 | from gi.repository import Gtk 36 | 37 | class KazamService(dbus.service.Object): 38 | 39 | def __init__(self, app): 40 | self.app = app 41 | bus_name = dbus.service.BusName('org.kazam', bus=dbus.SessionBus()) 42 | dbus.service.Object.__init__(self, bus_name, "/org/kazam") 43 | 44 | @dbus.service.method('org.kazam') 45 | def instance(self): 46 | self.app.window.show() 47 | self.app.window.present() 48 | 49 | @dbus.service.method('org.kazam') 50 | def prefs(self): 51 | self.app.cb_preferences_request(None) 52 | 53 | if __name__ == "__main__": 54 | 55 | logger = logging.getLogger() 56 | logger.name = "Kazam" 57 | handler = logging.StreamHandler() 58 | formatter = logging.Formatter('%(levelname)s %(name)s - %(message)s') 59 | handler.setFormatter(formatter) 60 | logger.addHandler(handler) 61 | logger.setLevel(logging.INFO) 62 | 63 | logger.debug("Logger intialized.") 64 | 65 | if os.path.exists("./kazam") and os.path.exists("../data"): 66 | logger.warning("Running from local directory, AppIndicator icons could be missing.") 67 | datadir = "../data" 68 | sys.path.insert(0, "..") 69 | else: 70 | # A bit more flexible setting of datadir, it works 71 | # when base install path is not /usr 72 | curpath = os.path.abspath(__file__) 73 | curpath = os.path.realpath(curpath) 74 | datadir = curpath.split('bin/')[0] + "share/kazam/" 75 | 76 | try: 77 | import distro 78 | dist = distro.id(), distro.version(), distro.codename() 79 | except: 80 | # Fallback to the almighty Ubuntu 12.10 ;) 81 | dist = ('Ubuntu', '12.10', 'quantal') 82 | logger.warning("Failed to correctly detect operating system.") 83 | 84 | from kazam.version import * 85 | version = "%(prog)s {0} '{1}'".format(VERSION, CODENAME) 86 | parser = ArgumentParser(description="Kazam - Screen recording and capturing program.") 87 | 88 | parser.add_argument("--debug", action="store_true", help="enable debug mode") 89 | parser.add_argument("--silent", action="store_true", help="silent start, no UI shown") 90 | parser.add_argument("--nosound", action="store_false", help="disable PulseAudio") 91 | parser.add_argument("--test", action="store_true", help="generate test video signal") 92 | parser.add_argument("-v", "--version", action="version", version=version) 93 | parser.add_argument("-f", "--fullscreen", action="store_true", help="instant screenshot of a full screen") 94 | parser.add_argument("-a", "--area", action="store_true", 95 | help="instant screenshot of a preselected screen area") 96 | parser.add_argument("-s", "--select", action="store_true", help="instant screenshot of a preselected window") 97 | parser.add_argument("-w", "--window", action="store_true", help="instant screenshot of an active window") 98 | parser.add_argument("-p", "--preferences", action="store_true", help="show preferences window") 99 | parser.add_argument("-g", "--godmode", action="store_true", help="god mode of capture") 100 | parser.add_argument("-x", "--instance", action="store_true", help="spawn new instance") 101 | 102 | args = parser.parse_args() 103 | if args.debug: 104 | logger.setLevel(logging.DEBUG) 105 | else: 106 | logger.setLevel(logging.INFO) 107 | 108 | logger.debug("Starting ...") 109 | logger.debug("Running on: {0} {1}".format(dist[0], dist[1])) 110 | logger.debug("Kazam version: {0} {1}".format(VERSION, CODENAME)) 111 | 112 | if args.fullscreen: 113 | from kazam.instant import InstantApp 114 | app = InstantApp(datadir, dist, args.debug, 1) # MODE_ALL 115 | elif args.area: 116 | from kazam.instant import InstantApp 117 | app = InstantApp(datadir, dist, args.debug, 2) # MODE_AREA 118 | elif args.select: 119 | from kazam.instant import InstantApp 120 | app = InstantApp(datadir, dist, args.debug, 3) # MODE_WIN 121 | elif args.window: 122 | from kazam.instant import InstantApp 123 | app = InstantApp(datadir, dist, args.debug, 4) # MODE_ACTIVE 124 | elif args.godmode: 125 | from kazam.instant import InstantApp 126 | app = InstantApp(datadir, dist, args.debug, 666) # MODE_ACTIVE 127 | else: 128 | 129 | DBusGMainLoop(set_as_default=True) 130 | bus = dbus.SessionBus() 131 | instance = bus.request_name("org.kazam") 132 | 133 | if not args.instance and instance != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER: 134 | logger.debug("Getting existing instance ...") 135 | if args.preferences: 136 | logger.debug("Opening preferences ...") 137 | app = dbus.SessionBus().get_object("org.kazam", "/org/kazam").get_dbus_method("prefs") 138 | else: 139 | logger.debug("Showing main window ...") 140 | app = dbus.SessionBus().get_object("org.kazam", "/org/kazam").get_dbus_method("instance") 141 | app() 142 | sys.exit(0) 143 | else: 144 | if args.preferences: 145 | from kazam.instant import InstantApp 146 | app = InstantApp(datadir, dist, args.debug, 0, preferences=True) 147 | else: 148 | logger.debug("Starting new instance ...") 149 | from kazam.app import KazamApp 150 | app = KazamApp(datadir, dist, args.debug, args.test, args.nosound, args.silent) 151 | 152 | kazam_service = KazamService(app) 153 | 154 | Gtk.main() 155 | logger.debug("Finishing ...") 156 | sys.exit(0) 157 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ![image0](https://raw.githubusercontent.com/henrywoo/kazam/master/kazam.png) Kazam2 - Linux Screen Recorder, Broadcaster, Capture and OCR with AI 2 | 3 | ![Documentation Status](https://readthedocs.org/projects/hiq/badge/?version=latest) ![CodeCov](https://codecov.io/gh/uber/athenadriver/branch/master/graph/badge.svg) ![Github release](https://img.shields.io/badge/release-v2.0.0-red) ![License](https://img.shields.io/badge/License-Apache--2.0-red) 4 | 5 | Kazam 2.0 is a versatile tool for **screen recording, broadcasting, capturing and optical character recognition(OCR)**. 6 | 7 | ![Kazam GUI Screenshot](https://raw.githubusercontent.com/henrywoo/images/main/kazam.png) 8 | 9 | Main Features: 10 | 11 | 1. **Screen Recording**: Kazam allows you to capture everything displayed on your screen and save it as a video file. The recorded video is saved in a format compatible with any media player that supports H264, VP8 codec and WebM video format. 12 | 13 | 2. **Broadcasting**: Kazam offers the ability to broadcast your screen content live over the internet, making it suitable for live streaming sessions. It supports Twitch and Youtube live broadcasting at the time of this writing. 14 | 15 | 3. **Optical Character Recognition (OCR)**: Kazam includes OCR functionality, enabling it to detect and extract text from the captured screen content, which can then be edited or saved. 16 | 17 | 4. **Audio Recording**: In addition to screen content, Kazam can record audio from any sound input device that is recognized and supported by the PulseAudio sound system. This allows you to capture both the screen and accompanying audio, such as voice narration or system sounds, in your recordings. 18 | 19 | 5. **Web Camera**: Kazam support web camera recording and users can drag and drop webcam window anywhere in the screen to suit the recording need. 20 | 21 | 6. **Full Screen, Window and Area Mode**: Kazam support full screen, window and area modes. 22 | 23 | 📌 **Please use the latest version kazam 2.0.0. Make sure the version is the latest when you report issues.** 24 | 25 | ```bash 26 | 🍄 Tested in: Ubuntu 20.04, 22.04, and 24.04 with Python 3.8 - 3.12. 27 | ``` 28 | 29 | ## 📥 Installation 30 | 31 | ```bash 32 | pip install -U kazam 33 | ``` 34 | 35 | Kazam needs some dependency libraries like `dbus`, `cairo` to work. In Ubuntu, you can use the following command to install them: 36 | 37 | ```bash 38 | sudo apt install build-essential libpython3-dev \ 39 | libdbus-1-dev libcairo2-dev libgirepository1.0-dev \ 40 | gir1.2-gudev-1.0 gir1.2-keybinder-3.0 python3-gi python3-gst-1.0 xdotool cmake -y 41 | ``` 42 | 43 | In Ubuntu, make sure the PulseAudio GStreamer plugin is installed. If not, run: 44 | 45 | ```bash 46 | sudo apt reinstall gstreamer1.0-pulseaudio -y 47 | ``` 48 | 49 | - To use OCR features, please install: 50 | 51 | ```bash 52 | sudo apt-get install tesseract-ocr -y 53 | pip install pytesseract pillow rapidocr-onnxruntime 54 | ``` 55 | 56 | ## 🧸 Screenshots 57 | 58 | - Live Broadcasting 59 | 60 | ![Kazam GUI Screenshot](https://raw.githubusercontent.com/henrywoo/images/main/live.png) 61 | 62 | - Preferences Window 63 | 64 | ![Kazam Preferences Screenshot](https://raw.githubusercontent.com/henrywoo/images/main/prefs.png) 65 | 66 | ## 💎 Running Kazam 67 | 68 | ### From Source Code 69 | 70 | If you want to run Kazam from the source tree, there are a few limitations that you have to take into account. Every icon has to be taken from the currently installed icon theme. Toolbars will not show any icons, and you will not see Unity AppIndicator. 71 | 72 | To run Kazam, simply execute the following commands in the source tree: 73 | 74 | ```bash 75 | pip install -r requirements.txt 76 | cd bin 77 | ./kazam 78 | ``` 79 | 80 | ### From Command Line 81 | 82 | Make sure **~/.local/bin** is in your PATH, and running `kazam` in your terminal should work. 83 | 84 | ### From GUI 85 | 86 | If you already have Kazam installed, then Kazam icons will be displayed properly. 87 | 88 | ## ⌨️ Keyboard Shortcuts 89 | 90 | ```bash 91 | SUPER-CTRL-Q - Quit 92 | SUPER-CTRL-W - Show/Hide main window 93 | SUPER-CTRL-R - Start Recording 94 | SUPER-CTRL-F - Finish Recording 95 | ``` 96 | 97 | On a normal Logitech keyboard, SUPER-CTRL is `Ctrl+CMD`. 98 | 99 | ## 💡 Recording Tips 100 | 101 | - Choose a small framerate. My personal setup is framerate equal to 3. Framerates above 20fps are unlikely to work well because of software and hardware limitations. If you increase the framerate and the resulting video framerate drops, that is because the encoder can't keep up. 102 | 103 | - Always do a sound check, especially if you are recording live commentary with background sound. I got the best results when I used earphones to listen to the audio while recording. This way, your mic will not pick up any audio coming from the speakers. 104 | 105 | - If you _really_ want lossless quality, then you will have to record in RAW format. This is possible, but without an SSD with a lot of free space, your results will be terrible. 1920x1080 at 15 frames per second will need around 45 MB of disk space per second. Most people will want to record at 20 or 25 frames per second. Most disks will not handle that, and your system will start to crawl. 106 | 107 | - Your next best bet is HUFFYUV format, which is a little bit friendlier on disk bandwidth with 28 MB per second at 15 frames per second. The problem? Not many video editors and players can handle HUFFYUV, let alone video sharing services. 108 | 109 | ## 🎤 How to do live broadcasting with Kazam? 110 | 111 | Kazam 2 support live broadcasting with Twitch and YouTube. 112 | 113 | ### 🥁 Twitch 114 | 115 | Click `File` -> `Preferences`, and then click `Broadcast` tab. In `Server URL`, input `rtmp://live.twitch.tv/app/`. 116 | 117 | For `Stream Key`, please login https://www.twitch.tv/ with your twitch account. Then go to `Creator Dashboard` -> `Settings` -> `Stream`, Click `Copy` button to copy the `Primary Stream key`, which is your `Stream Key`. 118 | 119 | ![image](https://github.com/user-attachments/assets/13098998-2298-45a6-8136-35c04e3f021c) 120 | 121 | And then paste it into the `Stream Key` in your Kazam preferences window. 122 | 123 | ![image](https://github.com/user-attachments/assets/962d73f0-3822-4ec1-ad65-cd5824f274a5) 124 | 125 | (Do not use the keys displayed above which are invalid. Use your own ones, please.) 126 | 127 | ### 🥔 YouTube 128 | 129 | Login https://studio.youtube.com/ with your account and find the `Go live` icon as below (it should be on the right side of the page below your account avatar): 130 | 131 | ![image](https://github.com/user-attachments/assets/a71e7bb7-3470-4f14-9d92-7b1ca0d73831) 132 | 133 | Or you can click `Create` and then `Go live` at the top right side of the page. 134 | 135 | You will be directed to this page below: 136 | 137 | ![image](https://github.com/user-attachments/assets/a522d6c9-5129-4ba7-b1d0-c01ef719237f) 138 | 139 | You can find your `Stream Key` and `Stream URL` as above. Copy-paste them into your Kazam Preferences window's YouTube Live Settings section, then you can close the window and go to `Kazam` main window, click `Broadcast` and select `Fullscreen`, `Window` or `Area` to start live broadcasting. 140 | 141 | 142 | ## 💣 Debugging & Reporting Problems 143 | 144 | If you encounter a bug or any kind of unexpected behavior, please try to reproduce it while running Kazam from a standard terminal with the `--debug` option. Please report bugs at [https://github.com/henrywoo/kazam/issues](https://github.com/henrywoo/kazam/issues) and include the generated output. 145 | 146 | -------------------------------------------------------------------------------- /kazam/backend/config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # config.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import os 25 | from configparser import ConfigParser, NoSectionError, NoOptionError 26 | from xdg.BaseDirectory import xdg_config_home 27 | 28 | 29 | class KazamConfig(object): 30 | 31 | DEFAULTS = [{ 32 | "name": "main", 33 | "keys": {"video_toggled": "True", 34 | "video_source": "0", 35 | "audio_toggled": "False", 36 | "audio_source": "0", 37 | "audio_volume": "0", 38 | "audio2_toggled": "False", 39 | "audio2_source": "0", 40 | "audio2_volume": "0", 41 | "codec": "0", 42 | "counter": "5", 43 | "capture_cursor": "True", 44 | "capture_speakers": "False", 45 | "capture_microphone": "False", 46 | "capture_cursor_pic": "True", 47 | "capture_borders_pic": "True", 48 | "framerate": "15", 49 | "countdown_splash": "True", 50 | "last_x": "60", 51 | "last_y": "25", 52 | "advanced": "0", 53 | "silent": "0", 54 | "autosave_video": "False", 55 | "autosave_video_dir": "", 56 | "autosave_video_file": "Kazam_screencast", 57 | "autosave_picture": "False", 58 | "autosave_picture_dir": "", 59 | "autosave_picture_file": "Kazam_screenshot", 60 | "shutter_sound": "True", 61 | "shutter_type": "0", 62 | "first_run": "True", 63 | "webcam_source": "0", 64 | "webcam_show_preview": "True", 65 | "webcam_preview_pos": "1", 66 | "webcam_preview_x_offset": "0", 67 | "webcam_preview_y_offset": "0", 68 | "webcam_resolution": "0", 69 | "capture_speakers_w": "False", 70 | "capture_microphone_w": "False", 71 | "capture_cursor_b": "False", 72 | "capture_speakers_b": "False", 73 | "capture_microphone_b": "False", 74 | "capture_keys": "False", 75 | "capture_keys_b": "False", 76 | "yt_stream": "", 77 | "yt_server": "", 78 | "broadcast_dst": "1", 79 | "tw_server": "rtmp://live.twitch.tv/app/" 80 | }, 81 | }, 82 | {"name": "keyboard_shortcuts", 83 | "keys": {"pause": "p", 84 | "finish": "f", 85 | "show": "s", 86 | "quit": "q", 87 | }, 88 | }] 89 | 90 | CONFIGDIR = os.path.join(xdg_config_home, "kazam") 91 | CONFIGFILE = os.path.join(CONFIGDIR, "kazam.conf") 92 | 93 | def __init__(self): 94 | self.config = ConfigParser(self.DEFAULTS[0]['keys']) 95 | if not os.path.isdir(self.CONFIGDIR): 96 | os.makedirs(self.CONFIGDIR) 97 | if not os.path.isfile(self.CONFIGFILE): 98 | self.create_default() 99 | self.write() 100 | self.config.read(self.CONFIGFILE) 101 | 102 | def create_default(self): 103 | # For every section 104 | for section in self.DEFAULTS: 105 | # Add the section 106 | self.config.add_section(section["name"]) 107 | # And add every key in it, with its default value 108 | for key in section["keys"]: 109 | value = section["keys"][key] 110 | self.set(section["name"], key, value) 111 | 112 | def find_default(self, section, key): 113 | for d_section in self.DEFAULTS: 114 | if d_section["name"] == section: 115 | for d_key in d_section["keys"]: 116 | if d_key == key: 117 | return d_section["keys"][key] 118 | 119 | def get(self, section, key): 120 | try: 121 | ret = self.config.get(section, key) 122 | if ret == "None": 123 | default = self.find_default(section, key) 124 | self.set(section, key, default) 125 | self.write() 126 | return default 127 | else: 128 | return ret 129 | except NoSectionError: 130 | default = self.find_default(section, key) 131 | self.set(section, key, default) 132 | self.write() 133 | return default 134 | except NoOptionError: 135 | default = self.find_default(section, key) 136 | self.set(section, key, default) 137 | self.write() 138 | return default 139 | except ValueError: 140 | default = self.find_default(section, key) 141 | self.set(section, key, default) 142 | self.write() 143 | return default 144 | 145 | def getboolean(self, section, key): 146 | val = self.get(section, key) 147 | if val.lower() == 'true' or val.lower == "on" or val.lower() == "yes": 148 | return True 149 | else: 150 | return False 151 | 152 | def set(self, section, option, value): 153 | # If the section referred to doesn't exist (rare case), 154 | # then create it 155 | if not self.config.has_section(section): 156 | self.config.add_section(section) 157 | self.config.set(section, option, str(value)) 158 | 159 | def write(self): 160 | file_ = open(self.CONFIGFILE, "w") 161 | self.config.write(file_) 162 | file_.close() 163 | -------------------------------------------------------------------------------- /kazam/frontend/window_select.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # window_select.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # Copyright 2010 Andrew 8 | # 9 | # This program is free software; you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation; either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program; if not, write to the Free Software 21 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 22 | # MA 02110-1301, USA. 23 | 24 | import cairo 25 | import logging 26 | logger = logging.getLogger("Window Select") 27 | 28 | from gettext import gettext as _ 29 | 30 | from gi.repository import Gtk, GObject, Gdk, Wnck, GdkX11 31 | 32 | from kazam.backend.prefs import * 33 | 34 | 35 | class SelectWindow(GObject.GObject): 36 | 37 | __gsignals__ = { 38 | "window-selected": (GObject.SIGNAL_RUN_LAST, 39 | None, 40 | (), 41 | ), 42 | "window-canceled": (GObject.SIGNAL_RUN_LAST, 43 | None, 44 | (), 45 | ), 46 | } 47 | 48 | def __init__(self): 49 | super(SelectWindow, self).__init__() 50 | logger.debug("Initializing select window.") 51 | 52 | self.xid = None 53 | 54 | self.window = Gtk.Window() 55 | self.window.connect("delete-event", Gtk.main_quit) 56 | self.window.connect("draw", self.cb_draw) 57 | self.window.connect("key-press-event", self.cb_keypress_event) 58 | self.window.connect("button-press-event", self.cb_button_press_event) 59 | self.window.connect("leave-notify-event", self.cb_leave_notify_event) 60 | 61 | self.window.set_border_width(30) 62 | self.window.set_app_paintable(True) 63 | self.window.set_has_resize_grip(False) 64 | self.window.set_resizable(True) 65 | self.window.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK) 66 | self.window.set_decorated(False) 67 | self.window.set_property("skip-taskbar-hint", True) 68 | self.window.set_keep_above(True) 69 | self.screen = self.window.get_screen() 70 | self.visual = self.screen.get_rgba_visual() 71 | self.recording = False 72 | 73 | self.disp = GdkX11.X11Display.get_default() 74 | self.dm = Gdk.Display.get_device_manager(self.disp) 75 | self.pntr_device = self.dm.get_client_pointer() 76 | 77 | if self.visual is not None and self.screen.is_composited(): 78 | logger.debug("Compositing window manager detected.") 79 | self.window.set_visual(self.visual) 80 | self.compositing = True 81 | else: 82 | self.compositing = False 83 | 84 | (scr, x, y) = self.pntr_device.get_position() 85 | cur = scr.get_monitor_at_point(x, y) 86 | self.window.unfullscreen() 87 | self.window.move(HW.screens[cur]['x'], 88 | HW.screens[cur]['y']) 89 | self.window.fullscreen() 90 | crosshair_cursor = Gdk.Cursor(Gdk.CursorType.CROSSHAIR) 91 | self.last_cursor = Gdk.Cursor(Gdk.CursorType.LEFT_PTR) 92 | self.gdk_win = self.window.get_root_window() 93 | self.gdk_win.set_cursor(crosshair_cursor) 94 | 95 | def cb_leave_notify_event(self, widget, event): 96 | (scr, x, y) = self.pntr_device.get_position() 97 | cur = scr.get_monitor_at_point(x, y) 98 | self.window.unfullscreen() 99 | logger.debug("Move to X: {0} Y: {1}".format(HW.screens[cur]['x'], HW.screens[cur]['y'])) 100 | self.window.move(HW.screens[cur]['x'], 101 | HW.screens[cur]['y']) 102 | self.window.fullscreen() 103 | 104 | def cb_button_press_event(self, widget, event): 105 | self.geometry = None 106 | self.win_name = None 107 | self.xid = None 108 | # TODO: Error handling 109 | (op, button) = event.get_button() 110 | if button == 1: 111 | screen = Wnck.Screen.get_default() 112 | screen.force_update() 113 | workspace = screen.get_active_workspace() 114 | wins = screen.get_windows_stacked() 115 | 116 | for win in reversed(wins): 117 | if win.is_visible_on_workspace(workspace) and win.is_in_viewport(workspace): 118 | self.win_name = win.get_name() 119 | if not (self.win_name.lower().startswith("kazam") or self.win_name.lower().startswith("desktop")): 120 | geometry = win.get_client_window_geometry() 121 | self.geometry = geometry 122 | if geometry[0] <= event.x_root <= (geometry[0] + geometry[2]) and geometry[1] <= event.y_root <= (geometry[1] + geometry[3]): 123 | self.xid = win.get_xid() 124 | break 125 | self.gdk_win.set_cursor(self.last_cursor) 126 | self.window.hide() 127 | if self.xid: 128 | self.emit("window-selected") 129 | else: 130 | self.emit("window-canceled") 131 | 132 | def cb_keypress_event(self, widget, event): 133 | (op, keycode) = event.get_keycode() 134 | if keycode == 36 or keycode == 104 or keycode == 9: # Enter or Escape 135 | self.gdk_win.set_cursor(self.last_cursor) 136 | self.window.hide() 137 | self.emit("window-canceled") 138 | 139 | def cb_draw(self, widget, cr): 140 | (w, h) = self.window.get_size() 141 | 142 | if self.compositing: 143 | cr.set_source_rgba(0.0, 0.0, 0.0, 0.45) 144 | else: 145 | cr.set_source_rgb(0.5, 0.5, 0.5) 146 | 147 | cr.set_operator(cairo.OPERATOR_SOURCE) 148 | cr.paint() 149 | if self.compositing: 150 | cr.set_source_rgba(1.0, 1.0, 1.0, 1.0) 151 | else: 152 | cr.set_source_rgba(1.0, 1.0, 1.0) 153 | 154 | cr.set_operator(cairo.OPERATOR_OVER) 155 | self._outline_text(cr, w, h, 30, _("Select a window by clicking on it.")) 156 | self._outline_text(cr, w, h + 50, 26, _("Press ENTER or ESC to cancel")) 157 | 158 | def _outline_text(self, cr, w, h, size, text): 159 | cr.set_font_size(size) 160 | try: 161 | cr.select_font_face("Ubuntu", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) 162 | except: 163 | pass 164 | te = cr.text_extents(text) 165 | cr.set_line_width(2.0) 166 | cx = w / 2 - te[2] / 2 167 | cy = h / 2 - te[3] / 2 168 | if self.compositing: 169 | cr.set_source_rgba(0.4, 0.4, 0.4, 1.0) 170 | else: 171 | cr.set_source_rgb(0.4, 0.4, 0.4) 172 | 173 | cr.move_to(cx, cy) 174 | cr.text_path(text) 175 | cr.stroke() 176 | if self.compositing: 177 | cr.set_source_rgba(1.0, 1.0, 1.0, 1.0) 178 | else: 179 | cr.set_source_rgb(1.0, 1.0, 1.0) 180 | cr.move_to(cx, cy) 181 | cr.show_text(text) 182 | -------------------------------------------------------------------------------- /kazam/frontend/window_outline.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # window_select.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | import cairo 24 | import logging 25 | logger = logging.getLogger("Outline Window") 26 | 27 | from gi.repository import Gtk, GObject, Gdk, Wnck, GdkX11 28 | 29 | from kazam.backend.prefs import * 30 | 31 | 32 | class OutlineWindow(GObject.GObject): 33 | 34 | def __init__(self, x, y, w, h): 35 | super(OutlineWindow, self).__init__() 36 | logger.debug("Initializing outline window.") 37 | self.x, self.y, self.w, self.h = x, y, w, h 38 | self.pos_adjust(x, y, w, h) 39 | self.window = Gtk.Window() 40 | self.window.connect("draw", self.cb_draw) 41 | self.window.set_border_width(0) 42 | self.window.set_app_paintable(True) 43 | self.window.set_has_resize_grip(False) 44 | self.window.set_resizable(True) 45 | self.window.set_decorated(False) 46 | self.window.set_property("skip-taskbar-hint", True) 47 | self.window.set_keep_above(True) 48 | 49 | self.screen = self.window.get_screen() 50 | self.visual = self.screen.get_rgba_visual() 51 | 52 | self.disp = GdkX11.X11Display.get_default() 53 | self.dm = Gdk.Display.get_device_manager(self.disp) 54 | self.pntr_device = self.dm.get_client_pointer() 55 | 56 | if self.visual is not None and self.screen.is_composited(): 57 | logger.debug("Compositing window manager detected.") 58 | self.window.set_visual(self.visual) 59 | self.compositing = True 60 | else: 61 | logger.warning("Compositing window manager not found, expect the unexpected.") 62 | self.compositing = False 63 | 64 | # 65 | # Hardcore Launcher and Panel size detection 66 | # 67 | screen = Wnck.Screen.get_default() 68 | screen.force_update() 69 | workspace = screen.get_active_workspace() 70 | wins = screen.get_windows_stacked() 71 | self.panel_height = 24 72 | self.launcher_width = 49 73 | 74 | try: 75 | logger.debug("Trying to determine Unity Launcher and Panel sizes.") 76 | for win in reversed(wins): 77 | if win.get_name() == 'unity-panel': 78 | self.panel_height = win.get_client_window_geometry()[3] 79 | if win.get_name() == 'unity-launcher': 80 | self.launcher_width = win.get_client_window_geometry()[2] 81 | except: 82 | logger.warning("Unable to detect correct launcher and panel sizes. Using fallback.") 83 | 84 | logger.debug("Got panel size and launcher.") 85 | self.window.move(self.x, self.y) 86 | self.window.set_default_geometry(self.w, self.h) 87 | (x, y) = self.window.get_position() 88 | (w, h) = self.window.get_size() 89 | logger.debug("Showing outline window.") 90 | self.window.move(self.x, self.y) 91 | self.window.set_default_geometry(self.w, self.h) 92 | self.window.show_all() 93 | logger.debug("Outline window shown.") 94 | self.show_ready = True 95 | self.show_text = "Press Capture button to record." 96 | 97 | def pos_adjust(self, x, y, w, h): 98 | self.x = x - 1 99 | self.y = y - 1 100 | self.w = w + 3 101 | if y > 23: 102 | self.h = h + 3 103 | else: 104 | self.no_top = True 105 | self.h = h - 23 + y 106 | 107 | 108 | def update_position(self, x, y, w, h): 109 | self.pos_adjust(x, y, w, h) 110 | if self.window: 111 | self.window.move(self.x, self.y) 112 | self.window.resize(self.w, self.h) # Resize the window 113 | 114 | def show(self, show_ready=True, show_text="Press Capture button to record."): 115 | self.show_ready = show_ready 116 | self.show_text = show_text 117 | self.window.show_all() 118 | self.window.queue_draw() 119 | 120 | def hide(self): 121 | if self.window: 122 | self.window.hide() 123 | 124 | def cb_draw(self, widget, cr): 125 | cr.set_source_rgba(0.0, 0.0, 0.0, 0.0) 126 | cr.set_operator(cairo.OPERATOR_SOURCE) 127 | cr.paint() 128 | surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.w, self.h) 129 | surface_ctx = cairo.Context(surface) 130 | surface_ctx.set_source_rgba(1.0, 1.0, 1.0, 0.0) 131 | surface_ctx.set_operator(cairo.OPERATOR_SOURCE) 132 | surface_ctx.paint() 133 | 134 | rect = cairo.RectangleInt(0, 0, 1, 1) 135 | reg = cairo.Region(rect) 136 | if (not reg.is_empty()): 137 | widget.input_shape_combine_region(None) 138 | widget.input_shape_combine_region(reg) 139 | 140 | cr.move_to(0, 0) 141 | cr.set_source_rgba(0.0, 0.5, 1.0, 0.8) 142 | cr.set_line_width(2.0) 143 | cr.set_dash([3.0, 3.0]) # Set dash pattern (dash length, space length) 144 | 145 | # 146 | # Seriously? 147 | # The thing is, windows cannot overlap Panel or Launcher. 148 | # Ugly code taking care of this overlapping is below. 149 | # 150 | if self.y > self.panel_height - 1: 151 | cr.line_to(self.w, 0) 152 | else: 153 | cr.move_to(self.w, 0) 154 | if self.x + self.w < HW.screens[self.screen.get_number()]['width']: 155 | cr.line_to(self.w, self.h) 156 | else: 157 | cr.move_to(self.w, self.h) 158 | if self.y + self.h < HW.screens[self.screen.get_number()]['height']: 159 | cr.line_to(0, self.h) 160 | else: 161 | cr.move_to(0, self.h) 162 | if self.x > self.launcher_width: 163 | cr.line_to(0, 0) 164 | 165 | cr.stroke() 166 | cr.set_operator(cairo.OPERATOR_OVER) 167 | 168 | if self.show_ready: 169 | # Draw the background rectangle first 170 | cr.set_source_rgba(0.0, 0.5, 1.0, 0.8) # Set background color to green with some transparency 171 | background_width = 220 # Adjust width as needed 172 | background_height = 18 # Adjust height as needed 173 | cr.rectangle(0, 0, background_width, background_height) # Position the background rectangle 174 | cr.fill() # Fill the rectangle with the current color 175 | 176 | # Add text "Ready To Record" on top of the background 177 | cr.set_source_rgba(1.0, 1.0, 1.0, 0.8) # Set text color to white with some transparency 178 | cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) 179 | cr.set_font_size(11) # Set font size 180 | cr.move_to(5, 12) # Position the text slightly inside the background rectangle 181 | cr.show_text(self.show_text) 182 | cr.stroke() 183 | 184 | def destroy(self): 185 | """Destroy the outline window and clean up resources.""" 186 | self.hide() 187 | if self.window: 188 | self.window.destroy() # Destroy the Gtk.Window 189 | self.window = None # Clear the reference to the Gtk.Window 190 | -------------------------------------------------------------------------------- /po/fo.po: -------------------------------------------------------------------------------- 1 | # Faroese translation for kazam 2 | # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2012. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2012-02-23 15:33+0000\n" 12 | "Last-Translator: Jógvan Olsen \n" 13 | "Language-Team: Faroese \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /po/eo.po: -------------------------------------------------------------------------------- 1 | # Esperanto translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2011-01-09 10:52+0000\n" 12 | "Last-Translator: Kristjan SCHMIDT \n" 13 | "Language-Team: Esperanto \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "Kazam" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "redakto kun:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "Nuligi" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "Daŭrigi" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "Pri" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /kazam/pulseaudio/ctypes_pulseaudio.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # ctypes_pulseaudio.py 4 | # 5 | # Copyright 2018 Henry Fuheng Wu 6 | # Copyright 2012 David Klasinc 7 | # 8 | # This library is free software; you can redistribute it and/or 9 | # modify it under the terms of the GNU Lesser General Public 10 | # License as published by the Free Software Foundation; either 11 | # version 3 of the License, or (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program; if not, write to the Free Software 20 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 | # MA 02110-1301, USA. 22 | 23 | from ctypes import * 24 | PA = CDLL('libpulse.so.0') 25 | 26 | # 27 | # Pulse Audio constants and defines 28 | # 29 | PA_CONTEXT_UNCONNECTED = 0 30 | PA_CONTEXT_CONNECTING = 1 31 | PA_CONTEXT_AUTHORIZING = 2 32 | PA_CONTEXT_SETTING_NAME = 3 33 | PA_CONTEXT_READY = 4 34 | PA_CONTEXT_FAILED = 5 35 | PA_CONTEXT_TERMINATED = 6 36 | 37 | PA_OPERATION_RUNNING = 0 38 | PA_OPERATION_DONE = 1 39 | PA_OPERATION_CANCELLED = 2 40 | 41 | # Convenience ... 42 | STRING = c_char_p 43 | size_t = c_ulong 44 | uint32_t = c_uint32 45 | uint8_t = c_uint8 46 | 47 | class pa_mainloop_api(Structure): 48 | pass 49 | class pa_threaded_mainloop(Structure): 50 | pass 51 | pa_threaded_mainloop._fields_ = [] 52 | pa_threaded_mainloop_new = PA.pa_threaded_mainloop_new 53 | pa_threaded_mainloop_new.restype = POINTER(pa_threaded_mainloop) 54 | pa_threaded_mainloop_new.argtypes = [] 55 | pa_threaded_mainloop_free = PA.pa_threaded_mainloop_free 56 | pa_threaded_mainloop_free.restype = None 57 | pa_threaded_mainloop_free.argtypes = [POINTER(pa_threaded_mainloop)] 58 | pa_threaded_mainloop_start = PA.pa_threaded_mainloop_start 59 | pa_threaded_mainloop_start.restype = c_int 60 | pa_threaded_mainloop_start.argtypes = [POINTER(pa_threaded_mainloop)] 61 | pa_threaded_mainloop_stop = PA.pa_threaded_mainloop_stop 62 | pa_threaded_mainloop_stop.restype = None 63 | pa_threaded_mainloop_stop.argtypes = [POINTER(pa_threaded_mainloop)] 64 | pa_threaded_mainloop_get_api = PA.pa_threaded_mainloop_get_api 65 | pa_threaded_mainloop_get_api.restype = POINTER(pa_mainloop_api) 66 | pa_threaded_mainloop_get_api.argtypes = [POINTER(pa_threaded_mainloop)] 67 | 68 | class pa_context(Structure): 69 | pass 70 | pa_context._fields_ = [] 71 | class pa_spawn_api(Structure): 72 | pass 73 | class pa_stream(Structure): 74 | pass 75 | pa_stream._fields_ = [] 76 | 77 | class pa_operation(Structure): 78 | pass 79 | 80 | class pa_cvolume(Structure): 81 | pass 82 | pa_volume_t = uint32_t 83 | pa_cvolume._fields_ = [ 84 | ('channels', uint8_t), 85 | ('values', pa_volume_t * 32), 86 | ] 87 | 88 | pa_sample_format = c_int 89 | pa_sample_format_t = pa_sample_format 90 | 91 | class pa_sample_spec(Structure): 92 | pass 93 | pa_sample_spec._fields_ = [ 94 | ('format', pa_sample_format_t), 95 | ('rate', uint32_t), 96 | ('channels', uint8_t), 97 | ] 98 | 99 | pa_channel_position = c_int 100 | pa_channel_position_t = pa_channel_position 101 | 102 | class pa_channel_map(Structure): 103 | pass 104 | uint8_t = c_uint8 105 | pa_channel_map._fields_ = [ 106 | ('channels', uint8_t), 107 | ('map', pa_channel_position_t * 32), 108 | ] 109 | 110 | class pa_source_info(Structure): 111 | pass 112 | pa_source_info._fields_ = [ 113 | ('name', STRING), 114 | ('index', uint32_t), 115 | ('description', STRING), 116 | ('sample_spec', pa_sample_spec), 117 | ('channel_map', pa_channel_map), 118 | ('owner_module', uint32_t), 119 | ('volume', pa_cvolume), 120 | # ('mute', c_int), 121 | # ('monitor_of_sink', uint32_t), 122 | # ('monitor_of_sink_name', STRING), 123 | # ('latency', pa_usec_t), 124 | # ('driver', STRING), 125 | # ('flags', pa_source_flags_t), 126 | # ('proplist', POINTER(pa_proplist)), 127 | # ('configured_latency', pa_usec_t), 128 | # ('base_volume', pa_volume_t), 129 | # ('state', pa_source_state_t), 130 | # ('n_volume_steps', uint32_t), 131 | # ('card', uint32_t), 132 | # ('n_ports', uint32_t), 133 | # ('ports', POINTER(POINTER(pa_source_port_info))), 134 | # ('active_port', POINTER(pa_source_port_info)), 135 | # ('n_formats', uint8_t), 136 | # ('formats', POINTER(POINTER(pa_format_info))), 137 | ] 138 | 139 | pa_context_flags = c_int 140 | pa_context_flags_t = pa_context_flags 141 | pa_context_state = c_int 142 | pa_context_state_t = pa_context_state 143 | pa_context_notify_cb_t = CFUNCTYPE(None, POINTER(pa_context), c_void_p) 144 | pa_context_success_cb_t = CFUNCTYPE(None, POINTER(pa_context), c_int, c_void_p) 145 | pa_stream_success_cb_t = CFUNCTYPE(None, POINTER(pa_stream), c_int, c_void_p) 146 | pa_stream_request_cb_t = CFUNCTYPE(None, POINTER(pa_stream), size_t, c_void_p) 147 | pa_stream_notify_cb_t = CFUNCTYPE(None, POINTER(pa_stream), c_void_p) 148 | pa_source_info_cb_t = CFUNCTYPE(None, POINTER(pa_context), POINTER(pa_source_info), c_int, c_void_p) 149 | 150 | pa_context_new = PA.pa_context_new 151 | pa_context_new.restype = POINTER(pa_context) 152 | pa_context_new.argtypes = [POINTER(pa_mainloop_api), STRING] 153 | pa_context_connect = PA.pa_context_connect 154 | pa_context_connect.restype = c_int 155 | pa_context_connect.argtypes = [POINTER(pa_context), STRING, pa_context_flags_t, POINTER(pa_spawn_api)] 156 | pa_context_disconnect = PA.pa_context_disconnect 157 | pa_context_disconnect.restype = None 158 | pa_context_disconnect.argtypes = [POINTER(pa_context)] 159 | 160 | pa_context_set_state_callback = PA.pa_context_set_state_callback 161 | pa_context_set_state_callback.restype = None 162 | pa_context_set_state_callback.argtypes = [POINTER(pa_context), pa_context_notify_cb_t, c_void_p] 163 | pa_context_get_state = PA.pa_context_get_state 164 | pa_context_get_state.restype = pa_context_state_t 165 | pa_context_get_state.argtypes = [POINTER(pa_context)] 166 | pa_stream_set_state_callback = PA.pa_stream_set_state_callback 167 | pa_stream_set_state_callback.restype = None 168 | pa_stream_set_state_callback.argtypes = [POINTER(pa_stream), pa_stream_notify_cb_t, c_void_p] 169 | 170 | pa_context_get_source_info_list = PA.pa_context_get_source_info_list 171 | pa_context_get_source_info_list.restype = POINTER(pa_operation) 172 | pa_context_get_source_info_list.argtypes = [POINTER(pa_context), pa_source_info_cb_t, c_void_p] 173 | 174 | pa_context_get_source_info_by_index = PA.pa_context_get_source_info_by_index 175 | pa_context_get_source_info_by_index.restype = POINTER(pa_operation) 176 | pa_context_get_source_info_by_index.argtypes = [POINTER(pa_context), uint32_t, pa_source_info_cb_t, c_void_p] 177 | 178 | pa_context_set_source_volume_by_index = PA.pa_context_set_source_volume_by_index 179 | pa_context_set_source_volume_by_index.restype = POINTER(pa_operation) 180 | pa_context_set_source_volume_by_index.argtypes = [POINTER(pa_context), uint32_t, POINTER(pa_cvolume), pa_context_success_cb_t, c_void_p] 181 | 182 | pa_context_set_source_mute_by_index = PA.pa_context_set_source_mute_by_index 183 | pa_context_set_source_mute_by_index.restype = POINTER(pa_operation) 184 | pa_context_set_source_mute_by_index.argtypes = [POINTER(pa_context), uint32_t, c_int, pa_context_success_cb_t, c_void_p] 185 | 186 | pa_sw_volume_from_linear = PA.pa_sw_volume_from_linear 187 | pa_sw_volume_from_linear.restype = pa_volume_t 188 | pa_sw_volume_from_linear.argtypes = [c_double] 189 | pa_sw_volume_to_linear = PA.pa_sw_volume_to_linear 190 | pa_sw_volume_to_linear.restype = c_double 191 | pa_sw_volume_to_linear.argtypes = [pa_volume_t] 192 | 193 | pa_sw_volume_from_dB = PA.pa_sw_volume_from_dB 194 | pa_sw_volume_from_dB.restype = pa_volume_t 195 | pa_sw_volume_from_dB.argtypes = [c_double] 196 | pa_sw_volume_to_dB = PA.pa_sw_volume_to_dB 197 | pa_sw_volume_to_dB.restype = c_double 198 | pa_sw_volume_to_dB.argtypes = [pa_volume_t] 199 | -------------------------------------------------------------------------------- /po/pt_PT.po: -------------------------------------------------------------------------------- 1 | # Portuguese (Portugal) translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2010-10-21 15:48+0000\n" 12 | "Last-Translator: Eugênio F \n" 13 | "Language-Team: Portuguese (Portugal) \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "Editar com:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "Cancelar" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "Continuar" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "Sair" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "Acerca" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /po/bn.po: -------------------------------------------------------------------------------- 1 | # Bengali translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2010-09-13 12:13+0000\n" 12 | "Last-Translator: Scio \n" 13 | "Language-Team: Bengali \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "এডিট করুন এর দ্বারা:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "বাতিল" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "পরবর্তী" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "স্ক্রীণকাস্ট সেভ করো" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "প্রস্থান" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "পরিচিতি" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /po/is.po: -------------------------------------------------------------------------------- 1 | # Icelandic translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2010-09-13 13:26+0000\n" 12 | "Last-Translator: Freyr Gunnar Ólafsson \n" 13 | "Language-Team: Icelandic \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "Breyta með:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "Hætta við" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "Halda áfram" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "Vista Skjáupptöku" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "Hætta" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "Um" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /COPYING.LGPL: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /po/en_CA.po: -------------------------------------------------------------------------------- 1 | # English (Canada) translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2012-10-20 01:13+0000\n" 12 | "Last-Translator: Kamran Mackey \n" 13 | "Language-Team: English (Canada) \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "Speakers:" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "Microphone:" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "Set Volume" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "Record With:" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "Edit with:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "Cancel" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "Continue" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "Save screencast" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "Quit" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "About" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "Pause recording" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /po/ku.po: -------------------------------------------------------------------------------- 1 | # Kurdish translation for kazam 2 | # Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2017-02-19 00:29+0000\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: Kurdish \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "Kazam" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "Capture" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "Weşana ekranê" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "Wêneya sermasê" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "Giştî" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "Pêrêz:" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "Pelrêçekç hilbijêre" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "Vebijêrk" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "Dîmender Tije" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "Pencere" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "Cih" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | 253 | #: ../kazam/frontend/done_recording.py:65 254 | msgid "Edit with:" 255 | msgstr "Lêzêdekirina bi:" 256 | 257 | #: ../kazam/frontend/done_recording.py:73 258 | msgid "Save for later" 259 | msgstr "" 260 | 261 | #: ../kazam/frontend/done_recording.py:83 262 | msgid "Cancel" 263 | msgstr "Betal bike" 264 | 265 | #: ../kazam/frontend/done_recording.py:85 266 | msgid "Continue" 267 | msgstr "Berdewam" 268 | 269 | #: ../kazam/frontend/done_recording.py:121 270 | msgid "Save screencast" 271 | msgstr "" 272 | 273 | #: ../kazam/frontend/about_dialog.py:60 274 | msgid "Linux Screen Recorder, Broadcaster and OCR" 275 | msgstr "" 276 | 277 | #: ../kazam/frontend/save_dialog.py:37 278 | msgid "Save" 279 | msgstr "Tomar Bike" 280 | 281 | #: ../kazam/frontend/main_menu.py:62 282 | msgid "File" 283 | msgstr "Dosya" 284 | 285 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 286 | msgid "Quit" 287 | msgstr "Derkeve" 288 | 289 | #: ../kazam/frontend/main_menu.py:63 290 | msgid "Quit Kazam" 291 | msgstr "" 292 | 293 | #: ../kazam/frontend/main_menu.py:65 294 | msgid "Open preferences" 295 | msgstr "Vebijêrkan veke" 296 | 297 | #: ../kazam/frontend/main_menu.py:67 298 | msgid "Help" 299 | msgstr "Alîkarî" 300 | 301 | #: ../kazam/frontend/main_menu.py:68 302 | msgid "About" 303 | msgstr "Der barê" 304 | 305 | #: ../kazam/frontend/main_menu.py:68 306 | msgid "About Kazam" 307 | msgstr "" 308 | 309 | #: ../kazam/frontend/window_area.py:384 310 | msgid "Select an area by clicking and dragging." 311 | msgstr "" 312 | 313 | #: ../kazam/frontend/window_area.py:385 314 | msgid "Press ENTER to confirm or ESC to cancel" 315 | msgstr "" 316 | 317 | #: ../kazam/frontend/indicator.py:72 318 | msgid "Pause recording" 319 | msgstr "" 320 | 321 | #: ../kazam/backend/grabber.py:172 322 | msgid "Save capture" 323 | msgstr "" 324 | 325 | #: ../kazam/backend/prefs.py:148 326 | msgid "Unknown" 327 | msgstr "" 328 | -------------------------------------------------------------------------------- /po/uk.po: -------------------------------------------------------------------------------- 1 | # Ukrainian translation for kazam 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the kazam package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kazam\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2014-06-16 20:19+0200\n" 11 | "PO-Revision-Date: 2012-03-28 13:40+0000\n" 12 | "Last-Translator: Andriy Nezhivy \n" 13 | "Language-Team: Ukrainian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2018-10-10 05:35+0000\n" 18 | "X-Generator: Launchpad (build 18790)\n" 19 | 20 | #: ../data/ui/kazam.ui.h:1 ../data/kazam.desktop.in.h:1 21 | #: ../kazam/frontend/about_dialog.py:59 22 | msgid "Kazam" 23 | msgstr "" 24 | 25 | #: ../data/ui/kazam.ui.h:2 26 | msgid "Capture" 27 | msgstr "" 28 | 29 | #: ../data/ui/kazam.ui.h:3 30 | msgid "Seconds to wait before capturing:" 31 | msgstr "" 32 | 33 | #: ../data/ui/kazam.ui.h:4 34 | msgid "Sound from microphone" 35 | msgstr "" 36 | 37 | #: ../data/ui/kazam.ui.h:5 38 | msgid "Sound from speakers" 39 | msgstr "" 40 | 41 | #: ../data/ui/kazam.ui.h:6 42 | msgid "Mouse cursor" 43 | msgstr "" 44 | 45 | #: ../data/ui/kazam.ui.h:7 ../data/ui/preferences.ui.h:15 ../kazam/app.py:171 46 | #: ../kazam/frontend/save_dialog.py:42 47 | msgid "Screencast" 48 | msgstr "" 49 | 50 | #: ../data/ui/kazam.ui.h:8 51 | msgid "Window borders" 52 | msgstr "" 53 | 54 | #: ../data/ui/kazam.ui.h:9 ../data/ui/preferences.ui.h:18 ../kazam/app.py:185 55 | #: ../kazam/frontend/save_dialog.py:44 56 | msgid "Screenshot" 57 | msgstr "" 58 | 59 | #: ../data/ui/kazam.ui.h:10 60 | msgid "When capturing include:" 61 | msgstr "" 62 | 63 | #: ../data/ui/preferences.ui.h:1 64 | msgid "Kazam Preferences" 65 | msgstr "" 66 | 67 | #: ../data/ui/preferences.ui.h:2 68 | msgid "Speakers:" 69 | msgstr "" 70 | 71 | #: ../data/ui/preferences.ui.h:3 72 | msgid "Microphone:" 73 | msgstr "" 74 | 75 | #: ../data/ui/preferences.ui.h:4 76 | msgid "Set volume" 77 | msgstr "" 78 | 79 | #: ../data/ui/preferences.ui.h:5 80 | msgid "Countdown splash:" 81 | msgstr "" 82 | 83 | #: ../data/ui/preferences.ui.h:6 84 | msgid "Toggle display of countdown splash" 85 | msgstr "" 86 | 87 | #: ../data/ui/preferences.ui.h:7 88 | msgid "General" 89 | msgstr "" 90 | 91 | #: ../data/ui/preferences.ui.h:8 92 | msgid "Framerate:" 93 | msgstr "" 94 | 95 | #: ../data/ui/preferences.ui.h:9 96 | msgid "Set the number of frames per second" 97 | msgstr "" 98 | 99 | #: ../data/ui/preferences.ui.h:10 100 | msgid "Record with:" 101 | msgstr "" 102 | 103 | #: ../data/ui/preferences.ui.h:11 104 | msgid "Automatic file saving:" 105 | msgstr "" 106 | 107 | #: ../data/ui/preferences.ui.h:12 108 | msgid "Directory:" 109 | msgstr "" 110 | 111 | #: ../data/ui/preferences.ui.h:13 112 | msgid "Select a directory" 113 | msgstr "" 114 | 115 | #: ../data/ui/preferences.ui.h:14 116 | msgid "Filename prefix:" 117 | msgstr "" 118 | 119 | #: ../data/ui/preferences.ui.h:16 120 | msgid "Shutter sound:" 121 | msgstr "" 122 | 123 | #: ../data/ui/preferences.ui.h:17 124 | msgid "Shutter type:" 125 | msgstr "" 126 | 127 | #: ../data/kazam.desktop.in.h:2 128 | msgid "Screencast and Screenshot tool" 129 | msgstr "" 130 | 131 | #: ../data/kazam.desktop.in.h:3 132 | msgid "Record a video or take a screenshot of your screen" 133 | msgstr "" 134 | 135 | #: ../data/kazam.desktop.in.h:4 136 | msgid "screenshot;screencast;videorecord;desktop recording;" 137 | msgstr "" 138 | 139 | #: ../data/kazam.desktop.in.h:5 140 | msgid "Take a screenshot of entire workspace" 141 | msgstr "" 142 | 143 | #: ../data/kazam.desktop.in.h:6 144 | msgid "Select an area to screenshot" 145 | msgstr "" 146 | 147 | #: ../data/kazam.desktop.in.h:7 148 | msgid "Select a window to screenshot" 149 | msgstr "" 150 | 151 | #: ../data/kazam.desktop.in.h:8 ../kazam/frontend/main_menu.py:65 152 | msgid "Preferences" 153 | msgstr "" 154 | 155 | #: ../kazam/app.py:57 ../kazam/app.py:66 156 | msgid "Gstreamer 1.0 or higher required, bailing out." 157 | msgstr "" 158 | 159 | #: ../kazam/app.py:172 160 | msgid "Record a video of your desktop." 161 | msgstr "" 162 | 163 | #: ../kazam/app.py:186 164 | msgid "Record a picture of your desktop." 165 | msgstr "" 166 | 167 | #: ../kazam/app.py:198 168 | msgid "Webcam" 169 | msgstr "" 170 | 171 | #: ../kazam/app.py:199 172 | msgid "Capture form your webcam." 173 | msgstr "" 174 | 175 | #: ../kazam/app.py:212 176 | msgid "Broadcast" 177 | msgstr "" 178 | 179 | #: ../kazam/app.py:213 180 | msgid "Broadcast your desktop." 181 | msgstr "" 182 | 183 | #: ../kazam/app.py:239 184 | msgid "Fullscreen" 185 | msgstr "" 186 | 187 | #: ../kazam/app.py:240 188 | msgid "Capture contents of the current screen." 189 | msgstr "" 190 | 191 | #: ../kazam/app.py:251 192 | msgid "All Screens" 193 | msgstr "" 194 | 195 | #: ../kazam/app.py:252 196 | msgid "Capture contents of all of your screens." 197 | msgstr "" 198 | 199 | #: ../kazam/app.py:264 200 | msgid "Window" 201 | msgstr "" 202 | 203 | #: ../kazam/app.py:265 204 | msgid "Capture contents of a single window." 205 | msgstr "" 206 | 207 | #: ../kazam/app.py:276 208 | msgid "Area" 209 | msgstr "" 210 | 211 | #: ../kazam/app.py:277 212 | msgid "Capture a pre-selected area of your screen." 213 | msgstr "" 214 | 215 | #: ../kazam/app.py:341 ../kazam/app.py:358 ../kazam/frontend/indicator.py:68 216 | msgid "Start recording" 217 | msgstr "" 218 | 219 | #: ../kazam/app.py:349 220 | msgid "Take screenshot" 221 | msgstr "" 222 | 223 | #: ../kazam/app.py:363 224 | msgid "Start broadcasting" 225 | msgstr "" 226 | 227 | #: ../kazam/app.py:606 ../kazam/app.py:627 ../kazam/frontend/indicator.py:76 228 | msgid "Finish recording" 229 | msgstr "Завершити запис" 230 | 231 | #: ../kazam/app.py:790 232 | msgid "Cancel countdown" 233 | msgstr "" 234 | 235 | #: ../kazam/frontend/window_select.py:155 236 | msgid "Select a window by clicking on it." 237 | msgstr "" 238 | 239 | #: ../kazam/frontend/window_select.py:156 240 | msgid "Press ENTER or ESC to cancel" 241 | msgstr "" 242 | 243 | #: ../kazam/frontend/done_recording.py:50 244 | msgid "Recording finished" 245 | msgstr "" 246 | 247 | #: ../kazam/frontend/done_recording.py:62 248 | msgid "" 249 | "Kazam finished recording.\n" 250 | "What do you want to do now?" 251 | msgstr "" 252 | "Kazam закінчив запис.\n" 253 | "Що Ви хочете робити?" 254 | 255 | #: ../kazam/frontend/done_recording.py:65 256 | msgid "Edit with:" 257 | msgstr "Редагувати з:" 258 | 259 | #: ../kazam/frontend/done_recording.py:73 260 | msgid "Save for later" 261 | msgstr "Зберегти" 262 | 263 | #: ../kazam/frontend/done_recording.py:83 264 | msgid "Cancel" 265 | msgstr "Відміна" 266 | 267 | #: ../kazam/frontend/done_recording.py:85 268 | msgid "Continue" 269 | msgstr "Продовжити" 270 | 271 | #: ../kazam/frontend/done_recording.py:121 272 | msgid "Save screencast" 273 | msgstr "Зберегти запис" 274 | 275 | #: ../kazam/frontend/about_dialog.py:60 276 | msgid "Linux Screen Recorder, Broadcaster and OCR" 277 | msgstr "" 278 | 279 | #: ../kazam/frontend/save_dialog.py:37 280 | msgid "Save" 281 | msgstr "Зберегти" 282 | 283 | #: ../kazam/frontend/main_menu.py:62 284 | msgid "File" 285 | msgstr "Файл" 286 | 287 | #: ../kazam/frontend/main_menu.py:63 ../kazam/frontend/indicator.py:82 288 | msgid "Quit" 289 | msgstr "Вийти" 290 | 291 | #: ../kazam/frontend/main_menu.py:63 292 | msgid "Quit Kazam" 293 | msgstr "Вийти з Kazam" 294 | 295 | #: ../kazam/frontend/main_menu.py:65 296 | msgid "Open preferences" 297 | msgstr "" 298 | 299 | #: ../kazam/frontend/main_menu.py:67 300 | msgid "Help" 301 | msgstr "Довідка" 302 | 303 | #: ../kazam/frontend/main_menu.py:68 304 | msgid "About" 305 | msgstr "Про програму" 306 | 307 | #: ../kazam/frontend/main_menu.py:68 308 | msgid "About Kazam" 309 | msgstr "Про Kazam" 310 | 311 | #: ../kazam/frontend/window_area.py:384 312 | msgid "Select an area by clicking and dragging." 313 | msgstr "" 314 | 315 | #: ../kazam/frontend/window_area.py:385 316 | msgid "Press ENTER to confirm or ESC to cancel" 317 | msgstr "" 318 | 319 | #: ../kazam/frontend/indicator.py:72 320 | msgid "Pause recording" 321 | msgstr "Зупинка запису" 322 | 323 | #: ../kazam/backend/grabber.py:172 324 | msgid "Save capture" 325 | msgstr "" 326 | 327 | #: ../kazam/backend/prefs.py:148 328 | msgid "Unknown" 329 | msgstr "Невідомо" 330 | --------------------------------------------------------------------------------