All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-10 14:56   ` Takashi Iwai
  2018-08-08 15:56 ` [PATCH - hwmixvolume 2/9] hwmixvolume: switch to GTK+ 3.0 Emmanuel Gil Peyrot
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API
changed quite a lot.

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index ef80bc8..28ce776 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -15,7 +15,10 @@
 # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-import gobject, gtk
+import gi
+gi.require_version('GLib', '2.0')
+gi.require_version('Gtk', '3.0')
+from gi.repository import GLib, Gtk
 from pyalsa import alsacard, alsahcontrol
 
 INTF_PCM = alsahcontrol.interface_id['PCM']
@@ -57,16 +60,16 @@ class Stream:
 		value = alsahcontrol.Value(self.element)
 		value.read()
 		values = value.get_tuple(TYPE_INTEGER, info.count)
-		self.label = gtk.Label(self.get_label(info))
+		self.label = Gtk.Label(self.get_label(info))
 		self.label.set_single_line_mode(True)
 		self.parent.scales_vbox.pack_start(self.label, expand=False)
 		for i in range(info.count):
-			adj = gtk.Adjustment(value=values[i],
+			adj = Gtk.Adjustment(value=values[i],
 					lower=info.min, upper=info.max,
 					step_incr=1,
 					page_incr=(info.max-info.min+1)/8)
 			adj.connect('value-changed', self.update_ctl_from_scale, i)
-			scale = gtk.HScale(adj)
+			scale = Gtk.HScale(adj)
 			scale.set_draw_value(False)
 			self.parent.scales_vbox.pack_start(scale, expand=False)
 			self.scales.append(scale)
@@ -157,7 +160,7 @@ class Stream:
 			f.close()
 		return cmdline.replace('\x00', ' ').strip()
 
-class MixerWindow(gtk.Window):
+class MixerWindow(Gtk.Window):
 	card_numbers = alsacard.card_list()
 	current_card = -1
 	hcontrol = None
@@ -167,21 +170,21 @@ class MixerWindow(gtk.Window):
 	hctl_sources = []
 
 	def __init__(self):
-		gtk.Window.__init__(self)
-		self.connect('destroy', lambda w: gtk.main_quit())
+		Gtk.Window.__init__(self)
+		self.connect('destroy', lambda w: Gtk.main_quit())
 		self.set_title("Hardware Mixer Volumes")
 
-		vbox = gtk.VBox()
+		vbox = Gtk.VBox()
 		self.add(vbox)
 
-		hbox = gtk.HBox()
+		hbox = Gtk.HBox()
 		vbox.pack_start(hbox, expand=False)
 
-		label = gtk.Label("_Sound Card: ")
+		label = Gtk.Label("_Sound Card: ")
 		label.set_use_underline(True)
 		hbox.pack_start(label, expand=False)
 
-		combo = gtk.combo_box_new_text()
+		combo = Gtk.combo_box_new_text()
 		for i in self.card_numbers:
 			str = "%d: %s" % (i, alsacard.card_get_name(i))
 			combo.append_text(str)
@@ -191,23 +194,23 @@ class MixerWindow(gtk.Window):
 		hbox.pack_start(combo)
 		label.set_mnemonic_widget(combo)
 
-		self.lock_check = gtk.CheckButton(label="_Lock Channels")
+		self.lock_check = Gtk.CheckButton(label="_Lock Channels")
 		self.lock_check.set_active(True)
 		vbox.pack_start(self.lock_check, expand=False)
 
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(hscrollbar_policy=gtk.POLICY_NEVER, vscrollbar_policy=gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_NONE)
+		scrollwin = Gtk.ScrolledWindow()
+		scrollwin.set_policy(hscrollbar_policy=Gtk.POLICY_NEVER, vscrollbar_policy=Gtk.POLICY_AUTOMATIC)
+		scrollwin.set_shadow_type(Gtk.SHADOW_NONE)
 		vbox.pack_start(scrollwin)
 
-		self.scales_vbox = gtk.VBox()
+		self.scales_vbox = Gtk.VBox()
 		scrollwin.add_with_viewport(self.scales_vbox)
 
-		label = gtk.Label()
+		label = Gtk.Label()
 		label.set_single_line_mode(True)
 		line_height = label.size_request()[1]
 		label.destroy()
-		scale = gtk.HScale()
+		scale = Gtk.HScale()
 		scale.set_draw_value(False)
 		line_height += scale.size_request()[1]
 		scale.destroy()
@@ -223,7 +226,7 @@ class MixerWindow(gtk.Window):
 
 	def change_card(self, cardnum):
 		for s in self.hctl_sources:
-			gobject.source_remove(s)
+			GLib.source_remove(s)
 		self.hctl_sources = []
 
 		self.hcontrol = self.open_hcontrol_for_card(cardnum)
@@ -249,7 +252,7 @@ class MixerWindow(gtk.Window):
 			self.streams.append(stream)
 
 		for fd,condition in self.hcontrol.poll_fds:
-			self.hctl_sources.append(gobject.io_add_watch(fd, condition, self.hctl_io_callback))
+			self.hctl_sources.append(GLib.io_add_watch(fd, condition, self.hctl_io_callback))
 
 		self.update_msg_label()
 
@@ -267,7 +270,7 @@ class MixerWindow(gtk.Window):
 			else:
 				msg = "This card does not have stream controls."
 			if not has_msg:
-				self.msg_label = gtk.Label(msg)
+				self.msg_label = Gtk.Label(msg)
 				self.scales_vbox.pack_start(self.msg_label)
 				self.scales_vbox.show_all()
 			elif self.msg_label.get_text() != msg:
@@ -280,9 +283,9 @@ class MixerWindow(gtk.Window):
 					mode=alsahcontrol.open_mode['NONBLOCK'])
 		except:
 			# TODO: alsa error msg
