153 lines
3.2 KiB
C
153 lines
3.2 KiB
C
/*
|
|
* 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);
|
|
}
|