static GtkWidget *volume_constructor(LXPanel *panel, config_setting_t *settings) { volume_t *vol; GtkWidget *p; GtkAdjustment *vol_adjustment; vol_before_mute = 1; curr_volume = 0; curr_image = NULL; skip_botton1_event = FALSE; ENTER; /* check if OSS mixer device could be open */ mixer_fd = open ("/dev/mixer", O_RDWR, 0); if (mixer_fd < 0) { RET(NULL); } /* try to obtain current volume */ p = create_volume_window(); /* use pointer */ if (! vol_spin) goto _error; vol_adjustment = gtk_spin_button_get_adjustment (vol_spin); if (! vol_adjustment) { _error: gtk_widget_destroy(p); RET(NULL); } curr_volume = gtk_adjustment_get_value (vol_adjustment); vol = g_new0(volume_t, 1); vol->dlg = p; /* it was reused */ p = gtk_event_box_new(); lxpanel_plugin_set_data(p, vol, volume_destructor); vol->panel = panel; gtk_widget_add_events(p, GDK_BUTTON_PRESS_MASK); g_signal_connect(p, "scroll-event", G_CALLBACK(on_mouse_scroll), vol); gtk_widget_set_size_request(p, panel_get_icon_size(panel), panel_get_icon_size(panel)); update_icon(p, vol); gtk_widget_destroy( vol->dlg ); vol->dlg = NULL; /* FIXME: display current level in tooltip. ex: "Volume Control: 80%" */ gtk_widget_set_tooltip_text(p, _("Volume control")); RET(p); }
static void update_icon (GtkWidget *p, volume_t *vol) { GdkPixbuf *icon; GtkWidget *image; GtkIconTheme* theme; GtkIconInfo* info; int icon_size; theme = panel_get_icon_theme(vol->panel); icon_size = panel_get_icon_size(vol->panel); if (curr_volume <= 0) { info = gtk_icon_theme_lookup_icon( theme, "stock_volume-mute", icon_size, 0 ); } else if (curr_volume > 0 && curr_volume <= 50) { info = gtk_icon_theme_lookup_icon( theme, "stock_volume-min", icon_size, 0 ); } else if (curr_volume > 50 && curr_volume <= 75) { info = gtk_icon_theme_lookup_icon( theme, "stock_volume-med", icon_size, 0 ); } else /* curr_volume > 75 */ { info = gtk_icon_theme_lookup_icon( theme, "stock_volume-max", icon_size, 0 ); } if (info ) { icon = gdk_pixbuf_new_from_file_at_size( gtk_icon_info_get_filename( info ), icon_size, icon_size, NULL ); gtk_icon_info_free( info ); } else { icon = gdk_pixbuf_new_from_xpm_data((const char **) volume_xpm); } if (icon) { if (curr_image) { gtk_widget_destroy(curr_image); curr_image = NULL; } image = gtk_image_new_from_pixbuf(icon); gtk_container_add(GTK_CONTAINER(p), image); curr_image = image; } gtk_widget_show_all(p); return; }
/* Callback when panel configuration changes. */ static void wincmd_panel_reconfigure(LXPanel *panel, GtkWidget *p) { WinCmdPlugin * wc = lxpanel_plugin_get_data(p); lxpanel_button_set_icon(p, wc->image, panel_get_icon_size(panel)); }