diff options
Diffstat (limited to 'gtk-recordmydesktop/src')
-rw-r--r-- | gtk-recordmydesktop/src/Makefile.am | 27 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/__init__.py | 4 | ||||
-rwxr-xr-x | gtk-recordmydesktop/src/gtk-recordMyDesktop | 43 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/gtk-recordmydesktop.desktop | 10 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/gtk-recordmydesktop.png | bin | 0 -> 3183 bytes | |||
-rw-r--r-- | gtk-recordmydesktop/src/rmdConfig.py.in | 4 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/rmdPrefsWidget.py | 284 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/rmdSelect.py | 139 | ||||
-rwxr-xr-x | gtk-recordmydesktop/src/rmdSelectThumb.py | 217 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/rmdSimple.py | 286 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/rmdTrayIcon.py | 276 | ||||
-rw-r--r-- | gtk-recordmydesktop/src/rmdTrayPopup.py | 102 |
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 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()) + |