~jroose/cairo-dock-plug-ins/Messaging-Menu-alaric-devel

« back to all changes in this revision

Viewing changes to System-Monitor/src/applet-nvidia.c

  • Committer: jroose at gmail
  • Date: 2010-11-18 14:43:40 UTC
  • Revision ID: jroose@gmail.com-20101118144340-qvrs0rmanr5lr1mj
Messaging-Menu

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
* This file is a part of the Cairo-Dock project
 
3
*
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
 
6
*
 
7
* This program is free software; you can redistribute it and/or
 
8
* modify it under the terms of the GNU General Public License
 
9
* as published by the Free Software Foundation; either version 3
 
10
* of the License, or (at your option) any later version.
 
11
*
 
12
* This program is distributed in the hope that it will be useful,
 
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
* GNU General Public License for more details.
 
16
* You should have received a copy of the GNU General Public License
 
17
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
18
*/
 
19
 
 
20
#include <stdlib.h>
 
21
#include <stdio.h>
 
22
#include <string.h>
 
23
#include <math.h>
 
24
 
 
25
#include <fcntl.h>
 
26
#include <unistd.h>
 
27
#include <unistd.h>
 
28
 
 
29
#include "applet-struct.h"
 
30
#include "applet-nvidia.h"
 
31
 
 
32
void cd_sysmonitor_get_nvidia_data (CairoDockModuleInstance *myApplet)
 
33
{
 
34
        gchar *cCommand = g_strdup_printf ("nvidia-settings -q GPUCoreTemp -t");
 
35
        gchar *cResult = cairo_dock_launch_command_sync (cCommand);
 
36
        g_free (cCommand);
 
37
        
 
38
        gint iGpuTemp = 0;
 
39
        if (cResult != NULL)
 
40
                iGpuTemp = atoi (cResult);
 
41
        
 
42
        if (iGpuTemp == 0) {
 
43
                cd_warning("nVidia : couldn't acquire GPU temperature\n is 'nvidia-settings' installed on your system and its version >= 1.0 ?");
 
44
                myData.bAcquisitionOK = FALSE;
 
45
        }
 
46
        else {
 
47
                myData.iGPUTemp = iGpuTemp;
 
48
        }
 
49
        
 
50
        if (myData.iGPUTemp <= myConfig.iLowerLimit)
 
51
                myData.fGpuTempPercent = 0;
 
52
        else if (myData.iGPUTemp >= myConfig.iUpperLimit)
 
53
                myData.fGpuTempPercent = 100.;
 
54
        else
 
55
                myData.fGpuTempPercent = 100. * (myData.iGPUTemp - myConfig.iLowerLimit) / (myConfig.iUpperLimit - myConfig.iLowerLimit);
 
56
        if (fabs (myData.fGpuTempPercent - myData.fPrevGpuTempPercent) > 1)
 
57
        {
 
58
                myData.fPrevGpuTempPercent = myData.fGpuTempPercent;
 
59
                myData.bNeedsUpdate = TRUE;
 
60
        }
 
61
}
 
62
 
 
63
 
 
64
static void _get_nvidia_info (CairoDockModuleInstance *myApplet)
 
