diff options
author | iovar <iovar@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2006-09-25 07:45:20 +0000 |
---|---|---|
committer | iovar <iovar@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2006-09-25 07:45:20 +0000 |
commit | 4a831afd95e453a92c7da8445cbe0582c540f6cc (patch) | |
tree | b3fe4cb47370c5902254b5580a5324bcc3722c4d | |
parent | cc504650ca73cd9045c4bc2f89596954d2450257 (diff) |
automake based project
git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@70 f606c939-3180-4ac9-a4b8-4b8779d57d0a
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 Binary files differnew file mode 100644 index 0000000..bc50b04 --- /dev/null +++ b/gtk-recordmydesktop/src/gtk-recordmydesktop.png 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()) + |