-			dlg = gtk.MessageDialog(self,
-					gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-					gtk.MESSAGE_ERROR, gtk.BUTTONS_OK,
+			dlg = Gtk.MessageDialog(self,
+					Gtk.DIALOG_MODAL | Gtk.DIALOG_DESTROY_WITH_PARENT,
+					Gtk.MESSAGE_ERROR, Gtk.BUTTONS_OK,
 					"Cannot open sound card control device.")
 			dlg.run()
 			dlg.destroy()
@@ -304,7 +307,7 @@ class MixerWindow(gtk.Window):
 
 def main():
 	MixerWindow()
-	gtk.main()
+	Gtk.main()
 
 main()
 
-- 
2.18.0

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 2/9] hwmixvolume: switch to GTK+ 3.0
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
  2018-08-08 15:56 ` [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 3/9] hwmixvolume: use four spaces instead of one tab for indent Emmanuel Gil Peyrot
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index 28ce776..039ca17 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -62,7 +62,7 @@ class Stream:
 		values = value.get_tuple(TYPE_INTEGER, info.count)
 		self.label = Gtk.Label(self.get_label(info))
 		self.label.set_single_line_mode(True)
-		self.parent.scales_vbox.pack_start(self.label, expand=False)
+		self.parent.scales_vbox.add(self.label)
 		for i in range(info.count):
 			adj = Gtk.Adjustment(value=values[i],
 					lower=info.min, upper=info.max,
@@ -71,7 +71,7 @@ class Stream:
 			adj.connect('value-changed', self.update_ctl_from_scale, i)
 			scale = Gtk.HScale(adj)
 			scale.set_draw_value(False)
-			self.parent.scales_vbox.pack_start(scale, expand=False)
+			self.parent.scales_vbox.add(scale)
 			self.scales.append(scale)
 			self.adjustments.append(adj)
 		self.parent.scales_vbox.show_all()
@@ -174,45 +174,48 @@ class MixerWindow(Gtk.Window):
 		self.connect('destroy', lambda w: Gtk.main_quit())
 		self.set_title("Hardware Mixer Volumes")
 
-		vbox = Gtk.VBox()
+		vbox = Gtk.Grid()
+		vbox.set_orientation(Gtk.Orientation.VERTICAL)
 		self.add(vbox)
 
-		hbox = Gtk.HBox()
-		vbox.pack_start(hbox, expand=False)
+		hbox = Gtk.Grid()
+		vbox.add(hbox)
 
-		label = Gtk.Label("_Sound Card: ")
-		label.set_use_underline(True)
-		hbox.pack_start(label, expand=False)
+		label = Gtk.Label.new_with_mnemonic("_Sound Card: ")
+		hbox.add(label)
 
-		combo = Gtk.combo_box_new_text()
+		combo = Gtk.ComboBoxText()
+		combo.set_hexpand(True)
 		for i in self.card_numbers:
 			str = "%d: %s" % (i, alsacard.card_get_name(i))
 			combo.append_text(str)
 		if len(self.card_numbers) > 0:
 			combo.set_active(0)
 		combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
-		hbox.pack_start(combo)
+		hbox.add(combo)
 		label.set_mnemonic_widget(combo)
 
-		self.lock_check = Gtk.CheckButton(label="_Lock Channels")
+		self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels")
 		self.lock_check.set_active(True)
-		vbox.pack_start(self.lock_check, expand=False)
+		vbox.add(self.lock_check)
 
 		scrollwin = Gtk.ScrolledWindow()
-		scrollwin.set_policy(hscrollbar_policy=Gtk.POLICY_NEVER, vscrollbar_policy=Gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(Gtk.SHADOW_NONE)
-		vbox.pack_start(scrollwin)
+		scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
+		scrollwin.set_shadow_type(Gtk.ShadowType.NONE)
+		scrollwin.set_vexpand(True)
+		vbox.add(scrollwin)
 
-		self.scales_vbox = Gtk.VBox()
+		self.scales_vbox = Gtk.Grid()
+		self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL)
 		scrollwin.add_with_viewport(self.scales_vbox)
 
 		label = Gtk.Label()
 		label.set_single_line_mode(True)
-		line_height = label.size_request()[1]
+		line_height = label.size_request().height
 		label.destroy()
 		scale = Gtk.HScale()
 		scale.set_draw_value(False)
-		line_height += scale.size_request()[1]
+		line_height += scale.size_request().height
 		scale.destroy()
 		# always have space for at least four sliders
 		scrollwin.set_size_request(width=-1, height=line_height*4+4)
@@ -252,7 +255,7 @@ class MixerWindow(Gtk.Window):
 			self.streams.append(stream)
 
 		for fd,condition in self.hcontrol.poll_fds:
-			self.hctl_sources.append(GLib.io_add_watch(fd, condition, self.hctl_io_callback))
+			self.hctl_sources.append(GLib.io_add_watch(fd, 0, GLib.IOCondition(condition), self.hctl_io_callback))
 
 		self.update_msg_label()
 
@@ -271,7 +274,8 @@ class MixerWindow(Gtk.Window):
 				msg = "This card does not have stream controls."
 			if not has_msg:
 				self.msg_label = Gtk.Label(msg)
-				self.scales_vbox.pack_start(self.msg_label)
+				self.msg_label.set_vexpand(True)
+				self.scales_vbox.add(self.msg_label)
 				self.scales_vbox.show_all()
 			elif self.msg_label.get_text() != msg:
 				self.msg_label.set_text(msg)
@@ -284,8 +288,8 @@ class MixerWindow(Gtk.Window):
 		except:
 			# TODO: alsa error msg
 			dlg = Gtk.MessageDialog(self,
-					Gtk.DIALOG_MODAL | Gtk.DIALOG_DESTROY_WITH_PARENT,
-					Gtk.MESSAGE_ERROR, Gtk.BUTTONS_OK,
+					Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+					Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
 					"Cannot open sound card control device.")
 			dlg.run()
 			dlg.destroy()
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 3/9] hwmixvolume: use four spaces instead of one tab for indent
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
  2018-08-08 15:56 ` [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 2/9] hwmixvolume: switch to GTK+ 3.0 Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files Emmanuel Gil Peyrot
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index 039ca17..267228c 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -29,289 +29,289 @@ EVENT_INFO = alsahcontrol.event_mask['INFO']
 EVENT_REMOVE = alsahcontrol.event_mask_remove
 
 class Stream:
