summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk-recordmydesktop/m4/Makefile.am7
-rw-r--r--gtk-recordmydesktop/m4/as-ac-expand.m443
-rw-r--r--gtk-recordmydesktop/m4/as-python.m4218
-rw-r--r--gtk-recordmydesktop/m4/as-version.m459
-rw-r--r--gtk-recordmydesktop/m4/common.mk28
-rwxr-xr-xgtk-recordmydesktop/m4/py-compile-destdir153
-rw-r--r--gtk-recordmydesktop/m4/pychecker.mk43
-rw-r--r--gtk-recordmydesktop/m4/python.mk11
-rw-r--r--gtk-recordmydesktop/po/ChangeLog15
-rw-r--r--gtk-recordmydesktop/po/LINGUAS1
-rw-r--r--gtk-recordmydesktop/po/Makefile.in.in221
-rw-r--r--gtk-recordmydesktop/po/Makevars41
-rw-r--r--gtk-recordmydesktop/po/POTFILES.in6
-rw-r--r--gtk-recordmydesktop/po/el.po220
-rw-r--r--gtk-recordmydesktop/po/messages.pot189
-rw-r--r--gtk-recordmydesktop/src/Makefile.am27
-rw-r--r--gtk-recordmydesktop/src/__init__.py4
-rwxr-xr-xgtk-recordmydesktop/src/gtk-recordMyDesktop43
-rw-r--r--gtk-recordmydesktop/src/gtk-recordmydesktop.desktop10
-rw-r--r--gtk-recordmydesktop/src/gtk-recordmydesktop.pngbin0 -> 3183 bytes
-rw-r--r--gtk-recordmydesktop/src/rmdConfig.py.in4
-rw-r--r--gtk-recordmydesktop/src/rmdPrefsWidget.py284
-rw-r--r--gtk-recordmydesktop/src/rmdSelect.py139
-rwxr-xr-xgtk-recordmydesktop/src/rmdSelectThumb.py217
-rw-r--r--gtk-recordmydesktop/src/rmdSimple.py286
-rw-r--r--gtk-recordmydesktop/src/rmdTrayIcon.py276
-rw-r--r--gtk-recordmydesktop/src/rmdTrayPopup.py102
27 files changed, 2647 insertions, 0 deletions
diff --git a/gtk-recordmydesktop/m4/Makefile.am b/gtk-recordmydesktop/m4/Makefile.am
new file mode 100644
index 0000000..213bdde
--- /dev/null
+++ b/gtk-recordmydesktop/m4/Makefile.am
@@ -0,0 +1,7 @@
+EXTRA_DIST = as-python.m4 \
+ as-version.m4 \
+ as-ac-expand.m4 \
+ py-compile-destdir \
+ common.mk \
+ python.mk \
+ pychecker.mk
diff --git a/gtk-recordmydesktop/m4/as-ac-expand.m4 b/gtk-recordmydesktop/m4/as-ac-expand.m4
new file mode 100644
index 0000000..7bd0a61
--- /dev/null
+++ b/gtk-recordmydesktop/m4/as-ac-expand.m4
@@ -0,0 +1,43 @@
+dnl as-ac-expand.m4 0.1.0
+dnl autostars m4 macro for expanding directories using configure's prefix
+dnl thomas@apestaart.org
+
+dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR)
+dnl example
+dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir)
+dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local
+
+AC_DEFUN([AS_AC_EXPAND],
+[
+ EXP_VAR=[$1]
+ FROM_VAR=[$2]
+
+ dnl first expand prefix and exec_prefix if necessary
+ prefix_save=$prefix
+ exec_prefix_save=$exec_prefix
+
+ dnl if no prefix given, then use /usr/local, the default prefix
+ if test "x$prefix" = "xNONE"; then
+ prefix=/usr/local
+ fi
+ dnl if no exec_prefix given, then use prefix
+ if test "x$exec_prefix" = "xNONE"; then
+ exec_prefix=$prefix
+ fi
+
+ full_var="$FROM_VAR"
+ dnl loop until it doesn't change anymore
+ while true; do
+ new_full_var="`eval echo $full_var`"
+ if test "x$new_full_var"="x$full_var"; then break; fi
+ full_var=$new_full_var
+ done
+
+ dnl clean up
+ full_var=$new_full_var
+ AC_SUBST([$1], "$full_var")
+
+ dnl restore prefix and exec_prefix
+ prefix=$prefix_save
+ exec_prefix=$exec_prefix_save
+])
diff --git a/gtk-recordmydesktop/m4/as-python.m4 b/gtk-recordmydesktop/m4/as-python.m4
new file mode 100644
index 0000000..7f1bec5
--- /dev/null
+++ b/gtk-recordmydesktop/m4/as-python.m4
@@ -0,0 +1,218 @@
+dnl as-python.m4 0.1.0
+dnl autostars m4 macro for python checks
+
+dnl From Andrew Dalke
+dnl Updated by James Henstridge
+dnl Updated by Andy Wingo to loop through possible pythons
+dnl Updated by Thomas Vander Stichele to check for presence of packages/modules
+
+dnl $Id: as-python.m4,v 1.1 2006-09-25 07:45:20 iovar Exp $
+
+# AS_PATH_PYTHON([MINIMUM-VERSION])
+
+# Adds support for distributing Python modules and packages. To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable. To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+
+# If the MINIMUM-VERSION argument is passed, AS_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement. MINIMUM-VERSION should consist of
+# numbers and dots only.
+
+# Updated to loop over all possible python binaries by Andy Wingo
+# <wingo@pobox.com>
+
+AC_DEFUN([AS_PATH_PYTHON],
+ [
+ dnl Find a version of Python. I could check for python versions 1.4
+ dnl or earlier, but the default installation locations changed from
+ dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages
+ dnl in 1.5, and I don't want to maintain that logic.
+
+ dnl should we do the version check?
+ ifelse([$1],[],
+ [AC_PATH_PROG(PYTHON, python python2.1 python2.0 python1.6 python1.5)],
+ [
+ AC_MSG_NOTICE(Looking for Python version >= $1)
+ changequote(<<, >>)dnl
+ prog="
+import sys, string
+minver = '$1'
+pyver = string.split(sys.version)[0] # first word is version string
+# split strings by '.'. just compare textually to allow for versions like
+# 2.4.1a0
+minver = string.split(minver, '.')
+pyver = string.split(pyver, '.')
+# we can now do comparisons on the two lists:
+if pyver >= minver:
+ sys.exit(0)
+else:
+ sys.exit(1)"
+ changequote([, ])dnl
+
+ python_good=false
+ for python_candidate in python python2.2 python2.1 python2.0 python2 python1.6 python1.5; do
+ unset PYTHON
+ AC_PATH_PROG(PYTHON, $python_candidate) 1> /dev/null 2> /dev/null
+
+ if test "x$PYTHON" = "x"; then continue; fi
+
+ if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then
+ AC_MSG_CHECKING(["$PYTHON":])
+ AC_MSG_RESULT([okay])
+ python_good=true
+ break;
+ else
+ dnl clear the cache val
+ unset ac_cv_path_PYTHON
+ fi
+ done
+ ])
+
+ if test "$python_good" != "true"; then
+ AC_MSG_ERROR([No suitable version of python found])
+ fi
+
+ AC_MSG_CHECKING([local Python configuration])
+
+ dnl Query Python for its version number. Getting [:3] seems to be
+ dnl the best way to do this; it's what "site.py" does in the standard
+ dnl library. Need to change quote character because of [:3]
+
+ AC_SUBST(PYTHON_VERSION)
+ changequote(<<, >>)dnl
+ PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"`
+ changequote([, ])dnl
+
+
+ dnl Use the values of $prefix and $exec_prefix for the corresponding
+ dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made
+ dnl distinct variables so they can be overridden if need be. However,
+ dnl general consensus is that you shouldn't need this ability.
+
+ AC_SUBST(PYTHON_PREFIX)
+ PYTHON_PREFIX='${prefix}'
+
+ AC_SUBST(PYTHON_EXEC_PREFIX)
+ PYTHON_EXEC_PREFIX='${exec_prefix}'
+
+ dnl At times (like when building shared libraries) you may want
+ dnl to know which OS platform Python thinks this is.
+
+ AC_SUBST(PYTHON_PLATFORM)
+ PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"`
+
+
+ dnl Set up 4 directories:
+
+ dnl pythondir -- where to install python scripts. This is the
+ dnl site-packages directory, not the python standard library
+ dnl directory like in previous automake betas. This behaviour
+ dnl is more consistent with lispdir.m4 for example.
+ dnl
+ dnl Also, if the package prefix isn't the same as python's prefix,
+ dnl then the old $(pythondir) was pretty useless.
+
+ AC_SUBST(pythondir)
+ pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages
+
+ dnl pkgpythondir -- $PACKAGE directory under pythondir. Was
+ dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
+ dnl more consistent with the rest of automake.
+ dnl Maybe this should be put in python.am?
+
+ AC_SUBST(pkgpythondir)
+ pkgpythondir=\${pythondir}/$PACKAGE
+
+ dnl pyexecdir -- directory for installing python extension modules
+ dnl (shared libraries) Was PYTHON_SITE_EXEC in previous betas.
+
+ AC_SUBST(pyexecdir)
+ pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages
+
+ dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+ dnl Maybe this should be put in python.am?
+
+ AC_SUBST(pkgpyexecdir)
+ pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+ AC_MSG_RESULT([looks good])
+])
+
+dnl AS_PYTHON_IMPORT(PACKAGE/MODULE, [ACTION-IF-FOUND, [ACTION-IF-NOT-FOUND, [PREAMBLE, [POSTAMBLE]]]])
+dnl Try to import the given PACKAGE/MODULE
+
+AC_DEFUN([AS_PYTHON_IMPORT],
+[
+ dnl Check if we can import a given module.
+ dnl Requires AS_PATH_PYTHON to be called before.
+
+ AC_MSG_CHECKING([for python module $1])
+
+ prog="
+import sys
+
+try:
+ $4
+ import $1
+ $5
+ sys.exit(0)
+except ImportError:
+ sys.exit(1)
+except SystemExit:
+ raise
+except Exception, e:
+ print ' Error while trying to import $1:'
+ print ' %r: %s' % (e, e)
+ sys.exit(1)"
+
+if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
+then
+ AC_MSG_RESULT(found)
+ ifelse([$2], , :, [$2])
+else
+ AC_MSG_RESULT(not found)
+ ifelse([$3], , :, [$3])
+fi
+])
+
+dnl a macro to check for ability to create python extensions
+dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
+dnl function also defines PYTHON_INCLUDES
+AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
+ [
+ AC_REQUIRE([AM_PATH_PYTHON])
+ AC_MSG_CHECKING(for headers required to compile python extensions)
+
+ dnl deduce PYTHON_INCLUDES
+ py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+ py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+ PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+
+ if test "$py_prefix" != "$py_exec_prefix"; then
+ PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+ fi
+ AC_SUBST(PYTHON_INCLUDES)
+
+ dnl check if the headers exist:
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+AC_TRY_CPP([#include <Python.h>],dnl
+[AC_MSG_RESULT(found)
+$1],dnl
+[AC_MSG_RESULT(not found)
+$2])
+CPPFLAGS="$save_CPPFLAGS"
+])
diff --git a/gtk-recordmydesktop/m4/as-version.m4 b/gtk-recordmydesktop/m4/as-version.m4
new file mode 100644
index 0000000..343f408
--- /dev/null
+++ b/gtk-recordmydesktop/m4/as-version.m4
@@ -0,0 +1,59 @@
+dnl version.m4 0.0.6
+dnl autostars m4 macro for versioning
+dnl thomas@apestaart.org
+dnl
+dnl AS_VERSION(PACKAGE, PREFIX, MAJOR, MINOR, MICRO, NANO, ACTION_IF_NO_NANO, ACTION_IF_NANO)
+dnl example
+dnl AS_VERSION(gstreamer, GST_VERSION, 0, 3, 2,)
+dnl for a 0.3.2 release version
+dnl
+dnl this macro
+dnl - defines [$PREFIX]_MAJOR, MINOR and MICRO
+dnl - if NANO is empty, then we're in release mode, else in cvs/dev mode
+dnl - defines [$PREFIX], VERSION, and [$PREFIX]_RELEASE
+dnl - executes the relevant action
+dnl - AC_SUBST's PACKAGE, VERSION, [$PREFIX] and [$PREFIX]_RELEASE
+dnl as well as the little ones
+dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents
+dnl maintainer mode from running ok
+dnl
+dnl don't forget to put #undef [$2] and [$2]_RELEASE in acconfig.h
+
+AC_DEFUN([AS_VERSION],
+[
+ PACKAGE=[$1]
+ [$2]_MAJOR=[$3]
+ [$2]_MINOR=[$4]
+ [$2]_MICRO=[$5]
+ NANO=[$6]
+ [$2]_NANO=$NANO
+ if test "x$NANO" = "x" || test "x$NANO" = "x0";
+ then
+ AC_MSG_NOTICE(configuring [$1] for release)
+ VERSION=[$3].[$4].[$5]
+ [$2]_RELEASE=1
+ dnl execute action
+ ifelse([$7], , :, [$7])
+ else
+ AC_MSG_NOTICE(configuring [$1] for development with nano $NANO)
+ VERSION=[$3].[$4].[$5].$NANO
+ [$2]_RELEASE=0.`date +%Y%m%d.%H%M%S`
+ dnl execute action
+ ifelse([$8], , :, [$8])
+ fi
+
+ [$2]=$VERSION
+ AC_DEFINE_UNQUOTED([$2], "$[$2]", [Define the version])
+ AC_SUBST([$2])
+ AC_DEFINE_UNQUOTED([$2]_RELEASE, "$[$2]_RELEASE", [Define the release version])
+ AC_SUBST([$2]_RELEASE)
+
+ AC_SUBST([$2]_MAJOR)
+ AC_SUBST([$2]_MINOR)
+ AC_SUBST([$2]_MICRO)
+ AC_SUBST([$2]_NANO)
+ AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Define the package name])
+ AC_SUBST(PACKAGE)
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Define the version])
+ AC_SUBST(VERSION)
+])
diff --git a/gtk-recordmydesktop/m4/common.mk b/gtk-recordmydesktop/m4/common.mk
new file mode 100644
index 0000000..e6b86a1
--- /dev/null
+++ b/gtk-recordmydesktop/m4/common.mk
@@ -0,0 +1,28 @@
+clean-local:
+ @rm -rf _trial_temp
+
+test:
+ @make check -C flumotion/test
+
+check-docs:
+ @make check -C doc/reference
+
+coverage:
+ @trial --coverage coverage -R flumotion.test
+ @$(PYTHON) common/show-coverage.py _trial_temp/coverage/flumotion.*
+
+fixme:
+ tools/fixme | less -R
+
+release: dist
+ make $(PACKAGE)-$(VERSION).tar.bz2.md5
+
+# generate md5 sum files
+%.md5: %
+ md5sum $< > $@
+
+# generate a sloc count
+sloc:
+ sloccount flumotion | grep "(SLOC)" | cut -d = -f 2
+
+.PHONY: test
diff --git a/gtk-recordmydesktop/m4/py-compile-destdir b/gtk-recordmydesktop/m4/py-compile-destdir
new file mode 100755
index 0000000..e85695e
--- /dev/null
+++ b/gtk-recordmydesktop/m4/py-compile-destdir
@@ -0,0 +1,153 @@
+#!/bin/sh
+# py-compile - Compile a Python program
+
+# modified by thomasvs to have DESTDIR support so rpm packages have correct
+# compiled-in paths
+
+scriptversion=2004-01-12.23
+
+# Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if [ -z "$PYTHON" ]; then
+ PYTHON=python
+fi
+
+basedir=
+
+#echo "THOMAS: args: $*"
+loop=true
+while test "x$loop" = "xtrue"
+do
+ case "$1" in
+ --basedir)
+ basedir=$2
+ if test -z "$basedir"; then
+ echo "$0: Missing argument to --basedir." 1>&2
+ exit 1
+ fi
+ shift 2
+ ;;
+ --destdir)
+ destdir=$2
+ if test -z "$destdir"; then
+ echo "$0: Missing argument to --destdir." 1>&2
+ exit 1
+ fi
+ shift 2
+ ;;
+ -h|--h*)
+ cat <<\EOF
+Usage: py-compile [--help] [--version] [--basedir DIR] FILES..."
+
+Byte compile some python scripts FILES. This should be performed
+after they have been moved to the final installation location
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit 0
+ ;;
+ -v|--v*)
+ echo "py-compile $scriptversion"
+ exit 0
+ ;;
+ *)
+ loop=false
+ ;;
+ esac
+done
+
+if [ $# = 0 ]; then
+ echo "$0: No files given. Try \`$0 --help' for more information." 1>&2
+ exit 1
+fi
+
+# if basedir was given, then it should be prepended to filenames before
+# byte compilation.
+if [ -z "$basedir" ]; then
+ trans=" path = file"
+else
+ trans=" path = os.path.join('$basedir', file)"
+fi
+
+# if destdir was given, then it should be stripped from path when storing
+# the intended file name
+if [ -z "$destdir" ]; then
+ transdfile=" dfile = path"
+else
+ transdfile="
+ if path.startswith('$destdir'):
+ dfile = path.split('$destdir')[1]
+ else:
+ dfile = path
+ "
+fi
+#echo "THOMAS: args after parse: $*"
+#echo THOMAS: transdfile: $transdfile
+
+$PYTHON -c "
+import sys, os, string, py_compile
+
+files = '''$*'''
+# print 'THOMAS: files: %s' % files
+print 'Byte-compiling python modules...'
+for file in string.split(files):
+$trans
+ # print 'THOMAS: looking at file %s for path %s' % (file, path)
+$transdfile
+ # print 'THOMAS: dfile: %s' % dfile
+ if not os.path.exists(path) or not (len(path) >= 3 and path[-3:] == '.py'):
+ continue
+ print file,
+ sys.stdout.flush()
+ # print 'THOMAS: compiling path %s' % path
+ py_compile.compile(path, dfile=dfile)
+print" || exit $?
+
+# this will fail for python < 1.5, but that doesn't matter ...
+$PYTHON -O -c "
+import sys, os, string, py_compile
+
+files = '''$*'''
+print 'Byte-compiling python modules (optimized versions) ...'
+for file in string.split(files):
+$trans
+$transdfile
+ if not os.path.exists(path) or not (len(path) >= 3 and path[-3:] == '.py'):
+ continue
+ print file,
+ sys.stdout.flush()
+ py_compile.compile(path, dfile=dfile)
+print" 2>/dev/null || :
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/gtk-recordmydesktop/m4/pychecker.mk b/gtk-recordmydesktop/m4/pychecker.mk
new file mode 100644
index 0000000..1e1f72a
--- /dev/null
+++ b/gtk-recordmydesktop/m4/pychecker.mk
@@ -0,0 +1,43 @@
+# include this snippet for the pychecker stuff
+# Makefile.am needs to define
+# PYCHECKER_WHITELIST
+# and
+# PYCHECKER_BLACKLIST
+
+# we redirect stderr so we don't get messages like
+# warning: couldn't find real module for class SSL.Error (module name: SSL)
+# which can't be turned off in pychecker
+pycheckersplit:
+ @echo running pychecker on each file ...
+ @for file in $(filter-out $(PYCHECKER_BLACKLIST),$(wildcard $(PYCHECKER_WHITELIST))); \
+ do \
+ PYTHONPATH=`pwd` \
+ pychecker -Q -F misc/pycheckerrc \
+ `ls $(top_srcdir)/misc/setup.py 2> /dev/null` \
+ `ls $(top_srcdir)/misc/pycheckerhelp.py 2> /dev/null` \
+ $$file \
+ > /dev/null 2>&1; \
+ if test $$? -ne 0; then \
+ echo "Error on $$file"; \
+ pychecker -Q -F misc/pycheckerrc \
+ `ls $(top_srcdir)/misc/setup.py 2> /dev/null` \
+ `ls $(top_srcdir)/misc/pycheckerhelp.py 2> /dev/null` \
+ $$file; break; fi; \
+ done
+
+pychecker:
+ @echo running pychecker ...
+ @PYTHONPATH=`pwd` \
+ pychecker -Q -F misc/pycheckerrc \
+ `ls $(top_srcdir)/misc/setup.py 2> /dev/null` \
+ `ls $(top_srcdir)/misc/pycheckerhelp.py 2> /dev/null` \
+ $(filter-out $(PYCHECKER_BLACKLIST),$(wildcard $(PYCHECKER_WHITELIST)))\
+ 2> /dev/null || make pycheckerverbose
+
+pycheckerverbose:
+ @echo running pychecker ...
+ PYTHONPATH=`pwd` \
+ pychecker -F misc/pycheckerrc \
+ `ls $(top_srcdir)/misc/setup.py 2> /dev/null` \
+ `ls $(top_srcdir)/misc/pycheckerhelp.py 2> /dev/null` \
+ $(filter-out $(PYCHECKER_BLACKLIST),$(wildcard $(PYCHECKER_WHITELIST)))
diff --git a/gtk-recordmydesktop/m4/python.mk b/gtk-recordmydesktop/m4/python.mk
new file mode 100644
index 0000000..244df22
--- /dev/null
+++ b/gtk-recordmydesktop/m4/python.mk
@@ -0,0 +1,11 @@
+py_compile = $(top_srcdir)/m4/py-compile-destdir --destdir $(DESTDIR)
+
+#if HAVE_PYCHECKER
+#check-local: $(PYCHECKER_FILES)
+# if test ! -z "$(PYCHECKER_FILES)"; \
+# then \
+# PYTHONPATH=$(top_srcdir):$(top_builddir) \
+# pychecker -Q -F $(top_srcdir)/misc/pycheckerrc \
+# $(PYCHECKER_FILES); \
+# fi
+#endif
diff --git a/gtk-recordmydesktop/po/ChangeLog b/gtk-recordmydesktop/po/ChangeLog
new file mode 100644
index 0000000..da54a01
--- /dev/null
+++ b/gtk-recordmydesktop/po/ChangeLog
@@ -0,0 +1,15 @@
+2006-09-24 gettextize <bug-gnu-gettext@gnu.org>
+
+ * POTFILES.in: New file.
+
+2006-09-24 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.in.in: New file, from gettext-0.14.5.
+ * boldquot.sed: New file, from gettext-0.14.5.
+ * en@boldquot.header: New file, from gettext-0.14.5.
+ * en@quot.header: New file, from gettext-0.14.5.
+ * insert-header.sin: New file, from gettext-0.14.5.
+ * quot.sed: New file, from gettext-0.14.5.
+ * remove-potcdate.sin: New file, from gettext-0.14.5.
+ * Rules-quot: New file, from gettext-0.14.5.
+
diff --git a/gtk-recordmydesktop/po/LINGUAS b/gtk-recordmydesktop/po/LINGUAS
new file mode 100644
index 0000000..a6f316f
--- /dev/null
+++ b/gtk-recordmydesktop/po/LINGUAS
@@ -0,0 +1 @@
+el
diff --git a/gtk-recordmydesktop/po/Makefile.in.in b/gtk-recordmydesktop/po/Makefile.in.in
new file mode 100644
index 0000000..d2d4e4c
--- /dev/null
+++ b/gtk-recordmydesktop/po/Makefile.in.in
@@ -0,0 +1,221 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+#
+# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
+# instead of PACKAGE and to look for po2tbl in ./ not in intl/
+#
+# - Modified by jacob berkman <jacob@ximian.com> to install
+# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
+#
+# - Modified by Rodney Dawes <dobey@novell.com> for use with intltool
+#
+# We have the following line for use by intltoolize:
+# INTLTOOL_MAKEFILE
+
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+datarootdir = @datarootdir@
+libdir = @libdir@
+DATADIRNAME = @DATADIRNAME@
+itlocaledir = $(prefix)/$(DATADIRNAME)/locale
+subdir = po
+install_sh = @install_sh@
+# Automake >= 1.8 provides @mkdir_p@.
+# Until it can be supposed, use the safe fallback:
+mkdir_p = $(install_sh) -d
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
+GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
+
+ALL_LINGUAS = @ALL_LINGUAS@
+
+PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; fi)
+
+POFILES=$(shell if test -n "$(PO_LINGUAS)"; then LINGUAS="$(PO_LINGUAS)"; else LINGUAS="$(ALL_LINGUAS)"; fi; for lang in $$LINGUAS; do printf "$$lang.po "; done)
+
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(POFILES)
+EXTRA_DISTFILES = POTFILES.skip Makevars LINGUAS
+
+POTFILES = \
+#This Gets Replace for some reason
+
+CATALOGS=$(shell if test -n "$(PO_LINGUAS)"; then LINGUAS="$(PO_LINGUAS)"; else LINGUAS="$(ALL_LINGUAS)"; fi; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
+
+.SUFFIXES:
+.SUFFIXES: .po .pox .gmo .mo .msg .cat
+
+.po.pox:
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && gencat $@ $*.msg
+
+
+all: all-@USE_NLS@
+
+all-yes: $(CATALOGS)
+all-no:
+
+$(GETTEXT_PACKAGE).pot: $(POTFILES)
+ $(GENPOT)
+
+install: install-data
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ $(mkdir_p) $(DESTDIR)$(itlocaledir)
+ if test -n "$(PO_LINGUAS)"; then \
+ linguas="$(PO_LINGUAS)"; \
+ else \
+ linguas="$(ALL_LINGUAS)"; \
+ fi; \
+ for lang in $$linguas; do \
+ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $$dir; \
+ if test -r $$lang.gmo; then \
+ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
+ echo "installing $(srcdir)/$$lang.gmo as" \
+ "$$dir/$(GETTEXT_PACKAGE).mo"; \
+ fi; \
+ if test -r $$lang.gmo.m; then \
+ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
+ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
+ else \
+ if test -r $(srcdir)/$$lang.gmo.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
+ $$dir/$(GETTEXT_PACKAGE).mo.m; \
+ echo "installing $(srcdir)/$$lang.gmo.m as" \
+ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+
+# Empty stubs to satisfy archaic automake needs
+dvi info tags TAGS ID:
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ if test -n "$(PO_LINGUAS)"; then \
+ linguas="$(PO_LINGUAS)"; \
+ else \
+ linguas="$(ALL_LINGUAS)"; \
+ fi; \
+ for lang in $$linguas; do \
+ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
+ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
+ done
+
+check: all $(GETTEXT_PACKAGE).pot
+
+mostlyclean:
+ rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
+ rm -f .intltool-merge-cache
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES stamp-it
+ rm -f *.mo *.msg *.cat *.cat.m *.gmo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f Makefile.in.in
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ extra_dists="$(EXTRA_DISTFILES)"; \
+ for file in $$extra_dists; do \
+ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
+ done; \
+ for file in $$dists; do \
+ test -f $$file || file="$(srcdir)/$$file"; \
+ ln $$file $(distdir) 2> /dev/null \
+ || cp -p $$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(GETTEXT_PACKAGE).pot
+ tmpdir=`pwd`; \
+ if test -n "$(PO_LINGUAS)"; then \
+ linguas="$(PO_LINGUAS)"; \
+ else \
+ linguas="$(ALL_LINGUAS)"; \
+ fi; \
+ for lang in $$linguas; do \
+ echo "$$lang:"; \
+ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
+ if $$result; then \
+ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.gmo failed!"; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi; \
+ done
+
+Makefile POTFILES: stamp-it
+ @if test ! -f $@; then \
+ rm -f stamp-it; \
+ $(MAKE) stamp-it; \
+ fi
+
+stamp-it: Makefile.in.in ../config.status POTFILES.in
+ cd .. \
+ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gtk-recordmydesktop/po/Makevars b/gtk-recordmydesktop/po/Makevars
new file mode 100644
index 0000000..32692ab
--- /dev/null
+++ b/gtk-recordmydesktop/po/Makevars
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
+# package. (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.) Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright. The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used. It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/gtk-recordmydesktop/po/POTFILES.in b/gtk-recordmydesktop/po/POTFILES.in
new file mode 100644
index 0000000..067cd01
--- /dev/null
+++ b/gtk-recordmydesktop/po/POTFILES.in
@@ -0,0 +1,6 @@
+# List of source files which contain translatable strings.
+
+
+src/rmdSimple.py
+src/rmdPrefsWidget.py
+src/rmdTrayPopup.py \ No newline at end of file
diff --git a/gtk-recordmydesktop/po/el.po b/gtk-recordmydesktop/po/el.po
new file mode 100644
index 0000000..42dc5af
--- /dev/null
+++ b/gtk-recordmydesktop/po/el.po
@@ -0,0 +1,220 @@
+# translation of el.po to
+# translation of messages.po to
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# John Varouhakis <johnvarouhakis@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: el\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-24 12:29+0300\n"
+"PO-Revision-Date: 2006-09-25 00:39+0300\n"
+"Last-Translator: John Varouhakis <johnvarouhakis@gmail.com>\n"
+"Language-Team: <el@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: src/rmdSimple.py:45 src/rmdPrefsWidget.py:40
+msgid "Video Quality"
+msgstr "Ποιότητα Εικόνας"
+
+#: src/rmdSimple.py:45 src/rmdPrefsWidget.py:40
+msgid "Sound Quality"
+msgstr "Ποιότητα Ήχου"
+
+#: src/rmdSimple.py:46 src/rmdPrefsWidget.py:45
+msgid "Advanced"
+msgstr "Για Προχωρημένους"
+
+#: src/rmdSimple.py:46
+msgid "Select Window"
+msgstr "Επιλογή Παραθύρου"
+
+#: src/rmdSimple.py:47
+msgid "Click here to select a window to record"
+msgstr ""
+"Κάνετε κλικ εδώ για να "
+"επιλέξετε ένα παράθυρο "
+"για εγγραφή"
+
+#: src/rmdSimple.py:48
+msgid ""
+"Click to start the recording.\n"
+"This window will hide itself."
+msgstr ""
+"Κάνετε κλικ εδώ για "
+"να αρχίσει η εγγραφή. "
+"Αυτό το παράθυρο θα "
+"κρυφτεί."
+
+#: src/rmdSimple.py:49
+msgid ""
+"Click to choose a filename and location.\n"
+"Default is out.ogg in your home folder.\n"
+"EXISTING FILES WILL BE OVER-WRITTEN WITHOUT WARNING!"
+msgstr ""
+"Κάνετε κλικ εδώ για να "
+"επιλέξετε όνομα αρχείου και "
+"τοποθεσία. Η προεπιλογή είναι "
+"out.ogg στον αρχικό φάκελο του χρήστη. "
+"ΥΠΑΡΧΟΝΤΑ ΑΡΧΕΙΑ ΘΑ ΔΙΑΓΡΑΦΟΥΝ "
+"ΧΩΡΙΣ ΠΡΟΕΙΔΟΠΟΙΗΣΗ! "
+
+#: src/rmdSimple.py:50
+msgid "Click to exit the program."
+msgstr ""
+"Κάνετε κλικ για να τερματίσετε "
+"την εφαρμογή. "
+
+#: src/rmdSimple.py:51
+msgid ""
+"Select the video quality of your recording.\n"
+"(Lower quality will require more proccessing power.)"
+msgstr ""
+"Επιλέξετε την ποιότητα της εικόνας. "
+"(Χαμηλότερη ποιότητα θα χρειαστεί "
+"μεγαλύτερη επεξεργαστική ισχύ) "
+
+#: src/rmdSimple.py:52
+msgid "Enable/Disable sound recording."
+msgstr "Ενεργοποίηση/Απενεργοποίηση Ήχου"
+
+#: src/rmdSimple.py:53
+msgid "Select the audio quality of your recording."
+msgstr "Επιλέξετε την ποιότητα του ήχου."
+
+#: src/rmdSimple.py:54
+msgid "Click here to access more options."
+msgstr ""
+"Κάνετε κλικ εδώ για να φανερωθούν "
+"περισσότερες επιλογές."
+
+#: src/rmdSimple.py:55
+msgid ""
+"\n"
+"Left click and drag, on the preview image,\n"
+"to select an area for recording.\n"
+"Right click on it, to reset the area."
+msgstr ""
+"\n"
+"Πατήστε το αριστερό πλήκτρο και \n"
+"σύρετε το ποντίκι στην προεσκόπηση,\n"
+"για να επιλέξετε περιοχή εγγραφής.\n"
+"Κάνετε δεξί κλικ για να επαναφέρετε "
+"την προεπιλογή."
+
+#: src/rmdPrefsWidget.py:39
+msgid "Frames Per Second"
+msgstr "Στιγμιότυπα ανά δευτερολεπτο. "
+
+#: src/rmdPrefsWidget.py:39 src/rmdTrayPopup.py:74
+msgid " "
+msgstr " "
+
+#: src/rmdPrefsWidget.py:39
+msgid "Startup Delay(secs)"
+msgstr "Καθυστέρυση έναρξης"
+
+#: src/rmdPrefsWidget.py:40
+msgid "Channels"
+msgstr "Κανάλια"
+
+#: src/rmdPrefsWidget.py:40
+msgid "Frequency"
+msgstr "Συχνότητα"
+
+#: src/rmdPrefsWidget.py:40
+msgid "Device"
+msgstr "Συσκευή"
+
+#: src/rmdPrefsWidget.py:41
+msgid "Display"
+msgstr "Display"
+
+#: src/rmdPrefsWidget.py:41
+msgid "Mouse Cursor"
+msgstr "Δείκτης ποντικιού"
+
+#: src/rmdPrefsWidget.py:41
+msgid "Full shots at every frame"
+msgstr "Πλήρεις λήψεις σε κάθε στιγμιότυπο"
+
+#: src/rmdPrefsWidget.py:41
+msgid "MIT-Shm extension"
+msgstr "Επέκταση MIT-Shm"
+
+#: src/rmdPrefsWidget.py:42
+msgid "Drop Frames(encoder)"
+msgstr "Αποβολή στιγμιοτύπων (κωδικοποιητής)"
+
+#: src/rmdPrefsWidget.py:42
+msgid "Shared Threshold"
+msgstr "Κατώφλι χρήσης κοινής μνήμης"
+
+#: src/rmdPrefsWidget.py:42
+msgid "Quick Subsampling"
+msgstr "Γρήγορη υποδειγματοληψία "
+
+#: src/rmdPrefsWidget.py:43
+msgid "Normal"
+msgstr "Κανονικό"
+
+#: src/rmdPrefsWidget.py:43
+msgid "White"
+msgstr "Λευκό"
+
+#: src/rmdPrefsWidget.py:43
+msgid "Black"
+msgstr "Μαύρο"
+
+#: src/rmdPrefsWidget.py:43
+msgid "None"
+msgstr "Κανένα"
+
+#: src/rmdPrefsWidget.py:44
+msgid "Enabled"
+msgstr "Ενεργό"
+
+#: src/rmdPrefsWidget.py:44
+msgid "Disabled"
+msgstr "Ανενεργό"
+
+#: src/rmdPrefsWidget.py:45
+msgid "Basic"
+msgstr "Απλό"
+
+#: src/rmdPrefsWidget.py:45
+msgid "Sound"
+msgstr "Ήχος"
+
+#: src/rmdTrayPopup.py:67
+msgid "gtk-recordMyDesktop"
+msgstr "gtk-recordMyDesktop"
+
+#: src/rmdTrayPopup.py:69
+msgid "a graphical frontend for recordMyDesktop"
+msgstr "Ένα γραφικό περιβάλλον για το recordMyDesktop"
+
+#: src/rmdTrayPopup.py:70
+msgid ""
+"Copyright (C) John Varouhakis\n"
+"Portions Copyright (C) 2005-6 Zaheer Abbas Merali, John N. Laliberte\n"
+"Portions Copyright (C) Fluendo S.L."
+msgstr ""
+"Πνευματικά Δικαιώματα (C) Γιάννης Βαρουχάκης\n"
+"Πνευματικά Δικαιώματα ορισμένων τμημάτων (C) 2005-6 Zaheer Abbas Merali, John N. Laliberte\n"
+"Πνευματικά Δικαιώματα ορισμένων τμημάτων (C) Fluendo S.L."
+
+#: src/rmdTrayPopup.py:75
+msgid "Translator Credits And Information(Replace with your info)"
+msgstr ""
+"Γιάννης Βαρουχάκης "
+"\t<johnvarouhakis@gmail.com>"
+
+#: src/rmdTrayPopup.py:79
+msgid "_Select Area On Screen"
+msgstr "_Επιλογή Περιοχής στην οθόνη"
+
diff --git a/gtk-recordmydesktop/po/messages.pot b/gtk-recordmydesktop/po/messages.pot
new file mode 100644
index 0000000..f2d04ff
--- /dev/null
+++ b/gtk-recordmydesktop/po/messages.pot
@@ -0,0 +1,189 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-24 12:29+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/rmdSimple.py:45 src/rmdPrefsWidget.py:40
+msgid "Video Quality"
+msgstr ""
+
+#: src/rmdSimple.py:45 src/rmdPrefsWidget.py:40
+msgid "Sound Quality"
+msgstr ""
+
+#: src/rmdSimple.py:46 src/rmdPrefsWidget.py:45
+msgid "Advanced"
+msgstr ""
+
+#: src/rmdSimple.py:46
+msgid "Select Window"
+msgstr ""
+
+#: src/rmdSimple.py:47
+msgid "Click here to select a window to record"
+msgstr ""
+
+#: src/rmdSimple.py:48
+msgid ""
+"Click to start the recording.\n"
+"This window will hide itself."
+msgstr ""
+
+#: src/rmdSimple.py:49
+msgid ""
+"Click to choose a filename and location.\n"
+"Default is out.ogg in your home folder.\n"
+"EXISTING FILES WILL BE OVER-WRITTEN WITHOUT WARNING!"
+msgstr ""
+
+#: src/rmdSimple.py:50
+msgid "Click to exit the program."
+msgstr ""
+
+#: src/rmdSimple.py:51
+msgid ""
+"Select the video quality of your recording.\n"
+"(Lower quality will require more proccessing power.)"
+msgstr ""
+
+#: src/rmdSimple.py:52
+msgid "Enable/Disable sound recording."
+msgstr ""
+
+#: src/rmdSimple.py:53
+msgid "Select the audio quality of your recording."
+msgstr ""
+
+#: src/rmdSimple.py:54
+msgid "Click here to access more options."
+msgstr ""
+
+#: src/rmdSimple.py:55
+msgid ""
+"\n"
+"Left click and drag, on the preview image,\n"
+"to select an area for recording.\n"
+"Right click on it, to reset the area."
+msgstr ""
+
+#: src/rmdPrefsWidget.py:39
+msgid "Frames Per Second"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:39 src/rmdTrayPopup.py:74
+msgid " "
+msgstr ""
+
+#: src/rmdPrefsWidget.py:39
+msgid "Startup Delay(secs)"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:40
+msgid "Channels"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:40
+msgid "Frequency"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:40
+msgid "Device"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:41
+msgid "Display"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:41
+msgid "Mouse Cursor"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:41
+msgid "Full shots at every frame"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:41
+msgid "MIT-Shm extension"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:42
+msgid "Drop Frames(encoder)"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:42
+msgid "Shared Threshold"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:42
+msgid "Quick Subsampling"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:43
+msgid "Normal"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:43
+msgid "White"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:43
+msgid "Black"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:43
+msgid "None"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:44
+msgid "Enabled"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:44
+msgid "Disabled"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:45
+msgid "Basic"
+msgstr ""
+
+#: src/rmdPrefsWidget.py:45
+msgid "Sound"
+msgstr ""
+
+#: src/rmdTrayPopup.py:67
+msgid "gtk-recordMyDesktop"
+msgstr ""
+
+#: src/rmdTrayPopup.py:69
+msgid "a graphical frontend for recordMyDesktop"
+msgstr ""
+
+#: src/rmdTrayPopup.py:70
+msgid ""
+"Copyright (C) John Varouhakis\n"
+"Portions Copyright (C) 2005-6 Zaheer Abbas Merali, John N. Laliberte\n"
+"Portions Copyright (C) Fluendo S.L."
+msgstr ""
+
+
+#: src/rmdTrayPopup.py:75
+msgid "Translator Credits And Information(Replace with your info)"
+msgstr ""
+
+
+#: src/rmdTrayPopup.py:79
+msgid "_Select Area On Screen"
+msgstr ""
diff --git a/gtk-recordmydesktop/src/Makefile.am b/gtk-recordmydesktop/src/Makefile.am
new file mode 100644
index 0000000..82d981e
--- /dev/null
+++ b/gtk-recordmydesktop/src/Makefile.am
@@ -0,0 +1,27 @@
+include $(top_srcdir)/m4/python.mk
+
+bin_SCRIPTS=gtk-recordMyDesktop
+
+gtk_recordMyDesktopdir=$(pythondir)/recordMyDesktop
+
+gtk_recordMyDesktop_PYTHON = \
+ rmdSelect.py\
+ rmdTrayIcon.py\
+ rmdSelectThumb.py\
+ rmdTrayPopup.py\
+ rmdPrefsWidget.py\
+ rmdSimple.py\
+ rmdConfig.py\
+ __init__.py
+
+desktopdir = $(datadir)/applications
+
+desktop_DATA =gtk-recordmydesktop.desktop
+
+pixmapdir = $(datadir)/pixmaps
+pixmap_DATA = gtk-recordmydesktop.png
+
+EXTRA_DIST=gtk-recordMyDesktop gtk-recordmydesktop.desktop gtk-recordmydesktop.png
+
+clean-local:
+ rm -rf *.pyc *.pyo
diff --git a/gtk-recordmydesktop/src/__init__.py b/gtk-recordmydesktop/src/__init__.py
new file mode 100644
index 0000000..7262f15
--- /dev/null
+++ b/gtk-recordmydesktop/src/__init__.py
@@ -0,0 +1,4 @@
+#
+#
+#
+
diff --git a/gtk-recordmydesktop/src/gtk-recordMyDesktop b/gtk-recordmydesktop/src/gtk-recordMyDesktop
new file mode 100755
index 0000000..6982e53
--- /dev/null
+++ b/gtk-recordmydesktop/src/gtk-recordMyDesktop
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+
+#/*********************************************************************************
+#* gtk-recordMyDesktop *
+#**********************************************************************************
+#* *
+#* Copyright (C) 2006 John Varouhakis *
+#* *
+#* *
+#* This program is free software; you can redistribute it and/or modify *
+#* it under the terms of the GNU General Public License as published by *
+#* the Free Software Foundation; either version 2 of the License, or *
+#* (at your option) any later version. *
+#* *
+#* This program is distributed in the hope that it will be useful, *
+#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+#* GNU General Public License for more details. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, write to the Free Software *
+#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+#* *
+#* *
+#* *
+#* For further information contact me at johnvarouhakis@gmail.com *
+#**********************************************************************************/
+
+from recordMyDesktop import rmdSimple
+
+def main():
+ tr=rmdSimple.simpleWidget()
+
+
+main()
+
+
+
+
+
+
+
diff --git a/gtk-recordmydesktop/src/gtk-recordmydesktop.desktop b/gtk-recordmydesktop/src/gtk-recordmydesktop.desktop
new file mode 100644
index 0000000..3d6a4a7
--- /dev/null
+++ b/gtk-recordmydesktop/src/gtk-recordmydesktop.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=gtk-recordMyDesktop
+Comment=Frontend for recordMyDesktop
+Exec=gtk-recordMyDesktop
+Terminal=false
+Type=Application
+Icon=gtk-recordmydesktop.png
+Categories=GNOME;KDE;Application;AudioVideo;
+StartupNotify=false
diff --git a/gtk-recordmydesktop/src/gtk-recordmydesktop.png b/gtk-recordmydesktop/src/gtk-recordmydesktop.png
new file mode 100644
index 0000000..bc50b04
--- /dev/null
+++ b/gtk-recordmydesktop/src/gtk-recordmydesktop.png
Binary files differ
diff --git a/gtk-recordmydesktop/src/rmdConfig.py.in b/gtk-recordmydesktop/src/rmdConfig.py.in
new file mode 100644
index 0000000..cec0381
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdConfig.py.in
@@ -0,0 +1,4 @@
+import os
+
+locale_install_dir=os.path.join('@DATADIR@', 'locale')
+
diff --git a/gtk-recordmydesktop/src/rmdPrefsWidget.py b/gtk-recordmydesktop/src/rmdPrefsWidget.py
new file mode 100644
index 0000000..2e8a553
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdPrefsWidget.py
@@ -0,0 +1,284 @@
+#/*********************************************************************************
+#* gtk-recordMyDesktop *
+#**********************************************************************************
+#* *
+#* Copyright (C) 2006 John Varouhakis *
+#* *
+#* *
+#* This program is free software; you can redistribute it and/or modify *
+#* it under the terms of the GNU General Public License as published by *
+#* the Free Software Foundation; either version 2 of the License, or *
+#* (at your option) any later version. *
+#* *
+#* This program is distributed in the hope that it will be useful, *
+#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+#* GNU General Public License for more details. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, write to the Free Software *
+#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+#* *
+#* *
+#* *
+#* For further information contact me at johnvarouhakis@gmail.com *
+#**********************************************************************************/
+
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import locale, gettext
+import rmdConfig
+_ = gettext.gettext
+gettext.textdomain('gtk-recordMyDesktop')
+gettext.bindtextdomain('gtk-recordMyDesktop',rmdConfig.locale_install_dir)
+import os
+
+
+
+
+class prefsWidget(object):
+ labelStrings=[_('Frames Per Second'),_(' '),_('Startup Delay(secs)'),
+ _('Channels'),_('Frequency'),_('Device'),_('Video Quality'),_('Sound Quality'),
+ _('Display'),_('Mouse Cursor'),_('Full shots at every frame'),_('MIT-Shm extension'),
+ _('Drop Frames(encoder)'),_('Shared Threshold'),_('Quick Subsampling')]
+ mouseStrings=[_('Normal'),_('White'),_('Black'),_('None')]
+ stateStrings=[_('Enabled'),_('Disabled')]
+ tabStrings=[_('Basic'),_('Sound'),_('Advanced')]
+
+ def destroy(self,Event=None):
+ self.values[0]=self.fpsSpinButton.get_value_as_int()
+ self.values[1]=self.mouseComboBox.get_active()
+ #self.values[2]=self.soundComboBox.get_active()
+ self.values[3]=self.fullComboBox.get_active()
+ #self.values[4]=self.pathEntry.get_text()
+ #self.values[5]=self.are
+ self.values[6]=self.delaySpinButton.get_value_as_int()
+ self.values[7]=self.channelsSpinButton.get_value_as_int()
+ self.values[8]=self.freqSpinButton.get_value_as_int()
+ self.values[9]=self.deviceEntry.get_text().replace(' ','')
+ #self.values[10]=self.vidqSpinButton.get_value_as_int()
+ #self.values[11]=self.soundqSpinButton.get_value_as_int()
+ self.values[12]=self.displayEntry.get_text().replace(' ','')
+ self.values[13]=self.sharedComboBox.get_active()
+ self.values[14]=self.frdropComboBox.get_active()
+ self.values[15]=self.thresSpinButton.get_value_as_int()
+ self.values[16]=self.quickComboBox.get_active()
+
+ self.window.destroy()
+ self.optionsOpen[0]=0
+
+ def __exit__(self,Event=None):
+ gtk.main_quit()
+ self.values[0]=-1
+ self.optionsOpen[0]=0
+ self.window.destroy()
+
+
+
+ def __subWidgets__(self):
+ self.labels={}
+ self.boxes={}
+ self.labelbox={}
+ #self.labelbox[0]=gtk.VBox(homogeneous=False, spacing=20)
+ for i in range(3):
+ self.labelbox[i]=gtk.VBox(homogeneous=False, spacing=20)
+ self.notebook = gtk.Notebook()
+
+#basic page
+ self.fpsAdjustment=gtk.Adjustment(value=self.values[0], lower=1, upper=50, step_incr=1, page_incr=5, page_size=0)
+ self.fpsSpinButton= gtk.SpinButton(self.fpsAdjustment, climb_rate=0.5, digits=0)
+
+
+ #self.soundComboBox = gtk.combo_box_new_text()
+ #for i in range(2):
+ #self.soundComboBox.append_text(self.stateStrings[i])
+ #self.soundComboBox.set_active(self.values[2])
+
+ self.delayAdjustment=gtk.Adjustment(value=self.values[6], lower=0,upper=10000, step_incr=1, page_incr=5, page_size=0)
+ self.delaySpinButton= gtk.SpinButton(self.delayAdjustment, climb_rate=0.5, digits=0)
+
+ #self.pathEntry= gtk.Entry(max=0)
+ #self.pathEntry.set_text(self.values[4])
+ #self.pathButton = gtk.Button(None,gtk.STOCK_SAVE_AS)
+
+ self.okButton=gtk.Button(None,gtk.STOCK_CLOSE)
+
+ for i in xrange(0,3,2):
+ self.labels[i]=gtk.Label(self.labelStrings[i])
+ self.labels[i].set_justify(gtk.JUSTIFY_LEFT)
+ self.boxes[i]=gtk.HBox(homogeneous=False, spacing=0)
+ self.boxes[i].pack_start(self.labels[i],expand=False,fill=False)
+ self.labels[i].show()
+ self.labelbox[0].pack_start(self.boxes[i],expand=False,fill=False)
+
+ self.boxes[3]=gtk.HBox(homogeneous=False, spacing=20)
+ self.labelbox[0].pack_start(self.boxes[3],expand=False,fill=False)
+ placeholder2=gtk.Label("\n\n\n\n\n\n")
+ placeholder2.show()
+ self.labelbox[0].pack_start(placeholder2,True,True)
+ self.boxes[4]=gtk.HBox(homogeneous=False, spacing=0)
+ self.labelbox[0].pack_end(self.boxes[4])
+
+ self.fpsSpinButton.show()
+ self.boxes[0].pack_end(self.fpsSpinButton,expand=False,fill=False)
+ #self.soundComboBox.show()
+ #self.boxes[1].pack_end(self.soundComboBox,expand=False,fill=False)
+ self.delaySpinButton.show()
+ self.boxes[2].pack_end(self.delaySpinButton,expand=False,fill=False)
+ #self.pathEntry.show()
+ #self.boxes[3].pack_start(self.pathEntry,expand=False,fill=False)
+ #self.pathButton.show()
+ #self.boxes[3].pack_end(self.pathButton,expand=False,fill=False)
+ self.okButton.show()
+ self.boxes[4].pack_end(self.okButton,expand=False,fill=False)
+ for i in range(5):
+ if i!=1:
+ self.boxes[i].show()
+#sound page
+ for i in xrange(3,6):
+ self.labels[i]=gtk.Label(self.labelStrings[i])
+ self.labels[i].set_justify(gtk.JUSTIFY_LEFT)
+ self.boxes[i+5]=gtk.HBox(homogeneous=False, spacing=0)
+ self.boxes[i+5].pack_start(self.labels[i],expand=False,fill=False)
+ self.labels[i].show()
+ #self.boxes[i+5].show()
+ self.labelbox[1].pack_start(self.boxes[i+5],expand=False,fill=False)
+ self.channelsAdjustment=gtk.Adjustment(value=self.values[7], lower=1,upper=2, step_incr=1, page_incr=1, page_size=1)
+ self.channelsSpinButton= gtk.SpinButton(self.channelsAdjustment, climb_rate=0.5, digits=0)
+ self.boxes[8].pack_end(self.channelsSpinButton,expand=False,fill=False)
+ self.channelsSpinButton.show()
+ self.boxes[8].show()
+
+ self.freqAdjustment=gtk.Adjustment(value=self.values[8], lower=0,upper=44100, step_incr=1, page_incr=100, page_size=0)
+ self.freqSpinButton= gtk.SpinButton(self.freqAdjustment, climb_rate=0.5, digits=0)
+ self.boxes[9].pack_end(self.freqSpinButton,expand=False,fill=False)
+ self.freqSpinButton.show()
+ self.boxes[9].show()
+
+ self.deviceEntry= gtk.Entry(max=0)
+ self.deviceEntry.set_text(self.values[9])
+ self.boxes[10].pack_end(self.deviceEntry,expand=False,fill=False)
+ self.deviceEntry.show()
+ self.boxes[10].show()
+
+
+#encoding page
+ #for i in xrange(6,8):
+ #self.labels[i]=gtk.Label(self.labelStrings[i])
+ #self.labels[i].set_justify(gtk.JUSTIFY_LEFT)
+ #self.boxes[i+5]=gtk.HBox(homogeneous=False, spacing=0)
+ #self.boxes[i+5].pack_start(self.labels[i],expand=False,fill=False)
+ #self.labels[i].show()
+ ##self.boxes[i+5].show()
+ #self.labelbox[2].pack_start(self.boxes[i+5],expand=False,fill=False)
+ #self.vidqAdjustment=gtk.Adjustment(value=self.values[10], lower=0,upper=63, step_incr=1, page_incr=1, page_size=1)
+ #self.vidqSpinButton= gtk.SpinButton(self.vidqAdjustment, climb_rate=0.5, digits=0)
+ #self.boxes[11].pack_end(self.vidqSpinButton,expand=False,fill=False)
+ #self.vidqSpinButton.show()
+ #self.boxes[11].show()
+ #self.soundqAdjustment=gtk.Adjustment(value=self.values[11], lower=-1,upper=10, step_incr=1, page_incr=1, page_size=1)
+ #self.soundqSpinButton= gtk.SpinButton(self.soundqAdjustment, climb_rate=0.5, digits=0)
+ #self.boxes[12].pack_end(self.soundqSpinButton,expand=False,fill=False)
+ #self.soundqSpinButton.show()
+ #self.boxes[12].show()
+
+#misc page
+ for i in xrange(8,15):
+ self.labels[i]=gtk.Label(self.labelStrings[i])
+ self.labels[i].set_justify(gtk.JUSTIFY_LEFT)
+ self.boxes[i+5]=gtk.HBox(homogeneous=False, spacing=0)
+ self.boxes[i+5].pack_start(self.labels[i],expand=False,fill=False)
+ self.labels[i].show()
+ #self.boxes[i+5].show()
+ self.labelbox[2].pack_start(self.boxes[i+5],expand=False,fill=False)
+ self.displayEntry= gtk.Entry(max=0)
+ self.displayEntry.set_text(self.values[12])
+ self.boxes[13].pack_end(self.displayEntry,expand=False,fill=False)
+ self.displayEntry.show()
+ self.boxes[13].show()
+
+ self.mouseComboBox = gtk.combo_box_new_text()
+ for i in range(4):
+ self.mouseComboBox.append_text(self.mouseStrings[i])
+ self.mouseComboBox.set_active(self.values[1])
+ self.boxes[14].pack_end(self.mouseComboBox,expand=False,fill=False)
+ self.mouseComboBox.show()
+ self.boxes[14].show()
+
+ self.fullComboBox = gtk.combo_box_new_text()
+ for i in range(2):
+ self.fullComboBox.append_text(self.stateStrings[i])
+ self.fullComboBox.set_active(self.values[3])
+ self.boxes[15].pack_end(self.fullComboBox,expand=False,fill=False)
+ self.fullComboBox.show()
+ self.boxes[15].show()
+
+ self.sharedComboBox = gtk.combo_box_new_text()
+ for i in range(2):
+ self.sharedComboBox.append_text(self.stateStrings[i])
+ self.sharedComboBox.set_active(self.values[13])
+ self.boxes[16].pack_end(self.sharedComboBox,expand=False,fill=False)
+ self.sharedComboBox.show()
+ self.boxes[16].show()
+
+
+ self.frdropComboBox = gtk.combo_box_new_text()
+ for i in range(2):
+ self.frdropComboBox.append_text(self.stateStrings[i])
+ self.frdropComboBox.set_active(self.values[14])
+ self.boxes[17].pack_end(self.frdropComboBox,expand=False,fill=False)
+ self.frdropComboBox.show()
+ self.boxes[17].show()
+
+ self.thresAdjustment=gtk.Adjustment(value=self.values[15], lower=0,upper=100, step_incr=1, page_incr=5, page_size=1)
+ self.thresSpinButton= gtk.SpinButton(self.thresAdjustment, climb_rate=0.5, digits=0)
+ self.boxes[18].pack_end(self.thresSpinButton,expand=False,fill=False)
+ self.thresSpinButton.show()
+ self.boxes[18].show()
+
+ self.quickComboBox = gtk.combo_box_new_text()
+ for i in range(2):
+ self.quickComboBox.append_text(self.stateStrings[i])
+ self.quickComboBox.set_active(self.values[16])
+ self.boxes[19].pack_end(self.quickComboBox,expand=False,fill=False)
+ self.quickComboBox.show()
+ self.boxes[19].show()
+
+#append and show
+ for i in range(3):
+ self.notebook.append_page(self.labelbox[i],gtk.Label(self.tabStrings[i]))
+ self.window.add(self.notebook)
+ for i in range(3):
+ self.labelbox[i].show()
+ self.notebook.show()
+
+ def __makeCons__(self):
+ #self.pathButton.connect("clicked",self.__fileSelect__)
+ self.okButton.connect("clicked",self.destroy)
+
+ def __init__(self,values,optionsOpen):
+ self.values=values
+ self.optionsOpen=optionsOpen
+ self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ self.window.connect("destroy", self.destroy)
+ self.window.set_border_width(10)
+ self.window.set_title("recordMyDesktop")
+ self.__subWidgets__()
+ self.__makeCons__()
+
+
+ self.window.set_size_request(350,-1)
+ self.window.show()
+
+ def main(self):
+ gtk.main()
+
+
+
+
+
+
+
+
diff --git a/gtk-recordmydesktop/src/rmdSelect.py b/gtk-recordmydesktop/src/rmdSelect.py
new file mode 100644
index 0000000..cf03403
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdSelect.py
@@ -0,0 +1,139 @@
+# -*- Mode: Python -*-
+# vi:si:et:sw=4:sts=4:ts=4
+#
+# Istanbul - a desktop session recorder
+# Copyright (C) 2005 Zaheer Abbas Merali (zaheerabbas at merali dot org)
+# All rights reserved.
+
+# This file may be distributed and/or modified under the terms of
+# the GNU General Public License version 2 as published by
+# the Free Software Foundation.
+# This file is distributed without any warranty; without even the implied
+# warranty of merchantability or fitness for a particular purpose.
+# See "LICENSE.GPL" in the source distribution for more information.
+
+# Headers in this file shall remain intact.
+
+#This file has been modified to be used in gtk-recordMyDesktop
+#by John Varouhakis
+#area_return list has been added to retrieve the values
+#original file name is select.py in Istanbul-0.2.1
+import gtk
+import gtk.gdk
+
+class GtkAreaSelector(gtk.Window):
+ def __init__(self,area_return):
+ self.area_return=area_return
+ gtk.Window.__init__(self)
+ self.set_app_paintable(True)
+ self.fullscreen()
+ self.connect("expose-event", self.expose_cb)
+ self.connect("button-press-event", self.button_press_cb)
+ self.connect("button-release-event", self.button_release_cb)
+ self.connect("motion-notify-event", self.motion_notify_cb)
+ self.connect("delete-event", self.delete_cb)
+ self.connect("realize", self.realize_cb)
+ root = gtk.gdk.get_default_root_window()
+ (width, height) = root.get_size()
+ self.root = root.get_image(0, 0, width, height)
+ self.x1 = self.y1 = -1
+ self.x2 = self.y2 = 0
+ self.show_all()
+
+ def realize_cb(self, widget):
+ gdkwindow = self.window
+ gdkwindow.set_events(gdkwindow.get_events() |
+ gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |
+ gtk.gdk.POINTER_MOTION_MASK);
+ cursor = gtk.gdk.Cursor(gtk.gdk.CROSSHAIR)
+ gdkwindow.set_cursor(cursor)
+ gdkwindow.set_back_pixmap(None, False)
+
+ def expose_cb(self, widget, event):
+ dashes = [ 1.0, 2.0 ]
+ cr = self.window.cairo_create()
+ cr.rectangle(event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.clip()
+ self.window.draw_image(self.style.black_gc, self.root, event.area.x,
+ event.area.y, event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.set_line_width(1.0)
+ cr.set_source_rgba (1.0, 0.0, 0.0, 1.0)
+ cr.set_dash (dashes, 0.0)
+ cr.move_to (self.x1 - 0.5, 0.0)
+ cr.line_to (self.x1 - 0.5, event.area.y + event.area.height)
+ cr.move_to (0.0, self.y1 - 0.5)
+ cr.line_to (event.area.x + event.area.width, self.y1 - 0.5)
+ cr.stroke ()
+
+ if self.x1 >= 0:
+ x = min(self.x1, self.x2)
+ y = min(self.y1, self.y2)
+ w = max(self.x1, self.x2) - x
+ h = max(self.y1, self.y2) - y
+ cr.set_dash ([], 0.0)
+ cr.rectangle ( x, y, w, h)
+ cr.fill()
+ cr.set_source_rgba (0.0, 0.0, 0.5, 0.5)
+ cr.rectangle (x + 0.5, y + 0.5, w - 1, h - 1)
+ cr.stroke()
+
+ return False
+
+ def motion_notify_cb(self, widget, event):
+ self.queue_draw()
+
+ if self.x1 >= 0:
+ rect = gtk.gdk.Rectangle()
+ rect.x = min(self.x1, min(self.x2, event.x + 1))
+ rect.width = max(self.x1, max(self.x2, event.x + 1)) - rect.x
+ rect.y = min(self.y1, min(self.y2, event.y + 1))
+ rect.height = max(self.y1, max(self.y2, event.y + 1)) - rect.y
+ self.queue_draw_area(rect.x, rect.y, rect.width, rect.height)
+
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+
+ return True
+
+ def button_release_cb(self, widget, event):
+ if event.button == 1 and self.x1 >= 0:
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+ # stop
+ self.area_return[0]=min(int(self.x1),int(self.x2))
+ self.area_return[1]=min(int(self.y1),int(self.y2))
+ self.area_return[2]=max(int(self.x1),int(self.x2))
+ self.area_return[3]=max(int(self.y1),int(self.y2))
+ self.hide()
+ self.destroy()
+
+ return True
+
+ def button_press_cb(self, widget, event):
+ if event.button != 1:
+ self.x1 = self.y1 = -1
+ # stop
+ #print "(%d, %d) - (%d, %d)" % (self.x1, self.y1, self.x2, self.y2)
+ #self.area_return[0]=self.x1
+ #self.area_return[1]=self.y1
+ #self.area_return[2]=self.x2
+ #self.area_return[3]=self.y2
+ #print self.area_return
+ self.destroy()
+ return True
+ self.x1 = event.x
+ self.y1 = event.y
+ self.queue_draw()
+ return True
+
+ def delete_cb(self, widget,Event=None):
+ pass
+
+if __name__ == "__main__":
+ w = GtkAreaSelector()
+ w.show()
+ gtk.main()
+
+
diff --git a/gtk-recordmydesktop/src/rmdSelectThumb.py b/gtk-recordmydesktop/src/rmdSelectThumb.py
new file mode 100755
index 0000000..6130b26
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdSelectThumb.py
@@ -0,0 +1,217 @@
+# -*- Mode: Python -*-
+# vi:si:et:sw=4:sts=4:ts=4
+#
+# Istanbul - a desktop session recorder
+# Copyright (C) 2005 Zaheer Abbas Merali (zaheerabbas at merali dot org)
+# All rights reserved.
+
+# This file may be distributed and/or modified under the terms of
+# the GNU General Public License version 2 as published by
+# the Free Software Foundation.
+# This file is distributed without any warranty; without even the implied
+# warranty of merchantability or fitness for a particular purpose.
+# See "LICENSE.GPL" in the source distribution for more information.
+
+# Headers in this file shall remain intact.
+
+#This file has been modified to be used in gtk-recordMyDesktop
+#by John Varouhakis
+
+#Base class is DrawingArea instead of Window to allow insertion.
+#new methods:
+# update_image to keep the screenshot current.
+# __subsample__ to scale the screenshot
+# __draw_lines__ to highlight the selected area.
+#Calls to destroy have been removed, since this widget is meant to
+#live for an indefinite amount of time.
+#Click behavior has been changed. Selection now happens by left-click and dragging,
+#while right click resets the selection.
+
+
+#original file name is select.py in Istanbul-0.2.1
+
+
+import gtk
+import gtk.gdk
+#from rmdSelect import *
+import gobject
+import gc
+
+class GtkThumbSelector(gtk.DrawingArea):
+ def __init__(self,area_return,hidden,update_interval=2000):
+ self.hidden=hidden
+ self.area_return=area_return
+ self.selecting=0
+ gtk.DrawingArea.__init__(self)
+ self.set_app_paintable(True)
+ #self.fullscreen()
+ self.connect("expose-event", self.expose_cb)
+ self.connect("button-press-event", self.button_press_cb)
+ self.connect("button-release-event", self.button_release_cb)
+ self.connect("motion-notify-event", self.motion_notify_cb)
+ #self.connect("delete-event", self.delete_cb)
+ self.connect("realize", self.realize_cb)
+ #root = gtk.gdk.get_default_root_window()
+ self.wroot = gtk.gdk.get_default_root_window()
+ (self.wwidth, self.wheight) = self.wroot.get_size()
+ ###############################################################
+
+ self.factor=1;
+ twidth=self.wwidth
+ while twidth>320 or self.factor<4:
+ twidth/=2
+ self.factor*=2
+ self.root=gtk.gdk.Image(gtk.gdk.IMAGE_NORMAL,self.wroot.get_visual(),self.wwidth/self.factor,self.wheight/self.factor)
+ #(width, height) = root.get_size()
+ sroot = self.wroot.get_image(0, 0, self.wwidth, self.wheight)
+ self.__subsample__(sroot,self.wwidth,self.wheight,self.root,self.factor)
+ #self.root = root.get_image(0, 0, width, height)
+ self.x1 = self.y1 = -1
+ self.x2 = self.y2 = -1
+ self.set_size_request(self.wwidth/self.factor,self.wheight/self.factor)
+ self.timed_id=gobject.timeout_add(update_interval,self.update_image)
+
+ def __subsample__(self,im1,w,h,im2,stride,x=0,y=0):
+ for i in xrange(y,h,stride):
+ for k in xrange(x,w,stride):
+ im2.put_pixel(k/stride,i/stride,im1.get_pixel(k,i))
+ def button_release_cb(self, widget, event):
+ if event.button == 1 and self.x1 >= 0 and widget==self:
+ self.selecting=0
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+ # stop
+ if self.x1 <0: self.x1=0
+ if self.x2 <0: self.x2=0
+ if self.y1 <0: self.y1=0
+ if self.y2 <0: self.y2=0
+ if self.x1 >self.wwidth/self.factor: self.x1=self.wwidth/self.factor
+ if self.x2 >self.wwidth/self.factor: self.x2=self.wwidth/self.factor
+ if self.y1 >self.wheight/self.factor: self.y1=self.wheight/self.factor
+ if self.y2 >self.wheight/self.factor: self.y2=self.wheight/self.factor
+
+
+ self.area_return[0]=min(int(self.x1),int(self.x2))*self.factor
+ self.area_return[1]=min(int(self.y1),int(self.y2))*self.factor
+ self.area_return[2]=max(int(self.x1),int(self.x2))*self.factor
+ self.area_return[3]=max(int(self.y1),int(self.y2))*self.factor
+ self.x1=self.y1=self.x2=self.y2=-1
+ #print self.area_return
+ self.update_image()
+
+ def button_press_cb(self, widget, event):
+ if widget==self:
+ if event.button == 1:
+ self.selecting=1
+ self.update_image()
+ self.x1 = event.x
+ self.y1 = event.y
+ else:
+ self.x1 = self.y1=self.x2=self.y2=-1
+ self.area_return[0]=self.area_return[1]=0
+ self.area_return[2]=self.wwidth
+ self.area_return[3]=self.wheight
+ self.update_image()
+
+ def realize_cb(self, widget):
+ if widget == self:
+ gdkwindow = self.window
+ gdkwindow.set_events(gdkwindow.get_events() |
+ gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |
+ gtk.gdk.POINTER_MOTION_MASK);
+ cursor = gtk.gdk.Cursor(gtk.gdk.CROSSHAIR)
+ gdkwindow.set_cursor(cursor)
+ gdkwindow.set_back_pixmap(None, False)
+
+ def expose_cb(self, widget, event):
+ if widget==self:
+ dashes = [ 1.0, 2.0 ]
+ cr = self.window.cairo_create()
+ cr.rectangle(event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.clip()
+ self.window.draw_image(self.style.black_gc, self.root, event.area.x,
+ event.area.y, event.area.x, event.area.y, event.area.width,
+ event.area.height)
+ cr.set_line_width(1.0)
+ cr.set_source_rgba (1.0, 0.0, 0.0, 1.0)
+ cr.set_dash (dashes, 0.0)
+ cr.move_to (self.x1 - 0.5, 0.0)
+ cr.line_to (self.x1 - 0.5, event.area.y + event.area.height)
+ cr.move_to (0.0, self.y1 - 0.5)
+ cr.line_to (event.area.x + event.area.width, self.y1 - 0.5)
+ cr.stroke ()
+
+ if self.x1 >= 0:
+ x = min(self.x1, self.x2)
+ y = min(self.y1, self.y2)
+ w = max(self.x1, self.x2) - x
+ h = max(self.y1, self.y2) - y
+ cr.set_dash ([], 0.0)
+ cr.rectangle ( x, y, w, h)
+ cr.fill()
+ cr.set_source_rgba (0.0, 0.0, 0.5, 0.5)
+ cr.rectangle (x + 0.5, y + 0.5, w - 1, h - 1)
+ cr.stroke()
+
+ return False
+
+ def motion_notify_cb(self, widget, event):
+ if widget ==self:
+ self.queue_draw()
+
+ if self.x1 >= 0 :
+ rect = gtk.gdk.Rectangle()
+ rect.x = min(self.x1, min(self.x2, event.x + 1))
+ rect.width = max(self.x1, max(self.x2, event.x + 1)) - rect.x
+ rect.y = min(self.y1, min(self.y2, event.y + 1))
+ rect.height = max(self.y1, max(self.y2, event.y + 1)) - rect.y
+ self.queue_draw_area(rect.x, rect.y, rect.width, rect.height)
+
+ self.x2 = event.x + 1
+ self.y2 = event.y + 1
+
+ return True
+
+ def update_image(self):
+ #self.root.destroy()
+ self.queue_draw()
+ if self.hidden[0]==0 :
+ gc.collect()
+ sroot = self.wroot.get_image(0,0,self.wwidth,self.wheight)
+ self.__subsample__(sroot,self.wwidth,self.wheight,self.root,self.factor)
+ vals=[0,0, self.wwidth, self.wheight]
+ if self.area_return[0]>=0:
+ vals[0]=self.area_return[0]
+ if self.area_return[1]>=0:
+ vals[1]=self.area_return[1]
+ if self.area_return[2]>=0:
+ vals[2]=self.area_return[2]-self.area_return[0]
+ if self.area_return[3]>=0:
+ vals[3]=self.area_return[3]-self.area_return[1]
+ if vals[0] >0 or vals[1] >0 or vals[2] <self.wwidth or vals[3] <self.wheight:
+ if self.selecting==0:
+ self.__draw_lines__(self.root,vals,self.factor)
+ return True
+ def __draw_lines__(self,img,vals,factor):
+ for i in xrange(vals[0]/factor,vals[0]/factor+vals[2]/factor):
+ for k in range(2):
+ img.put_pixel(i,vals[1]/factor+k,0xff0000)
+ img.put_pixel(i,(vals[1]+vals[3]/2-k)/factor,0xff0000)
+ img.put_pixel(i,(vals[1]+vals[3]-1-k)/factor,0xff0000)
+ for i in xrange(vals[1]/factor,vals[1]/factor+vals[3]/factor):
+ for k in range(2):
+ img.put_pixel(vals[0]/factor+k,i,0xff0000)
+ img.put_pixel((vals[0]+vals[2]/2-k)/factor,i,0xff0000)
+ img.put_pixel((vals[0]+vals[2]-1-k)/factor,i,0xff0000)
+
+#area_return=[-1,-1,-1,-1]
+
+#w=GtkThumbSelector(area_return,0)
+#w.show()
+#gtk.main()
+#print area_return
+
+
+
+
diff --git a/gtk-recordmydesktop/src/rmdSimple.py b/gtk-recordmydesktop/src/rmdSimple.py
new file mode 100644
index 0000000..3dcc7db
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdSimple.py
@@ -0,0 +1,286 @@
+#/*********************************************************************************
+#* gtk-recordMyDesktop *
+#**********************************************************************************
+#* *
+#* Copyright (C) 2006 John Varouhakis *
+#* *
+#* *
+#* This program is free software; you can redistribute it and/or modify *
+#* it under the terms of the GNU General Public License as published by *
+#* the Free Software Foundation; either version 2 of the License, or *
+#* (at your option) any later version. *
+#* *
+#* This program is distributed in the hope that it will be useful, *
+#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+#* GNU General Public License for more details. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, write to the Free Software *
+#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+#* *
+#* *
+#* *
+#* For further information contact me at johnvarouhakis@gmail.com *
+#**********************************************************************************/
+
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import locale, gettext
+import rmdConfig
+_ = gettext.gettext
+gettext.textdomain('gtk-recordMyDesktop')
+gettext.bindtextdomain('gtk-recordMyDesktop',rmdConfig.locale_install_dir)
+import os
+from rmdPrefsWidget import *
+from rmdTrayIcon import *
+import gtk.gdk
+import gobject
+import gc
+import re
+import rmdPrefsWidget as pW
+import rmdSelectThumb as sT
+
+class simpleWidget(object):
+ hidden=[0]
+ labelStrings=[_('Video Quality'),_('Sound Quality')]
+ buttonStrings=[_('Advanced'),_('Select Window')]
+ tooltipLabels=[_('Click here to select a window to record'),
+ _('Click to start the recording.\nThis window will hide itself.'),
+ _('Click to choose a filename and location.\nDefault is out.ogg in your home folder.\nEXISTING FILES WILL BE OVER-WRITTEN WITHOUT WARNING!'),
+ _('Click to exit the program.'),
+ _('Select the video quality of your recording.\n(Lower quality will require more proccessing power.)'),
+ _('Enable/Disable sound recording.'),
+ _('Select the audio quality of your recording.'),
+ _('Click here to access more options.')]
+ tipLabelStrings=[_('\nLeft click and drag, on the preview image,\nto select an area for recording.\nRight click on it, to reset the area.')]
+
+ options=None
+ optionsOpen=[0]
+ def __subWidgets__(self):
+ self.labelbox=gtk.VBox(homogeneous=False, spacing=20)
+ #self.labelbox.set_size_request(400,272)
+ self.NBox=gtk.HBox(homogeneous=False, spacing=20)
+ self.NEBox=gtk.VBox(homogeneous=False, spacing=0)
+ self.NEVQBox=gtk.HBox(homogeneous=False, spacing=10)
+ self.NESQBox=gtk.HBox(homogeneous=False, spacing=10)
+ self.NETABox=gtk.VBox(homogeneous=False, spacing=10)
+ self.NWBox=gtk.VBox(homogeneous=False, spacing=0)
+
+
+
+ self.NBox.pack_start(self.NWBox,expand=False,fill=False)
+ self.NBox.pack_start(self.NEBox,expand=True,fill=True)
+ self.NEBox.pack_start(self.NEVQBox,expand=False,fill=False)
+ self.NEBox.pack_start(self.NESQBox,expand=False,fill=False)
+ self.NEBox.pack_start(self.NETABox,expand=False,fill=False)
+
+ self.SBox=gtk.HBox(homogeneous=True, spacing=0)
+ self.SEBox=gtk.HBox(homogeneous=False, spacing=10)
+ self.SWBox=gtk.HBox(homogeneous=False, spacing=10)
+ self.SBox.pack_start(self.SWBox,expand=True,fill=True)
+ self.SBox.pack_start(self.SEBox,expand=True,fill=True)
+
+ self.labelbox.pack_start(self.NBox,expand=False,fill=False)
+ self.labelbox.pack_end(self.SBox,expand=False,fill=False)
+
+ self.wroot = gtk.gdk.get_default_root_window()
+ (self.wwidth, self.wheight) = self.wroot.get_size()
+
+ self.factor=1;
+ twidth=self.wwidth
+ while twidth>320 or self.factor<4:
+ twidth/=2
+ self.factor*=2
+ self.image=sT.GtkThumbSelector(self.values[5],self.hidden,2000)
+ self.image.show()
+
+ self.NWBox.pack_start(self.image,False,False)
+ #quality
+ self.v_adj=gtk.Adjustment(value=(self.values[10]*100)/63, lower=0, upper=100, step_incr=1, page_incr=10, page_size=0)
+ self.v_quality=gtk.HScale(self.v_adj)
+ self.v_quality.set_value_pos(gtk.POS_LEFT)
+ self.v_quality.set_digits(0)
+ self.s_button= gtk.CheckButton(label=None)
+ self.s_adj=gtk.Adjustment(value=(self.values[11]*10), lower=0, upper=100, step_incr=1, page_incr=10, page_size=0)
+ #print (self.values[11]*10)
+ self.s_quality=gtk.HScale(self.s_adj)
+ self.s_quality.set_value_pos(gtk.POS_LEFT)
+ self.s_quality.set_digits(0)
+ self.v_label=gtk.Label(" "+self.labelStrings[0])
+ self.s_label=gtk.Label(self.labelStrings[1])
+
+ self.advanced_button=gtk.Button(self.buttonStrings[0])
+ self.tipLabel=gtk.Label(self.tipLabelStrings[0])
+ self.NEVQBox.pack_start(self.v_label,expand=False,fill=False)
+ self.NEVQBox.pack_start(self.v_quality,expand=True,fill=True)
+ self.NESQBox.pack_start(self.s_button,expand=False,fill=False)
+ self.NESQBox.pack_start(self.s_label,expand=False,fill=False)
+ self.NESQBox.pack_start(self.s_quality,expand=True,fill=True)
+ self.NETABox.pack_start(self.advanced_button,expand=False,fill=False)
+ self.NETABox.pack_start(self.tipLabel,expand=False,fill=False)
+
+ self.win_button=gtk.Button(self.buttonStrings[1])
+ self.start_button=gtk.Button(None,gtk.STOCK_MEDIA_RECORD)
+ self.file_button=gtk.Button(None,gtk.STOCK_SAVE_AS)
+ self.quit_button=gtk.Button(None,gtk.STOCK_QUIT)
+ self.SWBox.pack_start(self.win_button,False,False)
+ self.SWBox.pack_start(self.start_button,False,False)
+ self.SEBox.pack_end(self.quit_button,False,False)
+ self.SEBox.pack_end(self.file_button,False,False)
+
+ self.win_button.show()
+ self.start_button.show()
+ self.file_button.show()
+ self.quit_button.show()
+
+ self.v_quality.show()
+ self.s_button.show()
+ self.s_quality.show()
+ self.v_label.show()
+ self.s_label.show()
+ self.tipLabel.show()
+ self.advanced_button.show()
+ self.NEVQBox.show()
+ self.NESQBox.show()
+ self.NETABox.show()
+ self.NEBox.show()
+ self.NWBox.show()
+ self.NBox.show()
+ self.SEBox.show()
+ self.SWBox.show()
+ self.SBox.show()
+
+ self.labelbox.show()
+ self.window.add(self.labelbox)
+ def __tooltips__(self):
+ self.tooltips=gtk.Tooltips()
+ self.tooltips.set_tip(self.win_button,self.tooltipLabels[0])
+ self.tooltips.set_tip(self.start_button,self.tooltipLabels[1])
+ self.tooltips.set_tip(self.file_button,self.tooltipLabels[2])
+ self.tooltips.set_tip(self.quit_button,self.tooltipLabels[3])
+ self.tooltips.set_tip(self.v_quality,self.tooltipLabels[4])
+ self.tooltips.set_tip(self.v_label,self.tooltipLabels[4])
+ self.tooltips.set_tip(self.s_button,self.tooltipLabels[5])
+ self.tooltips.set_tip(self.s_quality,self.tooltipLabels[6])
+ self.tooltips.set_tip(self.s_label,self.tooltipLabels[6])
+ self.tooltips.set_tip(self.advanced_button,self.tooltipLabels[7])
+
+ def __exit__(self,Event=None):
+ gtk.main_quit()
+ self.values[0]=-1
+ self.optionsOpen[0]=0
+ self.window.destroy()
+ def hide(self,Event=None):
+ self.window.hide()
+ self.hidden[0]=1
+ def show(self,Event=None):
+ self.window.show()
+ self.hidden[0]=0
+ def advanced(self,button=None):
+ if self.optionsOpen[0] ==0:
+ self.optionsOpen[0]=1
+ self.options=pW.prefsWidget(self.values,self.optionsOpen)
+ #self.parent.show()
+ else:
+ if self.options != None:
+ self.options.window.destroy()
+ self.optionsOpen[0]=0
+
+ def __fileSelQuit__(self,Event=None):
+ self.fileSel.destroy()
+
+ def __fileSelOk__(self,Event=None):
+ self.values[4]=self.fileSel.get_filename()
+ #self.pathEntry.set_text(self.fileSel.get_filename())
+ self.fileSel.destroy()
+
+ def __fileSelect__(self,Event=None):
+ self.fileSel = gtk.FileSelection(title=None)
+ self.fileSel.ok_button.connect("clicked", self.__fileSelOk__)
+ self.fileSel.cancel_button.connect("clicked", self.__fileSelQuit__)
+ self.fileSel.set_filename(self.values[4])
+ self.fileSel.show()
+ def __select_window__(self,button):
+ (stdin,stdout,stderr)=os.popen3('xwininfo','t')
+ wid=stdout.readlines()
+ stdin.close()
+ stdout.close()
+ stderr.close()
+ x=y=width=height=None
+ for i in wid:
+ if i.lstrip().startswith('Absolute upper-left X:'):
+ x=int(i.split(' ')[len(i.split(' '))-1])
+ elif i.lstrip().startswith('Absolute upper-left Y'):
+ y=int(i.split(' ')[len(i.split(' '))-1])
+ elif i.lstrip().startswith('Width:'):
+ width=int(i.split(' ')[len(i.split(' '))-1])
+ elif i.lstrip().startswith('Height:'):
+ height=int(i.split(' ')[len(i.split(' '))-1])
+ if x<0:
+ width+=x
+ x=0
+ if y<0:
+ height+=y
+ y=0
+ if width+x>self.wwidth: width=self.wwidth-x
+ if height+y>self.wheight: height=self.wheight-y
+ self.values[5][0]=x
+ self.values[5][1]=y
+ self.values[5][2]=width+x
+ self.values[5][3]=height+y
+ self.image.update_image()
+
+ def __makeCons__(self):
+ self.advanced_button.connect("clicked",self.advanced)
+ self.file_button.connect("clicked",self.__fileSelect__)
+ self.quit_button.connect("clicked",self.__exit__)
+ self.start_button.connect("clicked",self.trayIcon.record_ext)
+ self.s_button.connect("clicked",self.__sound_check__)
+ self.win_button.connect("clicked",self.__select_window__)
+ def __sound_check__(self,widget):
+ self.s_quality.set_sensitive(widget.get_active())
+ self.values[2]=widget.get_active()
+
+ def update(self) :
+ self.values[10]=int((self.v_quality.get_value()*63)/100)
+ self.values[11]=int(self.v_quality.get_value()/10)
+
+ def __init__(self):
+ self.values= [15,0,True,1,os.path.join(os.getenv('HOME'),'out.ogg'),[-1,-1,-1,-1],0,
+ 1,22050,'hw:0,0',63,10,"$DISPLAY",0,1,75,1]
+ self.optionsOpen=[0]
+ self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ self.window.connect("destroy", self.__exit__)
+ self.window.set_border_width(10)
+ self.window.set_title("recordMyDesktop")
+ self.__subWidgets__()
+
+ #self.timed_id=gobject.timeout_add(2000,self.__update_image__)
+ #if resolution is low let it decide size on it's own
+ if self.wwidth>640:
+ self.window.set_size_request(int(self.wwidth/self.factor*2.3),-1)
+ self.window.set_resizable(False)
+
+ self.trayIcon=trayIcon(self)
+ self.__makeCons__()
+ self.__tooltips__()
+ self.s_quality.set_sensitive(self.values[2])
+ self.s_button.set_active(self.values[2])
+ self.window.show()
+ wh=self.window.size_request()
+ self.window.set_size_request(wh[0],wh[1])
+ gtk.main()
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gtk-recordmydesktop/src/rmdTrayIcon.py b/gtk-recordmydesktop/src/rmdTrayIcon.py
new file mode 100644
index 0000000..103dcdc
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdTrayIcon.py
@@ -0,0 +1,276 @@
+#/*********************************************************************************
+#* gtk-recordMyDesktop *
+#**********************************************************************************
+#* *
+#* Copyright (C) 2006 John Varouhakis *
+#* *
+#* *
+#* This program is free software; you can redistribute it and/or modify *
+#* it under the terms of the GNU General Public License as published by *
+#* the Free Software Foundation; either version 2 of the License, or *
+#* (at your option) any later version. *
+#* *
+#* This program is distributed in the hope that it will be useful, *
+#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+#* GNU General Public License for more details. *
+#* *
+#* You should have received a copy of the GNU General Public License *
+#* along with this program; if not, write to the Free Software *
+#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+#* *
+#* *
+#* *
+#* For further information contact me at johnvarouhakis@gmail.com *
+#**********************************************************************************/
+
+
+import pygtk
+pygtk.require('2.0')
+import gtk,gobject
+
+import egg.trayicon
+import rmdSelect as isel
+import rmdTrayPopup as iTP
+import os,signal
+
+#values struct:
+
+#0 fps
+#1 mouse
+#2 sound on/off
+#3 full
+#4 path
+#5 area
+#6 delay
+#7 channels
+#8 frequency
+#9 device
+#10 v_quality
+#11 s_quality
+#12 display
+#13 shared memory
+#14 drop-frames
+#15 shared threshold
+#16 quick subsampling
+
+
+class trayIcon(object):
+ #values=[15,0,0,1,os.path.join(os.getenv('HOME'),'out.ogg'),[-1,-1,-1,-1],0,
+ #1,22050,'hw:0,0',63,10,"$DISPLAY",0,1,75,1]
+ exit_status={
+ 0:'Success',
+ 1*256:'Error while parsing the arguments.',
+ 2*256:'Initializing the encoder failed(either vorbis or theora)',
+ 3*256:'Could not open/configure sound card.',
+ 4*256:'Xdamage extension not present.',
+ 5*256:'Shared memory extension not present.',
+ 6*256:'Xfixes extension not present.',
+ 7*256:'XInitThreads failed.',
+ 8*256:'No $DISPLAY environment variable and none specified as argument.',
+ 9*256:'Cannot connect to Xserver.',
+ 10*256:'Color depth is not 24bpp.',
+ 11*256:'Improper window specification.',
+ 12*256:'Cannot attach shared memory to proccess.',
+ 11:'Segmentation Fault'
+ }
+
+
+ state=0#0 stopped,1 recording,2 paused
+ rmdPid=None
+ optionsOpen=[1]
+ reopen=0
+ timed_id=None
+
+ def __buttonPress__(self,widget,event=None):
+ if event.button==1 :
+ if self.state == 0:
+ if self.optionsOpen[0]==1:
+ self.parent.hide()
+ self.optionsOpen[0]=0
+ self.reopen=1
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=1
+ self.__execRMD__()
+ elif self.state== 1:
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_RECORD,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=0
+ self.__stopRMD__()
+ elif self.state == 2 :
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=1
+ self.__pauseRMD__()
+
+
+ elif event.button == 3:
+ if self.state == 0:
+ self.tray_popup.show()
+ elif self.state == 1:
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_PAUSE,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=2
+ self.__pauseRMD__()
+ elif self.state ==2:
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=1
+ self.__pauseRMD__()
+ def record_ext(self,button=None):
+ if self.state == 0:
+ if self.optionsOpen[0]==1:
+ self.parent.hide()
+ self.optionsOpen[0]=0
+ self.reopen=1
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.state=1
+ self.__execRMD__()
+
+ def __execRMD__(self):
+ self.parent.update()
+ execargs=["recordmydesktop","-o",'%s'%self.parent.values[4],
+ "-fps","%d"%self.parent.values[0]]
+ if self.parent.values[2]==False :
+ execargs.append("--nosound")
+ if self.parent.values[1] == 1:
+ execargs.append("-dummy-cursor")
+ execargs.append("white")
+ elif self.parent.values[1] == 2:
+ execargs.append("-dummy-cursor")
+ execargs.append("black")
+ elif self.parent.values[1] == 3:
+ execargs.append("--no-cursor")
+
+ if self.parent.values[3] == 0:
+ execargs.append("--full-shots")
+ if self.parent.values[13] == 0:
+ execargs.append("--with-shared")
+ if self.parent.values[3] == 1 and self.parent.values[13] == 1 :
+ execargs.append("--no-cond-shared")
+
+ if self.parent.values[5][0]>0 :
+ execargs.append('-x')
+ execargs.append('%d'%self.parent.values[5][0])
+ if self.parent.values[5][1]>0:
+ execargs.append('-y')
+ execargs.append('%d'%self.parent.values[5][1])
+ if self.parent.values[5][2]>0 and self.parent.values[5][3]>0:
+ execargs.append('-width')
+ execargs.append('%d'%(self.parent.values[5][2]-self.parent.values[5][0]))
+ execargs.append('-height')
+ execargs.append('%d'%(self.parent.values[5][3]-self.parent.values[5][1]))
+ for i in range(4):
+ self.parent.values[5][i]=-1
+ if self.parent.values[6]>0:
+ execargs.append('-delay')
+ execargs.append('%d'%self.parent.values[6])
+ execargs.append('-channels')
+ execargs.append('%d'%self.parent.values[7])
+ execargs.append('-freq')
+ execargs.append('%d'%self.parent.values[8])
+ execargs.append('-device')
+ execargs.append('%s'%self.parent.values[9])
+ execargs.append('-v_quality')
+ execargs.append('%d'%self.parent.values[10])
+ execargs.append('-s_quality')
+ execargs.append('%d'%self.parent.values[11])
+ if self.parent.values[12] != "$DISPLAY":
+ execargs.append('-display')
+ execargs.append('%s'%self.parent.values[12])
+ if self.parent.values[14] == 0:
+ execargs.append('--drop-frames')
+ execargs.append('-shared-threshold')
+ execargs.append('%d'%self.parent.values[15])
+ if self.parent.values[16] == 0:
+ execargs.append('--quick-subsampling')
+
+
+ #print execargs
+
+ self.rmdPid=os.fork()
+
+ if self.rmdPid==0:
+ res=os.execvp("recordmydesktop",execargs)
+ else:
+ self.timed_id=gobject.timeout_add(1000,self.__check_status__)
+
+
+ def __exit_status_dialog(self,status):
+ dialog = gtk.Dialog(title=None, parent=None, flags=0, buttons=None)
+ label1=None
+ try:
+ label1 = gtk.Label("\t\tRecording is finished.\nrecordMyDesktop has exited with status %d\nDescription:%s\n"%(status,self.exit_status[int(status)]))
+ except:
+ label1 = gtk.Label("\t\tRecording is finished.\nrecordMyDesktop has exited with uknown\nerror code: %d \n"%(status))
+ dialog.vbox.pack_start(label1, True, True, 0)
+ label1.show()
+ button = gtk.Button(label=None, stock=gtk.STOCK_OK)
+ dialog.vbox.pack_start(button, True, True, 0)
+ def __destroy(button):
+ dialog.destroy()
+ button.connect("clicked", __destroy)
+ button.show()
+ dialog.set_size_request(300,128)
+ dialog.show()
+
+ def __pauseRMD__(self):
+ os.kill(self.rmdPid,signal.SIGUSR1)
+
+ def __stopRMD__(self):
+ if self.timed_id!=None:
+ gobject.source_remove(self.timed_id)
+ self.timed_id=None
+ exit_ret=os.waitpid(self.rmdPid,os.WNOHANG)
+ if exit_ret[0] == 0:
+ os.kill(self.rmdPid,signal.SIGTERM)
+ exit_ret=os.waitpid(self.rmdPid,0)
+ #if exit_ret[0]==self.rmdPid:
+ #self.__exit_status_dialog(exit_ret[1])
+ else:
+ self.__exit_status_dialog(exit_ret[1])
+ self.rmdPid=None
+ if self.reopen==1:
+ self.parent.show()
+ self.optionsOpen[0]=1
+ self.reopen=0
+
+ #print exit_ret
+ def __check_status__(self):
+ if self.rmdPid!=None:
+ exit_ret=os.waitpid(self.rmdPid,os.WNOHANG)
+ if exit_ret[0] != 0:
+ self.state=0
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_RECORD,gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.__exit_status_dialog(exit_ret[1])
+ self.rmdPid=None
+ if self.reopen==1:
+ self.parent.show()
+ self.optionsOpen[0]=1
+ self.reopen=0
+ return False
+ else:
+ return True
+ else:
+ return False
+
+
+ def __init__(self,parent):
+ self.parent=parent
+ #self.parent.values=values
+ self.event_box = gtk.EventBox()
+ self.trayIcon=gtk.Image()
+ self.trayIcon.set_from_stock(gtk.STOCK_MEDIA_RECORD, gtk.ICON_SIZE_SMALL_TOOLBAR)
+ self.event_box.add(self.trayIcon)
+ self.tray_container = egg.trayicon.TrayIcon("recordMyDesktop")
+ self.tray_container.add(self.event_box)
+ self.tray_popup=iTP.TrayPopupMenu(self.parent,self.parent.values,self.optionsOpen)
+ self.event_box.connect("button-press-event", self.__buttonPress__)
+ self.tray_container.show_all()
+ #gtk.main()
+
+
+
+
+
+
+
+
+
+
diff --git a/gtk-recordmydesktop/src/rmdTrayPopup.py b/gtk-recordmydesktop/src/rmdTrayPopup.py
new file mode 100644
index 0000000..78cccf3
--- /dev/null
+++ b/gtk-recordmydesktop/src/rmdTrayPopup.py
@@ -0,0 +1,102 @@
+# -*- Mode: Python -*-
+# vi:si:et:sw=4:sts=4:ts=4
+#
+# Istanbul - A desktop recorder
+# Copyright (C) 2005 Zaheer Abbas Merali (zaheerabbas at merali dot org)
+# Copyright (C) 2006 John N. Laliberte (allanonjl@gentoo.org) (jlaliberte@gmail.com)
+# Portions Copyright (C) 2004,2005 Fluendo, S.L. (www.fluendo.com).
+# All rights reserved.
+
+
+# This file may be distributed and/or modified under the terms of
+# the GNU General Public License version 2 as published by
+# the Free Software Foundation.
+# This file is distributed without any warranty; without even the implied
+# warranty of merchantability or fitness for a particular purpose.
+# See "COPYING" in the source distribution for more information.
+
+#gtk-recordMyDesktop - a graphical frontend for recordMyDesktop
+#Copyright (C) 2006 John Varouhakis
+#This file has been modified to be used in gtk-recordMyDesktop
+#original file name is tray_popup.py in istanbul-0.2.1
+
+import gtk
+import locale, gettext
+import rmdConfig
+_ = gettext.gettext
+gettext.textdomain('gtk-recordMyDesktop')
+gettext.bindtextdomain('gtk-recordMyDesktop',rmdConfig.locale_install_dir)
+import rmdSelect as iSel
+import rmdPrefsWidget as pW
+
+class TrayPopupMenu:
+ options=None
+ def __init__(self,parent,values,optionsOpen):
+ self.parent=parent
+ self.optionsOpen=optionsOpen
+ self.values=values
+ self._setup_popup_menu()
+ self.selector = None
+
+ def _setup_popup_menu(self):
+ self.popupmenu = gtk.Menu()
+ self._setup_about()
+ self._setup_prefs_widget()
+ self._setup_select_area()
+ self._setup_quit()
+
+ def _prefs_widget(self,button):
+ if self.optionsOpen[0] ==0:
+ self.optionsOpen[0]=1
+ #self.options=pW.prefsWidget(self.values,self.optionsOpen)
+ self.parent.show()
+ else:
+ #if self.options != None:
+ self.parent.hide()
+ self.optionsOpen[0]=0
+ def _setup_prefs_widget(self):
+ self.popupmenu_prefs_widget = gtk.ImageMenuItem(
+ gtk.STOCK_PREFERENCES)
+ self.popupmenu_prefs_widget.connect('activate', self._prefs_widget)
+ self.popupmenu.add(self.popupmenu_prefs_widget)
+
+ def _setup_about(self):
+ self.popupmenu_aboutitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
+ self.popupmenu_aboutitem.connect('activate', self._about)
+ self.popupmenu.add(self.popupmenu_aboutitem)
+
+ def _about(self, button):
+ aboutdialog = gtk.AboutDialog()
+ aboutdialog.set_name(_('gtk-recordMyDesktop'))
+ aboutdialog.set_version("0.2.1")
+ aboutdialog.set_comments(_('a graphical frontend for recordMyDesktop'))
+ aboutdialog.set_copyright(_('Copyright (C) John Varouhakis\nPortions Copyright (C) 2005-6 Zaheer Abbas Merali, John N. Laliberte\nPortions Copyright (C) Fluendo S.L.'))
+ aboutdialog.set_authors(['recordMyDesktop and gtk-recordMyDesktop\nis written by John Varouhakis','Portions of gtk-recordMyDesktop\nare taken from Istanbul\n(http://live.gnome.org/Istanbul)\nwritten by\nZaheer Abbas Merali and John N. Laliberte'])
+ aboutdialog.set_website('http://recordmydesktop.sourceforge.net')
+ aboutdialog.set_license('GPL-2')
+ aboutdialog.set_translator_credits(_('Translator Credits And Information(Replace with your info)'))
+ aboutdialog.show_all()
+
+ def _setup_select_area(self):
+ self.popupmenu_selectarea = gtk.ImageMenuItem(
+ _("_Select Area On Screen"))
+ self.popupmenu.add(self.popupmenu_selectarea)
+ self.popupmenu_selectarea.connect("activate", self._select_area_cb)
+
+ def _select_area_cb(self, menuitem):
+ self.popupmenu.hide()
+ self.selector = iSel.GtkAreaSelector(self.values[5])
+ self.selector.show()
+
+ def _setup_quit(self):
+ self.popupmenu_quititem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
+ self.popupmenu_quititem.connect('activate', self._quit)
+ self.popupmenu.add(self.popupmenu_quititem)
+
+ def _quit(self, button):
+ gtk.main_quit()
+
+ def show(self):
+ self.popupmenu.show_all()
+ self.popupmenu.popup(None, None, None, 3, gtk.get_current_event_time())
+
© All Rights Reserved