From a73eeae8bec71c9ea25d2991521885fd150ead42 Mon Sep 17 00:00:00 2001 From: KarolS Date: Sun, 17 Nov 2013 22:05:06 +0100 Subject: [PATCH] Added ability to record other X displays --- aclocal.m4 | 59 +---- src/AV/Input/X11Input.cpp | 16 +- src/AV/Input/X11Input.h | 3 +- src/GUI/PageInput.cpp | 90 ++++++-- src/GUI/PageInput.h | 15 +- src/GUI/PageRecord.cpp | 3 +- src/GUI/PageRecord.h | 1 + src/Makefile.am | 2 + src/Makefile.in | 20 +- src/SimpleScreenRecorder.pro | 6 +- src/Utils.cpp | 33 +++ src/Utils.h | 4 + src/translations/simplescreenrecorder_de.ts | 238 +++++++++++--------- src/translations/simplescreenrecorder_nl.ts | 238 +++++++++++--------- 14 files changed, 418 insertions(+), 310 deletions(-) create mode 100644 src/Utils.cpp create mode 100644 src/Utils.h diff --git a/aclocal.m4 b/aclocal.m4 index f6c6b432..5821cc0a 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) @@ -180,61 +180,6 @@ else fi[]dnl ])# PKG_CHECK_MODULES - -# PKG_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable pkgconfigdir as the location where a module -# should install pkg-config .pc files. By default the directory is -# $libdir/pkgconfig, but the default can be changed by passing -# DIRECTORY. The user can override through the --with-pkgconfigdir -# parameter. -AC_DEFUN([PKG_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([pkgconfigdir], - [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, - [with_pkgconfigdir=]pkg_default) -AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_INSTALLDIR - - -# PKG_NOARCH_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable noarch_pkgconfigdir as the location where a -# module should install arch-independent pkg-config .pc files. By -# default the directory is $datadir/pkgconfig, but the default can be -# changed by passing DIRECTORY. The user can override through the -# --with-noarch-pkgconfigdir parameter. -AC_DEFUN([PKG_NOARCH_INSTALLDIR], -[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) -m4_pushdef([pkg_description], - [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) -AC_ARG_WITH([noarch-pkgconfigdir], - [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, - [with_noarch_pkgconfigdir=]pkg_default) -AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) -m4_popdef([pkg_default]) -m4_popdef([pkg_description]) -]) dnl PKG_NOARCH_INSTALLDIR - - -# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, -# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# ------------------------------------------- -# Retrieves the value of the pkg-config variable for the given module. -AC_DEFUN([PKG_CHECK_VAR], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl - -_PKG_CONFIG([$1], [variable="][$3]["], [$2]) -AS_VAR_COPY([$1], [pkg_cv_][$1]) - -AS_VAR_IF([$1], [""], [$5], [$4])dnl -])# PKG_CHECK_VAR - # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation diff --git a/src/AV/Input/X11Input.cpp b/src/AV/Input/X11Input.cpp index 033008bf..f617a989 100644 --- a/src/AV/Input/X11Input.cpp +++ b/src/AV/Input/X11Input.cpp @@ -41,6 +41,7 @@ along with SimpleScreenRecorder. If not, see . #include #include +#include /* The code in this file is based on the MIT-SHM example code and the x11grab device in libav/ffmpeg (which is GPL): @@ -167,8 +168,15 @@ static void X11ImageDrawCursor(Display* dpy, XImage* image, int recording_area_x } -X11Input::X11Input(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool record_cursor, bool follow_cursor) { +X11Input::X11Input(const QString& display_name, unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool record_cursor, bool follow_cursor) { + if(display_name=="this"){ + m_x11_display_name = NULL; + } else { + m_x11_display_name = new char[display_name.length()+1]; + QByteArray ba = display_name.toAscii(); + strcpy(m_x11_display_name, ba.data()); + } m_x = x; m_y = y; m_width = width; @@ -221,7 +229,7 @@ void X11Input::Init() { // do the X11 stuff // we need a separate display because the existing one would interfere with what Qt is doing in some cases - m_x11_display = XOpenDisplay(NULL); //QX11Info::display(); + m_x11_display = XOpenDisplay(m_x11_display_name); //QX11Info::display(); if(m_x11_display == NULL) { Logger::LogError("[X11Input::Init] " + QObject::tr("Error: Can't open X display!", "Don't translate 'display'")); throw X11Exception(); @@ -301,6 +309,10 @@ void X11Input::Free() { XCloseDisplay(m_x11_display); m_x11_display = NULL; } + if(m_x11_display_name != NULL) { + delete m_x11_display_name; + m_x11_display_name = NULL; + } } void X11Input::UpdateScreenConfiguration() { diff --git a/src/AV/Input/X11Input.h b/src/AV/Input/X11Input.h index ce9be1bc..ff3e73de 100644 --- a/src/AV/Input/X11Input.h +++ b/src/AV/Input/X11Input.h @@ -37,6 +37,7 @@ class X11Input : public QObject, public VideoSource { unsigned int m_x, m_y, m_width, m_height; bool m_record_cursor, m_follow_cursor; + char *m_x11_display_name; Display *m_x11_display; int m_x11_screen; Qt::HANDLE m_x11_root; @@ -53,7 +54,7 @@ class X11Input : public QObject, public VideoSource { std::atomic m_frame_counter; public: - X11Input(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool record_cursor, bool follow_cursor); + X11Input(const QString& display_name, unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool record_cursor, bool follow_cursor); ~X11Input(); // Returns the total number of captured frames. diff --git a/src/GUI/PageInput.cpp b/src/GUI/PageInput.cpp index af07ca3e..a5e91d62 100644 --- a/src/GUI/PageInput.cpp +++ b/src/GUI/PageInput.cpp @@ -19,6 +19,7 @@ along with SimpleScreenRecorder. If not, see . #include "Global.h" #include "PageInput.h" +#include "Utils.h" #include "MainWindow.h" @@ -78,13 +79,17 @@ PageInput::PageInput(MainWindow* main_window) { m_buttongroup_video_area = new QButtonGroup(group_video); QRadioButton *radio_area_screen = new QRadioButton(tr("Record the entire screen"), group_video); - QRadioButton *radio_area_fixed = new QRadioButton(tr("Record a fixed rectangle"), group_video); - QRadioButton *radio_area_cursor = new QRadioButton(tr("Follow the cursor"), group_video); + QRadioButton *radio_area_fixed = new QRadioButton(tr("Record a fixed rectangle"), group_video); + QRadioButton *radio_area_cursor = new QRadioButton(tr("Follow the cursor"), group_video); + QRadioButton *radio_area_other_x = new QRadioButton(tr("Record a fixed rectangle on another X server"), group_video); QRadioButton *radio_area_glinject = new QRadioButton(tr("Record OpenGL (experimental)"), group_video); m_buttongroup_video_area->addButton(radio_area_screen, VIDEO_AREA_SCREEN); - m_buttongroup_video_area->addButton(radio_area_fixed, VIDEO_AREA_FIXED); - m_buttongroup_video_area->addButton(radio_area_cursor, VIDEO_AREA_CURSOR); + m_buttongroup_video_area->addButton(radio_area_fixed, VIDEO_AREA_FIXED); + m_buttongroup_video_area->addButton(radio_area_cursor, VIDEO_AREA_CURSOR); + m_buttongroup_video_area->addButton(radio_area_other_x, VIDEO_AREA_OTHER_X); m_buttongroup_video_area->addButton(radio_area_glinject, VIDEO_AREA_GLINJECT); + m_lineedit_display_name = new QLineEdit(group_video); + m_lineedit_display_name->setToolTip(tr("X server display name.")); m_combobox_screens = new QComboBoxWithSignal(group_video); m_combobox_screens->setToolTip(tr("Select what monitor should be recorded in a multi-monitor configuration.")); m_pushbutton_video_select_rectangle = new QPushButton(tr("Select rectangle..."), group_video); @@ -140,7 +145,8 @@ PageInput::PageInput(MainWindow* main_window) connect(m_combobox_screens, SIGNAL(activated(int)), this, SLOT(OnUpdateVideoAreaFields())); connect(m_combobox_screens, SIGNAL(popupShown()), this, SLOT(OnIdentifyScreens())); connect(m_combobox_screens, SIGNAL(popupHidden()), this, SLOT(OnStopIdentifyScreens())); - connect(m_spinbox_video_x, SIGNAL(focusIn()), this, SLOT(OnUpdateRecordingFrame())); + connect(m_lineedit_display_name, SIGNAL(textChanged(QString)), this, SLOT(OnUpdateVideoAreaFields())); + connect(m_spinbox_video_x, SIGNAL(focusIn()), this, SLOT(OnUpdateRecordingFrame())); connect(m_spinbox_video_x, SIGNAL(focusOut()), this, SLOT(OnUpdateRecordingFrame())); connect(m_spinbox_video_x, SIGNAL(valueChanged(int)), this, SLOT(OnUpdateRecordingFrame())); connect(m_spinbox_video_y, SIGNAL(focusIn()), this, SLOT(OnUpdateRecordingFrame())); @@ -166,7 +172,13 @@ PageInput::PageInput(MainWindow* main_window) } layout->addWidget(radio_area_fixed); layout->addWidget(radio_area_cursor); - layout->addWidget(radio_area_glinject); + { + QHBoxLayout *layout2 = new QHBoxLayout(); + layout->addLayout(layout2); + layout2->addWidget(radio_area_other_x); + layout2->addWidget(m_lineedit_display_name); + } + layout->addWidget(radio_area_glinject); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); @@ -201,8 +213,8 @@ PageInput::PageInput(MainWindow* main_window) layout2->addWidget(m_spinbox_video_scaled_w, 0, 1); layout2->addWidget(m_label_video_scaled_h, 0, 2); layout2->addWidget(m_spinbox_video_scaled_h, 0, 3); - } - layout->addWidget(m_checkbox_record_cursor); + } + layout->addWidget(m_checkbox_record_cursor); } QGroupBox *group_audio = new QGroupBox(tr("Audio input"), this); { @@ -291,6 +303,7 @@ void PageInput::LoadSettings(QSettings* settings) { #endif // load settings + SetDisplayNameGui(settings->value("input_display_name", ":0").toString()); SetVideoArea((enum_video_area) settings->value("input/video_area", VIDEO_AREA_SCREEN).toUInt()); SetVideoAreaScreen(settings->value("input/video_area_screen", 0).toUInt()); SetVideoX(settings->value("input/video_x", 0).toUInt()); @@ -324,7 +337,8 @@ void PageInput::LoadSettings(QSettings* settings) { } void PageInput::SaveSettings(QSettings* settings) { - settings->setValue("input/video_area", GetVideoArea()); + settings->setValue("input/video_display_name", GetDisplayNameGui()); + settings->setValue("input/video_area", GetVideoArea()); settings->setValue("input/video_area_screen", GetVideoAreaScreen()); settings->setValue("input/video_x", GetVideoX()); settings->setValue("input/video_y", GetVideoY()); @@ -606,13 +620,15 @@ void PageInput::LoadPulseAudioSources() { void PageInput::OnUpdateRecordingFrame() { if(m_spinbox_video_x->hasFocus() || m_spinbox_video_y->hasFocus() || m_spinbox_video_w->hasFocus() || m_spinbox_video_h->hasFocus()) { - if(m_recording_frame == NULL) { - m_recording_frame.reset(new QRubberBand(QRubberBand::Rectangle)); - m_recording_frame->setGeometry(ValidateRubberBandRectangle(QRect(GetVideoX(), GetVideoY(), GetVideoW(), GetVideoH()))); - m_recording_frame->show(); - } else { - m_recording_frame->setGeometry(ValidateRubberBandRectangle(QRect(GetVideoX(), GetVideoY(), GetVideoW(), GetVideoH()))); - } + if(GetVideoArea() != VIDEO_AREA_OTHER_X) { + if(m_recording_frame == NULL) { + m_recording_frame.reset(new QRubberBand(QRubberBand::Rectangle)); + m_recording_frame->setGeometry(ValidateRubberBandRectangle(QRect(GetVideoX(), GetVideoY(), GetVideoW(), GetVideoH()))); + m_recording_frame->show(); + } else { + m_recording_frame->setGeometry(ValidateRubberBandRectangle(QRect(GetVideoX(), GetVideoY(), GetVideoW(), GetVideoH()))); + } + } } else { m_recording_frame.reset(); } @@ -623,8 +639,9 @@ void PageInput::OnUpdateVideoAreaFields() { case VIDEO_AREA_SCREEN: { m_combobox_screens->setEnabled(true); m_pushbutton_video_select_rectangle->setEnabled(false); - m_pushbutton_video_select_window->setEnabled(false); - m_pushbutton_video_opengl_settings->setEnabled(false); + m_pushbutton_video_select_window->setEnabled(false); + m_pushbutton_video_opengl_settings->setEnabled(false); + m_lineedit_display_name->setEnabled(false); GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, m_label_video_w, m_spinbox_video_w, m_label_video_h, m_spinbox_video_h}, false); int sc = m_combobox_screens->currentIndex(); @@ -641,15 +658,36 @@ void PageInput::OnUpdateVideoAreaFields() { SetVideoY(rect.top()); SetVideoW(rect.width()); SetVideoH(rect.height()); + SetDisplayName("this"); break; - } + } + + case VIDEO_AREA_OTHER_X: { + m_combobox_screens->setEnabled(false); + m_pushbutton_video_select_rectangle->setEnabled(false); + m_pushbutton_video_select_window->setEnabled(false); + m_pushbutton_video_opengl_settings->setEnabled(false); + m_lineedit_display_name->setEnabled(true); + GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, + m_label_video_w, m_spinbox_video_w, m_label_video_h, m_spinbox_video_h}, true); + SetVideoX(0); + SetVideoY(0); + int w,h; + getDisplaySize(m_lineedit_display_name->text(), &w, &h); // TODO + if(w>0) SetVideoW(w); + if(h>0) SetVideoH(h); + SetDisplayName(m_lineedit_display_name->text()); //TODO + break; + } case VIDEO_AREA_FIXED: { m_combobox_screens->setEnabled(false); m_pushbutton_video_select_rectangle->setEnabled(true); m_pushbutton_video_select_window->setEnabled(true); m_pushbutton_video_opengl_settings->setEnabled(false); - GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, + m_lineedit_display_name->setEnabled(false); + GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, m_label_video_w, m_spinbox_video_w, m_label_video_h, m_spinbox_video_h}, true); + SetDisplayName("this"); break; } case VIDEO_AREA_CURSOR: { @@ -657,20 +695,24 @@ void PageInput::OnUpdateVideoAreaFields() { m_pushbutton_video_select_rectangle->setEnabled(true); m_pushbutton_video_select_window->setEnabled(true); m_pushbutton_video_opengl_settings->setEnabled(false); - GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y}, false); + m_lineedit_display_name->setEnabled(false); + GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y}, false); GroupEnabled({m_label_video_w, m_spinbox_video_w, m_label_video_h, m_spinbox_video_h}, true); SetVideoX(0); SetVideoY(0); - break; + SetDisplayName("this"); + break; } case VIDEO_AREA_GLINJECT: { m_combobox_screens->setEnabled(false); m_pushbutton_video_select_rectangle->setEnabled(false); m_pushbutton_video_select_window->setEnabled(false); m_pushbutton_video_opengl_settings->setEnabled(true); - GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, + m_lineedit_display_name->setEnabled(false); + GroupEnabled({m_label_video_x, m_spinbox_video_x, m_label_video_y, m_spinbox_video_y, m_label_video_w, m_spinbox_video_w, m_label_video_h, m_spinbox_video_h}, false); - break; + SetDisplayName("this"); + break; } default: break; } diff --git a/src/GUI/PageInput.h b/src/GUI/PageInput.h index f7a85f2f..632690a6 100644 --- a/src/GUI/PageInput.h +++ b/src/GUI/PageInput.h @@ -66,6 +66,7 @@ class PageInput : public QWidget { VIDEO_AREA_FIXED, VIDEO_AREA_CURSOR, VIDEO_AREA_GLINJECT, + VIDEO_AREA_OTHER_X, VIDEO_AREA_COUNT // must be last }; enum enum_audio_backend { @@ -87,6 +88,7 @@ class PageInput : public QWidget { #endif QString m_glinject_command, m_glinject_working_directory; + QString m_display_name; bool m_glinject_run_command, m_glinject_relax_permissions; unsigned int m_glinject_max_megapixels; bool m_glinject_capture_front, m_glinject_limit_fps; @@ -97,7 +99,8 @@ class PageInput : public QWidget { QComboBoxWithSignal *m_combobox_screens; QPushButton *m_pushbutton_video_select_rectangle, *m_pushbutton_video_select_window, *m_pushbutton_video_opengl_settings; QLabel *m_label_video_x, *m_label_video_y, *m_label_video_w, *m_label_video_h; - QSpinBoxWithSignal *m_spinbox_video_x, *m_spinbox_video_y, *m_spinbox_video_w, *m_spinbox_video_h; + QLineEdit *m_lineedit_display_name; + QSpinBoxWithSignal *m_spinbox_video_x, *m_spinbox_video_y, *m_spinbox_video_w, *m_spinbox_video_h; QSpinBox *m_spinbox_video_frame_rate; QCheckBox *m_checkbox_scale; QLabel *m_label_video_scaled_w, *m_label_video_scaled_h; @@ -150,7 +153,9 @@ class PageInput : public QWidget { #endif inline QString GetGLInjectCommand() { return m_glinject_command; } inline QString GetGLInjectWorkingDirectory() { return m_glinject_working_directory; } - inline bool GetGLInjectRunCommand() { return m_glinject_run_command; } + inline QString GetDisplayName() { return m_display_name; } + inline QString GetDisplayNameGui() { return m_lineedit_display_name->text(); } + inline bool GetGLInjectRunCommand() { return m_glinject_run_command; } inline bool GetGLInjectRelaxPermissions() { return m_glinject_relax_permissions; } inline unsigned int GetGLInjectMaxMegaPixels() { return m_glinject_max_megapixels; } inline bool GetGLInjectCaptureFront() { return m_glinject_capture_front; } @@ -174,8 +179,10 @@ class PageInput : public QWidget { inline void SetPulseAudioSource(unsigned int source) { m_combobox_pulseaudio_source->setCurrentIndex(clamp(source, 0u, (unsigned int) m_pulseaudio_sources.size() - 1)); } #endif inline void SetGLInjectCommand(const QString& command) { m_glinject_command = command; } - inline void SetGLInjectWorkingDirectory(const QString& glinject_working_directory) { m_glinject_working_directory = glinject_working_directory; } - inline void SetGLInjectRunCommand(bool run_command) { m_glinject_run_command = run_command; } + inline void SetGLInjectWorkingDirectory(const QString& glinject_working_directory) { m_glinject_working_directory = glinject_working_directory; } + inline void SetDisplayName(const QString& display_name) { m_display_name = display_name; } + inline void SetDisplayNameGui(const QString& display_name) { m_lineedit_display_name->setText(display_name); } + inline void SetGLInjectRunCommand(bool run_command) { m_glinject_run_command = run_command; } inline void SetGLInjectRelaxPermissions(bool relax_permissions) { m_glinject_relax_permissions = relax_permissions; } inline void SetGLInjectMaxMegaPixels(unsigned int max_megapixels) { m_glinject_max_megapixels = clamp(max_megapixels, 1u, 100u); } inline void SetGLInjectCaptureFront(bool capture_front) { m_glinject_capture_front = capture_front; } diff --git a/src/GUI/PageRecord.cpp b/src/GUI/PageRecord.cpp index e8dccc5f..f2984b3d 100644 --- a/src/GUI/PageRecord.cpp +++ b/src/GUI/PageRecord.cpp @@ -381,6 +381,7 @@ void PageRecord::StartPage() { PageOutput *page_output = m_main_window->GetPageOutput(); // get the video input settings + m_x11_display_name = page_input->GetDisplayName(); m_video_area = page_input->GetVideoArea(); m_video_x = page_input->GetVideoX(); m_video_y = page_input->GetVideoY(); @@ -678,7 +679,7 @@ void PageRecord::StartInput() { } m_gl_inject_input.reset(new GLInjectInput(m_gl_inject_launcher.get())); } else { - m_x11_input.reset(new X11Input(m_video_x, m_video_y, m_video_in_width, m_video_in_height, m_video_record_cursor, m_video_area == PageInput::VIDEO_AREA_CURSOR)); + m_x11_input.reset(new X11Input(m_x11_display_name, m_video_x, m_video_y, m_video_in_width, m_video_in_height, m_video_record_cursor, m_video_area == PageInput::VIDEO_AREA_CURSOR)); } // start the audio input diff --git a/src/GUI/PageRecord.h b/src/GUI/PageRecord.h index 764ff83c..71638954 100644 --- a/src/GUI/PageRecord.h +++ b/src/GUI/PageRecord.h @@ -56,6 +56,7 @@ class PageRecord : public QWidget { bool m_recorded_something; PageInput::enum_video_area m_video_area; + QString m_x11_display_name; unsigned int m_video_x, m_video_y, m_video_in_width, m_video_in_height; unsigned int m_video_frame_rate; bool m_video_scaling; diff --git a/src/Makefile.am b/src/Makefile.am index ff545fed..66f173c9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -108,6 +108,8 @@ simplescreenrecorder_SOURCES = \ Main.cpp \ Main.h \ MutexDataPair.h \ + Utils.cpp \ + Utils.h \ Version.cpp \ Version.h nodist_simplescreenrecorder_SOURCES = diff --git a/src/Makefile.in b/src/Makefile.in index 47ca367b..5f99a00c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -129,7 +129,7 @@ am__simplescreenrecorder_SOURCES_DIST = AV/Input/ALSAInput.cpp \ GUI/PageRecord.cpp GUI/PageRecord.h GUI/PageWelcome.cpp \ GUI/PageWelcome.h GUI/VideoPreviewer.cpp GUI/VideoPreviewer.h \ Global.h Logger.cpp Logger.h Main.cpp Main.h MutexDataPair.h \ - Version.cpp Version.h + Utils.cpp Utils.h Version.cpp Version.h am__dirstamp = $(am__leading_dot)dirstamp @ENABLE_SSRPROGRAM_TRUE@am_simplescreenrecorder_OBJECTS = AV/Input/simplescreenrecorder-ALSAInput.$(OBJEXT) \ @ENABLE_SSRPROGRAM_TRUE@ AV/Input/simplescreenrecorder-GLInjectInput.$(OBJEXT) \ @@ -162,6 +162,7 @@ am__dirstamp = $(am__leading_dot)dirstamp @ENABLE_SSRPROGRAM_TRUE@ GUI/simplescreenrecorder-VideoPreviewer.$(OBJEXT) \ @ENABLE_SSRPROGRAM_TRUE@ simplescreenrecorder-Logger.$(OBJEXT) \ @ENABLE_SSRPROGRAM_TRUE@ simplescreenrecorder-Main.$(OBJEXT) \ +@ENABLE_SSRPROGRAM_TRUE@ simplescreenrecorder-Utils.$(OBJEXT) \ @ENABLE_SSRPROGRAM_TRUE@ simplescreenrecorder-Version.$(OBJEXT) @ENABLE_SSRPROGRAM_TRUE@nodist_simplescreenrecorder_OBJECTS = simplescreenrecorder-qrc_resources.$(OBJEXT) \ @ENABLE_SSRPROGRAM_TRUE@ simplescreenrecorder-moc_X11Input.$(OBJEXT) \ @@ -515,6 +516,8 @@ top_srcdir = @top_srcdir@ @ENABLE_SSRPROGRAM_TRUE@ Main.cpp \ @ENABLE_SSRPROGRAM_TRUE@ Main.h \ @ENABLE_SSRPROGRAM_TRUE@ MutexDataPair.h \ +@ENABLE_SSRPROGRAM_TRUE@ Utils.cpp \ +@ENABLE_SSRPROGRAM_TRUE@ Utils.h \ @ENABLE_SSRPROGRAM_TRUE@ Version.cpp \ @ENABLE_SSRPROGRAM_TRUE@ Version.h @@ -722,6 +725,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-Logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-Main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-Utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-Version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-moc_AudioPreviewer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplescreenrecorder-moc_ElidedLabel.Po@am__quote@ @@ -1225,6 +1229,20 @@ simplescreenrecorder-Main.obj: Main.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -c -o simplescreenrecorder-Main.obj `if test -f 'Main.cpp'; then $(CYGPATH_W) 'Main.cpp'; else $(CYGPATH_W) '$(srcdir)/Main.cpp'; fi` +simplescreenrecorder-Utils.o: Utils.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -MT simplescreenrecorder-Utils.o -MD -MP -MF $(DEPDIR)/simplescreenrecorder-Utils.Tpo -c -o simplescreenrecorder-Utils.o `test -f 'Utils.cpp' || echo '$(srcdir)/'`Utils.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simplescreenrecorder-Utils.Tpo $(DEPDIR)/simplescreenrecorder-Utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Utils.cpp' object='simplescreenrecorder-Utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -c -o simplescreenrecorder-Utils.o `test -f 'Utils.cpp' || echo '$(srcdir)/'`Utils.cpp + +simplescreenrecorder-Utils.obj: Utils.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -MT simplescreenrecorder-Utils.obj -MD -MP -MF $(DEPDIR)/simplescreenrecorder-Utils.Tpo -c -o simplescreenrecorder-Utils.obj `if test -f 'Utils.cpp'; then $(CYGPATH_W) 'Utils.cpp'; else $(CYGPATH_W) '$(srcdir)/Utils.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simplescreenrecorder-Utils.Tpo $(DEPDIR)/simplescreenrecorder-Utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Utils.cpp' object='simplescreenrecorder-Utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -c -o simplescreenrecorder-Utils.obj `if test -f 'Utils.cpp'; then $(CYGPATH_W) 'Utils.cpp'; else $(CYGPATH_W) '$(srcdir)/Utils.cpp'; fi` + simplescreenrecorder-Version.o: Version.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(simplescreenrecorder_CPPFLAGS) $(CPPFLAGS) $(simplescreenrecorder_CXXFLAGS) $(CXXFLAGS) -MT simplescreenrecorder-Version.o -MD -MP -MF $(DEPDIR)/simplescreenrecorder-Version.Tpo -c -o simplescreenrecorder-Version.o `test -f 'Version.cpp' || echo '$(srcdir)/'`Version.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simplescreenrecorder-Version.Tpo $(DEPDIR)/simplescreenrecorder-Version.Po diff --git a/src/SimpleScreenRecorder.pro b/src/SimpleScreenRecorder.pro index 89b4d4ad..3b31b924 100644 --- a/src/SimpleScreenRecorder.pro +++ b/src/SimpleScreenRecorder.pro @@ -44,7 +44,8 @@ SOURCES += \ GUI/VideoPreviewer.cpp \ Logger.cpp \ Main.cpp \ - Version.cpp + Version.cpp \ + Utils.cpp HEADERS += \ AV/Input/ALSAInput.h \ @@ -81,7 +82,8 @@ HEADERS += \ Logger.h \ Main.h \ MutexDataPair.h \ - Version.h + Version.h \ + Utils.h RESOURCES += \ resources.qrc diff --git a/src/Utils.cpp b/src/Utils.cpp new file mode 100644 index 00000000..0e984a9b --- /dev/null +++ b/src/Utils.cpp @@ -0,0 +1,33 @@ +#include "Global.h" +#include + +void getDisplaySize(const QString& display_name, int *w, int *h) { + Display* pdsp = NULL; + Window wid = 0; + XWindowAttributes xwAttr; + *h = -1; + *w = -1; + + if(display_name=="this") { + pdsp = XOpenDisplay(NULL); + } else { + QByteArray ba = display_name.toAscii(); + pdsp = XOpenDisplay(ba.data()); + } + if ( !pdsp ) { + return; + } + + wid = DefaultRootWindow(pdsp); + if (wid < 0) { + XCloseDisplay(pdsp); + return; + } + + Status status = XGetWindowAttributes(pdsp, wid, &xwAttr); + *w = xwAttr.width; + *h = xwAttr.height; + + XCloseDisplay( pdsp ); + return; +} diff --git a/src/Utils.h b/src/Utils.h new file mode 100644 index 00000000..d58db73f --- /dev/null +++ b/src/Utils.h @@ -0,0 +1,4 @@ +#pragma once +#include "Global.h" + +extern void getDisplaySize(const QString& display_name, int *w, int *h); diff --git a/src/translations/simplescreenrecorder_de.ts b/src/translations/simplescreenrecorder_de.ts index 45166466..7ce9ed64 100644 --- a/src/translations/simplescreenrecorder_de.ts +++ b/src/translations/simplescreenrecorder_de.ts @@ -42,12 +42,12 @@ DialogGLInject - + OpenGL Settings - + <p>Warning: OpenGL recording works by injecting a library into the program that will be recorded. This library will override some system functions in order to capture the frames before they are displayed on the screen. If you are trying to record a game that tries to detect hacking attempts on the client side, it's (theoretically) possible that the game will consider this a hack. This might even get you banned, so it's a good idea to make sure that the program you want to record won't ban you, *before* you try to record it. You've been warned :).</p> <p>Another warning: OpenGL recording is experimental, it may not work or even crash the program you are recording. If you are worried about losing program data, make a backup first!</p> @@ -56,45 +56,55 @@ - + Command: - + This command will be executed to start the program that should be recorded. - + + Working directory: + + + + + The command will be executed in this directory. If you leave this empty, the working directory won't be changed. + + + + Start the OpenGL application automatically - + If checked, the above command will be executed automatically (combined with some environment variables). If not checked, you have to start the OpenGL application yourself (the full command, including the required environment variables, is shown in the log). - + Relax shared memory permissions (insecure) - + If checked, other users on the same machine will be able to attach to the shared memory that's used for communication with the OpenGL program. This means other users can (theoretically) see what you are recording, modify the frames, inject their own frames, or simply disrupt the communication. This even applies to users that are logged in remotely (ssh). You should only enable this if you need to record a program that runs as a different user. - + Maximum image size (megapixels): - + This setting changes the amount of shared memory that will be allocated to send frames back to the main program. The size of the shared memory can't be changed anymore once the program has been started, so if the program you are trying to record is too large, recording won't work. 2 megapixels should be enough in almost all cases. Be careful, @@ -102,30 +112,30 @@ high values will use a lot of memory! - + Capture front buffer instead of back buffer - + If checked, the injected library will read the front buffer (the frame that's currently on the screen) rather than the back buffer (the new frame). This may be useful for some special applications that draw directly to the screen. - + Limit application frame rate - + If checked, the injected library will slow down the application so the frame rate doesn't become higher than the recording frame rate. This stops the application from wasting CPU time for frames that won't be recorded, and sometimes results in smoother video (this depends on the application). - + Close @@ -146,232 +156,242 @@ This stops the application from wasting CPU time for frames that won't be r PageInput - + Video input - + Record the entire screen - + Record a fixed rectangle - + Follow the cursor - + + Record a fixed rectangle on another X server + + + + Record OpenGL (experimental) - + + X server display name. + + + + Select what monitor should be recorded in a multi-monitor configuration. - + Select rectangle... - + Use the mouse to select the recorded rectangle. - + Select window... - + Use the mouse to select a window to record. Hint: If you click the border of a window, the entire window will be recorded (including the borders). Otherwise only the client area of the window will be recorded. - + OpenGL settings... - + Change the settings for OpenGL recording. - + Left: - + The x coordinate of the upper-left corner of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. - + Top: - + The y coordinate of the upper-left corner of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. - + Width: - + The width of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. - + Height: - + The height of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. - + Frame rate: - + The number of frames per second in the final video. Higher frame rates use more CPU time. - + Scale video - + Enable or disable scaling. Scaling uses more CPU time, but if the scaled video is smaller, it could make the encoding faster. - + Scaled width: - + Scaled height: - + Record cursor - + Audio input - + Record audio - + Backend: - + The ALSA device that will be used for recording. Normally this should be 'default'. You can change this to something like plughw:0,0 (which means sound card 0 input 0 with plugins enabled). Don't translate 'default' and 'plughw' - + The PulseAudio source that will be used for recording. A 'monitor' is a source that records the audio played by other applications. Don't translate 'monitor' unless PulseAudio does this as well - + All screens: %1x%2 This appears in the screen selection combobox - + Screen %1: %2x%3 at %4,%5 This appears in the screen selection combobox - + Screen %1 This appears in the screen labels - + You did not enter a command to start the OpenGL application that you want to record. Click the 'OpenGL settings' button and enter a command. - + The audio backend that will be used for recording. The ALSA backend will also work on systems that use PulseAudio, but it is better to use the PulseAudio backend directly. - + Device: - + Source: - + Refresh - + Refreshes the list of PulseAudio sources. - + Back - + Continue @@ -774,47 +794,47 @@ Are you sure that you want to quit? - + Starting output ... - + Started output. - + Stopping output ... - + Stopped output. - + Starting input ... - + Started input. - + Stopping input ... - + Stopped input. - + Starting page ... @@ -825,75 +845,75 @@ The program that you are recording will not receive the key press. - + Error: Something went wrong during GLInject initialization. - + Started page. - + Stopping page ... - + Stopped page. - + Error: Could not get the size of the OpenGL application because GLInject has not been started. - + Error: Could not get the size of the OpenGL application. Either the application wasn't started correctly, or the application hasn't created an OpenGL window yet. If you want to start recording before starting the application, you have to enable scaling and enter the video size manually. - - + + Error: Something went wrong during initialization. - + Error: Could not create a GLInject input because GLInject has not been started. - - + + Pause recording - - + + Start recording - + Stop preview - + Start preview - + Are you sure that you want to cancel this recording? - + You haven't recorded anything, there is nothing to save. The start button is at the top ;). @@ -1014,7 +1034,7 @@ The start button is at the top ;). - + Stopping input thread ... @@ -1057,7 +1077,7 @@ The start button is at the top ;). - + Input thread started. @@ -1075,7 +1095,7 @@ The start button is at the top ;). - + Input thread stopped. @@ -1083,7 +1103,7 @@ The start button is at the top ;). - + Exception '%1' in input thread. @@ -1091,7 +1111,7 @@ The start button is at the top ;). - + Unknown exception in input thread. @@ -1111,22 +1131,22 @@ The start button is at the top ;). - + Error: Can't get frame shared memory! - + Error: Can't attach to frame shared memory! - + Full command - + Error: Can't run command! @@ -1206,79 +1226,79 @@ It is possible that your system doesn't use PulseAudio. Try using the ALSA - + Error: Unsupported X11 image pixel format! - + Error: Can't open X display! Don't translate 'display' - + Using X11 shared memory. - + Error: Can't create shared image! - - + + Error: Can't get shared memory! - - + + Error: Can't attach to shared memory! - + Not using X11 shared memory. - + Error: Width or height is zero! - + Error: Width or height is too large, the maximum width and height is %1! - + Warning: XFixes is not supported by server, the cursor has been hidden. Don't translate 'XFixes' - + Error: Invalid screen bounding box! - + Error: Can't attach server to shared memory! - + Error: Can't get image (using shared memory)! Usually this means the recording area is not completely inside the screen. Or did you change the screen resolution? - + Error: Can't get image (not using shared memory)! Usually this means the recording area is not completely inside the screen. Or did you change the screen resolution? diff --git a/src/translations/simplescreenrecorder_nl.ts b/src/translations/simplescreenrecorder_nl.ts index e5cb40eb..2e4dc76f 100644 --- a/src/translations/simplescreenrecorder_nl.ts +++ b/src/translations/simplescreenrecorder_nl.ts @@ -42,12 +42,12 @@ DialogGLInject - + OpenGL Settings OpenGL instellingen - + <p>Warning: OpenGL recording works by injecting a library into the program that will be recorded. This library will override some system functions in order to capture the frames before they are displayed on the screen. If you are trying to record a game that tries to detect hacking attempts on the client side, it's (theoretically) possible that the game will consider this a hack. This might even get you banned, so it's a good idea to make sure that the program you want to record won't ban you, *before* you try to record it. You've been warned :).</p> <p>Another warning: OpenGL recording is experimental, it may not work or even crash the program you are recording. If you are worried about losing program data, make a backup first!</p> @@ -60,34 +60,44 @@ <p>Als je Steam-spellen wil opnemen, <a href="http://www.maartenbaert.be/simplescreenrecorder/recording-steam-games/">lees dan eerst dit</a>.</p> - + Command: Commando: - + This command will be executed to start the program that should be recorded. Dit commando zal worden uitgevoerd om het programma dat opgenomen moet worden te starten. - + + Working directory: + + + + + The command will be executed in this directory. If you leave this empty, the working directory won't be changed. + + + + Start the OpenGL application automatically Start de OpenGL-applicatie automatisch - + If checked, the above command will be executed automatically (combined with some environment variables). If not checked, you have to start the OpenGL application yourself (the full command, including the required environment variables, is shown in the log). Indien aangevinkt zal het bovenstaande commando automatisch worden uitgevoerd (samen met een aantal omgevingsvariabelen). Indien niet aangevinkt moet je zelf de OpenGL-applicatie starten (het volledige commando, inclusief de vereiste omgevingsvariabelen, zal worden weergegeven in de log). - + Relax shared memory permissions (insecure) Geen strikte permissies voor gedeeld geheugen (onveilig) - + If checked, other users on the same machine will be able to attach to the shared memory that's used for communication with the OpenGL program. This means other users can (theoretically) see what you are recording, modify the frames, inject their own frames, or simply disrupt the communication. This even applies to users that are logged in remotely (ssh). You should only enable this if you need to record a program that runs as a different user. @@ -96,12 +106,12 @@ Dit betekent dat andere gebruikers (theoretisch) kunnen zien wat je opneemt, de Dit geldt zelfs voor gebruikers die op afstand inloggen (ssh). Je moet dit enkel inschakelen als je een programma moet opnemen dat uitgevoerd wordt als een andere gebruiker. - + Maximum image size (megapixels): Maximum afbeeldingsgrootte (megapixels): - + This setting changes the amount of shared memory that will be allocated to send frames back to the main program. The size of the shared memory can't be changed anymore once the program has been started, so if the program you are trying to record is too large, recording won't work. 2 megapixels should be enough in almost all cases. Be careful, @@ -112,24 +122,24 @@ op te nemen te groot is, dan zal de opname mislukken. 2 megapixels zou genoeg mo zullen veel geheugen gebruiken! - + Capture front buffer instead of back buffer Neem de front buffer op in plaats van de back buffer - + If checked, the injected library will read the front buffer (the frame that's currently on the screen) rather than the back buffer (the new frame). This may be useful for some special applications that draw directly to the screen. Indien aangevinkt zal de geinjecteerde library de front buffer lezen (het beeld dat op dit moment op het scherm staat) in plaats van de back buffer (het nieuwe beeld). Dit zou nuttig kunnen zijn voor sommige speciale applicaties die rechtstreeks op het scherm tekenen. - + Limit application frame rate Limiteer beelden per seconde van de applicatie - + If checked, the injected library will slow down the application so the frame rate doesn't become higher than the recording frame rate. This stops the application from wasting CPU time for frames that won't be recorded, and sometimes results in smoother video (this depends on the application). @@ -138,7 +148,7 @@ Dit verhindert dat de applicatie CPU-tijd gebruikt voor beelden die niet opgenom (dit hangt af van de applicatie). - + Close Sluiten @@ -159,52 +169,62 @@ Dit verhindert dat de applicatie CPU-tijd gebruikt voor beelden die niet opgenom PageInput - + Video input Video input - + Record the entire screen Neem het hele scherm op - + Record a fixed rectangle Neem een vaste rechthoek op - + Follow the cursor Volg de cursor - + + Record a fixed rectangle on another X server + + + + Record OpenGL (experimental) OpenGL opname (experimenteel) - + + X server display name. + + + + Select what monitor should be recorded in a multi-monitor configuration. Selecteer welke monitor opgenomen moet worden in een multi-monitor configuratie. - + Select rectangle... Selecteer rechthoek... - + Use the mouse to select the recorded rectangle. Gebruik de muis om de opgenomen rechthoek te selecteren. - + Select window... Selecteer venster... - + Use the mouse to select a window to record. Hint: If you click the border of a window, the entire window will be recorded (including the borders). Otherwise only the client area of the window will be recorded. @@ -213,115 +233,115 @@ Hint: Als je op de rand van het venster klikt, zal het hele venster worden opgen enkel het client-gedeelte (binnenkant) van het venster opgenomen. - + OpenGL settings... OpenGL-instellingen... - + Change the settings for OpenGL recording. Verander de instellingen voor OpenGL opnames. - + Left: Links: - + The x coordinate of the upper-left corner of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. De x-coordinaat van de linkerbovenhoek van de opgenomen rechthoek. Hint: Je kan deze waarde ook aanpassen met het scrollwiel of de omhoog/omlaag-pijltjes. - + Top: Boven: - + The y coordinate of the upper-left corner of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. De y-coordinaat van de linkerbovenhoek van de opgenomen rechthoek. Hint: Je kan deze waarde ook aanpassen met het scrollwiel of de omhoog/omlaag-pijltjes. - + Width: Breedte: - + The width of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. De breedte van de opgenomen rechthoek. Hint: Je kan deze waarde ook aanpassen met het scrollwiel of de omhoog/omlaag-pijltjes. - + Height: Hoogte: - + The height of the recorded rectangle. Hint: You can also change this value with the scroll wheel or the up/down arrows. De hoogte van de opgenomen rechthoek. Hint: Je kan deze waarde ook aanpassen met het scrollwiel of de omhoog/omlaag-pijltjes. - + Frame rate: Beelden per seconde: - + The number of frames per second in the final video. Higher frame rates use more CPU time. Het aantal beelden per seconde in de uiteindelijke video. Hogere frame rates gebruiken meer CPU-tijd. - + Scale video Schaal video - + Enable or disable scaling. Scaling uses more CPU time, but if the scaled video is smaller, it could make the encoding faster. Schakel schalen in of uit. Schalen gebruikt meer CPU-tijd, maar als de geschaalde video kleiner is, zou dit het encoderen sneller kunnen maken. - + Scaled width: Geschaalde breedte: - + Scaled height: Geschaalde hoogte: - + Record cursor Neem de cursor op - + Audio input Audio input - + Record audio Neem audio op - + Backend: Backend: - + The ALSA device that will be used for recording. Normally this should be 'default'. You can change this to something like plughw:0,0 (which means sound card 0 input 0 with plugins enabled). Don't translate 'default' and 'plughw' @@ -329,7 +349,7 @@ You can change this to something like plughw:0,0 (which means sound card 0 input Je kan dit veranderen naar iets zoals plughw:0,0 (dit betekent geluidskaard 0 input 0 met plugins ingeschakeld). - + The PulseAudio source that will be used for recording. A 'monitor' is a source that records the audio played by other applications. Don't translate 'monitor' unless PulseAudio does this as well @@ -337,64 +357,64 @@ A 'monitor' is a source that records the audio played by other applica Een 'monitor' is een bron die de audio opneemt die wordt afgespeeld door andere applicaties. - + All screens: %1x%2 This appears in the screen selection combobox Alle schermen: %1x%2 - + Screen %1: %2x%3 at %4,%5 This appears in the screen selection combobox Scherm %1: %2x%3 op %4,%5 - + Screen %1 This appears in the screen labels Scherm %1 - + You did not enter a command to start the OpenGL application that you want to record. Click the 'OpenGL settings' button and enter a command. Je hebt geen commando ingegeven om de OpenGL-applicatie die je wil opnemen te starten. Klik op de 'OpenGL instellingen' knop en geef een commando in. - + The audio backend that will be used for recording. The ALSA backend will also work on systems that use PulseAudio, but it is better to use the PulseAudio backend directly. De audio-backend die gebruikt zal worden om op te nemen. De ALSA-backend zal ook werken op systemen die PulseAudio gebruiken, maar het is beter om de PulseAudio-backend rechtstreeks te gebruiken. - + Device: Apparaat: - + Source: Bron: - + Refresh Vernieuwen - + Refreshes the list of PulseAudio sources. Vernieuwt de lijst met PulseAudio-bronnen. - + Back Terug - + Continue Verder @@ -832,120 +852,120 @@ Are you sure that you want to quit? Weet je zeker dat je het programma wilt sluiten? - + Starting output ... Output starten ... - + Started output. Output gestart. - + Stopping output ... Output stoppen ... - + Stopped output. Output gestopt. - + Starting input ... Input starten ... - + Started input. Input gestart. - + Stopping input ... Input stoppen ... - + Stopped input. Input gestopt. - + Starting page ... Pagina starten ... - + Error: Something went wrong during GLInject initialization. Fout: Er ging iets fout tijdens de GLInject initialisatie. - + Started page. Pagina gestart. - + Stopping page ... Pagina stoppen ... - + Stopped page. Pagina gestopt. - + Error: Could not get the size of the OpenGL application because GLInject has not been started. Fout: Kan de grootte van de OpenGL-applicatie niet krijgen omdat GLInject niet gestart is. - + Error: Could not get the size of the OpenGL application. Either the application wasn't started correctly, or the application hasn't created an OpenGL window yet. If you want to start recording before starting the application, you have to enable scaling and enter the video size manually. Fout: Kon de grootte van de OpenGL-applicatie niet krijgen. Ofwel is de applicatie niet correct gestart, ofwel heeft de applicatie nog geen OpenGL-venster gemaakt. Als je wil beginnen met opnemen voordat de applicatie is gestart, dan moet je schalen inschakelen en manueel de videogrootte instellen. - - + + Error: Something went wrong during initialization. Fout: Er ging iets fout tijdens de initialisatie. - + Error: Could not create a GLInject input because GLInject has not been started. Fout: Kan geen GLInject input maken omdat GLInject niet gestart is. - - + + Pause recording Opname pauzeren - - + + Start recording Opname starten - + Stop preview Voorbeeld stoppen - + Start preview Voorbeeld starten - + Are you sure that you want to cancel this recording? Weet je zeker dat je deze opname wilt annuleren? - + You haven't recorded anything, there is nothing to save. The start button is at the top ;). @@ -1073,7 +1093,7 @@ De startknop staat bovenaan ;). - + Stopping input thread ... Stop input thread ... @@ -1116,7 +1136,7 @@ De startknop staat bovenaan ;). - + Input thread started. Input thread gestart. @@ -1134,7 +1154,7 @@ De startknop staat bovenaan ;). - + Input thread stopped. Input thread gestopt. @@ -1142,7 +1162,7 @@ De startknop staat bovenaan ;). - + Exception '%1' in input thread. Exceptie '%1' in input thread. @@ -1150,7 +1170,7 @@ De startknop staat bovenaan ;). - + Unknown exception in input thread. Onbekende exceptie in input thread. @@ -1170,22 +1190,22 @@ De startknop staat bovenaan ;). Fout: De afbeelding past niet in het geheugen! - + Error: Can't get frame shared memory! Fout: Kan geen frame gedeeld geheugen krijgen! - + Error: Can't attach to frame shared memory! Fout: Kan niet vastmaken aan frame gedeeld geheugen! - + Full command Volledig commando - + Error: Can't run command! Fout: Kan commando niet uitvoeren! @@ -1266,80 +1286,80 @@ Het is mogelijk dat je systeem geen PulseAudio gebruikt. Probeer om de ALSA-back Waarschuwing: Stream werd verplaatst naar een andere bron. - + Error: Unsupported X11 image pixel format! Fout: X11-afbeeldingspixelformaat wordt niet ondersteund! - + Error: Can't open X display! Don't translate 'display' Fout: Kan X display niet openen! - + Using X11 shared memory. Gebruik X11 gedeeld geheugen. - + Error: Can't create shared image! Fout: Kan geen gedeelde afbeelding maken! - - + + Error: Can't get shared memory! Fout: Kan geen gedeeld geheugen krijgen! - - + + Error: Can't attach to shared memory! Fout: Kan niet vastmaken aan gedeeld geheugen! - + Not using X11 shared memory. Gebruik geen X11 gedeeld geheugen. - + Error: Width or height is zero! Fout: Breedte of hoogte is nul! - + Error: Width or height is too large, the maximum width and height is %1! Fout: Breedte of hoogte is te groot, de maximum breedte en hoogte is %1! - + Warning: XFixes is not supported by server, the cursor has been hidden. Don't translate 'XFixes' Waarschuwing: XFixes wordt niet ondersteund door de server, de cursor is verborgen. - + Error: Invalid screen bounding box! Fout: Ongeldige schermrechthoek! - + Error: Can't attach server to shared memory! Fout: Kan server niet vastmaken aan gedeeld geheugen! - + Error: Can't get image (using shared memory)! Usually this means the recording area is not completely inside the screen. Or did you change the screen resolution? Fout: Kan geen afbeelding krijgen (met gedeeld geheugen)! Meestal betekent dit dat het opgenomen gebied niet volledig binnen het scherm is. Of heb je de schermresolutie veranderd? - + Error: Can't get image (not using shared memory)! Usually this means the recording area is not completely inside the screen. Or did you change the screen resolution? Fout: Kan geen afbeelding krijgen (zonder gedeeld geheugen)!