-	def __init__(self, element, parent):
-		self.element = element
-		self.element.set_callback(self)
-		self.parent = parent
-		self.label = None
-		self.scales = []
-		self.adjustments = []
-		self.callback(self.element, EVENT_INFO)
-
-	def destroy(self):
-		self.deactivate()
-
-	def callback(self, e, mask):
-		if mask == EVENT_REMOVE:
-			self.deactivate()
-		elif (mask & EVENT_INFO) != 0:
-			info = alsahcontrol.Info(self.element)
-			if info.is_inactive:
-				self.deactivate()
-			else:
-				self.activate()
-		elif (mask & EVENT_VALUE) != 0:
-			self.update_scales_from_ctl()
-
-	def activate(self):
-		if self.label:
-			return
-		info = alsahcontrol.Info(self.element)
-		value = alsahcontrol.Value(self.element)
-		value.read()
-		values = value.get_tuple(TYPE_INTEGER, info.count)
-		self.label = Gtk.Label(self.get_label(info))
-		self.label.set_single_line_mode(True)
-		self.parent.scales_vbox.add(self.label)
-		for i in range(info.count):
-			adj = Gtk.Adjustment(value=values[i],
-					lower=info.min, upper=info.max,
-					step_incr=1,
-					page_incr=(info.max-info.min+1)/8)
-			adj.connect('value-changed', self.update_ctl_from_scale, i)
-			scale = Gtk.HScale(adj)
-			scale.set_draw_value(False)
-			self.parent.scales_vbox.add(scale)
-			self.scales.append(scale)
-			self.adjustments.append(adj)
-		self.parent.scales_vbox.show_all()
-		self.parent.update_msg_label()
-
-	def deactivate(self):
-		if not self.label:
-			return
-		self.label.destroy()
-		for s in self.scales:
-			s.destroy()
-		self.label = None
-		self.scales = []
-		self.adjustments = []
-		self.parent.update_msg_label()
-
-	def update_scales_from_ctl(self):
-		if not self.label:
-			return
-		count = len(self.adjustments)
-		value = alsahcontrol.Value(self.element)
-		value.read()
-		values = value.get_tuple(TYPE_INTEGER, count)
-		for i in range(count):
-			self.adjustments[i].set_value(values[i])
-
-	def update_ctl_from_scale(self, adj, index):
-		scale_value = adj.get_value()
-		value_to_set = int(round(adj.get_value()))
-		count = len(self.adjustments)
-		value = alsahcontrol.Value(self.element)
-		if self.parent.lock_check.get_active():
-			values = [value_to_set  for i in range(count)]
-		else:
-			value.read()
-			values = value.get_array(TYPE_INTEGER, count)
-			values[index] = value_to_set
-		value.set_array(TYPE_INTEGER, values)
-		value.write()
-		if value_to_set != scale_value:
-			adj.set_value(value_to_set)
-
-	def get_label(self, info):
-		pid = self.get_pid(info)
-		if pid:
-			cmdline = self.get_pid_cmdline(pid)
-			if cmdline:
-				return cmdline
-			else:
-				return "PID %d" % pid
-		else:
-			name = info.name
-			if name[-7:] == " Volume":
-				name = name[:-7]
-			if name[-9:] == " Playback":
-				name = name[:-9]
-			return name
-
-	def get_pid(self, info):
-		card = self.parent.current_card
-		device = info.device
-		subdevice = info.subdevice
-		if subdevice == 0:
-			subdevice = info.index
-		filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
-		try:
-			f = open(filename, "r")
-		except IOError:
-			return None
-		try:
-			for line in f.readlines():
-				if line[:9] == "owner_pid":
-					return int(line.split(':')[1].strip())
-		finally:
-			f.close()
-		return None
-
-	def get_pid_cmdline(self, pid):
-		try:
-			f = open("/proc/%d/cmdline" % pid, "r")
-		except IOError:
-			return None
-		try:
-			cmdline = f.read()
-		finally:
-			f.close()
-		return cmdline.replace('\x00', ' ').strip()
+    def __init__(self, element, parent):
+        self.element = element
+        self.element.set_callback(self)
+        self.parent = parent
+        self.label = None
+        self.scales = []
+        self.adjustments = []
+        self.callback(self.element, EVENT_INFO)
+
+    def destroy(self):
+        self.deactivate()
+
+    def callback(self, e, mask):
+        if mask == EVENT_REMOVE:
+            self.deactivate()
+        elif (mask & EVENT_INFO) != 0:
+            info = alsahcontrol.Info(self.element)
+            if info.is_inactive:
+                self.deactivate()
+            else:
+                self.activate()
+        elif (mask & EVENT_VALUE) != 0:
+            self.update_scales_from_ctl()
+
+    def activate(self):
+        if self.label:
+            return
+        info = alsahcontrol.Info(self.element)
+        value = alsahcontrol.Value(self.element)
+        value.read()
+        values = value.get_tuple(TYPE_INTEGER, info.count)
+        self.label = Gtk.Label(self.get_label(info))
+        self.label.set_single_line_mode(True)
+        self.parent.scales_vbox.add(self.label)
+        for i in range(info.count):
+            adj = Gtk.Adjustment(value=values[i],
+                    lower=info.min, upper=info.max,
+                    step_incr=1,
+                    page_incr=(info.max-info.min+1)/8)
+            adj.connect('value-changed', self.update_ctl_from_scale, i)
+            scale = Gtk.HScale(adj)
+            scale.set_draw_value(False)
+            self.parent.scales_vbox.add(scale)
+            self.scales.append(scale)
+            self.adjustments.append(adj)
+        self.parent.scales_vbox.show_all()
+        self.parent.update_msg_label()
+
+    def deactivate(self):
+        if not self.label:
+            return
+        self.label.destroy()
+        for s in self.scales:
+            s.destroy()
+        self.label = None
+        self.scales = []
+        self.adjustments = []
+        self.parent.update_msg_label()
+
+    def update_scales_from_ctl(self):
+        if not self.label:
+            return
+        count = len(self.adjustments)
+        value = alsahcontrol.Value(self.element)
+        value.read()
+        values = value.get_tuple(TYPE_INTEGER, count)
+        for i in range(count):
+            self.adjustments[i].set_value(values[i])
+
+    def update_ctl_from_scale(self, adj, index):
+        scale_value = adj.get_value()
+        value_to_set = int(round(adj.get_value()))
+        count = len(self.adjustments)
+        value = alsahcontrol.Value(self.element)
+        if self.parent.lock_check.get_active():
+            values = [value_to_set  for i in range(count)]
+        else:
+            value.read()
+            values = value.get_array(TYPE_INTEGER, count)
+            values[index] = value_to_set
+        value.set_array(TYPE_INTEGER, values)
+        value.write()
+        if value_to_set != scale_value:
+            adj.set_value(value_to_set)
+
+    def get_label(self, info):
+        pid = self.get_pid(info)
+        if pid:
+            cmdline = self.get_pid_cmdline(pid)
+            if cmdline:
+                return cmdline
+            else:
+                return "PID %d" % pid
+        else:
+            name = info.name
+            if name[-7:] == " Volume":
+                name = name[:-7]
+            if name[-9:] == " Playback":
+                name = name[:-9]
+            return name
+
+    def get_pid(self, info):
+        card = self.parent.current_card
+        device = info.device
+        subdevice = info.subdevice
+        if subdevice == 0:
+            subdevice = info.index
+        filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
+        try:
+            f = open(filename, "r")
+        except IOError:
+            return None
+        try:
+            for line in f.readlines():
+                if line[:9] == "owner_pid":
+                    return int(line.split(':')[1].strip())
+        finally:
+            f.close()
+        return None
+
+    def get_pid_cmdline(self, pid):
+        try:
+            f = open("/proc/%d/cmdline" % pid, "r")
+        except IOError:
+            return None
+        try:
+            cmdline = f.read()
+        finally:
+            f.close()
+        return cmdline.replace('\x00', ' ').strip()
 
 class MixerWindow(Gtk.Window):
