| /* |
| * Copyright 2007, Intel Corporation |
| * |
| * This file is part of PowerTOP |
| * |
| * This program file is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License as published by the |
| * Free Software Foundation; version 2 of the License. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program in a file named COPYING; if not, write to the |
| * Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, |
| * Boston, MA 02110-1301 USA |
| * |
| * Authors: |
| * Arjan van de Ven <arjan@linux.intel.com> |
| */ |
| |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <stdint.h> |
| #include <sys/types.h> |
| #include <dirent.h> |
| |
| #include "powertop.h" |
| |
| |
| |
| char suggestion_key; |
| suggestion_func *suggestion_activate; |
| |
| struct suggestion; |
| |
| struct suggestion { |
| struct suggestion *next; |
| |
| char *string; |
| int weight; |
| |
| char key; |
| char *keystring; |
| |
| suggestion_func *func; |
| }; |
| |
| |
| static struct suggestion *suggestions; |
| static int total_weight; |
| |
| static char previous[1024]; |
| |
| |
| void reset_suggestions(void) |
| { |
| struct suggestion *ptr; |
| ptr = suggestions; |
| while (ptr) { |
| struct suggestion *next; |
| next = ptr->next; |
| free(ptr->string); |
| free(ptr->keystring); |
| free(ptr); |
| ptr = next; |
| } |
| suggestions = NULL; |
| strcpy(status_bar_slots[8],""); |
| suggestion_key = 255; |
| suggestion_activate = NULL; |
| total_weight = 0; |
| } |
| |
| void add_suggestion(char *text, int weight, char key, char *keystring, suggestion_func *func) |
| { |
| struct suggestion *new; |
| |
| if (!text) |
| return; |
| |
| new = malloc(sizeof(struct suggestion)); |
| if (!new) |
| return; |
| memset(new, 0, sizeof(struct suggestion)); |
| new->string = strdup(text); |
| new->weight = weight; |
| new->key = key; |
| if (keystring) |
| new->keystring = strdup(keystring); |
| new->next = suggestions; |
| new->func = func; |
| suggestions = new; |
| total_weight += weight; |
| } |
| |
| void pick_suggestion(void) |
| { |
| int value, running = 0; |
| struct suggestion *ptr; |
| int weight; |
| |
| strcpy(status_bar_slots[8],""); |
| suggestion_key = 255; |
| suggestion_activate = NULL; |
| |
| if (total_weight==0 || suggestions==NULL) { |
| /* zero suggestions */ |
| show_suggestion(""); |
| return; |
| } |
| |
| weight = total_weight; |
| if (strlen(previous) && displaytime > 0.0) |
| weight+=50; |
| value = rand() % weight; |
| ptr = suggestions; |
| while (ptr) { |
| running += ptr->weight; |
| if (strcmp(ptr->string, previous)==0 && displaytime > 0.0) |
| running += 50; |
| if (running > value) { |
| if (ptr->keystring) |
| strncpy(status_bar_slots[8],ptr->keystring, 40); |
| suggestion_key = ptr->key; |
| suggestion_activate = ptr->func; |
| show_suggestion(ptr->string); |
| if (strcmp(ptr->string, previous)) { |
| displaytime = 30.0; |
| strcpy(previous, ptr->string); |
| } |
| return; |
| } |
| ptr = ptr->next; |
| } |
| show_suggestion(""); |
| memset(previous, 0, sizeof(previous)); |
| displaytime = -1.0; |
| } |
| |
| void print_all_suggestions(void) |
| { |
| struct suggestion *ptr; |
| |
| for (ptr = suggestions; ptr; ptr = ptr->next) |
| printf("\n%s\n", ptr->string); |
| } |