diff -Nuarpd -X diff-excludes gtk-recordmydesktop-0.3.8/src/rmdConfig.py.in gtk-recordmydesktop-patched/src/rmdConfig.py.in --- gtk-recordmydesktop-0.3.8/src/rmdConfig.py.in 2012-02-13 12:09:31.108123883 +0400 +++ gtk-recordmydesktop-patched/src/rmdConfig.py.in 2012-02-13 12:34:13.620298266 +0400 @@ -1,4 +1,10 @@ import os +import ConfigParser +import gtk +import re +import fnmatch +import warnings + VERSION='@VERSION@' PREFIX='@PREFIX@' locale_install_dir=os.path.join('@DATADIR@'.replace("${prefix}",PREFIX), 'locale') @@ -35,3 +41,417 @@ default_values=[15, #framerate 0, #draw an on-screen frame, surrounding the capture area,0 on 1 off "", #extra options ] + +old_config_file = os.path.join(os.getenv("HOME"),".gtk-recordmydesktop") +config_file = os.path.join(os.getenv("HOME"),".gtk-recordmydesktop2") + + +class Config: + def __init__(self, parent): + self.parent = parent + self.load_defaults() + if not self.load(config_file): + self.migrate(old_config_file) + self.update_filename() + + def load(self, path = config_file): + try: + parser = ConfigParser.ConfigParser() + parser.read(path) + try: self.fps = parser.getint('global', 'fps') + except ConfigParser.NoOptionError: pass + try: self.cursor = parser.getint('global', 'cursor') + except ConfigParser.NoOptionError: pass + try: self.with_sound = parser.getint('global', 'with_sound') + except ConfigParser.NoOptionError: pass + try: self.full_shots = parser.getint('global', 'full_shots') + except ConfigParser.NoOptionError: pass + try: self.output_filename = parser.get('global', 'output_filename') + except ConfigParser.NoOptionError: pass + try: self.coords = eval(parser.get('global', 'coords'), {}, {}) + except ConfigParser.NoOptionError: pass + try: self.delay = parser.getint('global', 'delay') + except ConfigParser.NoOptionError: pass + try: self.channels = parser.getint('global', 'channels') + except ConfigParser.NoOptionError: pass + try: self.freq = parser.getint('global', 'freq') + except ConfigParser.NoOptionError: pass + try: self.device = parser.get('global', 'device') + except ConfigParser.NoOptionError: pass + try: self.v_quality = parser.getint('global', 'v_quality') + except ConfigParser.NoOptionError: pass + try: self.s_quality = parser.getint('global', 's_quality') + except ConfigParser.NoOptionError: pass + try: self.display = parser.get('global', 'display') + except ConfigParser.NoOptionError: pass + try: self.no_shared = parser.getint('global', 'no_shared') + except ConfigParser.NoOptionError: pass + try: self.area_reset = parser.getint('global', 'area_reset') + except ConfigParser.NoOptionError: pass + try: self.follow_mouse = parser.getint('global', 'follow_mouse') + except ConfigParser.NoOptionError: pass + try: self.quick_subsampling = parser.getint('global', 'quick_subsampling') + except ConfigParser.NoOptionError: pass + try: self.workdir = parser.get('global', 'workdir') + except ConfigParser.NoOptionError: pass + try: self.on_the_fly_encoding = parser.getint('global', 'on_the_fly_encoding') + except ConfigParser.NoOptionError: pass + try: self.compress_cache = parser.getint('global', 'compress_cache') + except ConfigParser.NoOptionError: pass + try: self.overwrite = parser.getboolean('global', 'overwrite') + except ConfigParser.NoOptionError: pass + try: self.decorations = parser.getint('global', 'decorations') + except ConfigParser.NoOptionError: pass + try: self.use_jack = parser.getboolean('global', 'use_jack') + except ConfigParser.NoOptionError: pass + try: self.jack_ports = eval(parser.get('global', 'jack_ports'), {}, {}) + except ConfigParser.NoOptionError: pass + try: self.tooltips = parser.getint('global', 'tooltips') + except ConfigParser.NoOptionError: pass + try: self.no_frame = parser.getint('global', 'no_frame') + except ConfigParser.NoOptionError: pass + try: self.extra_args = parser.get('global', 'extra_args') + except ConfigParser.NoOptionError: pass + try: self.filebase = parser.get('global', 'filebase') + except ConfigParser.NoOptionError: pass + try: self.use_template = parser.getboolean('global', 'use_template') + except ConfigParser.NoOptionError: pass + try: self.template = parser.get('global', 'template') + except ConfigParser.NoOptionError: pass + except: + return False + return True + + def save(self, path = config_file): + parser = ConfigParser.ConfigParser() + parser.add_section('global') + parser.set('global', 'fps', self.fps) + parser.set('global', 'cursor', self.cursor) + parser.set('global', 'with_sound', self.with_sound) + parser.set('global', 'full_shots', self.full_shots) + parser.set('global', 'output_filename', self.output_filename) + parser.set('global', 'coords', self.coords) + parser.set('global', 'delay', self.delay) + parser.set('global', 'channels', self.channels) + parser.set('global', 'freq ', self.freq) + parser.set('global', 'device', self.device) + parser.set('global', 'v_quality', self.v_quality) + parser.set('global', 's_quality', self.s_quality) + parser.set('global', 'display', self.display) + parser.set('global', 'no_shared', self.no_shared) + parser.set('global', 'area_reset', self.area_reset) + parser.set('global', 'follow_mouse', self.follow_mouse) + parser.set('global', 'quick_subsampling', self.quick_subsampling) + parser.set('global', 'workdir', self.workdir) + parser.set('global', 'on_the_fly_encoding', self.on_the_fly_encoding) + parser.set('global', 'compress_cache', self.compress_cache) + parser.set('global', 'overwrite', self.overwrite) + parser.set('global', 'decorations', self.decorations) + parser.set('global', 'use_jack', self.use_jack) + parser.set('global', 'jack_ports', self.jack_ports) + parser.set('global', 'tooltips', self.tooltips) + parser.set('global', 'no_frame', self.no_frame) + parser.set('global', 'extra_args', self.extra_args) + parser.set('global', 'filebase', self.filebase) + parser.set('global', 'use_template', self.use_template) + parser.set('global', 'template', self.template) + cfgfile = 0 + try: + cfgfile = open(path, 'w') + except IOError as (errno, strerror): + p = gtk.MessageDialog( + parent = self.parent.window, + flags = gtk.DIALOG_MODAL, + type = gtk.MESSAGE_WARNING, + buttons = gtk.BUTTONS_OK) + p.set_title("Warning!") + p.set_markup("Error writing to\n" + + path + "\n\n(%d) %s"%(errno, strerror)) + p.run() + return + parser.write(cfgfile) + cfgfile.close() + if os.path.isfile(old_config_file): + try: os.remove(old_config_file) + except: pass + + def load_defaults(self): + self.values = default_values + self.migrate_values() + + def update_filename(self, check_day = True): + u = FilenameUtil(self) + if not u.match_template(self.output_filename, self.filebase, check_day)[0] or os.path.exists(self.output_filename): + u.build() + + def set_filename(self, filename): + self.output_filename = re.sub('\.ogv$', '', filename) + ".ogv" + u = FilenameUtil(self) + u.update_filebase() + + # 01/25/2012: after three years from now please remove migrate* and old_config_file + def migrate(self, path): + if not self.migrate_get_values(path): + return False + self.migrate_values() + return True + + def migrate_values(self): + self.fps = self.values[0] + self.cursor = self.values[1] + self.with_sound = self.values[2] + self.full_shots = self.values[3] + self.coords = self.values[5] + self.delay = self.values[6] + self.channels = self.values[7] + self.freq = self.values[8] + self.device = self.values[9] + self.v_quality = self.values[10] + self.s_quality = self.values[11] + self.display = self.values[12] + self.no_shared = self.values[13] + self.area_reset = 1 - self.values[14] + self.follow_mouse = 1 - self.values[15] + self.quick_subsampling = 1 - self.values[16] + self.workdir = self.values[17] + self.on_the_fly_encoding = 1 - self.values[18] + self.compress_cache = self.values[19] + self.overwrite = self.values[20] + self.decorations = 1 - self.values[21] + self.use_jack = self.values[22] + self.jack_ports = self.values[23] + self.tooltips = self.values[24] + self.no_frame = self.values[25] + self.extra_args = self.values[26] + + self.use_template = False + self.template = "%f" + self.set_filename(self.values[4]) + + def migrate_get_values(self, path): + try: + self.values=[] + savefile=open(path,"r") + #the header + savefile.readline() + savefile.readline() + #the options,each has a coment above + for i in range(2): + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(int(savefile.readline())==1) + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(savefile.readline().replace("\n","")) + #recording area is not saved + self.values.append([]) + for i in range(3): + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(savefile.readline().replace("\n","")) + for i in range(2): + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(savefile.readline().replace("\n","")) + for i in range(2): + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + areastring=savefile.readline() + try: + as1=areastring.replace('\n','').split(',') + for i in range(4): + self.values[5].append(int(as1[i])) + except: + self.values[5]=[] + for i in rmdConfig.default_values[5]: + self.values[5].append(i) + #loaded further bellow + self.values.append(0) + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(savefile.readline().replace("\n","")) + for i in range(2): + savefile.readline() + self.values.append(int(savefile.readline())) + savefile.readline() + self.values.append(int(savefile.readline())==1) + #new options for 0.3.3 + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[21]) + else: + self.values.append(int(savefile.readline())) + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[22]) + self.values.append(rmdConfig.default_values[23]) + else: + self.values.append(int(savefile.readline())==1) + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[23]) + else: + ports_t=savefile.readline().split(' ') + #get rid of the trailing \n + ports_t.pop() + self.values.append(ports_t) + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[24]) + else: + self.values.append(int(savefile.readline())) + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[25]) + else: + self.values.append(int(savefile.readline())) + p=savefile.readline() + if p=='': + self.values.append(rmdConfig.default_values[26]) + else: + self.values.append(savefile.readline().replace("\n","")) + p=savefile.readline() + if p=='': + self.values[15]=rmdConfig.default_values[15] + else: + t_followmouse=int(savefile.readline()) + if t_followmouse>1: t_followmouse=1 + self.values[15]=t_followmouse + return True + except: + return False + +import re +import time as t + +# is a friend class of Config (changes it) +class FilenameUtil: + def __init__(self, config): + self.config = config + + def build(self): + dir = os.path.dirname(self.config.output_filename) + filename = \ + self.expand_template() \ + if self.config.use_template \ + else self.expand_number(self.config.filebase, dir) + self.config.output_filename = dir + '/' + filename + '.ogv' + + def expand_template(self): + dir = os.path.dirname(self.config.output_filename) + expanded = re.sub('%f', self.config.filebase, self.config.template) + expanded = t.strftime(expanded) + expanded = self.expand_number(expanded, dir) + return expanded + + def get_base(self, path_file): + base = os.path.basename(path_file) + base = re.sub('\.ogv$', '', base) + if not self.config.use_template: + base = re.sub('-\d+$', '', base) + return base + + def expand_number(self, template, dir): + match = False + if self.config.use_template: + match = re.search('^(.*)%(N+)(.*)$', template) + if not match: + if self.config.overwrite: + return template + return self.expand_number_oldstyle(template, dir) + padding = len(match.group(2)) + name0 = match.group(1) + name1 = match.group(3) + name_mask = name0 + '[0-9]' * padding + name1 + '.ogv' + files = fnmatch.filter(os.listdir(dir), name_mask) + number = 1 + if len(files) > 0: + files.sort() + number = re.sub(name1 + '\.ogv$', '', files[-1]) + number = int(re.sub('^' + name0, '', number)) + 1 + number = ('%0' + str(padding) + 'd') % number + result = name0 + number + name1 + return result + + def expand_number_oldstyle(self, template, dir): + if not os.path.exists(dir + '/' + template + '.ogv'): + return template + i = 1 + while True: + result = template + '-' + str(i) + if not os.path.exists(dir + '/' + result + '.ogv'): + return result + if i == 100000: + warnings.warn("Too many .ogv files at " + dir + "!", RuntimeWarning) + i = i + 1 + + + def update_filebase(self): + output_filename = self.config.output_filename + if not self.config.use_template: + self.config.filebase = self.get_base(output_filename) + return + + (m, filebase_used) = self.match_template(output_filename, '.*') + if not m: + self.config.use_template = False + self.config.filebase = self.get_base(output_filename) + elif filebase_used: + self.config.filebase = m.group(2) + + + def match_template(self, output_filename, filebase_match, check_day = False): + if not self.config.use_template: + return (False, False) + # Alternative strftime() formats are not supported (%Ec, %EC, %Od, %Oe, etc.) + strftime_regexps = {'%a': '\w+', '%A': '\w+', '%b': '\w+', '%B': '\w+', + '%c': '.+', '%C': '\d\d', '%d': '[0-3]\d', + '%D': '[01]\d/[0-3]\d/\d\d', '%e': '[ 1-3]\d', + '%F': '\d{4}-[01]\d-[0-3]\d', '%G': '\d{4}', '%g': '\d\d', + '%h': '\w+', '%H': '[0-2]\d', '%I': '[01]\d', + '%j': '[0-3]\d\d', '%k': '[ 12]\d', '%l': '[ 1]\d', + '%m': '[01]\d', '%M': '[0-5]\d', '%p': '[AP]M', + '%P': '[ap]m', '%r': '[01]\d:[0-5]\d:[0-6]\d [AP]M', + '%R': '[0-2]\d:[0-6]\d', '%s': '\d+', '%S': '[0-6]\d', + '%t': '\t', '%T': '[0-2]\d:[0-5]\d:[0-6]\d', + '%u': '[1-7]', '%U': '[0-5]\d', '%V': '[0-5]\d', + '%w': '[0-6]', '%W': '[0-5]\d', '%x': '.+', + '%X': '.+', '%y': '\d\d', '%Y': '\d{4}', + '%z': '[-+]\d{4}', '%Z': '.+', '%+': '.+', '%%': '%'} + + # Increment %N counter on day-resolution basis (may be configurable in future) + strftime_day = {} + if check_day: + for x in ['%a', '%A', '%b', '%B', '%C', '%d', '%D', '%e', '%F', + '%G', '%g', '%h', '%j', '%m', '%w', '%W', '%x', '%y', + '%Y' ]: + strftime_day[x] = 1 + + regexp = self.config.template + + filebase_used = True + regexp = regexp.replace('%f', '(' + filebase_match + ')') # This group will be filebase + if regexp == self.config.template: + # %f is not used, no need to change filebase + filebase_used = False + + for key, value in strftime_regexps.iteritems(): + if not strftime_day.has_key(key): + regexp = regexp.replace(key, value) + + regexp = t.strftime(regexp) + + while True: + m = re.search('%(N+)', regexp) + if not m: break + regexp = regexp.replace(m.group(0), '\d' * len(m.group(1))) + + filebase_path = re.sub('\.ogv$', '',output_filename) + regexp = '(.*/)?' + regexp + '$' + return (re.match(regexp, filebase_path), filebase_used) diff -Nuarpd -X diff-excludes gtk-recordmydesktop-0.3.8/src/rmdFrame.py gtk-recordmydesktop-patched/src/rmdFrame.py --- gtk-recordmydesktop-0.3.8/src/rmdFrame.py 2012-02-13 12:09:31.058123815 +0400 +++ gtk-recordmydesktop-patched/src/rmdFrame.py 2012-01-25 17:06:59.815924896 +0400 @@ -40,6 +40,7 @@ class rmdFrame: self.w=w self.h=h self.parent=parent + self.config = parent.config mask = gtk.gdk.Pixmap(None, self.w+self.borderwidth*2, self.h+self.borderwidth*2, @@ -78,7 +79,7 @@ class rmdFrame: self.timed_id=gobject.timeout_add(100,self.moveFrame) def moveFrame(self): - if self.parent.values[15]==0 and self.parent.hidden[0]==0: + if self.config.follow_mouse == 1 and self.parent.hidden[0]==0: npos=gtk.gdk.Display.get_pointer(self.disp) x=npos[1]-self.w/2 y=npos[2]-self.h/2 diff -Nuarpd -X diff-excludes gtk-recordmydesktop-0.3.8/src/rmdPrefsWidget.py gtk-recordmydesktop-patched/src/rmdPrefsWidget.py --- gtk-recordmydesktop-0.3.8/src/rmdPrefsWidget.py 2012-02-13 12:09:50.308152043 +0400 +++ gtk-recordmydesktop-patched/src/rmdPrefsWidget.py 2012-02-10 12:26:12.579426559 +0400 @@ -46,46 +46,47 @@ class prefsWidget(object): self.tooltips.set_tip(self.eboxes[i],prefTooltipLabels[i]) self.tooltips.set_tip(self.jack_ebox,prefJacktip) - - def destroy(self,Event=None): - self.values[0]=self.fpsSpinButton.get_value_as_int() - self.values[1]=self.mouseComboBox.get_active() - self.values[3]=int(not self.fullComboBox.get_active()) - 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[12]=self.displayEntry.get_text().replace(' ','') - self.values[13]=int(not self.sharedComboBox.get_active()) - self.values[14]=int(not self.areaResetComboBox.get_active()) - self.values[15]=int(not self.followMouseComboBox.get_active()) - self.values[16]=int(not self.quickComboBox.get_active()) - self.values[17]=self.workdirEntry.get_text() - self.values[18]=int(not self.onTheFlyComboBox.get_active()) - self.values[19]=int(not self.zeroCmpComboBox.get_active()) - self.values[20]=self.overwriteFilesButton.get_active() - self.values[21]=int(not self.winDecoComboBox.get_active()) - self.values[22]=self.jack_button.get_active() + def apply(self): + self.config.fps=self.fpsSpinButton.get_value_as_int() + self.config.cursor=self.mouseComboBox.get_active() + self.config.full_shots=int(not self.fullComboBox.get_active()) + self.config.channels=self.channelsSpinButton.get_value_as_int() + self.config.freq=self.freqSpinButton.get_value_as_int() + self.config.device=self.deviceEntry.get_text().replace(' ','') + self.config.display=self.displayEntry.get_text().replace(' ','') + self.config.no_shared=int(not self.sharedComboBox.get_active()) + self.config.area_reset=int(self.areaResetComboBox.get_active()) + self.config.follow_mouse=int(self.followMouseComboBox.get_active()) + self.config.quick_subsampling=int(self.quickComboBox.get_active()) + self.config.workdir=self.workdirEntry.get_text() + self.config.on_the_fly_encoding=int(self.onTheFlyComboBox.get_active()) + self.config.compress_cache=int(not self.zeroCmpComboBox.get_active()) + self.config.overwrite=self.overwriteFilesButton.get_active() + self.config.decorations=int(self.winDecoComboBox.get_active()) + self.config.use_jack=self.jack_button.get_active() self.__getSelectedPorts__() - self.values[24]=int(not self.tooltipsComboBox.get_active()) - self.values[25]=int(not self.rFrameComboBox.get_active()) - self.values[26]=self.extraOptsEntry.get_text().strip() - self.window.destroy() - self.optionsOpen[0]=0 + self.config.tooltips=int(not self.tooltipsComboBox.get_active()) + self.config.no_frame=int(not self.rFrameComboBox.get_active()) + self.config.extra_args=self.extraOptsEntry.get_text().strip() + self.config.filebase = self.filebase_entry.get_text() + self.config.use_template = self.use_template_checkbox.get_active() + self.config.template = self.template_entry.get_text() + + self.config.update_filename(False) def __exit__(self,Event=None): gtk.main_quit() - self.values[0]=-1 - self.optionsOpen[0]=0 + self.config.fps=-1 self.window.destroy() def __getSelectedPorts__(self): iters_t=[] - self.values[23]=[] + self.config.jack_ports=[] sel_rows=self.jack_lsp_listview.get_selection().get_selected_rows() for i in sel_rows[1]: iters_t.append(self.jack_lsp_listview.get_model().get_iter(i)) for i in iters_t: - self.values[23].append(self.jack_lsp_listview.get_model().get_value(i,0)) + self.config.jack_ports.append(self.jack_lsp_listview.get_model().get_value(i,0)) def __fileSelQuit__(self,Event=None): self.fileSel.destroy() @@ -102,7 +103,8 @@ class prefsWidget(object): self.labelbox={} self.eboxes={} for i in range(4): - self.labelbox[i]=gtk.VBox(homogeneous=False, spacing=20) + self.labelbox[i]=gtk.VBox(homogeneous=False, spacing=10) + self.labelbox[i].set_border_width(10) self.notebook = gtk.Notebook() #Files page @@ -111,35 +113,58 @@ class prefsWidget(object): self.labels[i].set_justify(gtk.JUSTIFY_LEFT) self.boxes[i]=gtk.HBox(homogeneous=False, spacing=40) self.boxes[i].pack_start(self.labels[i],expand=False,fill=False) - self.labels[i].show() self.eboxes[i]=gtk.EventBox() self.eboxes[i].add(self.boxes[i]) self.labelbox[0].pack_start(self.eboxes[i],expand=False,fill=False) - self.workdir_layout=gtk.HBox(homogeneous=False, spacing=0) + self.workdir_layout=gtk.HBox(homogeneous=False, spacing=5) self.overwriteFilesButton=gtk.CheckButton(label=None) - self.overwriteFilesButton.set_active(self.values[20]) - self.overwriteFilesButton.show() + self.overwriteFilesButton.set_active(self.config.overwrite) self.boxes[0].pack_end(self.overwriteFilesButton,expand=False,fill=False) self.workdirEntry= gtk.Entry(max=0) - self.workdirEntry.set_text(self.values[17]) - self.workdirEntry.show() + self.workdirEntry.set_text(self.config.workdir) #self.boxes[1].pack_end(self.workdirEntry,expand=False,fill=False) #self.file_button=gtk.Button(None,gtk.STOCK_SAVE_AS) - #self.file_button.show() self.workdir_button=gtk.Button(None,gtk.STOCK_SAVE_AS) - self.workdir_button.show() - self.workdir_layout.pack_start(self.workdirEntry,expand=True,fill=True) self.workdir_layout.pack_start(self.workdir_button,expand=False,fill=False) - self.workdir_layout.show() - self.labelbox[0].pack_start(self.workdir_layout,expand=False,fill=False) + + b = gtk.HBox(False, 0) + b.pack_start(gtk.Label("Filename base"), False, False) + self.labelbox[0].pack_start(b, False, False) + self.filebase_entry = gtk.Entry() + self.filebase_entry.set_text(self.config.filebase) + self.labelbox[0].pack_start(self.filebase_entry, False, False) + + self.template_label = gtk.Label("Filename template") + b = gtk.HBox(False, 0) + b.pack_start(self.template_label, False, False) + self.use_template_checkbox = gtk.CheckButton("Use") + self.use_template_checkbox.connect("toggled", self.__use_template_toggled__) + b.pack_end(self.use_template_checkbox, False, False) + self.labelbox[0].pack_start(b, False, False) + self.template_entry = gtk.Entry() + self.template_entry.set_text(self.config.template) + self.labelbox[0].pack_start(self.template_entry, False, False) + b = gtk.HBox(False, 0) + b.pack_start(gtk.Label( +"%N: Count number, use %NN... for zero-padding\ +\n%f: File base name withound suffix\ +\n\nOther %-variables are from strftime(), e.g.:\ +\n%d: Day of month as a decimal number (range 01 to 31)\ +\n%m: Month as a decimal number (01 to 12)\ +\n%y: Year as a decimal number (00 to 99)\ +\netc. (look 'man 3 strftime' for more)")) + self.labelbox[0].pack_start(b, False, False) + + self.use_template_checkbox.set_active(self.config.use_template) + self.use_template_checkbox.toggled() #Performance page for i in xrange(2,7): @@ -147,36 +172,33 @@ class prefsWidget(object): self.labels[i].set_justify(gtk.JUSTIFY_LEFT) self.boxes[i]=gtk.HBox(homogeneous=False, spacing=40) self.boxes[i].pack_start(self.labels[i],expand=False,fill=False) - self.labels[i].show() self.eboxes[i]=gtk.EventBox() self.eboxes[i].add(self.boxes[i]) self.labelbox[1].pack_start(self.eboxes[i],expand=False,fill=False) - self.fpsAdjustment=gtk.Adjustment(value=self.values[0], lower=1, upper=50, step_incr=1, page_incr=5, page_size=0) + self.fpsAdjustment=gtk.Adjustment(value=self.config.fps, 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.fpsSpinButton.show() self.boxes[2].pack_end(self.fpsSpinButton,expand=False,fill=False) + # FIXME: for wtf reason they are comboboxes? They are checkboxes! self.onTheFlyComboBox = gtk.CheckButton(" ") - self.onTheFlyComboBox.set_active(int(not self.values[18])) - self.onTheFlyComboBox.show() + self.onTheFlyComboBox.set_active(int(self.config.on_the_fly_encoding)) + self.onTheFlyComboBox.connect("toggled", self.__on_the_fly_toggled__) self.boxes[3].pack_end(self.onTheFlyComboBox,expand=False,fill=False) self.zeroCmpComboBox = gtk.CheckButton(" ") - self.zeroCmpComboBox.set_active(int(not self.values[19])) - self.zeroCmpComboBox.show() + self.zeroCmpComboBox.set_active(int(not self.config.compress_cache)) self.boxes[4].pack_end(self.zeroCmpComboBox,expand=False,fill=False) self.quickComboBox = gtk.CheckButton(" ") - self.quickComboBox.set_active(int(not self.values[16])) - self.quickComboBox.show() + self.quickComboBox.set_active(int(self.config.quick_subsampling)) self.boxes[5].pack_end(self.quickComboBox,expand=False,fill=False) self.fullComboBox = gtk.CheckButton(" ") - self.fullComboBox.set_active(int(not self.values[3])) - self.fullComboBox.show() + self.fullComboBox.set_active(int(not self.config.full_shots)) self.boxes[6].pack_end(self.fullComboBox,expand=False,fill=False) - + + self.onTheFlyComboBox.toggled() #sound page for i in xrange(7,10): @@ -184,7 +206,6 @@ class prefsWidget(object): 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.eboxes[i]=gtk.EventBox() self.eboxes[i].add(self.boxes[i]) self.labelbox[2].pack_start(self.eboxes[i],expand=False,fill=False) @@ -215,41 +236,30 @@ class prefsWidget(object): - self.jack_button.set_active(self.values[22]) - self.jack_button.show() - self.jack_lsp_label.show() - self.jack_lsp_listview.show() + self.jack_button.set_active(self.config.use_jack) self.jack_scroll.set_size_request(-1,200) - self.jack_scroll.show() - self.jack_lsp_refresh.show() self.jack_ebox=gtk.EventBox() self.jack_ebox.add(self.jack_box) - self.jack_box.show() sep1=gtk.HSeparator() self.labelbox[2].pack_start(sep1,expand=False,fill=False) self.labelbox[2].pack_start(self.jack_ebox,expand=True,fill=True) - sep1.show() - self.jack_ebox.show() - 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.channelsSpinButton.show() + self.channelsAdjustment=gtk.Adjustment(value=self.config.channels, lower=1,upper=2, step_incr=1, page_incr=1, page_size=0) + self.channelsSpinButton=gtk.SpinButton(self.channelsAdjustment, climb_rate=0.5, digits=0) self.boxes[7].pack_end(self.channelsSpinButton,expand=False,fill=False) - self.freqAdjustment=gtk.Adjustment(value=self.values[8], lower=0,upper=48000, step_incr=1, page_incr=100, page_size=0) + self.freqAdjustment=gtk.Adjustment(value=self.config.freq, lower=0,upper=48000, step_incr=1, page_incr=100, page_size=0) self.freqSpinButton= gtk.SpinButton(self.freqAdjustment, climb_rate=0.5, digits=0) - self.freqSpinButton.show() self.boxes[8].pack_end(self.freqSpinButton,expand=False,fill=False) self.deviceEntry= gtk.Entry(max=0) - self.deviceEntry.set_text(self.values[9]) - self.deviceEntry.show() + self.deviceEntry.set_text(self.config.device) self.boxes[9].pack_end(self.deviceEntry,expand=False,fill=False) #misc page @@ -258,71 +268,57 @@ class prefsWidget(object): 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.eboxes[i]=gtk.EventBox() self.eboxes[i].add(self.boxes[i]) self.labelbox[3].pack_start(self.eboxes[i],expand=False,fill=False) self.displayEntry= gtk.Entry(max=0) - self.displayEntry.set_text(self.values[12]) - self.displayEntry.show() + self.displayEntry.set_text(self.config.display) self.boxes[10].pack_end(self.displayEntry,expand=False,fill=False) self.mouseComboBox = gtk.combo_box_new_text() for i in range(4): self.mouseComboBox.append_text(prefMouseStrings[i]) - self.mouseComboBox.set_active(self.values[1]) - self.mouseComboBox.show() + self.mouseComboBox.set_active(self.config.cursor) self.boxes[11].pack_end(self.mouseComboBox,expand=False,fill=False) self.followMouseComboBox = gtk.CheckButton(" ") - self.followMouseComboBox.set_active(int(not self.values[15])) - self.followMouseComboBox.show() + self.followMouseComboBox.set_active(int(self.config.follow_mouse)) self.boxes[12].pack_end(self.followMouseComboBox,expand=False,fill=False) self.sharedComboBox = gtk.CheckButton(" ") - self.sharedComboBox.set_active(int(not self.values[13])) - self.sharedComboBox.show() + self.sharedComboBox.set_active(int(not self.config.no_shared)) self.boxes[13].pack_end(self.sharedComboBox,expand=False,fill=False) self.winDecoComboBox = gtk.CheckButton(" ") - self.winDecoComboBox.set_active(int(not self.values[21])) - self.winDecoComboBox.show() + self.winDecoComboBox.set_active(int(self.config.decorations)) self.boxes[14].pack_end(self.winDecoComboBox,expand=False,fill=False) self.tooltipsComboBox = gtk.CheckButton(" ") - self.tooltipsComboBox.set_active(int(not self.values[24])) - self.tooltipsComboBox.show() + self.tooltipsComboBox.set_active(int(not self.config.tooltips)) self.boxes[15].pack_end(self.tooltipsComboBox,expand=False,fill=False) self.rFrameComboBox = gtk.CheckButton(" ") - self.rFrameComboBox.set_active(int(not self.values[25])) - self.rFrameComboBox.show() + self.rFrameComboBox.set_active(int(not self.config.no_frame)) self.boxes[16].pack_end(self.rFrameComboBox,expand=False,fill=False) self.areaResetComboBox = gtk.CheckButton(" ") - self.areaResetComboBox.set_active(int(not self.values[14])) - self.areaResetComboBox.show() + self.areaResetComboBox.set_active(int(self.config.area_reset)) self.boxes[17].pack_end(self.areaResetComboBox,expand=False,fill=False) self.extraOptsEntry= gtk.Entry(max=0) - self.extraOptsEntry.set_text(self.values[26]) - self.extraOptsEntry.show() + self.extraOptsEntry.set_text(self.config.extra_args) self.boxes[18].pack_end(self.extraOptsEntry,expand=False,fill=False) - for i in range(19): - self.boxes[i].show() - self.eboxes[i].show() - -#append and show +#append for i in range(4): self.notebook.append_page(self.labelbox[i],gtk.Label(prefTabStrings[i])) - self.window.add(self.notebook) - for i in range(4): - self.labelbox[i].show() - self.notebook.show() + box = self.window.get_content_area() + box.set_spacing(10) + + box.add(self.notebook) def which(self,program): import os @@ -366,17 +362,17 @@ class prefsWidget(object): self.ports.append(prefStrings['JackLspS1']) self.ports.append(prefStrings['JackLspS2']) self.jack_lsp_listview.get_selection().set_mode(gtk.SELECTION_NONE) - self.values[23]=[] + self.config.jack_ports=[] k=0 - for i in self.values[23]: + for i in self.config.jack_ports: self.jack_lsp_liststore.append([i]) self.jack_lsp_listview.get_selection().select_path((k,)) k+=1 for i in self.ports: - if i not in self.values[23]: + if i not in self.config.jack_ports: self.jack_lsp_liststore.append([i]) #we are selecting the first one to prevent messing the args - if (not failed) and self.values[23]==[]: + if (not failed) and self.config.jack_ports==[]: self.jack_lsp_listview.get_selection().select_path((0,)) #print self.jack_lsp_listview.get_selection().get_selected_rows() @@ -413,16 +409,28 @@ class prefsWidget(object): self.deviceEntry.set_sensitive(not widget.get_active()) self.jack_lsp_listview.set_sensitive(widget.get_active()) self.jack_lsp_refresh.set_sensitive(widget.get_active()) + + def __use_template_toggled__(self, Event = None): + enabled = self.use_template_checkbox.get_active() + self.template_label.set_sensitive(enabled) + self.template_entry.set_sensitive(enabled) + + def __on_the_fly_toggled__(self, Event = None): + enabled = 1 - self.onTheFlyComboBox.get_active() + self.labels[4].set_sensitive(enabled) + self.zeroCmpComboBox.set_sensitive(enabled) - def __init__(self,parent,values,optionsOpen): - self.values=values + def __init__(self, parent, config): + self.config = config self.ports=[] self.parent=parent - 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: "+smplButtonStrings[0]) + self.window = gtk.Dialog("Preferences", + parent.window, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, + gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) + self.window.set_border_width(5) + self.window.set_resizable(False) self.accel_group = gtk.AccelGroup() self.window.add_accel_group(self.accel_group) @@ -431,12 +439,16 @@ class prefsWidget(object): self.__register_shortcuts__() self.__runJackLSP__() self.__jack_enabled_check__(self.jack_button) - if self.values[24]==0: + if self.config.tooltips==0: self.__tooltips__() - self.window.show() - def main(self): - gtk.main() + def run(self): + self.window.show_all() + res = self.window.run() + if gtk.RESPONSE_ACCEPT == res: + self.apply() + self.window.destroy() + return res diff -Nuarpd -X diff-excludes gtk-recordmydesktop-0.3.8/src/rmdSelectThumb.py gtk-recordmydesktop-patched/src/rmdSelectThumb.py --- gtk-recordmydesktop-0.3.8/src/rmdSelectThumb.py 2012-02-13 12:09:31.058123815 +0400 +++ gtk-recordmydesktop-patched/src/rmdSelectThumb.py 2012-01-25 17:08:44.096077836 +0400 @@ -44,6 +44,7 @@ class GtkThumbSelector(gtk.DrawingArea): self.selecting=0 self.realFrame=None self.caller=caller + self.config=caller.config gtk.DrawingArea.__init__(self) self.set_app_paintable(True) #self.fullscreen() @@ -192,9 +193,9 @@ class GtkThumbSelector(gtk.DrawingArea): 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]