-	card_numbers = alsacard.card_list()
-	current_card = -1
-	hcontrol = None
-	scales_vbox = None
-	msg_label = None
-	streams = []
-	hctl_sources = []
-
-	def __init__(self):
-		Gtk.Window.__init__(self)
-		self.connect('destroy', lambda w: Gtk.main_quit())
-		self.set_title("Hardware Mixer Volumes")
-
-		vbox = Gtk.Grid()
-		vbox.set_orientation(Gtk.Orientation.VERTICAL)
-		self.add(vbox)
-
-		hbox = Gtk.Grid()
-		vbox.add(hbox)
-
-		label = Gtk.Label.new_with_mnemonic("_Sound Card: ")
-		hbox.add(label)
-
-		combo = Gtk.ComboBoxText()
-		combo.set_hexpand(True)
-		for i in self.card_numbers:
-			str = "%d: %s" % (i, alsacard.card_get_name(i))
-			combo.append_text(str)
-		if len(self.card_numbers) > 0:
-			combo.set_active(0)
-		combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
-		hbox.add(combo)
-		label.set_mnemonic_widget(combo)
-
-		self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels")
-		self.lock_check.set_active(True)
-		vbox.add(self.lock_check)
-
-		scrollwin = Gtk.ScrolledWindow()
-		scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
-		scrollwin.set_shadow_type(Gtk.ShadowType.NONE)
-		scrollwin.set_vexpand(True)
-		vbox.add(scrollwin)
-
-		self.scales_vbox = Gtk.Grid()
-		self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL)
-		scrollwin.add_with_viewport(self.scales_vbox)
-
-		label = Gtk.Label()
-		label.set_single_line_mode(True)
-		line_height = label.size_request().height
-		label.destroy()
-		scale = Gtk.HScale()
-		scale.set_draw_value(False)
-		line_height += scale.size_request().height
-		scale.destroy()
-		# always have space for at least four sliders
-		scrollwin.set_size_request(width=-1, height=line_height*4+4)
-
-		# TODO: select the default card or the first card with stream controls
-		if len(self.card_numbers) > 0:
-			self.change_card(self.card_numbers[0])
-		self.update_msg_label()
-
-		self.show_all()
-
-	def change_card(self, cardnum):
-		for s in self.hctl_sources:
-			GLib.source_remove(s)
-		self.hctl_sources = []
-
-		self.hcontrol = self.open_hcontrol_for_card(cardnum)
-
-		for s in self.streams:
-			s.destroy()
-		self.streams = []
-
-		self.current_card = cardnum
-
-		if not self.hcontrol:
-			self.update_msg_label()
-			return
-
-		for id in self.hcontrol.list():
-			if not self.is_stream_elem(id):
-				continue
-			elem = alsahcontrol.Element(self.hcontrol, id[0])
-			info = alsahcontrol.Info(elem)
-			if not self.is_stream_info(info):
-				continue
-			stream = Stream(elem, self)
-			self.streams.append(stream)
-
-		for fd,condition in self.hcontrol.poll_fds:
-			self.hctl_sources.append(GLib.io_add_watch(fd, 0, GLib.IOCondition(condition), self.hctl_io_callback))
-
-		self.update_msg_label()
-
-		self.scales_vbox.show_all()
-
-	def update_msg_label(self):
-		needs_msg = len(self.scales_vbox.get_children()) < 2
-		has_msg = self.msg_label
-		if has_msg and not needs_msg:
-			self.msg_label.destroy()
-			self.msg_label = None
-		elif needs_msg:
-			if len(self.streams) > 0:
-				msg = "There are no open streams."
-			else:
-				msg = "This card does not have stream controls."
-			if not has_msg:
-				self.msg_label = Gtk.Label(msg)
-				self.msg_label.set_vexpand(True)
-				self.scales_vbox.add(self.msg_label)
-				self.scales_vbox.show_all()
-			elif self.msg_label.get_text() != msg:
-				self.msg_label.set_text(msg)
-
-	def open_hcontrol_for_card(self, cardnum):
-		devname = "hw:CARD=" + str(cardnum)
-		try:
-			hc = alsahcontrol.HControl(name=devname,
-					mode=alsahcontrol.open_mode['NONBLOCK'])
-		except:
-			# TODO: alsa error msg
-			dlg = Gtk.MessageDialog(self,
-					Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
-					Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
-					"Cannot open sound card control device.")
-			dlg.run()
-			dlg.destroy()
-			return None
-		return hc
-
-	def is_stream_elem(self, id):
-		return ((id[1] == INTF_PCM and
-			 id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or
-			(id[1] == INTF_MIXER and
-			 id[4] == "VIA DXS Playback Volume"))
-
-	def is_stream_info(self, info):
-		return info.is_readable and info.is_writable and info.type == TYPE_INTEGER
-
-	def hctl_io_callback(self, source, condition):
-		self.hcontrol.handle_events()
-		return True
+    card_numbers = alsacard.card_list()
+    current_card = -1
+    hcontrol = None
+    scales_vbox = None
+    msg_label = None
+    streams = []
+    hctl_sources = []
+
+    def __init__(self):
+        Gtk.Window.__init__(self)
+        self.connect('destroy', lambda w: Gtk.main_quit())
+        self.set_title("Hardware Mixer Volumes")
+
+        vbox = Gtk.Grid()
+        vbox.set_orientation(Gtk.Orientation.VERTICAL)
+        self.add(vbox)
+
+        hbox = Gtk.Grid()
+        vbox.add(hbox)
+
+        label = Gtk.Label.new_with_mnemonic("_Sound Card: ")
+        hbox.add(label)
+
+        combo = Gtk.ComboBoxText()
+        combo.set_hexpand(True)
+        for i in self.card_numbers:
+            str = "%d: %s" % (i, alsacard.card_get_name(i))
+            combo.append_text(str)
+        if len(self.card_numbers) > 0:
+            combo.set_active(0)
+        combo.connect('changed', lambda c: self.change_card(self.card_numbers[combo.get_active()]))
+        hbox.add(combo)
+        label.set_mnemonic_widget(combo)
+
+        self.lock_check = Gtk.CheckButton.new_with_mnemonic(label="_Lock Channels")
+        self.lock_check.set_active(True)
+        vbox.add(self.lock_check)
+
+        scrollwin = Gtk.ScrolledWindow()
+        scrollwin.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
+        scrollwin.set_shadow_type(Gtk.ShadowType.NONE)
+        scrollwin.set_vexpand(True)
+        vbox.add(scrollwin)
+
+        self.scales_vbox = Gtk.Grid()
+        self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL)
+        scrollwin.add_with_viewport(self.scales_vbox)
+
+        label = Gtk.Label()
+        label.set_single_line_mode(True)
+        line_height = label.size_request().height
+        label.destroy()
+        scale = Gtk.HScale()
+        scale.set_draw_value(False)
+        line_height += scale.size_request().height
+        scale.destroy()
+        # always have space for at least four sliders
+        scrollwin.set_size_request(width=-1, height=line_height*4+4)
+
+        # TODO: select the default card or the first card with stream controls
+        if len(self.card_numbers) > 0:
+            self.change_card(self.card_numbers[0])
+        self.update_msg_label()
+
+        self.show_all()
+
+    def change_card(self, cardnum):
+        for s in self.hctl_sources:
+            GLib.source_remove(s)
+        self.hctl_sources = []
+
+        self.hcontrol = self.open_hcontrol_for_card(cardnum)
+
+        for s in self.streams:
+            s.destroy()
+        self.streams = []
+
+        self.current_card = cardnum
+
+        if not self.hcontrol:
+            self.update_msg_label()
+            return
+
+        for id in self.hcontrol.list():
+            if not self.is_stream_elem(id):
+                continue
+            elem = alsahcontrol.Element(self.hcontrol, id[0])
+            info = alsahcontrol.Info(elem)
+            if not self.is_stream_info(info):
+                continue
+            stream = Stream(elem, self)
+            self.streams.append(stream)
+
+        for fd,condition in self.hcontrol.poll_fds:
+            self.hctl_sources.append(GLib.io_add_watch(fd, 0, GLib.IOCondition(condition), self.hctl_io_callback))
+
+        self.update_msg_label()
+
+        self.scales_vbox.show_all()
+
+    def update_msg_label(self):
+        needs_msg = len(self.scales_vbox.get_children()) < 2
+        has_msg = self.msg_label
+        if has_msg and not needs_msg:
+            self.msg_label.destroy()
+            self.msg_label = None
+        elif needs_msg:
+            if len(self.streams) > 0:
+                msg = "There are no open streams."
+            else:
+                msg = "This card does not have stream controls."
+            if not has_msg:
+                self.msg_label = Gtk.Label(msg)
+                self.msg_label.set_vexpand(True)
+                self.scales_vbox.add(self.msg_label)
+                self.scales_vbox.show_all()
+            elif self.msg_label.get_text() != msg:
+                self.msg_label.set_text(msg)
+
+    def open_hcontrol_for_card(self, cardnum):
+        devname = "hw:CARD=" + str(cardnum)
+        try:
+            hc = alsahcontrol.HControl(name=devname,
+                    mode=alsahcontrol.open_mode['NONBLOCK'])
+        except:
+            # TODO: alsa error msg
+            dlg = Gtk.MessageDialog(self,
+                    Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                    Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
+                    "Cannot open sound card control device.")
+            dlg.run()
+            dlg.destroy()
+            return None
+        return hc
+
+    def is_stream_elem(self, id):
+        return ((id[1] == INTF_PCM and
+                 id[4] in ("PCM Playback Volume", "EMU10K1 PCM Volume")) or
+                (id[1] == INTF_MIXER and
+                 id[4] == "VIA DXS Playback Volume"))
+
+    def is_stream_info(self, info):
+        return info.is_readable and info.is_writable and info.type == TYPE_INTEGER
+
+    def hctl_io_callback(self, source, condition):
+        self.hcontrol.handle_events()
+        return True
 
 def main():
