sound support for linux only (with a binder in preferences window)
This commit is contained in:
		
							parent
							
								
									a8a3c615ec
								
							
						
					
					
						commit
						c44861e5b6
					
				
					 3 changed files with 333 additions and 49 deletions
				
			
		| 
						 | 
				
			
			@ -239,6 +239,18 @@ class preference_Window:
 | 
			
		|||
			self.plugin.roster.mkemoticons()
 | 
			
		||||
		else:
 | 
			
		||||
			self.plugin.config['useemoticons'] = 0
 | 
			
		||||
		#sound player
 | 
			
		||||
		self.plugin.config['soundplayer'] = \
 | 
			
		||||
			self.xml.get_widget('entry_soundplayer').get_text()
 | 
			
		||||
		#sounds
 | 
			
		||||
		model = self.sound_tree.get_model()
 | 
			
		||||
		iter = model.get_iter_first()
 | 
			
		||||
		events = []
 | 
			
		||||
		while iter:
 | 
			
		||||
			events.append(model.get_value(iter, 0))
 | 
			
		||||
			events.append(model.get_value(iter, 1))
 | 
			
		||||
			iter = model.iter_next(iter)
 | 
			
		||||
		self.plugin.config['sounds'] = string.join(events, '\t')
 | 
			
		||||
		#autopopup
 | 
			
		||||
		if self.chk_autopp.get_active():
 | 
			
		||||
			self.plugin.config['autopopup'] = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -319,6 +331,44 @@ class preference_Window:
 | 
			
		|||
			model.set(iter, 0, self.plugin.config['msg%s_name' % i], 1, self.plugin.config['msg%s' % i])
 | 
			
		||||
			i += 1
 | 
			
		||||
 | 
			
		||||
	def on_msg_cell_edited(self, cell, row, new_text):
 | 
			
		||||
		model = self.msg_tree.get_model()
 | 
			
		||||
		iter = model.get_iter_from_string(row)
 | 
			
		||||
		model.set_value(iter, 0, new_text)
 | 
			
		||||
 | 
			
		||||
	def on_msg_treeview_cursor_changed(self, widget, data=None):
 | 
			
		||||
		self.xml.get_widget('delete_msg_button').set_sensitive(True)
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		name = model.get_value(iter, 0)
 | 
			
		||||
		msg = model.get_value(iter, 1)
 | 
			
		||||
		buf.set_text(msg)
 | 
			
		||||
 | 
			
		||||
	def on_new_msg_button_clicked(self, widget, data=None):
 | 
			
		||||
		model = self.msg_tree.get_model()
 | 
			
		||||
		iter = model.append()
 | 
			
		||||
		model.set(iter, 0, 'msg', 1, 'message')
 | 
			
		||||
 | 
			
		||||
	def on_delete_msg_button_clicked(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		model.remove(iter)
 | 
			
		||||
		buf.set_text('')
 | 
			
		||||
		self.xml.get_widget('delete_msg_button').set_sensitive(False)
 | 
			
		||||
			
 | 
			
		||||
	def on_msg_textview_changed(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
			return
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		first_iter, end_iter = buf.get_bounds()
 | 
			
		||||
		name = model.get_value(iter, 0)
 | 
			
		||||
		model.set_value(iter, 1, buf.get_text(first_iter, end_iter))
 | 
			
		||||
	
 | 
			
		||||
	def on_msg_treeview_key_press_event(self, widget, event):
 | 
			
		||||
		if event.keyval == gtk.keysyms.Delete:
 | 
			
		||||
			self.on_delete_msg_button_clicked(widget)
 | 
			
		||||
 | 
			
		||||
	def image_is_ok(self, image):
 | 
			
		||||
		if not os.path.exists(image):
 | 
			
		||||
			return 0
 | 
			
		||||
| 
						 | 
				
			
			@ -352,29 +402,11 @@ class preference_Window:
 | 
			
		|||
			iter = model.append()
 | 
			
		||||
			model.set(iter, 0, i, 1,emots[i])
 | 
			
		||||
 | 
			
		||||
	def on_msg_cell_edited(self, cell, row, new_text):
 | 
			
		||||
		model = self.msg_tree.get_model()
 | 
			
		||||
		iter = model.get_iter_from_string(row)
 | 
			
		||||
		model.set_value(iter, 0, new_text)
 | 
			
		||||
 | 
			
		||||
	def on_emot_cell_edited(self, cell, row, new_text):
 | 
			
		||||
		model = self.emot_tree.get_model()
 | 
			
		||||
		iter = model.get_iter_from_string(row)
 | 
			
		||||
		model.set_value(iter, 0, new_text)
 | 
			
		||||
 | 
			
		||||
	def on_msg_treeview_cursor_changed(self, widget, data=None):
 | 
			
		||||
		self.xml.get_widget('delete_msg_button').set_sensitive(True)
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		name = model.get_value(iter, 0)
 | 
			
		||||
		msg = model.get_value(iter, 1)
 | 
			
		||||
		buf.set_text(msg)
 | 
			
		||||
 | 
			
		||||
	def on_new_msg_button_clicked(self, widget, data=None):
 | 
			
		||||
		model = self.msg_tree.get_model()
 | 
			
		||||
		iter = model.append()
 | 
			
		||||
		model.set(iter, 0, 'msg', 1, 'message')
 | 
			
		||||
 | 
			
		||||
	def on_button_emoticons_clicked(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.emot_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
| 
						 | 
				
			
			@ -422,13 +454,6 @@ class preference_Window:
 | 
			
		|||
			self.xml.get_widget('image_emoticon').set_from_file(file)
 | 
			
		||||
			model.set_value(iter, 1, file)
 | 
			
		||||
			
 | 
			
		||||
	def on_delete_msg_button_clicked(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		model.remove(iter)
 | 
			
		||||
		buf.set_text('')
 | 
			
		||||
		self.xml.get_widget('delete_msg_button').set_sensitive(False)
 | 
			
		||||
			
 | 
			
		||||
	def on_button_new_emoticon_clicked(self, widget, data=None):
 | 
			
		||||
		model = self.emot_tree.get_model()
 | 
			
		||||
		iter = model.append()
 | 
			
		||||
| 
						 | 
				
			
			@ -440,15 +465,6 @@ class preference_Window:
 | 
			
		|||
			return
 | 
			
		||||
		model.remove(iter)
 | 
			
		||||
 | 
			
		||||
	def on_msg_textview_changed(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.msg_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
			return
 | 
			
		||||
		buf = self.xml.get_widget('msg_textview').get_buffer()
 | 
			
		||||
		first_iter, end_iter = buf.get_bounds()
 | 
			
		||||
		name = model.get_value(iter, 0)
 | 
			
		||||
		model.set_value(iter, 1, buf.get_text(first_iter, end_iter))
 | 
			
		||||
	
 | 
			
		||||
	def on_treeview_emoticons_cursor_changed(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.emot_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
| 
						 | 
				
			
			@ -462,14 +478,75 @@ class preference_Window:
 | 
			
		|||
		for w in widgets:
 | 
			
		||||
			w.set_sensitive(widget.get_active())
 | 
			
		||||
 | 
			
		||||
	def on_msg_treeview_key_press_event(self, widget, event):
 | 
			
		||||
		if event.keyval == gtk.keysyms.Delete:
 | 
			
		||||
			self.on_delete_msg_button_clicked(widget)
 | 
			
		||||
 | 
			
		||||
	def on_treeview_emoticons_key_press_event(self, widget, event):
 | 
			
		||||
		if event.keyval == gtk.keysyms.Delete:
 | 
			
		||||
			self.on_button_remove_emoticon_clicked(widget)
 | 
			
		||||
 | 
			
		||||
	def sound_is_ok(self, sound):
 | 
			
		||||
		if not os.path.exists(sound):
 | 
			
		||||
			return 0
 | 
			
		||||
		return 1
 | 
			
		||||
 | 
			
		||||
	def fill_sound_treeview(self):
 | 
			
		||||
		eventList = ['message']
 | 
			
		||||
		events = {}
 | 
			
		||||
		split_line = string.split(self.plugin.config['sounds'], '\t')
 | 
			
		||||
		for i in range(0, len(split_line)/2):
 | 
			
		||||
			events[split_line[2*i]] = split_line[2*i+1]
 | 
			
		||||
		model = self.sound_tree.get_model()
 | 
			
		||||
		model.clear()
 | 
			
		||||
		for ev in eventList:
 | 
			
		||||
			if ev in events:
 | 
			
		||||
				iter = model.append()
 | 
			
		||||
				model.set(iter, 0, ev, 1, events[ev])
 | 
			
		||||
 | 
			
		||||
	def on_treeview_sounds_cursor_changed(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.sound_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
			self.xml.get_widget('entry_sounds').set_text('')
 | 
			
		||||
			return
 | 
			
		||||
		str = model.get_value(iter, 1)
 | 
			
		||||
		self.xml.get_widget('entry_sounds').set_text(str)
 | 
			
		||||
 | 
			
		||||
	def on_button_sounds_clicked(self, widget, data=None):
 | 
			
		||||
		(model, iter) = self.sound_tree.get_selection().get_selected()
 | 
			
		||||
		if not iter:
 | 
			
		||||
			return
 | 
			
		||||
		file = model.get_value(iter, 1)
 | 
			
		||||
		dialog = gtk.FileChooserDialog("Choose sound",
 | 
			
		||||
							None,
 | 
			
		||||
							gtk.FILE_CHOOSER_ACTION_OPEN,
 | 
			
		||||
							(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
 | 
			
		||||
							gtk.STOCK_OPEN, gtk.RESPONSE_OK))
 | 
			
		||||
		dialog.set_default_response(gtk.RESPONSE_OK)
 | 
			
		||||
		filter = gtk.FileFilter()
 | 
			
		||||
		filter.set_name("All files")
 | 
			
		||||
		filter.add_pattern("*")
 | 
			
		||||
		dialog.add_filter(filter)
 | 
			
		||||
 | 
			
		||||
		filter = gtk.FileFilter()
 | 
			
		||||
		filter.set_name("Wav Sounds")
 | 
			
		||||
		filter.add_pattern("*.wav")
 | 
			
		||||
		dialog.add_filter(filter)
 | 
			
		||||
		dialog.set_filter(filter)
 | 
			
		||||
 | 
			
		||||
		file = os.path.join(os.getcwd(), file)
 | 
			
		||||
		dialog.set_filename(file)
 | 
			
		||||
		file = ''	
 | 
			
		||||
		ok = 0
 | 
			
		||||
		while(ok == 0):
 | 
			
		||||
			response = dialog.run()
 | 
			
		||||
			if response == gtk.RESPONSE_OK:
 | 
			
		||||
				file = dialog.get_filename()
 | 
			
		||||
				if self.sound_is_ok(file):
 | 
			
		||||
					ok = 1
 | 
			
		||||
			else:
 | 
			
		||||
				ok = 1
 | 
			
		||||
		dialog.destroy()
 | 
			
		||||
		if file:
 | 
			
		||||
			self.xml.get_widget('entry_sounds').set_text(file)
 | 
			
		||||
			model.set_value(iter, 1, file)
 | 
			
		||||
			
 | 
			
		||||
	def __init__(self, plugin):
 | 
			
		||||
		"""Initialize Preference window"""
 | 
			
		||||
		self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Preferences', APP)
 | 
			
		||||
| 
						 | 
				
			
			@ -549,6 +626,26 @@ class preference_Window:
 | 
			
		|||
		col.set_attributes(renderer, text=0)
 | 
			
		||||
		self.fill_emot_treeview()
 | 
			
		||||
 | 
			
		||||
		#sound player
 | 
			
		||||
		self.xml.get_widget('entry_soundplayer').set_text(\
 | 
			
		||||
			self.plugin.config['soundplayer'])
 | 
			
		||||
 | 
			
		||||
		#sounds
 | 
			
		||||
		self.sound_tree = self.xml.get_widget('treeview_sounds')
 | 
			
		||||
		model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
 | 
			
		||||
		self.sound_tree.set_model(model)
 | 
			
		||||
		col = gtk.TreeViewColumn('Event')
 | 
			
		||||
		self.sound_tree.append_column(col)
 | 
			
		||||
		renderer = gtk.CellRendererText()
 | 
			
		||||
		col.pack_start(renderer)
 | 
			
		||||
		col.set_attributes(renderer, text=0)
 | 
			
		||||
		col = gtk.TreeViewColumn('Sound')
 | 
			
		||||
		self.sound_tree.append_column(col)
 | 
			
		||||
		renderer = gtk.CellRendererText()
 | 
			
		||||
		col.pack_start(renderer)
 | 
			
		||||
		col.set_attributes(renderer, text=1)
 | 
			
		||||
		self.fill_sound_treeview()
 | 
			
		||||
		
 | 
			
		||||
		#Autopopup
 | 
			
		||||
		st = self.plugin.config['autopopup']
 | 
			
		||||
		self.chk_autopp.set_active(st)
 | 
			
		||||
| 
						 | 
				
			
			@ -645,18 +742,12 @@ class preference_Window:
 | 
			
		|||
		self.xml.signal_connect('on_cancel_clicked', self.on_cancel)
 | 
			
		||||
		self.xml.signal_connect('on_msg_treeview_cursor_changed', \
 | 
			
		||||
			self.on_msg_treeview_cursor_changed)
 | 
			
		||||
		self.xml.signal_connect('on_treeview_emoticons_cursor_changed', \
 | 
			
		||||
			self.on_treeview_emoticons_cursor_changed)
 | 
			
		||||
		self.xml.signal_connect('on_button_emoticons_clicked', \
 | 
			
		||||
			self.on_button_emoticons_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_new_msg_button_clicked', \
 | 
			
		||||
			self.on_new_msg_button_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_delete_msg_button_clicked', \
 | 
			
		||||
			self.on_delete_msg_button_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_button_new_emoticon_clicked', \
 | 
			
		||||
			self.on_button_new_emoticon_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_button_remove_emoticon_clicked', \
 | 
			
		||||
			self.on_button_remove_emoticon_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_msg_treeview_key_press_event', \
 | 
			
		||||
			self.on_msg_treeview_key_press_event)
 | 
			
		||||
		self.xml.signal_connect('on_chk_autopopup_toggled', \
 | 
			
		||||
			self.on_chk_toggled, [self.chk_autoppaway])
 | 
			
		||||
		self.xml.signal_connect('on_chk_autoaway_toggled', \
 | 
			
		||||
| 
						 | 
				
			
			@ -670,10 +761,20 @@ class preference_Window:
 | 
			
		|||
					self.xml.get_widget('entry_emoticons'),
 | 
			
		||||
					self.xml.get_widget('button_emoticons'),
 | 
			
		||||
					self.xml.get_widget('image_emoticon')])
 | 
			
		||||
		self.xml.signal_connect('on_msg_treeview_key_press_event', \
 | 
			
		||||
			self.on_msg_treeview_key_press_event)
 | 
			
		||||
		self.xml.signal_connect('on_treeview_emoticons_cursor_changed', \
 | 
			
		||||
			self.on_treeview_emoticons_cursor_changed)
 | 
			
		||||
		self.xml.signal_connect('on_button_emoticons_clicked', \
 | 
			
		||||
			self.on_button_emoticons_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_button_new_emoticon_clicked', \
 | 
			
		||||
			self.on_button_new_emoticon_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_button_remove_emoticon_clicked', \
 | 
			
		||||
			self.on_button_remove_emoticon_clicked)
 | 
			
		||||
		self.xml.signal_connect('on_treeview_emoticons_key_press_event', \
 | 
			
		||||
			self.on_treeview_emoticons_key_press_event)
 | 
			
		||||
		self.xml.signal_connect('on_treeview_sounds_cursor_changed', \
 | 
			
		||||
			self.on_treeview_sounds_cursor_changed)
 | 
			
		||||
		self.xml.signal_connect('on_button_sounds_clicked', \
 | 
			
		||||
			self.on_button_sounds_clicked)
 | 
			
		||||
 | 
			
		||||
		self.plugin.send('ASK_CONFIG', None, ('GtkGui', 'Logger', {'lognotsep':1,\
 | 
			
		||||
			'lognotusr':1}))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4678,6 +4678,148 @@ on the server.</property>
 | 
			
		|||
		  <property name="fill">False</property>
 | 
			
		||||
		</packing>
 | 
			
		||||
	      </child>
 | 
			
		||||
 | 
			
		||||
	      <child>
 | 
			
		||||
		<widget class="GtkHSeparator" id="hseparator15">
 | 
			
		||||
		  <property name="visible">True</property>
 | 
			
		||||
		</widget>
 | 
			
		||||
		<packing>
 | 
			
		||||
		  <property name="padding">0</property>
 | 
			
		||||
		  <property name="expand">False</property>
 | 
			
		||||
		  <property name="fill">True</property>
 | 
			
		||||
		</packing>
 | 
			
		||||
	      </child>
 | 
			
		||||
 | 
			
		||||
	      <child>
 | 
			
		||||
		<widget class="GtkHBox" id="hbox2911">
 | 
			
		||||
		  <property name="visible">True</property>
 | 
			
		||||
		  <property name="homogeneous">False</property>
 | 
			
		||||
		  <property name="spacing">5</property>
 | 
			
		||||
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <widget class="GtkLabel" id="label189">
 | 
			
		||||
		      <property name="visible">True</property>
 | 
			
		||||
		      <property name="label" translatable="yes">Sound player :</property>
 | 
			
		||||
		      <property name="use_underline">False</property>
 | 
			
		||||
		      <property name="use_markup">False</property>
 | 
			
		||||
		      <property name="justify">GTK_JUSTIFY_LEFT</property>
 | 
			
		||||
		      <property name="wrap">False</property>
 | 
			
		||||
		      <property name="selectable">False</property>
 | 
			
		||||
		      <property name="xalign">0.5</property>
 | 
			
		||||
		      <property name="yalign">0.5</property>
 | 
			
		||||
		      <property name="xpad">0</property>
 | 
			
		||||
		      <property name="ypad">0</property>
 | 
			
		||||
		    </widget>
 | 
			
		||||
		    <packing>
 | 
			
		||||
		      <property name="padding">0</property>
 | 
			
		||||
		      <property name="expand">False</property>
 | 
			
		||||
		      <property name="fill">False</property>
 | 
			
		||||
		    </packing>
 | 
			
		||||
		  </child>
 | 
			
		||||
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <widget class="GtkEntry" id="entry_soundplayer">
 | 
			
		||||
		      <property name="visible">True</property>
 | 
			
		||||
		      <property name="can_focus">True</property>
 | 
			
		||||
		      <property name="editable">True</property>
 | 
			
		||||
		      <property name="visibility">True</property>
 | 
			
		||||
		      <property name="max_length">0</property>
 | 
			
		||||
		      <property name="text" translatable="yes"></property>
 | 
			
		||||
		      <property name="has_frame">True</property>
 | 
			
		||||
		      <property name="invisible_char">*</property>
 | 
			
		||||
		      <property name="activates_default">False</property>
 | 
			
		||||
		    </widget>
 | 
			
		||||
		    <packing>
 | 
			
		||||
		      <property name="padding">0</property>
 | 
			
		||||
		      <property name="expand">True</property>
 | 
			
		||||
		      <property name="fill">True</property>
 | 
			
		||||
		    </packing>
 | 
			
		||||
		  </child>
 | 
			
		||||
		</widget>
 | 
			
		||||
		<packing>
 | 
			
		||||
		  <property name="padding">0</property>
 | 
			
		||||
		  <property name="expand">False</property>
 | 
			
		||||
		  <property name="fill">True</property>
 | 
			
		||||
		</packing>
 | 
			
		||||
	      </child>
 | 
			
		||||
 | 
			
		||||
	      <child>
 | 
			
		||||
		<widget class="GtkScrolledWindow" id="scrolledwindow29">
 | 
			
		||||
		  <property name="visible">True</property>
 | 
			
		||||
		  <property name="can_focus">True</property>
 | 
			
		||||
		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
			
		||||
		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
			
		||||
		  <property name="shadow_type">GTK_SHADOW_IN</property>
 | 
			
		||||
		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 | 
			
		||||
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <widget class="GtkTreeView" id="treeview_sounds">
 | 
			
		||||
		      <property name="visible">True</property>
 | 
			
		||||
		      <property name="can_focus">True</property>
 | 
			
		||||
		      <property name="headers_visible">True</property>
 | 
			
		||||
		      <property name="rules_hint">False</property>
 | 
			
		||||
		      <property name="reorderable">False</property>
 | 
			
		||||
		      <property name="enable_search">True</property>
 | 
			
		||||
		      <signal name="cursor_changed" handler="on_treeview_sounds_cursor_changed" last_modification_time="Wed, 09 Feb 2005 22:51:36 GMT"/>
 | 
			
		||||
		    </widget>
 | 
			
		||||
		  </child>
 | 
			
		||||
		</widget>
 | 
			
		||||
		<packing>
 | 
			
		||||
		  <property name="padding">0</property>
 | 
			
		||||
		  <property name="expand">True</property>
 | 
			
		||||
		  <property name="fill">True</property>
 | 
			
		||||
		</packing>
 | 
			
		||||
	      </child>
 | 
			
		||||
 | 
			
		||||
	      <child>
 | 
			
		||||
		<widget class="GtkHBox" id="hbox2910">
 | 
			
		||||
		  <property name="visible">True</property>
 | 
			
		||||
		  <property name="homogeneous">False</property>
 | 
			
		||||
		  <property name="spacing">5</property>
 | 
			
		||||
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <widget class="GtkEntry" id="entry_sounds">
 | 
			
		||||
		      <property name="visible">True</property>
 | 
			
		||||
		      <property name="can_focus">True</property>
 | 
			
		||||
		      <property name="editable">True</property>
 | 
			
		||||
		      <property name="visibility">True</property>
 | 
			
		||||
		      <property name="max_length">0</property>
 | 
			
		||||
		      <property name="text" translatable="yes"></property>
 | 
			
		||||
		      <property name="has_frame">True</property>
 | 
			
		||||
		      <property name="invisible_char">*</property>
 | 
			
		||||
		      <property name="activates_default">False</property>
 | 
			
		||||
		    </widget>
 | 
			
		||||
		    <packing>
 | 
			
		||||
		      <property name="padding">0</property>
 | 
			
		||||
		      <property name="expand">True</property>
 | 
			
		||||
		      <property name="fill">True</property>
 | 
			
		||||
		    </packing>
 | 
			
		||||
		  </child>
 | 
			
		||||
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <widget class="GtkButton" id="button_sounds">
 | 
			
		||||
		      <property name="visible">True</property>
 | 
			
		||||
		      <property name="can_focus">True</property>
 | 
			
		||||
		      <property name="label" translatable="yes">...</property>
 | 
			
		||||
		      <property name="use_underline">True</property>
 | 
			
		||||
		      <property name="relief">GTK_RELIEF_NORMAL</property>
 | 
			
		||||
		      <property name="focus_on_click">True</property>
 | 
			
		||||
		      <signal name="clicked" handler="on_button_sounds_clicked" last_modification_time="Wed, 09 Feb 2005 23:29:56 GMT"/>
 | 
			
		||||
		    </widget>
 | 
			
		||||
		    <packing>
 | 
			
		||||
		      <property name="padding">0</property>
 | 
			
		||||
		      <property name="expand">False</property>
 | 
			
		||||
		      <property name="fill">False</property>
 | 
			
		||||
		      <property name="pack_type">GTK_PACK_END</property>
 | 
			
		||||
		    </packing>
 | 
			
		||||
		  </child>
 | 
			
		||||
		</widget>
 | 
			
		||||
		<packing>
 | 
			
		||||
		  <property name="padding">0</property>
 | 
			
		||||
		  <property name="expand">False</property>
 | 
			
		||||
		  <property name="fill">True</property>
 | 
			
		||||
		</packing>
 | 
			
		||||
	      </child>
 | 
			
		||||
	    </widget>
 | 
			
		||||
	    <packing>
 | 
			
		||||
	      <property name="tab_expand">False</property>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ pygtk.require('2.0')
 | 
			
		|||
import gtk
 | 
			
		||||
from gtk import TRUE, FALSE
 | 
			
		||||
import gtk.glade,gobject
 | 
			
		||||
import os,string,time,Queue
 | 
			
		||||
import os,string,time,Queue, sys
 | 
			
		||||
import common.optparser,common.sleepy
 | 
			
		||||
from common import i18n
 | 
			
		||||
_ = i18n._
 | 
			
		||||
| 
						 | 
				
			
			@ -2143,6 +2143,21 @@ class roster_Window:
 | 
			
		|||
#		for state in ('online', 'away', 'xa', 'dnd', 'invisible', 'offline'):
 | 
			
		||||
#			self.xml.get_widget(state).set_image(self.pixbufs[state])
 | 
			
		||||
 | 
			
		||||
	def sound_is_ok(self, sound):
 | 
			
		||||
		if not os.path.exists(sound):
 | 
			
		||||
			return 0
 | 
			
		||||
		return 1
 | 
			
		||||
 | 
			
		||||
	def mkevents(self):
 | 
			
		||||
		"""initialize events array"""
 | 
			
		||||
		self.events = {}
 | 
			
		||||
		split_line = string.split(self.plugin.config['sounds'], '\t')
 | 
			
		||||
		for i in range(0, len(split_line)/2):
 | 
			
		||||
			file = split_line[2*i+1]
 | 
			
		||||
			if not self.sound_is_ok(file):
 | 
			
		||||
				continue
 | 
			
		||||
			self.events[split_line[2*i]] = file
 | 
			
		||||
 | 
			
		||||
	def on_show_off(self, widget):
 | 
			
		||||
		"""when show offline option is changed :
 | 
			
		||||
		redraw the treeview"""
 | 
			
		||||
| 
						 | 
				
			
			@ -2307,6 +2322,7 @@ class roster_Window:
 | 
			
		|||
		self.mkpixbufs()
 | 
			
		||||
		if self.plugin.config['useemoticons']:
 | 
			
		||||
			self.mkemoticons()
 | 
			
		||||
		self.mkevents()
 | 
			
		||||
 | 
			
		||||
		liststore = gtk.ListStore(gobject.TYPE_STRING, gtk.Image)
 | 
			
		||||
		self.cb = gtk.ComboBox()
 | 
			
		||||
| 
						 | 
				
			
			@ -2581,6 +2597,28 @@ class plugin:
 | 
			
		|||
					return a
 | 
			
		||||
			return None
 | 
			
		||||
 | 
			
		||||
	def play_timeout(self, pid):
 | 
			
		||||
		pidp, r = os.waitpid(pid, os.WNOHANG)
 | 
			
		||||
		return 0
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
	def play_sound(self, event):
 | 
			
		||||
		if not self.roster.events.has_key(event):
 | 
			
		||||
			return
 | 
			
		||||
		pid = os.fork()
 | 
			
		||||
		if pid == 0:
 | 
			
		||||
			argv = self.config['soundplayer'].split()
 | 
			
		||||
			argv.append(self.roster.events[event])
 | 
			
		||||
			try: 
 | 
			
		||||
				os.execvp(argv[0], argv)
 | 
			
		||||
			except: 
 | 
			
		||||
				print _("error while running %s :") % string.join(argv, ' '), \
 | 
			
		||||
					sys.exc_info()[1]
 | 
			
		||||
				os._exit(1)
 | 
			
		||||
		pidp, r = os.waitpid(pid, os.WNOHANG)
 | 
			
		||||
		if pidp == 0:
 | 
			
		||||
			gtk.timeout_add(10000, self.play_timeout, pid)
 | 
			
		||||
 | 
			
		||||
	def send(self, event, account, data):
 | 
			
		||||
		self.queueOUT.put((event, account, data))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2671,6 +2709,7 @@ class plugin:
 | 
			
		|||
		jid = string.split(array[0], '/')[0]
 | 
			
		||||
		if string.find(jid, "@") <= 0:
 | 
			
		||||
			jid = string.replace(jid, '@', '')
 | 
			
		||||
		self.play_sound('message')
 | 
			
		||||
		self.roster.on_message(jid, array[1], array[2], account)
 | 
			
		||||
		
 | 
			
		||||
	def handle_event_msgerror(self, account, array):
 | 
			
		||||
| 
						 | 
				
			
			@ -2967,6 +3006,8 @@ class plugin:
 | 
			
		|||
			'usetabbedchat': 0,\
 | 
			
		||||
			'useemoticons': 1,\
 | 
			
		||||
			'emoticons':':-)\tplugins/gtkgui/emoticons/smile.png\t(@)\tplugins/gtkgui/emoticons/pussy.png\t8)\tplugins/gtkgui/emoticons/coolglasses.png\t:(\tplugins/gtkgui/emoticons/unhappy.png\t:)\tplugins/gtkgui/emoticons/smile.png\t(})\tplugins/gtkgui/emoticons/hugleft.png\t:$\tplugins/gtkgui/emoticons/blush.png\t(Y)\tplugins/gtkgui/emoticons/yes.png\t:-@\tplugins/gtkgui/emoticons/angry.png\t:-D\tplugins/gtkgui/emoticons/biggrin.png\t(U)\tplugins/gtkgui/emoticons/brheart.png\t(F)\tplugins/gtkgui/emoticons/flower.png\t:-[\tplugins/gtkgui/emoticons/bat.png\t:>\tplugins/gtkgui/emoticons/biggrin.png\t(T)\tplugins/gtkgui/emoticons/phone.png\t(l)\tplugins/gtkgui/emoticons/heart.png\t:-S\tplugins/gtkgui/emoticons/frowing.png\t:-P\tplugins/gtkgui/emoticons/tongue.png\t(h)\tplugins/gtkgui/emoticons/coolglasses.png\t(D)\tplugins/gtkgui/emoticons/drink.png\t:-O\tplugins/gtkgui/emoticons/oh.png\t(f)\tplugins/gtkgui/emoticons/flower.png\t(C)\tplugins/gtkgui/emoticons/coffee.png\t:-o\tplugins/gtkgui/emoticons/oh.png\t({)\tplugins/gtkgui/emoticons/hugright.png\t(*)\tplugins/gtkgui/emoticons/star.png\tB-)\tplugins/gtkgui/emoticons/coolglasses.png\t(z)\tplugins/gtkgui/emoticons/boy.png\t:-d\tplugins/gtkgui/emoticons/biggrin.png\t(E)\tplugins/gtkgui/emoticons/mail.png\t(N)\tplugins/gtkgui/emoticons/no.png\t(p)\tplugins/gtkgui/emoticons/photo.png\t(K)\tplugins/gtkgui/emoticons/kiss.png\t(r)\tplugins/gtkgui/emoticons/rainbow.png\t:-|\tplugins/gtkgui/emoticons/stare.png\t:-s\tplugins/gtkgui/emoticons/frowing.png\t:-p\tplugins/gtkgui/emoticons/tongue.png\t(c)\tplugins/gtkgui/emoticons/coffee.png\t(e)\tplugins/gtkgui/emoticons/mail.png\t;-)\tplugins/gtkgui/emoticons/wink.png\t;-(\tplugins/gtkgui/emoticons/cry.png\t(6)\tplugins/gtkgui/emoticons/devil.png\t:o\tplugins/gtkgui/emoticons/oh.png\t(L)\tplugins/gtkgui/emoticons/heart.png\t(w)\tplugins/gtkgui/emoticons/brflower.png\t:d\tplugins/gtkgui/emoticons/biggrin.png\t(Z)\tplugins/gtkgui/emoticons/boy.png\t(u)\tplugins/gtkgui/emoticons/brheart.png\t:|\tplugins/gtkgui/emoticons/stare.png\t(P)\tplugins/gtkgui/emoticons/photo.png\t:O\tplugins/gtkgui/emoticons/oh.png\t(R)\tplugins/gtkgui/emoticons/rainbow.png\t(t)\tplugins/gtkgui/emoticons/phone.png\t(i)\tplugins/gtkgui/emoticons/lamp.png\t;)\tplugins/gtkgui/emoticons/wink.png\t;(\tplugins/gtkgui/emoticons/cry.png\t:p\tplugins/gtkgui/emoticons/tongue.png\t(H)\tplugins/gtkgui/emoticons/coolglasses.png\t:s\tplugins/gtkgui/emoticons/frowing.png\t;\'-(\tplugins/gtkgui/emoticons/cry.png\t:-(\tplugins/gtkgui/emoticons/unhappy.png\t:-)\tplugins/gtkgui/emoticons/smile.png\t(b)\tplugins/gtkgui/emoticons/beer.png\t8-)\tplugins/gtkgui/emoticons/coolglasses.png\t(B)\tplugins/gtkgui/emoticons/beer.png\t(W)\tplugins/gtkgui/emoticons/brflower.png\t:D\tplugins/gtkgui/emoticons/biggrin.png\t(y)\tplugins/gtkgui/emoticons/yes.png\t(8)\tplugins/gtkgui/emoticons/music.png\t:@\tplugins/gtkgui/emoticons/angry.png\tB)\tplugins/gtkgui/emoticons/coolglasses.png\t:-$\tplugins/gtkgui/emoticons/blush.png\t:\'(\tplugins/gtkgui/emoticons/cry.png\t(n)\tplugins/gtkgui/emoticons/no.png\t(k)\tplugins/gtkgui/emoticons/kiss.png\t:->\tplugins/gtkgui/emoticons/biggrin.png\t:[\tplugins/gtkgui/emoticons/bat.png\t(I)\tplugins/gtkgui/emoticons/lamp.png\t:P\tplugins/gtkgui/emoticons/tongue.png\t(%)\tplugins/gtkgui/emoticons/cuffs.png\t(d)\tplugins/gtkgui/emoticons/drink.png\t:S\tplugins/gtkgui/emoticons/frowing.png',\
 | 
			
		||||
			'soundplayer': 'play',\
 | 
			
		||||
			'sounds': 'message\tsounds/message.wav',\
 | 
			
		||||
			'x-position': 0,\
 | 
			
		||||
			'y-position': 0,\
 | 
			
		||||
			'width': 150,\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue