From: Takashi Iwai Date: Tue, 18 Aug 2026 10:46:33 +0000 (+0200) Subject: echomixer: Port to GTK+ 3 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=26567372d647610606ee5731b1a898d2eea9c871;p=alsa-tools.git echomixer: Port to GTK+ 3 Port the application to use GTK+ 3: - Use own legacy APIs for hbox and vbox creations - Modernize deprecated signal connections and radio buttons - Replace GdkPixmap with Cairo surface and context drawing - Replace GtkOptionMenu with GtkComboBox and GtkComboBoxText Also dropped the obsoleted configure.in-gtk1, too. Signed-off-by: Takashi Iwai --- diff --git a/echomixer/README b/echomixer/README index 7362acd..7c62891 100644 --- a/echomixer/README +++ b/echomixer/README @@ -13,8 +13,7 @@ master, PCM and monitors gains separately and it provides emulation of master vo for cards that don't support it in hardware (all non-Vmixer cards). Furthermore it has a matrix mixer which is more easy to use than the Echoaudio console interface. -Emixer requires GTK+ 1.2 or GTK+ 2.x. -To build with GTK+-1.2, pass --with-gtk2=no configure option. +Emixer requires GTK+ 3.x. For more informations: http://xoomer.virgilio.it/g_pochini/ea-emixer.html diff --git a/echomixer/configure.ac b/echomixer/configure.ac index c360442..ba85660 100644 --- a/echomixer/configure.ac +++ b/echomixer/configure.ac @@ -5,6 +5,6 @@ AC_HEADER_STDC AM_INIT_AUTOMAKE AM_MAINTAINER_MODE([enable]) -PKG_CHECK_MODULES(ECHOMIXER, gtk+-2.0 alsa >= 1.0.0) +PKG_CHECK_MODULES(ECHOMIXER, gtk+-3.0 alsa >= 1.0.0) AC_OUTPUT(Makefile desktop/Makefile) diff --git a/echomixer/configure.in-gtk1 b/echomixer/configure.in-gtk1 deleted file mode 100644 index cef8d82..0000000 --- a/echomixer/configure.in-gtk1 +++ /dev/null @@ -1,14 +0,0 @@ -AC_INIT(echomixer.c) -AM_INIT_AUTOMAKE(echomixer, 1.0.5) -AC_PROG_CC -AC_PROG_INSTALL -AC_HEADER_STDC - -AM_PATH_GTK(1.2.0) -AM_PATH_ALSA(1.0.0) -ECHOMIXER_CFLAGS="$CFLAGS $ALSA_CFLAGS $GTK_CFLAGS" -ECHOMIXER_LIBS="$LIBS $ALSA_LIBS $GTK_LIBS" -AC_SUBST(ECHOMIXER_CFLAGS) -AC_SUBST(ECHOMIXER_LIBS) - -AC_OUTPUT(Makefile) diff --git a/echomixer/echomixer.c b/echomixer/echomixer.c index adc10e1..7207ca8 100644 --- a/echomixer/echomixer.c +++ b/echomixer/echomixer.c @@ -86,6 +86,7 @@ #include #include #include +#include #include #include @@ -136,7 +137,7 @@ struct mixerControl_s { GtkWidget *window; GtkWidget *volume[ECHO_MAXAUDIOOUTPUTS]; GtkWidget *label[ECHO_MAXAUDIOOUTPUTS]; - GtkObject *adj[ECHO_MAXAUDIOOUTPUTS]; + GtkAdjustment *adj[ECHO_MAXAUDIOOUTPUTS]; GtkWidget *outsel[ECHO_MAXAUDIOOUTPUTS]; GtkWidget *inpsel[ECHO_MAXAUDIOINPUTS]; GtkWidget *vchsel[ECHO_MAXAUDIOOUTPUTS]; @@ -150,7 +151,7 @@ struct VolumeControl_s { GtkWidget *window; GtkWidget *volume[ECHO_MAXAUDIOOUTPUTS]; GtkWidget *label[ECHO_MAXAUDIOOUTPUTS]; - GtkObject *adj[ECHO_MAXAUDIOOUTPUTS]; + GtkAdjustment *adj[ECHO_MAXAUDIOOUTPUTS]; int Gain[ECHO_MAXAUDIOOUTPUTS]; } lineinControl, lineoutControl, pcmoutControl; @@ -167,16 +168,45 @@ struct SwitchControl_s { GtkWidget *Button; } PhantomPower, Automute; -GtkWidget *clocksrc_menuitem[ECHO_CLOCKS]; +static GtkListStore *clocksrc_store = NULL; GtkWidget *dmodeOpt, *clocksrcOpt, *spdifmodeOpt, *phantomChkbutton, *autoclockChkbutton; GtkWidget *window, *Mainwindow, *Miscwindow, *LVwindow, *VUwindow, *GMwindow; GtkWidget *VUdarea, *Mixdarea; gint VUtimer, Mixtimer, clocksrctimer; -GdkGC *gc=0; -static GdkPixmap *VUpixmap = NULL; -static GdkPixmap *Mixpixmap = NULL; -GdkFont *fnt; +static cairo_surface_t *VUpixmap = NULL; +static cairo_surface_t *Mixpixmap = NULL; + +static GtkWidget *__gtk_hbox_new(gboolean homogeneous, gint spacing) +{ + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, spacing); + gtk_box_set_homogeneous(GTK_BOX(box), homogeneous); + return box; +} +/* override for deprecation */ +#define gtk_hbox_new __gtk_hbox_new + +static GtkWidget*__gtk_vbox_new(gboolean homogeneous, gint spacing) +{ + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, spacing); + gtk_box_set_homogeneous(GTK_BOX(box), homogeneous); + return box; +} +/* override for deprecation */ +#define gtk_vbox_new __gtk_vbox_new + +static void cairo_set_source_pixel(cairo_t *cr, guint32 pixel) { + double r = ((pixel >> 16) & 0xFF) / 255.0; + double g = ((pixel >> 8) & 0xFF) / 255.0; + double b = (pixel & 0xFF) / 255.0; + cairo_set_source_rgb(cr, r, g, b); +} + +static void set_combo_active(GtkWidget *combo, int val, GCallback callback) { + g_signal_handlers_block_by_func(combo, callback, NULL); + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), val); + g_signal_handlers_unblock_by_func(combo, callback, NULL); +} void Clock_source_activate(GtkWidget *widget, gpointer clk); @@ -563,26 +593,26 @@ gint CheckInputs(gpointer unused) { for (clk=0; clk=0 && source!=clocksrcVal) { // Set the clock source, but do not change the value of AutoClock - Clock_source_activate(clocksrc_menuitem[source], (gpointer)(long)(source|DONT_CHANGE)); - gtk_option_menu_set_history(GTK_OPTION_MENU(clocksrcOpt), clocksrcVal); + SetEnum(clocksrcId, source); + clocksrcVal = source; + set_combo_active(clocksrcOpt, source, G_CALLBACK(Clock_source_activate)); } return(TRUE); } -void DrawBar(int x, int y, int level, int peak, int gain) { - GdkColor Bars={0x00FF00, 0, 0, 0}; - GdkColor Bars1={0x000000, 0, 0, 0}; - GdkColor Peak={0x1BABFF, 0, 0, 0}; - GdkColor Level={0xC0B000, 0, 0, 0}; +void DrawBar(cairo_t *cr, int x, int y, int level, int peak, int gain) { int db; x=XMETER+XCELLTOT*x; @@ -591,30 +621,35 @@ void DrawBar(int x, int y, int level, int peak, int gain) { if (level>ECHOGAIN_MUTED) { // Draw the "integer" part of the bar db=level>>2; - gdk_gc_set_foreground(gc, &Bars); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, x, y-db, GM_BARWIDTH, YCELLDIM+db); + cairo_set_source_pixel(cr, 0x00FF00); + cairo_rectangle(cr, x, y-db, GM_BARWIDTH, YCELLDIM+db); + cairo_fill(cr); // Draw the antialiased part - Bars1.pixel=(level&3) << (6 + 8); // 4 levels (256/4==64==2^6) of green (2^8) - if (Bars1.pixel) { - gdk_gc_set_foreground(gc, &Bars1); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, x, y-db-1, GM_BARWIDTH, 1); + guint32 bars1_pixel = (level&3) << (6 + 8); + if (bars1_pixel) { + cairo_set_source_pixel(cr, bars1_pixel); + cairo_rectangle(cr, x, y-db-1, GM_BARWIDTH, 1); + cairo_fill(cr); } } // Draw the peak if (peak>ECHOGAIN_MUTED) { db=peak>>2; - gdk_gc_set_foreground(gc, &Peak); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, x, y-db, GM_BARWIDTH, 1); + cairo_set_source_pixel(cr, 0x1BABFF); + cairo_rectangle(cr, x, y-db, GM_BARWIDTH, 1); + cairo_fill(cr); } // Draw the mixer gain if (gain>=ECHOGAIN_MUTED) { db=gain>>2; - gdk_gc_set_foreground(gc, &Level); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, x-XMETER+XVOLUME, y, 1, YCELLDIM); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, x-XMETER+XVOLUME-2, y-db, 5, 1); + cairo_set_source_pixel(cr, 0xC0B000); + cairo_rectangle(cr, x-XMETER+XVOLUME, y, 1, YCELLDIM); + cairo_fill(cr); + cairo_rectangle(cr, x-XMETER+XVOLUME-2, y-db, 5, 1); + cairo_fill(cr); } } @@ -622,7 +657,6 @@ void DrawBar(int x, int y, int level, int peak, int gain) { // Draw the matrix mixer gint DrawMixer(gpointer unused) { - GdkRectangle update_rect; int InLevel[ECHO_MAXAUDIOINPUTS]; int InPeak[ECHO_MAXAUDIOINPUTS]; int OutLevel[ECHO_MAXAUDIOOUTPUTS]; @@ -631,87 +665,93 @@ gint DrawMixer(gpointer unused) { int VirPeak[ECHO_MAXAUDIOOUTPUTS]; char str[16]; int i, o, dB; - GdkColor Grid={0x787878, 0, 0, 0}; - GdkColor Labels={0x9694C4, 0, 0, 0}; - GdkColor Hilight={0x000078, 0, 0, 0}; - GdkColor Hilight2={0x600000, 0, 0, 0}; if (!Mixpixmap) return(TRUE); - update_rect.x = 0; - update_rect.y = 0; - update_rect.width = Mixwidth; - update_rect.height = Mixheight; GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak); - if (!gc) - gc=gdk_gc_new(gtk_widget_get_parent_window(Mixdarea)); + cairo_t *cr = cairo_create(Mixpixmap); - gdk_draw_rectangle(Mixpixmap, Mixdarea->style->black_gc, TRUE, 0, 0, Mixwidth, Mixheight); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_rectangle(cr, 0, 0, Mixwidth, Mixheight); + cairo_fill(cr); // Highlight - gdk_gc_set_foreground(gc, &Hilight); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, 0, YCELLTOT*mixerControl.input, XCELLTOT*(mixerControl.output+1), YCELLTOT); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, XCELLTOT*(mixerControl.output+1), YCELLTOT*mixerControl.input, XCELLTOT, Mixheight); + cairo_set_source_pixel(cr, 0x000078); + cairo_rectangle(cr, 0, YCELLTOT*mixerControl.input, XCELLTOT*(mixerControl.output+1), YCELLTOT); + cairo_fill(cr); + cairo_rectangle(cr, XCELLTOT*(mixerControl.output+1), YCELLTOT*mixerControl.input, XCELLTOT, Mixheight); + cairo_fill(cr); if (vmixerId) { - gdk_gc_set_foreground(gc, &Hilight2); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, 0, YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT*(vmixerControl.output+1), YCELLTOT); - gdk_draw_rectangle(Mixpixmap, gc, TRUE, XCELLTOT*(vmixerControl.output+1), YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT, Mixheight); + cairo_set_source_pixel(cr, 0x600000); + cairo_rectangle(cr, 0, YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT*(vmixerControl.output+1), YCELLTOT); + cairo_fill(cr); + cairo_rectangle(cr, XCELLTOT*(vmixerControl.output+1), YCELLTOT*(GMixerSection.VmixerFirst+vmixerControl.input), XCELLTOT, Mixheight); + cairo_fill(cr); } // Draw the grid + cairo_select_font_face(cr, "monospace", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 10.0); - gdk_gc_set_font(gc, fnt); // Horizontal lines and input channel labels for (i=0; istyle->black_gc, TRUE, 0, 0, VUwidth, VUheight); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_rectangle(cr, 0, 0, VUwidth, VUheight); + cairo_fill(cr); // Draw the dB scale and the grid - gdk_gc_set_font(gc, fnt); - gdk_gc_set_foreground(gc, &Peak); - gdk_draw_string(VUpixmap, fnt, gc, 2, VU_YGRAF-12+4, " dB"); + cairo_select_font_face(cr, "monospace", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size(cr, 10.0); + cairo_set_source_pixel(cr, 0x00FF00); // Peak + cairo_move_to(cr, 2, VU_YGRAF-12+4); + cairo_show_text(cr, " dB"); for (i=0; i<=120; i+=12) { sprintf(str, "%4d", -i); - gdk_gc_set_foreground(gc, &dBValues); - gdk_draw_string(VUpixmap, fnt, gc, 2, VU_YGRAF+i+4, str); - gdk_gc_set_foreground(gc, &Grid); - gdk_draw_rectangle(VUpixmap, gc, TRUE, VU_XGRAF, VU_YGRAF+i, VUwidth-VU_XGRAF, 1); + cairo_set_source_pixel(cr, 0x00B000); // dBValues + cairo_move_to(cr, 2, VU_YGRAF+i+4); + cairo_show_text(cr, str); + cairo_set_source_pixel(cr, 0x9694C4); // Grid + cairo_rectangle(cr, VU_XGRAF, VU_YGRAF+i, VUwidth-VU_XGRAF, 1); + cairo_fill(cr); } - gdk_gc_set_foreground(gc, &Grid2); - gdk_draw_rectangle(VUpixmap, gc, TRUE, VU_XGRAF, VU_YGRAF+128, VUwidth-VU_XGRAF, 1); + cairo_set_source_pixel(cr, 0x646383); // Grid2 + cairo_rectangle(cr, VU_XGRAF, VU_YGRAF+128, VUwidth-VU_XGRAF, 1); + cairo_fill(cr); x=VU_XGRAF+VU_BARSEP; // Draw inputs for (i=0; iis_hint) - gdk_window_get_pointer(event->window, &x, &y, &state); + if (event->is_hint) { + GdkDevice *device = gdk_event_get_device((GdkEvent *)event); + gdk_window_get_device_position(event->window, device, &x, &y, &state); + } else { x=event->x; y=event->y; @@ -1040,7 +1090,7 @@ void Monitor_volume_changed(GtkWidget *widget, gpointer cnl) { char str[16]; UI_DEBUG(("Monitor_volume_changed() %d %d\n",mixerControl.input,mixerControl.output)); - val=rval=INVERT((int)GTK_ADJUSTMENT(widget)->value); + val=rval=INVERT((int)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); ch=(int)(long)cnl; @@ -1103,13 +1153,13 @@ void PCM_volume_changed(GtkWidget *widget, gpointer ch) { // Input channel=(int)(long)ch; vol=&lineinControl; - rval=val=IN_INVERT((int)GTK_ADJUSTMENT(widget)->value); + rval=val=IN_INVERT((int)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); sprintf(str, "%+4.1f", 0.5*val); } else { // Output channel=(int)(long)ch-ECHO_MAXAUDIOINPUTS; vol=&pcmoutControl; - val=rval=INVERT((int)GTK_ADJUSTMENT(widget)->value); + val=rval=INVERT((int)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); pcmoutControl.Gain[channel]=val; // Emulate the line-out volume if this card can't do it in hw. if (!lineoutId) { @@ -1137,7 +1187,7 @@ void PCM_volume_changed(GtkWidget *widget, gpointer ch) { vol->Gain[channel]=val; } if (Gang) - gtk_adjustment_set_value(GTK_ADJUSTMENT(vol->adj[channel^1]), (gfloat)GTK_ADJUSTMENT(widget)->value); + gtk_adjustment_set_value(GTK_ADJUSTMENT(vol->adj[channel^1]), (gfloat)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); } @@ -1219,7 +1269,7 @@ void LineOut_volume_changed(GtkWidget *widget, gpointer ch) { channel=(int)(long)ch; - val=INVERT((int)GTK_ADJUSTMENT(widget)->value); + val=INVERT((int)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); lineoutControl.Gain[channel]=val; gtk_label_set_text(GTK_LABEL(lineoutControl.label[channel]), strOutGain(str, val)); @@ -1248,7 +1298,7 @@ void LineOut_volume_changed(GtkWidget *widget, gpointer ch) { } if (Gang) - gtk_adjustment_set_value(GTK_ADJUSTMENT(lineoutControl.adj[channel^1]), (gfloat)GTK_ADJUSTMENT(widget)->value); + gtk_adjustment_set_value(GTK_ADJUSTMENT(lineoutControl.adj[channel^1]), (gfloat)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); } @@ -1259,7 +1309,7 @@ void Vmixer_volume_changed(GtkWidget *widget, gpointer ch) { int o, v; channel=(int)(long)ch; - val=rval=INVERT((int)GTK_ADJUSTMENT(widget)->value); + val=rval=INVERT((int)gtk_adjustment_get_value(GTK_ADJUSTMENT(widget))); #ifdef REVERSE v=channel; @@ -1407,114 +1457,109 @@ void AutoClock_toggled(GtkWidget *widget, gpointer unused) { AutoClock=clocksrcVal; snprintf(str, 31, "Autoclock [%s]", clocksrcName[AutoClock]); str[31]=0; - gtk_label_set_text(GTK_LABEL(GTK_BIN(widget)->child), str); + gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget))), str); } else { AutoClock=-1; - gtk_label_set_text(GTK_LABEL(GTK_BIN(widget)->child), "Autoclock"); + gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget))), "Autoclock"); } } -void Digital_mode_activate(GtkWidget *widget, gpointer mode) { - int adat; - - if (SetEnum(dmodeId, (int)(long)mode)<0) { - // Restore old value if it failed - gtk_option_menu_set_history(GTK_OPTION_MENU(dmodeOpt), dmodeVal); +void Digital_mode_activate(GtkWidget *widget, gpointer data) { + int mode = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + if (mode < 0 || mode == dmodeVal) return; + if (SetEnum(dmodeId, mode) < 0) { + set_combo_active(widget, dmodeVal, G_CALLBACK(Digital_mode_activate)); return; } + dmodeVal = mode; + clocksrcVal = GetEnum(clocksrcId); + set_combo_active(clocksrcOpt, clocksrcVal, G_CALLBACK(Clock_source_activate)); - dmodeVal=(int)(long)mode; - // When I change the digital mode, the clock source can change too - clocksrcVal=GetEnum(clocksrcId); - gtk_option_menu_set_history(GTK_OPTION_MENU(clocksrcOpt), clocksrcVal); - - adat=!memcmp(dmodeName[dmodeVal], "ADAT", 4); + int adat=!memcmp(dmodeName[dmodeVal], "ADAT", 4); SetSensitivity(adat); if (adat) { GMixerSection.Inputs=nIn; GMixerSection.Outputs=nLOut; } else { - GMixerSection.Inputs=fdIn+2; // S/PDIF has only 2 channels + GMixerSection.Inputs=fdIn+2; GMixerSection.Outputs=fdOut+2; } } - - -void Clock_source_activate(GtkWidget *widget, gpointer clk) { - unsigned int source; - - source=(unsigned int)(long)clk & 0xff; - if (SetEnum(clocksrcId, source)<0) { - gtk_option_menu_set_history(GTK_OPTION_MENU(clocksrcOpt), clocksrcVal); +void Clock_source_activate(GtkWidget *widget, gpointer data) { + int clk = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + if (clk < 0 || clk == clocksrcVal) return; + if (SetEnum(clocksrcId, clk) < 0) { + set_combo_active(widget, clocksrcVal, G_CALLBACK(Clock_source_activate)); } else { - clocksrcVal=(int)(long)clk & 0xff; - // Change only when the user triggers it - if (((int)(long)clk & DONT_CHANGE)==0 && AutoClock>=0) { - AutoClock=clocksrcVal; + clocksrcVal = clk; + if (AutoClock >= 0) { + AutoClock = clocksrcVal; AutoClock_toggled(autoclockChkbutton, NULL); } } } - - -void SPDIF_mode_activate(GtkWidget *widget, gpointer mode) { - - SetEnum(spdifmodeId, (int)(long)mode); // This one should never fail - spdifmodeVal=(int)(long)mode; +void SPDIF_mode_activate(GtkWidget *widget, gpointer data) { + int mode = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + if (mode < 0 || mode == spdifmodeVal) return; + if (SetEnum(spdifmodeId, mode) < 0) { + set_combo_active(widget, spdifmodeVal, G_CALLBACK(SPDIF_mode_activate)); + } else { + spdifmodeVal = mode; + } } -// Create a new backing pixmap of the appropriate size -static gint VU_configure_event(GtkWidget *widget, GdkEventConfigure *event) { +static gboolean VU_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { + GtkAllocation allocation; + gtk_widget_get_allocation(widget, &allocation); if (VUpixmap) - gdk_pixmap_unref(VUpixmap); - VUpixmap=gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); - gdk_draw_rectangle(VUpixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); + cairo_surface_destroy(VUpixmap); + VUpixmap=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); + + cairo_t *cr = cairo_create(VUpixmap); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); + cairo_fill(cr); + cairo_destroy(cr); return(TRUE); } - - -// Redraw the screen from the backing pixmap -static gint VU_expose(GtkWidget *widget, GdkEventExpose *event) { - - if (VUpixmap) - gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], VUpixmap, - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); +static gboolean VU_draw(GtkWidget *widget, cairo_t *cr, gpointer data) { + if (VUpixmap) { + cairo_set_source_surface(cr, VUpixmap, 0, 0); + cairo_paint(cr); + } return(FALSE); } - - -// Create a new backing pixmap of the appropriate size -static gint Gmixer_configure_event(GtkWidget *widget, GdkEventConfigure *event) { +static gboolean Gmixer_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { + GtkAllocation allocation; + gtk_widget_get_allocation(widget, &allocation); if (Mixpixmap) - gdk_pixmap_unref(Mixpixmap); - Mixpixmap=gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); - gdk_draw_rectangle(Mixpixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); + cairo_surface_destroy(Mixpixmap); + Mixpixmap=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); + + cairo_t *cr = cairo_create(Mixpixmap); + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); + cairo_fill(cr); + cairo_destroy(cr); return(TRUE); } - - -// Redraw the screen from the backing pixmap -static gint Gmixer_expose(GtkWidget *widget, GdkEventExpose *event) { - - if (Mixpixmap) - gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], Mixpixmap, - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); +static gboolean Gmixer_draw(GtkWidget *widget, cairo_t *cr, gpointer data) { + if (Mixpixmap) { + cairo_set_source_surface(cr, Mixpixmap, 0, 0); + cairo_paint(cr); + } return(FALSE); } @@ -1523,10 +1568,10 @@ static gint Gmixer_expose(GtkWidget *widget, GdkEventExpose *event) { gint CloseWindow(GtkWidget *widget, GdkEvent *event, gpointer geom) { struct geometry *g=geom; - gdk_window_get_root_origin(widget->window, &g->x, &g->y); - gdk_window_get_size(widget->window, &g->w, &g->h); + gdk_window_get_root_origin(gtk_widget_get_window(widget), &g->x, &g->y); + g->w = gdk_window_get_width(gtk_widget_get_window(widget)); g->h = gdk_window_get_height(gtk_widget_get_window(widget)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->toggler), FALSE); // This hides the window - //gtk_widget_set_uposition(widget, g->x, g->y); + //gtk_window_move(GTK_WINDOW(widget), g->x, g->y); return(TRUE); // Do not destroy it } @@ -1536,14 +1581,14 @@ gint Mainwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { struct geometry *g=geom; if (VUwindow) { - gdk_window_get_root_origin(VUwindow->window, &VUw_geom.x, &VUw_geom.y); + gdk_window_get_root_origin(gtk_widget_get_window(VUwindow), &VUw_geom.x, &VUw_geom.y); gtk_widget_destroy(VUwindow); } if (GMwindow) { - gdk_window_get_root_origin(GMwindow->window, &GMw_geom.x, &GMw_geom.y); + gdk_window_get_root_origin(gtk_widget_get_window(GMwindow), &GMw_geom.x, &GMw_geom.y); gtk_widget_destroy(GMwindow); } - gdk_window_get_root_origin(Mainwindow->window, &g->x, &g->y); + gdk_window_get_root_origin(gtk_widget_get_window(Mainwindow), &g->x, &g->y); gtk_main_quit(); return(FALSE); } @@ -1553,7 +1598,7 @@ gint Mainwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { gint VUwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { struct geometry *g=geom; - gdk_window_get_root_origin(widget->window, &g->x, &g->y); + gdk_window_get_root_origin(gtk_widget_get_window(widget), &g->x, &g->y); g->st=0; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->toggler), FALSE); return(FALSE); @@ -1564,7 +1609,7 @@ gint VUwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { gint VUwindow_destroy(GtkWidget *widget, gpointer unused) { SetVUmeters(0); - gtk_timeout_remove(VUtimer); + g_source_remove(VUtimer); //@@@del gc and fnt VUwindow=0; return(TRUE); @@ -1575,7 +1620,7 @@ gint VUwindow_destroy(GtkWidget *widget, gpointer unused) { gint GMwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { struct geometry *g=geom; - gdk_window_get_root_origin(widget->window, &g->x, &g->y); + gdk_window_get_root_origin(gtk_widget_get_window(widget), &g->x, &g->y); g->st=0; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->toggler), FALSE); return(FALSE); @@ -1586,7 +1631,7 @@ gint GMwindow_delete(GtkWidget *widget, GdkEvent *event, gpointer geom) { gint GMwindow_destroy(GtkWidget *widget, gpointer unused) { SetVUmeters(0); - gtk_timeout_remove(Mixtimer); + g_source_remove(Mixtimer); //@@@del gc and fnt GMwindow=0; return(TRUE); @@ -1608,25 +1653,23 @@ void VUmeters_button_click(GtkWidget *widget, gpointer unused) { VUwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); sprintf(str, "%s VU-meters", cardId); gtk_window_set_title (GTK_WINDOW (VUwindow), str); - gtk_window_set_wmclass(GTK_WINDOW(VUwindow), "vumeters", "Emixer"); - gtk_signal_connect(GTK_OBJECT(VUwindow), "destroy", GTK_SIGNAL_FUNC(VUwindow_destroy), NULL); - gtk_signal_connect(GTK_OBJECT(VUwindow), "delete_event", GTK_SIGNAL_FUNC(VUwindow_delete), (gpointer)&VUw_geom); - gtk_window_set_policy(GTK_WINDOW(VUwindow), FALSE, FALSE, TRUE); + g_signal_connect(G_OBJECT(VUwindow), "destroy", G_CALLBACK(VUwindow_destroy), NULL); + g_signal_connect(G_OBJECT(VUwindow), "delete_event", G_CALLBACK(VUwindow_delete), (gpointer)&VUw_geom); + gtk_window_set_resizable(GTK_WINDOW(VUwindow), FALSE); if (VUw_geom.st!=NOPOS) - gtk_widget_set_uposition(VUwindow, VUw_geom.x, VUw_geom.y); + gtk_window_move(GTK_WINDOW(VUwindow), VUw_geom.x, VUw_geom.y); gtk_widget_show(VUwindow); VUdarea=gtk_drawing_area_new(); gtk_widget_set_events(VUdarea, GDK_EXPOSURE_MASK); - gtk_drawing_area_size(GTK_DRAWING_AREA(VUdarea), VUwidth, VUheight); + gtk_widget_set_size_request(VUdarea, VUwidth, VUheight); gtk_container_add(GTK_CONTAINER(VUwindow), VUdarea); gtk_widget_show(VUdarea); - gtk_signal_connect(GTK_OBJECT(VUdarea), "expose_event", (GtkSignalFunc)VU_expose, NULL); - gtk_signal_connect(GTK_OBJECT(VUdarea), "configure_event", (GtkSignalFunc)VU_configure_event, NULL); - VUtimer=gtk_timeout_add(30, DrawVUmeters, 0); // The hw updates the meters about 30 times/s - gdk_window_clear_area(VUdarea->window, 0, 0, VUwidth, VUheight); - VUw_geom.st=1; + g_signal_connect(G_OBJECT(VUdarea), "draw", G_CALLBACK(VU_draw), NULL); + g_signal_connect(G_OBJECT(VUdarea), "configure-event", G_CALLBACK(VU_configure_event), NULL); + VUtimer=g_timeout_add(30, DrawVUmeters, 0); // The hw updates the meters about 30 times/s + VUw_geom.st=1; } } @@ -1646,28 +1689,26 @@ void GMixer_button_click(GtkWidget *widget, gpointer unused) { GMwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); sprintf(str, "%s Mixer", cardId); gtk_window_set_title (GTK_WINDOW (GMwindow), str); - gtk_window_set_wmclass(GTK_WINDOW(GMwindow), "gridmixer", "Emixer"); - gtk_signal_connect(GTK_OBJECT(GMwindow), "destroy", GTK_SIGNAL_FUNC(GMwindow_destroy), NULL); - gtk_signal_connect(GTK_OBJECT(GMwindow), "delete_event", GTK_SIGNAL_FUNC(GMwindow_delete), (gpointer)&GMw_geom); - gtk_window_set_policy(GTK_WINDOW(GMwindow), FALSE, FALSE, TRUE); + g_signal_connect(G_OBJECT(GMwindow), "destroy", G_CALLBACK(GMwindow_destroy), NULL); + g_signal_connect(G_OBJECT(GMwindow), "delete_event", G_CALLBACK(GMwindow_delete), (gpointer)&GMw_geom); + gtk_window_set_resizable(GTK_WINDOW(GMwindow), FALSE); if (GMw_geom.st!=NOPOS) - gtk_widget_set_uposition(GMwindow, GMw_geom.x, GMw_geom.y); + gtk_window_move(GTK_WINDOW(GMwindow), GMw_geom.x, GMw_geom.y); gtk_widget_show(GMwindow); Mixdarea=gtk_drawing_area_new(); gtk_widget_set_events(Mixdarea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); - gtk_drawing_area_size(GTK_DRAWING_AREA(Mixdarea), Mixwidth, Mixheight); + gtk_widget_set_size_request(Mixdarea, Mixwidth, Mixheight); gtk_container_add(GTK_CONTAINER(GMwindow), Mixdarea); gtk_widget_show(Mixdarea); - gtk_signal_connect(GTK_OBJECT(Mixdarea), "expose_event", (GtkSignalFunc)Gmixer_expose, NULL); - gtk_signal_connect(GTK_OBJECT(Mixdarea), "configure_event", (GtkSignalFunc)Gmixer_configure_event, NULL); - gtk_signal_connect(GTK_OBJECT(Mixdarea), "motion_notify_event", (GtkSignalFunc)Gmixer_motion_notify, NULL); - gtk_signal_connect(GTK_OBJECT(Mixdarea), "button_press_event", (GtkSignalFunc)Gmixer_button_press, NULL); - gtk_signal_connect(GTK_OBJECT(Mixdarea), "button_release_event", (GtkSignalFunc)Gmixer_button_release, NULL); - Mixtimer=gtk_timeout_add(30, DrawMixer, 0); // The hw updates the meters about 30 times/s - gdk_window_clear_area(Mixdarea->window, 0, 0, Mixwidth, Mixheight); - GMw_geom.st=1; + g_signal_connect(G_OBJECT(Mixdarea), "draw", G_CALLBACK(Gmixer_draw), NULL); + g_signal_connect(G_OBJECT(Mixdarea), "configure-event", G_CALLBACK(Gmixer_configure_event), NULL); + g_signal_connect(G_OBJECT(Mixdarea), "motion-notify-event", G_CALLBACK(Gmixer_motion_notify), NULL); + g_signal_connect(G_OBJECT(Mixdarea), "button-press-event", G_CALLBACK(Gmixer_button_press), NULL); + g_signal_connect(G_OBJECT(Mixdarea), "button-release-event", G_CALLBACK(Gmixer_button_release), NULL); + Mixtimer=g_timeout_add(30, DrawMixer, 0); // The hw updates the meters about 30 times/s + GMw_geom.st=1; } } @@ -1868,7 +1909,7 @@ int main(int argc, char *argv[]) { GtkWidget *hbox, *vbox; GtkWidget *mainbox; GtkWidget *vbsel, *frame, *button; - GtkWidget *label, *menu, *menuitem; + GtkWidget *label; GSList *bgroup; int err, i, o, n, cardnum, value; char hwname[16], cardname[32], load, save; @@ -2012,11 +2053,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ } } gtk_init(&argc, &argv); - fnt=gdk_font_load("-misc-fixed-medium-r-*-*-10-*-*-*-*-*-*-*"); - if (!fnt) { - printf("Cannot find the font\n"); - exit(1); - } + /* Now assemble the control windows */ @@ -2026,11 +2063,10 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ Miscwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); sprintf(str, "%s Misc controls", cardId); gtk_window_set_title(GTK_WINDOW(Miscwindow), str); - gtk_window_set_wmclass(GTK_WINDOW(Miscwindow), "misc", "Emixer"); - gtk_signal_connect(GTK_OBJECT(Miscwindow), "delete_event", GTK_SIGNAL_FUNC(CloseWindow), (gpointer)&Miscw_geom); + g_signal_connect(G_OBJECT(Miscwindow), "delete_event", G_CALLBACK(CloseWindow), (gpointer)&Miscw_geom); gtk_container_set_border_width(GTK_CONTAINER(Miscwindow), BORDER); if (Miscw_geom.st!=NOPOS) { - gtk_widget_set_uposition(Miscwindow, Miscw_geom.x, Miscw_geom.y); + gtk_window_move(GTK_WINDOW(Miscwindow), Miscw_geom.x, Miscw_geom.y); gtk_window_set_default_size(GTK_WINDOW(Miscwindow), Miscw_geom.w, Miscw_geom.h); } @@ -2054,7 +2090,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1); gtk_widget_show(button); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), NominalIn.Level[i]); // Forces handler call - gtk_signal_connect(GTK_OBJECT(button), "toggled", GTK_SIGNAL_FUNC(Nominal_level_toggled), (gpointer)(long)i); + g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(Nominal_level_toggled), (gpointer)(long)i); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), !NominalIn.Level[i]); } } @@ -2075,7 +2111,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 1); gtk_widget_show(button); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), NominalOut.Level[i]); - gtk_signal_connect(GTK_OBJECT(button), "toggled", GTK_SIGNAL_FUNC(Nominal_level_toggled), (gpointer)(long)(i+ECHO_MAXAUDIOINPUTS)); + g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(Nominal_level_toggled), (gpointer)(long)(i+ECHO_MAXAUDIOINPUTS)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), !NominalOut.Level[i]); } } @@ -2090,19 +2126,14 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER(frame), hbox); - dmodeOpt=gtk_option_menu_new(); + dmodeOpt = gtk_combo_box_text_new(); gtk_widget_show(dmodeOpt); - menu=gtk_menu_new(); - gtk_widget_show(menu); for (i=0; iwindow, Mixerw_geom.x, Mixerw_geom.y, Mixerw_geom.w, Mixerw_geom.h); +// gdk_window_move_resize(gtk_widget_get_window(mixerControl.window), Mixerw_geom.x, Mixerw_geom.y, Mixerw_geom.w, Mixerw_geom.h); /* gtk_widget_set_usize(mixerControl.window, Mixerw_geom.w, Mixerw_geom.h); gtk_widget_set_usize(mixerControl.window, -1, -1);*/ } @@ -2394,18 +2421,18 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); // Volume mixerControl.adj[i]=gtk_adjustment_new(0, ECHOGAIN_MINOUT, ECHOGAIN_MAXOUT, SHORTSTEP, LONGSTEP, 0); - mixerControl.volume[i]=gtk_vscale_new(GTK_ADJUSTMENT(mixerControl.adj[i])); + mixerControl.volume[i]=gtk_scale_new(GTK_ORIENTATION_VERTICAL, mixerControl.adj[i]); gtk_widget_show(mixerControl.volume[i]); gtk_box_pack_start(GTK_BOX(vbox), mixerControl.volume[i], TRUE, TRUE, 0); gtk_scale_set_draw_value(GTK_SCALE(mixerControl.volume[i]), 0); - gtk_signal_connect(GTK_OBJECT(mixerControl.volume[i]), "grab_focus", GTK_SIGNAL_FUNC(Monitor_volume_clicked), (gpointer)i); - gtk_signal_connect(GTK_OBJECT(mixerControl.adj[i]), "value_changed", GTK_SIGNAL_FUNC(Monitor_volume_changed), (gpointer)i); + g_signal_connect(G_OBJECT(mixerControl.volume[i]), "grab_focus", G_CALLBACK(Monitor_volume_clicked), (gpointer)i); + g_signal_connect(G_OBJECT(mixerControl.adj[i]), "value_changed", G_CALLBACK(Monitor_volume_changed), (gpointer)i); // Value label mixerControl.label[i]=gtk_label_new("xxx"); gtk_widget_show(mixerControl.label[i]); gtk_box_pack_start(GTK_BOX(vbox), mixerControl.label[i], FALSE, FALSE, 0); } - gtk_widget_set_usize(GTK_WIDGET(mixerControl.volume[0]), 0, 170); // Set minimum y size + gtk_widget_set_size_request(GTK_WIDGET(mixerControl.volume[0]), -1, 170); // Set minimum y size // Output channel selectors frame=gtk_frame_new("Mixer output"); @@ -2422,11 +2449,11 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ else sprintf(str, "Di-%d", i-fdOut); if (i) - bgroup=gtk_radio_button_group(GTK_RADIO_BUTTON(mixerControl.outsel[i-1])); + bgroup=gtk_radio_button_get_group(GTK_RADIO_BUTTON(mixerControl.outsel[i-1])); mixerControl.outsel[i]=gtk_radio_button_new_with_label(bgroup, str); gtk_widget_show(mixerControl.outsel[i]); gtk_box_pack_start(GTK_BOX(vbsel), mixerControl.outsel[i], FALSE, FALSE, 0); - gtk_signal_connect(GTK_OBJECT(mixerControl.outsel[i]), "toggled", GTK_SIGNAL_FUNC(Mixer_Output_selector_clicked), (gpointer)i); + g_signal_connect(G_OBJECT(mixerControl.outsel[i]), "toggled", G_CALLBACK(Mixer_Output_selector_clicked), (gpointer)i); } mixerControl.input=0; mixerControl.output=-1; @@ -2449,11 +2476,11 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ else sprintf(str, "Di-%d", i-fdIn); if (i) - bgroup=gtk_radio_button_group(GTK_RADIO_BUTTON(mixerControl.inpsel[i-1])); + bgroup=gtk_radio_button_get_group(GTK_RADIO_BUTTON(mixerControl.inpsel[i-1])); mixerControl.inpsel[i]=gtk_radio_button_new_with_label(bgroup, str); gtk_widget_show(mixerControl.inpsel[i]); gtk_box_pack_start(GTK_BOX(vbsel), mixerControl.inpsel[i], FALSE, FALSE, 0); - gtk_signal_connect(GTK_OBJECT(mixerControl.inpsel[i]), "toggled", GTK_SIGNAL_FUNC(Mixer_Input_selector_clicked), (gpointer)(long)i); + g_signal_connect(G_OBJECT(mixerControl.inpsel[i]), "toggled", G_CALLBACK(Mixer_Input_selector_clicked), (gpointer)(long)i); } // Mixer volume widgets @@ -2478,18 +2505,18 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); // Volume mixerControl.adj[i]=gtk_adjustment_new(0, ECHOGAIN_MINOUT, ECHOGAIN_MAXOUT, SHORTSTEP, LONGSTEP, 0); - mixerControl.volume[i]=gtk_vscale_new(GTK_ADJUSTMENT(mixerControl.adj[i])); + mixerControl.volume[i]=gtk_scale_new(GTK_ORIENTATION_VERTICAL, mixerControl.adj[i]); gtk_widget_show(mixerControl.volume[i]); gtk_box_pack_start(GTK_BOX(vbox), mixerControl.volume[i], TRUE, TRUE, 0); gtk_scale_set_draw_value(GTK_SCALE(mixerControl.volume[i]), 0); - gtk_signal_connect(GTK_OBJECT(mixerControl.volume[i]), "grab_focus", GTK_SIGNAL_FUNC(Monitor_volume_clicked), (gpointer)(long)i); - gtk_signal_connect(GTK_OBJECT(mixerControl.adj[i]), "value_changed", GTK_SIGNAL_FUNC(Monitor_volume_changed), (gpointer)(long)i); + g_signal_connect(G_OBJECT(mixerControl.volume[i]), "grab_focus", G_CALLBACK(Monitor_volume_clicked), (gpointer)(long)i); + g_signal_connect(G_OBJECT(mixerControl.adj[i]), "value_changed", G_CALLBACK(Monitor_volume_changed), (gpointer)(long)i); // Value label mixerControl.label[i]=gtk_label_new("xxx"); gtk_widget_show(mixerControl.label[i]); gtk_box_pack_start(GTK_BOX(vbox), mixerControl.label[i], FALSE, FALSE, 0); } - gtk_widget_set_usize(GTK_WIDGET(mixerControl.volume[0]), 0, 170); // Set minimum y size + gtk_widget_set_size_request(GTK_WIDGET(mixerControl.volume[0]), -1, 170); // Set minimum y size mixerControl.input=-1; mixerControl.output=0; Mixer_Input_selector_clicked(0, 0); @@ -2503,11 +2530,10 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ vmixerControl.window=gtk_window_new(GTK_WINDOW_TOPLEVEL); sprintf(str, "%s Vmixer", cardId); gtk_window_set_title(GTK_WINDOW(vmixerControl.window), str); - gtk_window_set_wmclass(GTK_WINDOW(vmixerControl.window), "vmixer", "Emixer"); - gtk_signal_connect(GTK_OBJECT(vmixerControl.window), "delete_event", GTK_SIGNAL_FUNC(CloseWindow), (gpointer)&Vmixerw_geom); + g_signal_connect(G_OBJECT(vmixerControl.window), "delete_event", G_CALLBACK(CloseWindow), (gpointer)&Vmixerw_geom); gtk_container_set_border_width(GTK_CONTAINER(vmixerControl.window), BORDER); if (Vmixerw_geom.st!=NOPOS) { - gtk_widget_set_uposition(vmixerControl.window, Vmixerw_geom.x, Vmixerw_geom.y); + gtk_window_move(GTK_WINDOW(vmixerControl.window), Vmixerw_geom.x, Vmixerw_geom.y); gtk_window_set_default_size(GTK_WINDOW(vmixerControl.window), Vmixerw_geom.w, Vmixerw_geom.h); } @@ -2536,18 +2562,18 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); // Volume vmixerControl.adj[i]=gtk_adjustment_new(0, ECHOGAIN_MINOUT, ECHOGAIN_MAXOUT, SHORTSTEP, LONGSTEP, 0); - vmixerControl.volume[i]=gtk_vscale_new(GTK_ADJUSTMENT(vmixerControl.adj[i])); + vmixerControl.volume[i]=gtk_scale_new(GTK_ORIENTATION_VERTICAL, vmixerControl.adj[i]); gtk_widget_show(vmixerControl.volume[i]); gtk_box_pack_start(GTK_BOX(vbox), vmixerControl.volume[i], TRUE, TRUE, 0); gtk_scale_set_draw_value(GTK_SCALE(vmixerControl.volume[i]), 0); - gtk_signal_connect(GTK_OBJECT(vmixerControl.volume[i]), "grab_focus", GTK_SIGNAL_FUNC(Vmixer_volume_clicked), (gpointer)i); - gtk_signal_connect(GTK_OBJECT(vmixerControl.adj[i]), "value_changed", GTK_SIGNAL_FUNC(Vmixer_volume_changed), (gpointer)i); + g_signal_connect(G_OBJECT(vmixerControl.volume[i]), "grab_focus", G_CALLBACK(Vmixer_volume_clicked), (gpointer)i); + g_signal_connect(G_OBJECT(vmixerControl.adj[i]), "value_changed", G_CALLBACK(Vmixer_volume_changed), (gpointer)i); // Value label vmixerControl.label[i]=gtk_label_new("xxx"); gtk_widget_show(vmixerControl.label[i]); gtk_box_pack_start(GTK_BOX(vbox), vmixerControl.label[i], FALSE, FALSE, 0); } - gtk_widget_set_usize(GTK_WIDGET(vmixerControl.volume[0]), 0, 170); // Set minimum y size + gtk_widget_set_size_request(GTK_WIDGET(vmixerControl.volume[0]), -1, 170); // Set minimum y size // Input channel selectors frame=gtk_frame_new("Output"); @@ -2564,11 +2590,11 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ else sprintf(str, "D%d", i); if (i) - bgroup=gtk_radio_button_group(GTK_RADIO_BUTTON(vmixerControl.outsel[i-1])); + bgroup=gtk_radio_button_get_group(GTK_RADIO_BUTTON(vmixerControl.outsel[i-1])); vmixerControl.outsel[i]=gtk_radio_button_new_with_label(bgroup, str); gtk_widget_show(vmixerControl.outsel[i]); gtk_box_pack_start(GTK_BOX(vbsel), vmixerControl.outsel[i], FALSE, FALSE, 0); - gtk_signal_connect(GTK_OBJECT(vmixerControl.outsel[i]), "toggled", GTK_SIGNAL_FUNC(Vmixer_output_selector_clicked), (gpointer)i); + g_signal_connect(G_OBJECT(vmixerControl.outsel[i]), "toggled", G_CALLBACK(Vmixer_output_selector_clicked), (gpointer)i); } vmixerControl.output=-1; Vmixer_output_selector_clicked(0, 0); @@ -2587,11 +2613,11 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ for (i=0; i \n"); fprintf(f, "MainWindow %d %d %d %d\n", Mainw_geom.x, Mainw_geom.y, Mainw_geom.w, Mainw_geom.h); if (VUwindow) - gdk_window_get_root_origin(VUwindow->window, &VUw_geom.x, &VUw_geom.y); + gdk_window_get_root_origin(gtk_widget_get_window(VUwindow), &VUw_geom.x, &VUw_geom.y); fprintf(f, "VUmetersWindow %d %d %d\n", VUw_geom.x, VUw_geom.y, VUw_geom.st); if (GMwindow) - gdk_window_get_root_origin(GMwindow->window, &VUw_geom.x, &VUw_geom.y); + gdk_window_get_root_origin(gtk_widget_get_window(GMwindow), &VUw_geom.x, &VUw_geom.y); fprintf(f, "GfxMixerWindow %d %d %d\n", GMw_geom.x, GMw_geom.y, GMw_geom.st); if (pcmoutId) { - if (pcmoutControl.window->window) { - gdk_window_get_root_origin(pcmoutControl.window->window, &PVw_geom.x, &PVw_geom.y); - gdk_window_get_size(pcmoutControl.window->window, &PVw_geom.w, &PVw_geom.h); + if (gtk_widget_get_window(pcmoutControl.window)) { + gdk_window_get_root_origin(gtk_widget_get_window(pcmoutControl.window), &PVw_geom.x, &PVw_geom.y); + PVw_geom.w = gdk_window_get_width(gtk_widget_get_window(pcmoutControl.window)); PVw_geom.h = gdk_window_get_height(gtk_widget_get_window(pcmoutControl.window)); } - fprintf(f, "PcmVolumeWindow %d %d %d %d %d\n", PVw_geom.x, PVw_geom.y, PVw_geom.w, PVw_geom.h, !!GTK_WIDGET_VISIBLE(pcmoutControl.window)); + fprintf(f, "PcmVolumeWindow %d %d %d %d %d\n", PVw_geom.x, PVw_geom.y, PVw_geom.w, PVw_geom.h, !!gtk_widget_get_visible(pcmoutControl.window)); } - if (LVwindow->window) { - gdk_window_get_root_origin(LVwindow->window, &LVw_geom.x, &LVw_geom.y); - gdk_window_get_size(LVwindow->window, &LVw_geom.w, &LVw_geom.h); + if (gtk_widget_get_window(LVwindow)) { + gdk_window_get_root_origin(gtk_widget_get_window(LVwindow), &LVw_geom.x, &LVw_geom.y); + LVw_geom.w = gdk_window_get_width(gtk_widget_get_window(LVwindow)); LVw_geom.h = gdk_window_get_height(gtk_widget_get_window(LVwindow)); } - fprintf(f, "LineVolumeWindow %d %d %d %d %d\n", LVw_geom.x, LVw_geom.y, LVw_geom.w, LVw_geom.h, !!GTK_WIDGET_VISIBLE(LVwindow)); - if (Miscwindow->window) { - gdk_window_get_root_origin(Miscwindow->window, &Miscw_geom.x, &Miscw_geom.y); - gdk_window_get_size(Miscwindow->window, &Miscw_geom.w, &Miscw_geom.h); + fprintf(f, "LineVolumeWindow %d %d %d %d %d\n", LVw_geom.x, LVw_geom.y, LVw_geom.w, LVw_geom.h, !!gtk_widget_get_visible(LVwindow)); + if (gtk_widget_get_window(Miscwindow)) { + gdk_window_get_root_origin(gtk_widget_get_window(Miscwindow), &Miscw_geom.x, &Miscw_geom.y); + Miscw_geom.w = gdk_window_get_width(gtk_widget_get_window(Miscwindow)); Miscw_geom.h = gdk_window_get_height(gtk_widget_get_window(Miscwindow)); } - fprintf(f, "MiscControlsWindow %d %d %d %d %d\n", Miscw_geom.x, Miscw_geom.y, Miscw_geom.w, Miscw_geom.h, !!GTK_WIDGET_VISIBLE(Miscwindow)); + fprintf(f, "MiscControlsWindow %d %d %d %d %d\n", Miscw_geom.x, Miscw_geom.y, Miscw_geom.w, Miscw_geom.h, !!gtk_widget_get_visible(Miscwindow)); if (mixerId) { - if (mixerControl.window->window) { - gdk_window_get_root_origin(mixerControl.window->window, &Mixerw_geom.x, &Mixerw_geom.y); - gdk_window_get_size(mixerControl.window->window, &Mixerw_geom.w, &Mixerw_geom.h); + if (gtk_widget_get_window(mixerControl.window)) { + gdk_window_get_root_origin(gtk_widget_get_window(mixerControl.window), &Mixerw_geom.x, &Mixerw_geom.y); + Mixerw_geom.w = gdk_window_get_width(gtk_widget_get_window(mixerControl.window)); Mixerw_geom.h = gdk_window_get_height(gtk_widget_get_window(mixerControl.window)); } - fprintf(f, "MixerWindow %d %d %d %d %d\n", Mixerw_geom.x, Mixerw_geom.y, Mixerw_geom.w, Mixerw_geom.h, !!GTK_WIDGET_VISIBLE(mixerControl.window)); + fprintf(f, "MixerWindow %d %d %d %d %d\n", Mixerw_geom.x, Mixerw_geom.y, Mixerw_geom.w, Mixerw_geom.h, !!gtk_widget_get_visible(mixerControl.window)); } if (vmixerId) { - if (vmixerControl.window->window) { - gdk_window_get_root_origin(vmixerControl.window->window, &Vmixerw_geom.x, &Vmixerw_geom.y); - gdk_window_get_size(vmixerControl.window->window, &Vmixerw_geom.w, &Vmixerw_geom.h); + if (gtk_widget_get_window(vmixerControl.window)) { + gdk_window_get_root_origin(gtk_widget_get_window(vmixerControl.window), &Vmixerw_geom.x, &Vmixerw_geom.y); + Vmixerw_geom.w = gdk_window_get_width(gtk_widget_get_window(vmixerControl.window)); Vmixerw_geom.h = gdk_window_get_height(gtk_widget_get_window(vmixerControl.window)); } - fprintf(f, "VmixerWindow %d %d %d %d %d\n", Vmixerw_geom.x, Vmixerw_geom.y, Vmixerw_geom.w, Vmixerw_geom.h, !!GTK_WIDGET_VISIBLE(vmixerControl.window)); + fprintf(f, "VmixerWindow %d %d %d %d %d\n", Vmixerw_geom.x, Vmixerw_geom.y, Vmixerw_geom.w, Vmixerw_geom.h, !!gtk_widget_get_visible(vmixerControl.window)); } fprintf(f, "\n"); fclose(f); @@ -2841,11 +2866,11 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/ if (VUwindow) { SetVUmeters(0); - gtk_timeout_remove(VUtimer); + g_source_remove(VUtimer); } if (GMwindow) { SetVUmeters(0); - gtk_timeout_remove(Mixtimer); + g_source_remove(Mixtimer); } snd_ctl_close(ctlhandle); return(0);