-	MixerWindow()
-	Gtk.main()
+    MixerWindow()
+    Gtk.main()
 
 main()
 
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (2 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 3/9] hwmixvolume: use four spaces instead of one tab for indent Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-14  3:59   ` Takashi Sakamoto
  2018-08-08 15:56 ` [PATCH - hwmixvolume 5/9] hwmixvolume: replace deprecated Gtk.HScale with Gtk.Scale Emmanuel Gil Peyrot
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index 267228c..e82f32d 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -138,26 +138,20 @@ class Stream:
             subdevice = info.index
         filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
         try:
-            f = open(filename, "r")
+            with open(filename, "r") as f:
+                for line in f.readlines():
+                    if line[:9] == "owner_pid":
+                        return int(line.split(':')[1].strip())
         except IOError:
             return None
-        try:
-            for line in f.readlines():
-                if line[:9] == "owner_pid":
-                    return int(line.split(':')[1].strip())
-        finally:
-            f.close()
         return None
 
     def get_pid_cmdline(self, pid):
         try:
-            f = open("/proc/%d/cmdline" % pid, "r")
+            with open("/proc/%d/cmdline" % pid, "r") as f:
+                cmdline = f.read()
         except IOError:
             return None
-        try:
-            cmdline = f.read()
-        finally:
-            f.close()
         return cmdline.replace('\x00', ' ').strip()
 
 class MixerWindow(Gtk.Window):
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 5/9] hwmixvolume: replace deprecated Gtk.HScale with Gtk.Scale
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (3 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 6/9] hwmixvolume: fix deprecation warnings given by G_ENABLE_DIAGNOSTIC=1 Emmanuel Gil Peyrot
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index e82f32d..af0c1e0 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -69,7 +69,7 @@ class Stream:
                     step_incr=1,
                     page_incr=(info.max-info.min+1)/8)
             adj.connect('value-changed', self.update_ctl_from_scale, i)
