static void monitors_apply_config (Plugin *p) { ENTER; MonitorsPlugin *mp; mp = (MonitorsPlugin *) p->priv; int i; int current_n_monitors = 0; start: for (i = 0; i < N_MONITORS; i++) { if (mp->displayed_monitors[i]) current_n_monitors++; if (mp->displayed_monitors[i] && !mp->monitors[i]) { /* We've just activated monitor<i> */ mp->monitors[i] = monitors_add_monitor(p, mp, update_functions[i], tooltip_update[i], colors[i]); /* * It is probably best for users if their monitors are always * displayed in the same order : the CPU monitor always on the left, * the RAM monitor always on the right of the CPU monitor (if the * CPU monitor is displayed), etc. That's why we do not just use * gtk_box_pack_start/gtk_box_pack_end, and use * gtk_box_reorder_child. */ gtk_box_reorder_child(GTK_BOX(p->pwid), mp->monitors[i]->da,current_n_monitors-1); } else if (!mp->displayed_monitors[i] && mp->monitors[i]) { /* We've just removed monitor<i> */ gtk_container_remove(GTK_CONTAINER(p->pwid), mp->monitors[i]->da); monitor_free(mp->monitors[i]); mp->monitors[i] = NULL; } if (mp->monitors[i] && strncmp(mp->monitors[i]->color, colors[i], COLOR_SIZE) != 0) { /* We've changed the color */ monitor_set_foreground_color(p, mp->monitors[i], colors[i]); } } /* Workaround meant to prevent users to display no monitor at all. * FIXME : write something clean. When there is only one monitor displayed, * its toggle button should not be clickable in the prefs. */ if (current_n_monitors == 0) { mp->displayed_monitors[0] = 1; goto start; } RET(); }
static GtkWidget * monitors_constructor(LXPanel *panel, config_setting_t *settings) { ENTER; int i; MonitorsPlugin *mp; GtkWidget *p; const char *tmp; mp = g_new0(MonitorsPlugin, 1); mp->panel = panel; mp->settings = settings; p = gtk_hbox_new(TRUE, 2); lxpanel_plugin_set_data(p, mp, monitors_destructor); /* First time we use this plugin : only display CPU usage */ mp->displayed_monitors[CPU_POSITION] = 1; /* Apply options */ config_setting_lookup_int(settings, "DisplayCPU", &mp->displayed_monitors[CPU_POSITION]); config_setting_lookup_int(settings, "DisplayRAM", &mp->displayed_monitors[MEM_POSITION]); if (config_setting_lookup_string(settings, "Action", &tmp)) mp->action = g_strdup(tmp); if (config_setting_lookup_string(settings, "CPUColor", &tmp)) colors[CPU_POSITION] = g_strndup(tmp, COLOR_SIZE-1); if (config_setting_lookup_string(settings, "RAMColor", &tmp)) colors[MEM_POSITION] = g_strndup(tmp, COLOR_SIZE-1); /* Initializing monitors */ for (i = 0; i < N_MONITORS; i++) { if (!colors[i]) colors[i] = g_strndup(default_colors[i], COLOR_SIZE-1); if (mp->displayed_monitors[i]) { mp->monitors[i] = monitors_add_monitor(p, mp, update_functions[i], tooltip_update[i], colors[i]); } } /* Adding a timer : monitors will be updated every UPDATE_PERIOD * seconds */ mp->timer = g_timeout_add_seconds(UPDATE_PERIOD, (GSourceFunc) monitors_update, (gpointer) mp); RET(p); }
static int monitors_constructor(Plugin *p, char **fp) { ENTER; int i; MonitorsPlugin *mp; mp = g_new0(MonitorsPlugin, 1); p->priv = mp; p->pwid = gtk_hbox_new(TRUE, 2); gtk_container_set_border_width(GTK_CONTAINER(p->pwid), 1); GTK_WIDGET_SET_FLAGS(p->pwid, GTK_NO_WINDOW); g_signal_connect(G_OBJECT(p->pwid), "button_press_event", G_CALLBACK(monitors_button_press_event), (gpointer) p); /* Apply options */ line s; s.len = 256; if (fp) { while (lxpanel_get_line(fp, &s) != LINE_BLOCK_END) { if (s.type == LINE_NONE) { ERR("%s : illegal token %s\n", PLUGIN_NAME, s.str); continue; } if (s.type == LINE_VAR) { if (g_ascii_strcasecmp(s.t[0], "DisplayCPU") == 0) mp->displayed_monitors[CPU_POSITION] = atoi(s.t[1]); else if (g_ascii_strcasecmp(s.t[0], "DisplayRAM") == 0) mp->displayed_monitors[MEM_POSITION] = atoi(s.t[1]); else if (g_ascii_strcasecmp(s.t[0], "Action") == 0) mp->action = g_strdup(s.t[1]); else if (g_ascii_strcasecmp(s.t[0], "CPUColor") == 0) colors[CPU_POSITION] = g_strndup(s.t[1], COLOR_SIZE-1); else if (g_ascii_strcasecmp(s.t[0], "RAMColor") == 0) colors[MEM_POSITION] = g_strndup(s.t[1], COLOR_SIZE-1); else { ERR("%s : unknown var %s\n", PLUGIN_NAME, s.t[0]); continue; } } } } else { /* First time we use this plugin : only display CPU usage */ mp->displayed_monitors[CPU_POSITION] = 1; } /* Initializing monitors */ for (i = 0; i < N_MONITORS; i++) { if (!colors[i]) colors[i] = g_strndup(default_colors[i], COLOR_SIZE-1); if (mp->displayed_monitors[i]) { mp->monitors[i] = monitors_add_monitor(p, mp, update_functions[i], tooltip_update[i], colors[i]); } } /* Adding a timer : monitors will be updated every UPDATE_PERIOD * seconds */ mp->timer = g_timeout_add_seconds(UPDATE_PERIOD, (GSourceFunc) monitors_update, (gpointer) mp); RET(TRUE); }
static gboolean monitors_apply_config (gpointer user_data) { ENTER; GtkWidget *p = user_data; MonitorsPlugin *mp; mp = lxpanel_plugin_get_data(p); int i; int current_n_monitors = 0; start: for (i = 0; i < N_MONITORS; i++) { if (mp->displayed_monitors[i]) current_n_monitors++; if (mp->displayed_monitors[i] && !mp->monitors[i]) { /* We've just activated monitor<i> */ mp->monitors[i] = monitors_add_monitor(p, mp, update_functions[i], tooltip_update[i], colors[i]); /* * It is probably best for users if their monitors are always * displayed in the same order : the CPU monitor always on the left, * the RAM monitor always on the right of the CPU monitor (if the * CPU monitor is displayed), etc. That's why we do not just use * gtk_box_pack_start/gtk_box_pack_end, and use * gtk_box_reorder_child. */ gtk_box_reorder_child(GTK_BOX(p), mp->monitors[i]->da,current_n_monitors-1); } else if (!mp->displayed_monitors[i] && mp->monitors[i]) { /* We've just removed monitor<i> */ gtk_widget_destroy(mp->monitors[i]->da); monitor_free(mp->monitors[i]); mp->monitors[i] = NULL; } if (mp->monitors[i] && strncmp(mp->monitors[i]->color, colors[i], COLOR_SIZE) != 0) { /* We've changed the color */ monitor_set_foreground_color(mp, mp->monitors[i], colors[i]); } } /* Workaround meant to prevent users to display no monitor at all. * FIXME : write something clean. When there is only one monitor displayed, * its toggle button should not be clickable in the prefs. */ if (current_n_monitors == 0) { mp->displayed_monitors[0] = 1; goto start; } config_group_set_int(mp->settings, "DisplayCPU", mp->displayed_monitors[CPU_POSITION]); config_group_set_int(mp->settings, "DisplayRAM", mp->displayed_monitors[MEM_POSITION]); config_group_set_string(mp->settings, "Action", mp->action); config_group_set_string(mp->settings, "CPUColor", mp->monitors[CPU_POSITION] ? colors[CPU_POSITION] : NULL); config_group_set_string(mp->settings, "RAMColor", mp->monitors[MEM_POSITION] ? colors[MEM_POSITION] : NULL); RET(FALSE); }