Implementing tabbed controls
This commit is contained in:
parent
4b41aac022
commit
76e05c98af
16
src/main.c
16
src/main.c
|
@ -41,8 +41,9 @@
|
||||||
/* usage */
|
/* usage */
|
||||||
static int _usage(void)
|
static int _usage(void)
|
||||||
{
|
{
|
||||||
fputs(_("Usage: mixer [-H|-V][-d device]\n"
|
fputs(_("Usage: mixer [-H|-T|-V][-d device]\n"
|
||||||
" -H Show the classes next to each other\n"
|
" -H Show the classes next to each other\n"
|
||||||
|
" -V Show the classes in separate tabs\n"
|
||||||
" -V Show the classes on top of each other\n"
|
" -V Show the classes on top of each other\n"
|
||||||
" -d The mixer device to use\n"), stderr);
|
" -d The mixer device to use\n"), stderr);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -54,20 +55,23 @@ int main(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
int o;
|
int o;
|
||||||
char const * device = NULL;
|
char const * device = NULL;
|
||||||
MixerOrientation mo = MO_HORIZONTAL;
|
MixerLayout ml = ML_TABBED;
|
||||||
Mixer * mixer;
|
Mixer * mixer;
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
while((o = getopt(argc, argv, "HVd:")) != -1)
|
while((o = getopt(argc, argv, "HTVd:")) != -1)
|
||||||
switch(o)
|
switch(o)
|
||||||
{
|
{
|
||||||
case 'H':
|
case 'H':
|
||||||
mo = MO_HORIZONTAL;
|
ml = ML_HORIZONTAL;
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
ml = ML_TABBED;
|
||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
mo = MO_VERTICAL;
|
ml = ML_VERTICAL;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
device = optarg;
|
device = optarg;
|
||||||
|
@ -78,7 +82,7 @@ int main(int argc, char * argv[])
|
||||||
if(optind != argc)
|
if(optind != argc)
|
||||||
return _usage();
|
return _usage();
|
||||||
gtk_init(&argc, &argv);
|
gtk_init(&argc, &argv);
|
||||||
if((mixer = mixer_new(device, mo)) == NULL)
|
if((mixer = mixer_new(device, ml)) == NULL)
|
||||||
return 2;
|
return 2;
|
||||||
gtk_main();
|
gtk_main();
|
||||||
mixer_delete(mixer);
|
mixer_delete(mixer);
|
||||||
|
|
58
src/mixer.c
58
src/mixer.c
|
@ -87,6 +87,7 @@ struct _Mixer
|
||||||
{
|
{
|
||||||
/* widgets */
|
/* widgets */
|
||||||
GtkWidget * window;
|
GtkWidget * window;
|
||||||
|
GtkWidget * notebook;
|
||||||
GtkWidget * properties;
|
GtkWidget * properties;
|
||||||
GtkWidget * about;
|
GtkWidget * about;
|
||||||
|
|
||||||
|
@ -202,16 +203,16 @@ static GtkWidget * _new_set(Mixer * mixer, int dev, struct audio_mixer_set * s);
|
||||||
#endif
|
#endif
|
||||||
static GtkWidget * _new_value(Mixer * mixer, int index);
|
static GtkWidget * _new_value(Mixer * mixer, int index);
|
||||||
|
|
||||||
Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
Mixer * mixer_new(char const * device, MixerLayout layout)
|
||||||
{
|
{
|
||||||
Mixer * mixer;
|
Mixer * mixer;
|
||||||
GtkAccelGroup * accel;
|
GtkAccelGroup * accel;
|
||||||
GtkSizeGroup * group;
|
GtkSizeGroup * group;
|
||||||
GtkWidget * scrolled;
|
GtkWidget * scrolled = NULL;
|
||||||
GtkWidget * vbox;
|
GtkWidget * vbox;
|
||||||
GtkWidget * label;
|
GtkWidget * label;
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
GtkWidget * hvbox;
|
GtkWidget * hvbox = NULL;
|
||||||
GtkWidget * hbox;
|
GtkWidget * hbox;
|
||||||
GtkWidget * control;
|
GtkWidget * control;
|
||||||
int i;
|
int i;
|
||||||
|
@ -258,12 +259,6 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
||||||
gtk_window_set_title(GTK_WINDOW(mixer->window), PACKAGE);
|
gtk_window_set_title(GTK_WINDOW(mixer->window), PACKAGE);
|
||||||
g_signal_connect_swapped(G_OBJECT(mixer->window), "delete-event",
|
g_signal_connect_swapped(G_OBJECT(mixer->window), "delete-event",
|
||||||
G_CALLBACK(on_closex), mixer);
|
G_CALLBACK(on_closex), mixer);
|
||||||
scrolled = gtk_scrolled_window_new(NULL, NULL);
|
|
||||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
|
|
||||||
GTK_POLICY_AUTOMATIC, orientation == MO_VERTICAL
|
|
||||||
? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER);
|
|
||||||
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled),
|
|
||||||
GTK_SHADOW_NONE);
|
|
||||||
vbox = gtk_vbox_new(FALSE, 0);
|
vbox = gtk_vbox_new(FALSE, 0);
|
||||||
#ifndef EMBEDDED
|
#ifndef EMBEDDED
|
||||||
/* menubar */
|
/* menubar */
|
||||||
|
@ -273,11 +268,25 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
||||||
desktop_accel_create(_mixer_accel, mixer, accel);
|
desktop_accel_create(_mixer_accel, mixer, accel);
|
||||||
#endif
|
#endif
|
||||||
/* classes */
|
/* classes */
|
||||||
if(orientation == MO_VERTICAL)
|
mixer->notebook = NULL;
|
||||||
hvbox = gtk_vbox_new(TRUE, 4);
|
if(layout == ML_TABBED)
|
||||||
|
mixer->notebook = gtk_notebook_new();
|
||||||
else
|
else
|
||||||
hvbox = gtk_hbox_new(FALSE, 4);
|
{
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(hvbox), 4);
|
scrolled = gtk_scrolled_window_new(NULL, NULL);
|
||||||
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
|
||||||
|
GTK_POLICY_AUTOMATIC, (layout == ML_VERTICAL)
|
||||||
|
? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER);
|
||||||
|
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(
|
||||||
|
scrolled), GTK_SHADOW_NONE);
|
||||||
|
if(layout == ML_VERTICAL)
|
||||||
|
hvbox = gtk_vbox_new(TRUE, 4);
|
||||||
|
else
|
||||||
|
hvbox = gtk_hbox_new(FALSE, 4);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(hvbox), 4);
|
||||||
|
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(
|
||||||
|
scrolled), hvbox);
|
||||||
|
}
|
||||||
for(i = 0;; i++)
|
for(i = 0;; i++)
|
||||||
{
|
{
|
||||||
#ifdef AUDIO_MIXER_DEVINFO
|
#ifdef AUDIO_MIXER_DEVINFO
|
||||||
|
@ -304,8 +313,6 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled),
|
|
||||||
hvbox);
|
|
||||||
/* controls */
|
/* controls */
|
||||||
for(i = 0;; i++)
|
for(i = 0;; i++)
|
||||||
{
|
{
|
||||||
|
@ -347,8 +354,16 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
||||||
{
|
{
|
||||||
mixer->mc[u].hbox = gtk_hbox_new(FALSE, 4);
|
mixer->mc[u].hbox = gtk_hbox_new(FALSE, 4);
|
||||||
hbox = mixer->mc[u].hbox;
|
hbox = mixer->mc[u].hbox;
|
||||||
gtk_box_pack_start(GTK_BOX(hvbox), hbox, FALSE, TRUE,
|
if(mixer->notebook != NULL)
|
||||||
0);
|
{
|
||||||
|
/* FIXME nicer tab labels */
|
||||||
|
gtk_notebook_append_page(GTK_NOTEBOOK(
|
||||||
|
mixer->notebook), hbox,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
else if(hvbox != NULL)
|
||||||
|
gtk_box_pack_start(GTK_BOX(hvbox), hbox, FALSE,
|
||||||
|
TRUE, 0);
|
||||||
}
|
}
|
||||||
gtk_size_group_add_widget(group, widget);
|
gtk_size_group_add_widget(group, widget);
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
||||||
|
@ -387,7 +402,11 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
|
if(mixer->notebook != NULL)
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), mixer->notebook, TRUE, TRUE,
|
||||||
|
0);
|
||||||
|
else
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
|
||||||
gtk_container_add(GTK_CONTAINER(mixer->window), vbox);
|
gtk_container_add(GTK_CONTAINER(mixer->window), vbox);
|
||||||
gtk_widget_show_all(vbox);
|
gtk_widget_show_all(vbox);
|
||||||
#ifdef AUDIO_MIXER_DEVINFO
|
#ifdef AUDIO_MIXER_DEVINFO
|
||||||
|
@ -874,6 +893,9 @@ void mixer_show_class(Mixer * mixer, char const * name)
|
||||||
#ifdef AUDIO_MIXER_DEVINFO
|
#ifdef AUDIO_MIXER_DEVINFO
|
||||||
size_t u;
|
size_t u;
|
||||||
|
|
||||||
|
if(mixer->notebook != NULL)
|
||||||
|
/* FIXME really implement */
|
||||||
|
name = NULL;
|
||||||
for(u = 0; u < mixer->mc_cnt; u++)
|
for(u = 0; u < mixer->mc_cnt; u++)
|
||||||
if(mixer->mc[u].hbox == NULL)
|
if(mixer->mc[u].hbox == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -23,13 +23,18 @@
|
||||||
|
|
||||||
/* Mixer */
|
/* Mixer */
|
||||||
/* types */
|
/* types */
|
||||||
typedef enum _MixerOrientation { MO_HORIZONTAL, MO_VERTICAL } MixerOrientation;
|
typedef enum _MixerLayout
|
||||||
|
{
|
||||||
|
ML_HORIZONTAL,
|
||||||
|
ML_TABBED,
|
||||||
|
ML_VERTICAL
|
||||||
|
} MixerLayout;
|
||||||
|
|
||||||
typedef struct _Mixer Mixer;
|
typedef struct _Mixer Mixer;
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
Mixer * mixer_new(char const * device, MixerOrientation orientation);
|
Mixer * mixer_new(char const * device, MixerLayout layout);
|
||||||
void mixer_delete(Mixer * mixer);
|
void mixer_delete(Mixer * mixer);
|
||||||
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user