1 /*****************************************************************
2  * gmerlin - a general purpose multimedia framework and applications
3  *
4  * Copyright (c) 2001 - 2011 Members of the Gmerlin project
5  * gmerlin-general@lists.sourceforge.net
6  * http://gmerlin.sourceforge.net
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  * *****************************************************************/
21 
22 #include "gui.h"
23 #include <gui_gtk/gtkutils.h>
24 
25 struct mixer_window_s
26   {
27   GtkWidget * main_win;
28   //  GtkWidget * aux_win;
29 
30   int num_cards;
31   card_widget_t ** cards;
32   bg_cfg_registry_t * cfg_reg;
33 
34   int x, y, width, height;
35   };
36 
37 static const bg_parameter_info_t parameters[] =
38   {
39     {
40       .name =      "x",
41       .long_name = "X",
42       .type =      BG_PARAMETER_INT,
43       .flags =     BG_PARAMETER_HIDE_DIALOG,
44       .val_default = { .val_i = 100 },
45     },
46     {
47       .name =      "y",
48       .long_name = "Y",
49       .type =      BG_PARAMETER_INT,
50       .flags =     BG_PARAMETER_HIDE_DIALOG,
51       .val_default = { .val_i = 100 },
52     },
53     {
54       .name =      "width",
55       .long_name = "Width",
56       .type =      BG_PARAMETER_INT,
57       .flags =     BG_PARAMETER_HIDE_DIALOG,
58       .val_default = { .val_i = 300 },
59     },
60     {
61       .name =      "height",
62       .long_name = "Height",
63       .type =      BG_PARAMETER_INT,
64       .flags =     BG_PARAMETER_HIDE_DIALOG,
65       .val_default = { .val_i = 200 },
66     },
67     { /* End of parameters */ }
68   };
69 
set_parameter(void * data,const char * name,const bg_parameter_value_t * val)70 static void set_parameter(void * data, const char * name,
71                           const bg_parameter_value_t * val)
72   {
73   mixer_window_t * w;
74   w = (mixer_window_t*)data;
75 
76   if(!name)
77     {
78     return;
79     }
80   if(!strcmp(name, "x"))
81     {
82     w->x = val->val_i;
83     }
84   else if(!strcmp(name, "y"))
85     {
86     w->y = val->val_i;
87     }
88   else if(!strcmp(name, "width"))
89     {
90     w->width = val->val_i;
91     }
92   else if(!strcmp(name, "height"))
93     {
94     w->height = val->val_i;
95     }
96   }
97 
get_parameter(void * data,const char * name,bg_parameter_value_t * val)98 static int get_parameter(void * data, const char * name,
99                          bg_parameter_value_t * val)
100   {
101   mixer_window_t * w;
102   w = (mixer_window_t*)data;
103   if(!name)
104     {
105     return 1;
106     }
107   if(!strcmp(name, "x"))
108     {
109     val->val_i = w->x;
110     return 1;
111     }
112   else if(!strcmp(name, "y"))
113     {
114     val->val_i = w->y;
115     return 1;
116     }
117   else if(!strcmp(name, "width"))
118     {
119     val->val_i = w->width;
120     return 1;
121     }
122   else if(!strcmp(name, "height"))
123     {
124     val->val_i = w->height;
125     return 1;
126     }
127   return 0;
128   }
129 
130 
131 
delete_callback(GtkWidget * wid,GdkEventAny * evt,gpointer data)132 static gboolean delete_callback(GtkWidget * wid, GdkEventAny * evt,
133                                 gpointer data)
134   {
135   int i;
136   mixer_window_t * w;
137   bg_cfg_section_t * section;
138 
139   w = (mixer_window_t*)data;
140   section =
141     bg_cfg_registry_find_section(w->cfg_reg, "General");
142 
143   gtk_window_get_position(GTK_WINDOW(w->main_win), &w->x, &w->y);
144   gtk_window_get_size(GTK_WINDOW(w->main_win), &w->width, &w->height);
145   bg_cfg_section_get(section, parameters, get_parameter, w);
146 
147   for(i = 0; i < w->num_cards; i++)
148     card_widget_get_window_coords(w->cards[i]);
149 
150   gtk_main_quit();
151   return TRUE;
152   }
153 
154 
155 
map_callback(GtkWidget * wid,gpointer data)156 static void map_callback(GtkWidget * wid, gpointer data)
157   {
158   mixer_window_t * w;
159   w = (mixer_window_t*)data;
160   gtk_window_resize(GTK_WINDOW(w->main_win), w->width, w->height);
161   gtk_window_move(GTK_WINDOW(w->main_win), w->x, w->y);
162   }
163 
mixer_window_create(alsa_mixer_t * mixer,bg_cfg_registry_t * cfg_reg)164 mixer_window_t * mixer_window_create(alsa_mixer_t * mixer,
165                                      bg_cfg_registry_t * cfg_reg)
166   {
167   int i;
168   GtkWidget * notebook;
169   GtkWidget * label;
170   bg_cfg_section_t * section;
171   mixer_window_t * ret;
172   ret = calloc(1, sizeof(*ret));
173   ret->cfg_reg = cfg_reg;
174   ret->main_win = bg_gtk_window_new(GTK_WINDOW_TOPLEVEL);
175   gtk_window_set_title(GTK_WINDOW(ret->main_win), "Gmerlin Alsamixer");
176 
177 
178   g_signal_connect(G_OBJECT(ret->main_win),
179                    "delete-event", G_CALLBACK(delete_callback),
180                    ret);
181 
182   g_signal_connect(G_OBJECT(ret->main_win),
183                    "map", G_CALLBACK(map_callback),
184                    ret);
185 
186   ret->cards = calloc(mixer->num_cards, sizeof(*(ret->cards)));
187 
188   notebook = gtk_notebook_new();
189   ret->num_cards = mixer->num_cards;
190   for(i = 0; i < mixer->num_cards; i++)
191     {
192     if(mixer->cards[i]->num_groups)
193       {
194       section =
195         bg_cfg_registry_find_section(ret->cfg_reg,
196                                      mixer->cards[i]->name);
197       label = gtk_label_new(mixer->cards[i]->name);
198       gtk_widget_show(label);
199 
200       ret->cards[i] = card_widget_create(mixer->cards[i], section);
201       gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
202                                card_widget_get_widget(ret->cards[i]),
203                                label);
204       }
205 
206     }
207 
208   gtk_widget_show(notebook);
209   gtk_container_add(GTK_CONTAINER(ret->main_win), notebook);
210 
211   section =
212     bg_cfg_registry_find_section(ret->cfg_reg, "General");
213   bg_cfg_section_apply(section, parameters, set_parameter, ret);
214   return ret;
215   }
216 
mixer_window_destroy(mixer_window_t * w)217 void mixer_window_destroy(mixer_window_t * w)
218   {
219   int i;
220 
221   for(i = 0; i < w->num_cards; i++)
222     card_widget_destroy(w->cards[i]);
223 
224   free(w);
225   }
226 
mixer_window_run(mixer_window_t * w)227 void mixer_window_run(mixer_window_t * w)
228   {
229   gtk_widget_show(w->main_win);
230   gtk_main();
231   }
232