-            scale = Gtk.HScale(adj)
+            scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj)
             scale.set_draw_value(False)
             self.parent.scales_vbox.add(scale)
             self.scales.append(scale)
@@ -207,7 +207,7 @@ class MixerWindow(Gtk.Window):
         label.set_single_line_mode(True)
         line_height = label.size_request().height
         label.destroy()
-        scale = Gtk.HScale()
+        scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL)
         scale.set_draw_value(False)
         line_height += scale.size_request().height
         scale.destroy()
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 6/9] hwmixvolume: fix deprecation warnings given by G_ENABLE_DIAGNOSTIC=1
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (4 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 5/9] hwmixvolume: replace deprecated Gtk.HScale with Gtk.Scale Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 7/9] hwmixvolume: switch the shebang to python, as it is now compatible with both 2 and 3 Emmanuel Gil Peyrot
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index af0c1e0..ec2d05d 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -60,7 +60,7 @@ class Stream:
         value = alsahcontrol.Value(self.element)
         value.read()
         values = value.get_tuple(TYPE_INTEGER, info.count)
-        self.label = Gtk.Label(self.get_label(info))
+        self.label = Gtk.Label.new(self.get_label(info))
         self.label.set_single_line_mode(True)
         self.parent.scales_vbox.add(self.label)
         for i in range(info.count):
@@ -201,15 +201,15 @@ class MixerWindow(Gtk.Window):
 
         self.scales_vbox = Gtk.Grid()
         self.scales_vbox.set_orientation(Gtk.Orientation.VERTICAL)
-        scrollwin.add_with_viewport(self.scales_vbox)
+        scrollwin.add(self.scales_vbox)
 
         label = Gtk.Label()
         label.set_single_line_mode(True)
-        line_height = label.size_request().height
+        line_height = max(label.get_size_request().height, 0)
         label.destroy()
         scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL)
         scale.set_draw_value(False)
-        line_height += scale.size_request().height
+        line_height += max(scale.get_size_request().height, 0)
         scale.destroy()
         # always have space for at least four sliders
         scrollwin.set_size_request(width=-1, height=line_height*4+4)
@@ -267,7 +267,7 @@ class MixerWindow(Gtk.Window):
             else:
                 msg = "This card does not have stream controls."
             if not has_msg:
