├── 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 |
34 |
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 |
93 |
--------------------------------------------------------------------------------
/data/icons/scalable/kazam-all-screens-symbolic.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
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 |
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 | #  Kazam2 - Linux Screen Recorder, Broadcaster, Capture and OCR with AI
2 |
3 |    
4 |
5 | Kazam 2.0 is a versatile tool for **screen recording, broadcasting, capturing and optical character recognition(OCR)**.
6 |
7 | 
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 | 
61 |
62 | - Preferences Window
63 |
64 | 
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 | 
120 |
121 | And then paste it into the `Stream Key` in your Kazam preferences window.
122 |
123 | 
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 | 
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 | 
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 |
--------------------------------------------------------------------------------