summaryrefslogtreecommitdiff
path: root/gtk-recordmydesktop/src
diff options
context:
space:
mode:
authoriovar <iovar@f606c939-3180-4ac9-a4b8-4b8779d57d0a>2006-09-25 07:45:20 +0000
committeriovar <iovar@f606c939-3180-4ac9-a4b8-4b8779d57d0a>2006-09-25 07:45:20 +0000
commit4a831afd95e453a92c7da8445cbe0582c540f6cc (patch)
treeb3fe4cb47370c5902254b5580a5324bcc3722c4d /gtk-recordmydesktop/src
parentcc504650ca73cd9045c4bc2f89596954d2450257 (diff)
automake based project
git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@70 f606c939-3180-4ac9-a4b8-4b8779d57d0a
Diffstat (limited to 'gtk-recordmydesktop/src')
-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
12 files changed, 1392 insertions, 0 deletions
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