-                self.msg_label = Gtk.Label(msg)
+                self.msg_label = Gtk.Label.new(msg)
                 self.msg_label.set_vexpand(True)
                 self.scales_vbox.add(self.msg_label)
                 self.scales_vbox.show_all()
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 7/9] hwmixvolume: switch the shebang to python, as it is now compatible with both 2 and 3
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (5 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 6/9] hwmixvolume: fix deprecation warnings given by G_ENABLE_DIAGNOSTIC=1 Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 8/9] hwmixvolume: add my copyright Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README Emmanuel Gil Peyrot
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index ec2d05d..7b90613 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -1,4 +1,4 @@
-#!/usr/bin/python2
+#!/usr/bin/env python
 
 # hwmixvolume - ALSA hardware mixer volume control applet
 # Copyright (c) 2009-2010 Clemens Ladisch
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 8/9] hwmixvolume: add my copyright
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (6 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 7/9] hwmixvolume: switch the shebang to python, as it is now compatible with both 2 and 3 Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-08 15:56 ` [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README Emmanuel Gil Peyrot
  8 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
index 7b90613..c34904e 100755
--- a/hwmixvolume/hwmixvolume
+++ b/hwmixvolume/hwmixvolume
@@ -2,6 +2,7 @@
 
 # hwmixvolume - ALSA hardware mixer volume control applet
 # Copyright (c) 2009-2010 Clemens Ladisch
+# Copyright (c) 2018 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
 #
 # Permission to use, copy, modify, and/or distribute this software for any
 # purpose with or without fee is hereby granted, provided that the above
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README
       [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
                   ` (7 preceding siblings ...)
  2018-08-08 15:56 ` [PATCH - hwmixvolume 8/9] hwmixvolume: add my copyright Emmanuel Gil Peyrot
@ 2018-08-08 15:56 ` Emmanuel Gil Peyrot
  2018-08-14  3:43   ` Takashi Sakamoto
  8 siblings, 1 reply; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-08 15:56 UTC (permalink / raw)
  To: patch; +Cc: Emmanuel Gil Peyrot, Emmanuel Gil Peyrot, alsa-devel

Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

diff --git a/hwmixvolume/README b/hwmixvolume/README
index 9884ec2..db1b874 100644
--- a/hwmixvolume/README
+++ b/hwmixvolume/README
@@ -8,7 +8,8 @@ that use hardware mixing, i.e., those based on the following chips:
 * Yamaha DS-1 (YMF-724/740/744/754) (driver: snd-ymfpci)
 
 
-This tool requires Python, pygtk, and alsa-pyton 1.0.22 or later.
+This tool requires Python, PyGObject, GTK+ 3.0 or later, and alsa-pyton 1.0.22
+or later.
 
 It is recommended to use at least Linux kernel 2.6.32 or alsa-driver 1.0.22;
 otherwise, the name of the program that is using a stream cannot be shown.
-- 
2.18.0

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection
  2018-08-08 15:56 ` [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection Emmanuel Gil Peyrot
@ 2018-08-10 14:56   ` Takashi Iwai
  2018-08-10 15:29     ` Emmanuel Gil Peyrot
                       ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Takashi Iwai @ 2018-08-10 14:56 UTC (permalink / raw)
  To: Emmanuel Gil Peyrot; +Cc: Emmanuel Gil Peyrot, alsa-devel

On Wed, 08 Aug 2018 17:56:29 +0200,
Emmanuel Gil Peyrot wrote:
> 
> This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API
> changed quite a lot.
> 
> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>

Thanks for the patches.  Most of changes look good, but also most of
patches have no change log at all.  That's already a bad sign.

Could you give some details, especially why the change is needed, in
each patch and resubmit as a patchset?  At best, send with a cover
letter and a thread as a patch set at the next time (git-send-email
can manage it well).


Takashi
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection
  2018-08-10 14:56   ` Takashi Iwai
@ 2018-08-10 15:29     ` Emmanuel Gil Peyrot
  2018-08-11  4:33     ` Takashi Sakamoto
  2018-08-14  4:24     ` Takashi Sakamoto
  2 siblings, 0 replies; 16+ messages in thread
From: Emmanuel Gil Peyrot @ 2018-08-10 15:29 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: Emmanuel Gil Peyrot, alsa-devel

On Fri, Aug 10, 2018 at 04:56:47PM +0200, Takashi Iwai wrote:
> On Wed, 08 Aug 2018 17:56:29 +0200,
> Emmanuel Gil Peyrot wrote:
> > 
> > This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API
> > changed quite a lot.
> > 
> > Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
> 
> Thanks for the patches.  Most of changes look good, but also most of
> patches have no change log at all.  That's already a bad sign.
> 
> Could you give some details, especially why the change is needed, in
> each patch and resubmit as a patchset?  At best, send with a cover
> letter and a thread as a patch set at the next time (git-send-email
> can manage it well).

I actually wrote a cover letter[1], but it seems your email service
didn’t accept the UTF-8 encoding of it, I received a bounce email about
that.

I’ll send a v2 with more detailed commit messages, thanks.

> 
> 
> Takashi

[1] https://linkmauve.fr/files/0000-cover-letter.patch

-- 
Emmanuel Gil Peyrot
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection
  2018-08-10 14:56   ` Takashi Iwai
  2018-08-10 15:29     ` Emmanuel Gil Peyrot
@ 2018-08-11  4:33     ` Takashi Sakamoto
  2018-08-14  4:24     ` Takashi Sakamoto
  2 siblings, 0 replies; 16+ messages in thread
From: Takashi Sakamoto @ 2018-08-11  4:33 UTC (permalink / raw)
  To: Takashi Iwai, Emmanuel Gil Peyrot; +Cc: Emmanuel Gil Peyrot, alsa-devel

Hi,

On Aug 10 2018 23:56, Takashi Iwai wrote:
> On Wed, 08 Aug 2018 17:56:29 +0200,
> Emmanuel Gil Peyrot wrote:
>>
>> This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API
>> changed quite a lot.
>>
>> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
> 
> Thanks for the patches.  Most of changes look good, but also most of
> patches have no change log at all.  That's already a bad sign.
> 
> Could you give some details, especially why the change is needed, in
> each patch and resubmit as a patchset?  At best, send with a cover
> letter and a thread as a patch set at the next time (git-send-email
> can manage it well).

I'm familiar with g-i. If you need reviewers, please add me to CC list 
in next time you post, freely.


Regards

Takashi Sakamoto
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README
  2018-08-08 15:56 ` [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README Emmanuel Gil Peyrot
@ 2018-08-14  3:43   ` Takashi Sakamoto
  0 siblings, 0 replies; 16+ messages in thread
From: Takashi Sakamoto @ 2018-08-14  3:43 UTC (permalink / raw)
  To: Emmanuel Gil Peyrot, patch; +Cc: Emmanuel Gil Peyrot, alsa-devel

Hi,

On Aug 9 2018 00:56, Emmanuel Gil Peyrot wrote:
> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
> 
> diff --git a/hwmixvolume/README b/hwmixvolume/README
> index 9884ec2..db1b874 100644
> --- a/hwmixvolume/README
> +++ b/hwmixvolume/README
> @@ -8,7 +8,8 @@ that use hardware mixing, i.e., those based on the following chips:
>   * Yamaha DS-1 (YMF-724/740/744/754) (driver: snd-ymfpci)
>   
>   
> -This tool requires Python, pygtk, and alsa-pyton 1.0.22 or later.
> +This tool requires Python, PyGObject, GTK+ 3.0 or later, and alsa-pyton 1.0.22
> +or later.
>   
>   It is recommended to use at least Linux kernel 2.6.32 or alsa-driver 1.0.22;
>   otherwise, the name of the program that is using a stream cannot be shown.

s/alsa-pyton/alsa-python/

This is a typo in original code, but it's better to fix now.


Thanks

Takashi Sakamoto
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files
  2018-08-08 15:56 ` [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files Emmanuel Gil Peyrot
@ 2018-08-14  3:59   ` Takashi Sakamoto
  2018-08-15 15:36     ` Takashi Sakamoto
  0 siblings, 1 reply; 16+ messages in thread
From: Takashi Sakamoto @ 2018-08-14  3:59 UTC (permalink / raw)
  To: Emmanuel Gil Peyrot, patch; +Cc: Emmanuel Gil Peyrot, alsa-devel

Hi,

On Aug 9 2018 00:56, Emmanuel Gil Peyrot wrote:
> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
> 
> diff --git a/hwmixvolume/hwmixvolume b/hwmixvolume/hwmixvolume
> index 267228c..e82f32d 100755
> --- a/hwmixvolume/hwmixvolume
> +++ b/hwmixvolume/hwmixvolume
> @@ -138,26 +138,20 @@ class Stream:
>               subdevice = info.index
>           filename = "/proc/asound/card%d/pcm%dp/sub%d/status" % (card, device, subdevice)
>           try:
> -            f = open(filename, "r")
> +            with open(filename, "r") as f:
> +                for line in f.readlines():
> +                    if line[:9] == "owner_pid":
> +                        return int(line.split(':')[1].strip())

I'm not oppose to use with (far from it I greatly prefer it.), however 
the with statement was firstly supported in Python 2.5:
https://docs.python.org/3.6/whatsnew/2.5.html#what-s-new-in-python-2-5

This mean that you drop python 2.4 or former, in this point I have no 
objections because it was already unsupported.

If you use Python 2.5 or later, you can use 'file()' instead of 
'open()'. Furthermore, FILE object returned by 'file()' (or 'open()') 
supports 'iterator' and you have no need to call '.readlines()' anymore,
thus:

```
 > +            with file(filename, "r") as f:
 > +                for line in f:
...
```

>           except IOError:
>               return None
> -        try:
> -            for line in f.readlines():
> -                if line[:9] == "owner_pid":
> -                    return int(line.split(':')[1].strip())
> -        finally:
> -            f.close()
>           return None
>   
>       def get_pid_cmdline(self, pid):
>           try:
> -            f = open("/proc/%d/cmdline" % pid, "r")
> +            with open("/proc/%d/cmdline" % pid, "r") as f:
> +                cmdline = f.read()
>           except IOError:
>               return None
> -        try:
> -            cmdline = f.read()
> -        finally:
> -            f.close()
>           return cmdline.replace('\x00', ' ').strip()
>   
>   class MixerWindow(Gtk.Window):

Regards

Takashi Sakamoto

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection
  2018-08-10 14:56   ` Takashi Iwai
  2018-08-10 15:29     ` Emmanuel Gil Peyrot
  2018-08-11  4:33     ` Takashi Sakamoto
@ 2018-08-14  4:24     ` Takashi Sakamoto
  2 siblings, 0 replies; 16+ messages in thread
From: Takashi Sakamoto @ 2018-08-14  4:24 UTC (permalink / raw)
  To: Takashi Iwai, Emmanuel Gil Peyrot; +Cc: Emmanuel Gil Peyrot, alsa-devel

Hi,

On Aug 10 2018 23:56, Takashi Iwai wrote:
> On Wed, 08 Aug 2018 17:56:29 +0200,
> Emmanuel Gil Peyrot wrote:
>>
>> This doesn’t work yet, we require Gtk 3.0 rather than 2.0 and the API
>> changed quite a lot.
>>
>> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
> 
> Thanks for the patches.  Most of changes look good, but also most of
> patches have no change log at all.  That's already a bad sign.
> 
> Could you give some details, especially why the change is needed, in
> each patch and resubmit as a patchset?  At best, send with a cover
> letter and a thread as a patch set at the next time (git-send-email
> can manage it well).

In my opinion, the aim of this patchset is porting from Gtk+2.0 to 
Gtk+3.0, according to EOL of python bindings. Original script uses 
PyGtk[1], which is an application of Gtk+2.0, but PyGtk is already at 
the end of life and usage of PyGObject[2] to access to metadata of 
Gtk+3.0 is a fresh way instead. In this point, Emmanuel's proposal is 
preferable in 2018.

Anyway, I encourage Emmanuel to re-post this patchset with enough 
comment according to maintainer's advice. I'll review his next post for 
merging.

[1] https://github.com/GNOME/pygtk
[2] https://gitlab.gnome.org/GNOME/pygobject


Thanks

Takashi Sakamoto
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files
  2018-08-14  3:59   ` Takashi Sakamoto
@ 2018-08-15 15:36     ` Takashi Sakamoto
  0 siblings, 0 replies; 16+ messages in thread
From: Takashi Sakamoto @ 2018-08-15 15:36 UTC (permalink / raw)
  To: Emmanuel Gil Peyrot, patch; +Cc: Emmanuel Gil Peyrot, alsa-devel

On Aug 14 2018 12:59, Takashi Sakamoto wrote:
> If you use Python 2.5 or later, you can use 'file()' instead of 
> 'open()'. Furthermore, FILE object returned by 'file()' (or 'open()') 
> supports 'iterator' and you have no need to call '.readlines()' anymore,
> thus:
> 
> ```
>  > +            with file(filename, "r") as f:
>  > +                for line in f:
> ...
> ```

Oops. The 'file()' is removed at Python 3.0[1]...

[1] https://docs.python.org/release/3.0/whatsnew/3.0.html#builtins


Regards

Takashi Sakamoto
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2018-08-15 15:36 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20180808155637.5592-1-linkmauve@jabberfr.org>
2018-08-08 15:56 ` [PATCH - hwmixvolume 1/9] hwmixvolume: replace PyGTK with gobject-introspection Emmanuel Gil Peyrot
2018-08-10 14:56   ` Takashi Iwai
2018-08-10 15:29     ` Emmanuel Gil Peyrot
2018-08-11  4:33     ` Takashi Sakamoto
2018-08-14  4:24     ` Takashi Sakamoto
2018-08-08 15:56 ` [PATCH - hwmixvolume 2/9] hwmixvolume: switch to GTK+ 3.0 Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 3/9] hwmixvolume: use four spaces instead of one tab for indent Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 4/9] hwmixvolume: use a with context to open files Emmanuel Gil Peyrot
2018-08-14  3:59   ` Takashi Sakamoto
2018-08-15 15:36     ` Takashi Sakamoto
2018-08-08 15:56 ` [PATCH - hwmixvolume 5/9] hwmixvolume: replace deprecated Gtk.HScale with Gtk.Scale Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 6/9] hwmixvolume: fix deprecation warnings given by G_ENABLE_DIAGNOSTIC=1 Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 7/9] hwmixvolume: switch the shebang to python, as it is now compatible with both 2 and 3 Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 8/9] hwmixvolume: add my copyright Emmanuel Gil Peyrot
2018-08-08 15:56 ` [PATCH - hwmixvolume 9/9] hwmixvolume: mention the new dependencies in the README Emmanuel Gil Peyrot
2018-08-14  3:43   ` Takashi Sakamoto

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.