65
{
 
66
        gchar *cCommand = g_strdup_printf ("bash %s/nvidia-config", MY_APPLET_SHARE_DATA_DIR);
 
67
        gchar *cResult = cairo_dock_launch_command_sync (cCommand);
 
68
        g_free (cCommand);
 
69
        if (cResult == NULL || *cResult == '\n')
 
70
        {
 
71
                myData.cGPUName = g_strdup ("none");
 
72
                return ;
 
73
        }
 
74
        
 
75
        gchar **cInfopipesList = g_strsplit (cResult, "\n", -1);
 
76
        g_free (cResult);
 
77
        gchar *cOneInfopipe;
 
78
        gint i=0;
 
79
        
 
80
        g_free (myData.cGPUName);
 
81
        myData.cGPUName = NULL;
 
82
        g_free (myData.cDriverVersion);
 
83
        myData.cDriverVersion = NULL;
 
84
        
 
85
        for (i = 0; cInfopipesList[i] != NULL; i ++) {
 
86
                cOneInfopipe = cInfopipesList[i];
 
87
                if (*cOneInfopipe == '\0')
 
88
                        continue;
 
89
                
 
90
                if ((i == 0) && (strcmp (cOneInfopipe,"nvidia") == 0)) {
 
91
                        cd_warning ("problem while getting nVidia GPU temperature.");
 
92
                        g_strfreev (cInfopipesList);
 
93
                        return ;
 
94
                }
 
95
                else {
 
96
                        if (i == 0) {
 
97
                                gchar *str = g_strstr_len (cOneInfopipe, strlen (cOneInfopipe), "version");
 
98
                                if (str != NULL) {
 
99
                                        str += 7;
 
100
                                        while (*str == ' ')
 
101
                                                str ++;
 
102
                                        gchar *str2 = strchr (str, ' ');
 
103
                                        if (str2 != NULL)
 
104
                                                *str2 = '\0';
 
105
                                        int iMajorVersion=0, iMinorVersion=0, iMicroVersion=0;
 
106
                                        cairo_dock_get_version_from_string (str, &iMajorVersion, &iMinorVersion, &iMicroVersion);
 
107
                                        /*if (iMajorVersion == 0 || (iMajorVersion == 1 && iMinorVersion < 0)) { /// A confirmer ...
 
108
                                                myData.bSettingsTooOld == TRUE;
 
109
                                                cd_warning ("Attention : your nvidia-settings's version is too old (%d.%d.%d)", iMajorVersion, iMinorVersion, iMicroVersion);
 
110
                                                break ;
 
111
                                        }*/
 
112
                                }
 
113
                        }
 
114
                        else if (i == 1) { //GPU Name
 
115
                                myData.cGPUName = g_strdup (cOneInfopipe);
 
116
                                gchar *str = strchr (myData.cGPUName, ')');
 
117
                                if (str != NULL)
 
118
                                        *str = '\0';
 
119
                        }
 
120
                        else if (i == 2) { //Video Ram
 
121
                                myData.iVideoRam = atoi (cOneInfopipe);
 
122
                                myData.iVideoRam = myData.iVideoRam >> 10;  // passage en Mo.
 
123
                        }
 
124
                        else if (i == 3) { //Driver Version
 
125
                                myData.cDriverVersion = g_strdup (cOneInfopipe);
 
126
                        }
 
127
                }
 
128
        }
 
129
        
 
130
        cd_debug ("nVidia %s %dMB %sV %d°C", myData.cGPUName, myData.iVideoRam, myData.cDriverVersion, myData.iGPUTemp);
 
131
        
 
132
        g_strfreev (cInfopipesList);
 
133
}
 
134
 
 
135
void cd_sysmonitor_get_nivdia_info (CairoDockModuleInstance *myApplet, GString *pInfo)
 
136
{
 
137
        if (myData.cGPUName == NULL)  // nvidia-config n'a encore jamais ete appele.
 
138
                _get_nvidia_info (myApplet);
 
139
        
 
140
        if (myData.cGPUName && strcmp (myData.cGPUName, "none") != 0)  // nvidia-config est passe avec succes.
 
141
        {
 
142
                if (!myConfig.bShowNvidia)
 
143
                        cd_sysmonitor_get_nvidia_data (myApplet);  // le thread ne passe pas par la => pas de conflit.
 
144
                
 
145
                g_string_append_printf (pInfo, "\n%s: %s\n  %s: %d%s \n  %s: %s\n  %s: %d°C",
 
146
                        D_("GPU model"), myData.cGPUName,
 
147
                        D_("Video Ram"), myData.iVideoRam, D_("Mb"),
 
148
                        D_("Driver Version"), myData.cDriverVersion,
 
149
                        D_("Core Temperature"), myData.iGPUTemp);
 
150
        }
 
151
}
 
152
 
 
153
 
 
154
 
 
155
void cd_nvidia_alert (CairoDockModuleInstance *myApplet)
 
156
{
 
157
        if (myData.bAlerted || ! myConfig.bAlert)
 
158
                return;
 
159
        
 
160
        cairo_dock_remove_dialog_if_any (myIcon);
 
161
        cairo_dock_show_temporary_dialog_with_icon_printf (D_("Alert! Graphic Card core temperature has reached %d°C"), myIcon, myContainer, 4e3, MY_APPLET_SHARE_DATA_DIR"/"MY_APPLET_ICON_FILE, myData.iGPUTemp);
 
162
        
 
163
        if (myConfig.bAlertSound)
 
164
                cairo_dock_play_sound (myConfig.cSoundPath);
 
165
        
 
166
        myData.bAlerted = TRUE;
 
167
}