17a192d395ce5d7e5945afa684146d5b0abc53480mbligh/* 27a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Copyright 2007, Intel Corporation 37a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 47a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This file is part of PowerTOP 57a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 67a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program file is free software; you can redistribute it and/or modify it 77a192d395ce5d7e5945afa684146d5b0abc53480mbligh * under the terms of the GNU General Public License as published by the 87a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation; version 2 of the License. 97a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 107a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program is distributed in the hope that it will be useful, but WITHOUT 117a192d395ce5d7e5945afa684146d5b0abc53480mbligh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 127a192d395ce5d7e5945afa684146d5b0abc53480mbligh * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 137a192d395ce5d7e5945afa684146d5b0abc53480mbligh * for more details. 147a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 157a192d395ce5d7e5945afa684146d5b0abc53480mbligh * You should have received a copy of the GNU General Public License 167a192d395ce5d7e5945afa684146d5b0abc53480mbligh * along with this program in a file named COPYING; if not, write to the 177a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation, Inc., 187a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 51 Franklin Street, Fifth Floor, 197a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Boston, MA 02110-1301 USA 207a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 217a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Authors: 227a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Arjan van de Ven <arjan@linux.intel.com> 237a192d395ce5d7e5945afa684146d5b0abc53480mbligh */ 247a192d395ce5d7e5945afa684146d5b0abc53480mbligh 257a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <unistd.h> 267a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdio.h> 277a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdlib.h> 287a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <string.h> 297a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdint.h> 307a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <sys/types.h> 317a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <dirent.h> 327a192d395ce5d7e5945afa684146d5b0abc53480mbligh 337a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include "powertop.h" 347a192d395ce5d7e5945afa684146d5b0abc53480mbligh 357a192d395ce5d7e5945afa684146d5b0abc53480mbligh 367a192d395ce5d7e5945afa684146d5b0abc53480mbligh 377a192d395ce5d7e5945afa684146d5b0abc53480mblighchar suggestion_key; 387a192d395ce5d7e5945afa684146d5b0abc53480mblighsuggestion_func *suggestion_activate; 397a192d395ce5d7e5945afa684146d5b0abc53480mbligh 407a192d395ce5d7e5945afa684146d5b0abc53480mblighstruct suggestion; 417a192d395ce5d7e5945afa684146d5b0abc53480mbligh 427a192d395ce5d7e5945afa684146d5b0abc53480mblighstruct suggestion { 437a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *next; 447a192d395ce5d7e5945afa684146d5b0abc53480mbligh 457a192d395ce5d7e5945afa684146d5b0abc53480mbligh char *string; 467a192d395ce5d7e5945afa684146d5b0abc53480mbligh int weight; 477a192d395ce5d7e5945afa684146d5b0abc53480mbligh 487a192d395ce5d7e5945afa684146d5b0abc53480mbligh char key; 497a192d395ce5d7e5945afa684146d5b0abc53480mbligh char *keystring; 507a192d395ce5d7e5945afa684146d5b0abc53480mbligh 517a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_func *func; 527a192d395ce5d7e5945afa684146d5b0abc53480mbligh}; 537a192d395ce5d7e5945afa684146d5b0abc53480mbligh 547a192d395ce5d7e5945afa684146d5b0abc53480mbligh 557a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic struct suggestion *suggestions; 567a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic int total_weight; 577a192d395ce5d7e5945afa684146d5b0abc53480mbligh 587a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic char previous[1024]; 597a192d395ce5d7e5945afa684146d5b0abc53480mbligh 607a192d395ce5d7e5945afa684146d5b0abc53480mbligh 617a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid reset_suggestions(void) 627a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 637a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *ptr; 647a192d395ce5d7e5945afa684146d5b0abc53480mbligh ptr = suggestions; 657a192d395ce5d7e5945afa684146d5b0abc53480mbligh while (ptr) { 667a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *next; 677a192d395ce5d7e5945afa684146d5b0abc53480mbligh next = ptr->next; 687a192d395ce5d7e5945afa684146d5b0abc53480mbligh free(ptr->string); 697a192d395ce5d7e5945afa684146d5b0abc53480mbligh free(ptr->keystring); 707a192d395ce5d7e5945afa684146d5b0abc53480mbligh free(ptr); 717a192d395ce5d7e5945afa684146d5b0abc53480mbligh ptr = next; 727a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 737a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestions = NULL; 747a192d395ce5d7e5945afa684146d5b0abc53480mbligh strcpy(status_bar_slots[8],""); 757a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_key = 255; 767a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_activate = NULL; 777a192d395ce5d7e5945afa684146d5b0abc53480mbligh total_weight = 0; 787a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 797a192d395ce5d7e5945afa684146d5b0abc53480mbligh 807a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid add_suggestion(char *text, int weight, char key, char *keystring, suggestion_func *func) 817a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 827a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *new; 837a192d395ce5d7e5945afa684146d5b0abc53480mbligh 847a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!text) 857a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 867a192d395ce5d7e5945afa684146d5b0abc53480mbligh 877a192d395ce5d7e5945afa684146d5b0abc53480mbligh new = malloc(sizeof(struct suggestion)); 887a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!new) 897a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 907a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(new, 0, sizeof(struct suggestion)); 917a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->string = strdup(text); 927a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->weight = weight; 937a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->key = key; 947a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (keystring) 957a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->keystring = strdup(keystring); 967a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->next = suggestions; 977a192d395ce5d7e5945afa684146d5b0abc53480mbligh new->func = func; 987a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestions = new; 997a192d395ce5d7e5945afa684146d5b0abc53480mbligh total_weight += weight; 1007a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 1017a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1027a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid pick_suggestion(void) 1037a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 1047a192d395ce5d7e5945afa684146d5b0abc53480mbligh int value, running = 0; 1057a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *ptr; 1067a192d395ce5d7e5945afa684146d5b0abc53480mbligh int weight; 1077a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1087a192d395ce5d7e5945afa684146d5b0abc53480mbligh strcpy(status_bar_slots[8],""); 1097a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_key = 255; 1107a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_activate = NULL; 1117a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1127a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (total_weight==0 || suggestions==NULL) { 1137a192d395ce5d7e5945afa684146d5b0abc53480mbligh /* zero suggestions */ 1147a192d395ce5d7e5945afa684146d5b0abc53480mbligh show_suggestion(""); 1157a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 1167a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1177a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1187a192d395ce5d7e5945afa684146d5b0abc53480mbligh weight = total_weight; 1197a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (strlen(previous) && displaytime > 0.0) 1207a192d395ce5d7e5945afa684146d5b0abc53480mbligh weight+=50; 1217a192d395ce5d7e5945afa684146d5b0abc53480mbligh value = rand() % weight; 1227a192d395ce5d7e5945afa684146d5b0abc53480mbligh ptr = suggestions; 1237a192d395ce5d7e5945afa684146d5b0abc53480mbligh while (ptr) { 1247a192d395ce5d7e5945afa684146d5b0abc53480mbligh running += ptr->weight; 1257a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (strcmp(ptr->string, previous)==0 && displaytime > 0.0) 1267a192d395ce5d7e5945afa684146d5b0abc53480mbligh running += 50; 1277a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (running > value) { 1287a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (ptr->keystring) 1297a192d395ce5d7e5945afa684146d5b0abc53480mbligh strncpy(status_bar_slots[8],ptr->keystring, 40); 1307a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_key = ptr->key; 1317a192d395ce5d7e5945afa684146d5b0abc53480mbligh suggestion_activate = ptr->func; 1327a192d395ce5d7e5945afa684146d5b0abc53480mbligh show_suggestion(ptr->string); 1337a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (strcmp(ptr->string, previous)) { 1347a192d395ce5d7e5945afa684146d5b0abc53480mbligh displaytime = 30.0; 1357a192d395ce5d7e5945afa684146d5b0abc53480mbligh strcpy(previous, ptr->string); 1367a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1377a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 1387a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1397a192d395ce5d7e5945afa684146d5b0abc53480mbligh ptr = ptr->next; 1407a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1417a192d395ce5d7e5945afa684146d5b0abc53480mbligh show_suggestion(""); 1427a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(previous, 0, sizeof(previous)); 1437a192d395ce5d7e5945afa684146d5b0abc53480mbligh displaytime = -1.0; 1447a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 1457a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1467a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid print_all_suggestions(void) 1477a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 1487a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct suggestion *ptr; 1497a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1507a192d395ce5d7e5945afa684146d5b0abc53480mbligh for (ptr = suggestions; ptr; ptr = ptr->next) 1517a192d395ce5d7e5945afa684146d5b0abc53480mbligh printf("\n%s\n", ptr->string); 1527a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 153