You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1368 lines
33 KiB
1368 lines
33 KiB
10 years ago
|
// infobar.C
|
||
|
//
|
||
|
// This program is free software. See the file COPYING for details.
|
||
|
// Author: Mattias Engdeg?rd, 1997-1999
|
||
|
|
||
|
// 13,245,200
|
||
|
#include <stdio.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <time.h>
|
||
|
|
||
|
#include "infobar.h"
|
||
|
#include "proc.h"
|
||
|
#include "qps.h"
|
||
|
#include "misc.h"
|
||
|
#include <QBitmap>
|
||
|
|
||
|
extern ControlBar *controlbar;
|
||
|
extern TFrame *infobox; // testing
|
||
|
extern Qps *qps; // testing
|
||
|
|
||
|
int history_start_idx = 0; // testing
|
||
|
|
||
|
float cpu_total = 0;
|
||
|
float cpu_idle = 0;
|
||
|
float cpu_used = 0;
|
||
|
|
||
|
QMenu *m_popup;
|
||
|
subcpuRack *cpubar = 0; // DEL extra CPU_window
|
||
|
|
||
|
// ============================
|
||
|
gwidget *x_cpu;
|
||
|
gwidget *x_mem;
|
||
|
gwidget *x_swap;
|
||
|
gwidget *x_utime;
|
||
|
gwidget *x_load_avg;
|
||
|
|
||
|
class VCursor
|
||
|
{
|
||
|
public:
|
||
|
int px;
|
||
|
int py;
|
||
|
int idx;
|
||
|
bool enable;
|
||
|
};
|
||
|
VCursor vcursor;
|
||
|
|
||
|
// DEL
|
||
|
void Infobar::hideEvent(QHideEvent *event)
|
||
|
{
|
||
|
// printf("Infobar::hideEvent()\n");
|
||
|
// cpubar->hide();
|
||
|
}
|
||
|
|
||
|
// return true if the swap meter is redlined
|
||
|
bool Infobar::swaplim_exceeded()
|
||
|
{
|
||
|
/*
|
||
|
if(Qps::swaplim_percent) {
|
||
|
if(procview->swap_total > 0) {
|
||
|
int free_p = 100 * procview->swap_free /
|
||
|
procview->swap_total;
|
||
|
return free_p < Qps::swaplimit;
|
||
|
} else
|
||
|
return false;
|
||
|
} else {
|
||
|
return procview->swap_free < Qps::swaplimit;
|
||
|
} */
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
char rotate_str[] = "|/-\\|/-\\";
|
||
|
int rotate_idx = 0;
|
||
|
char rotate_char = '|';
|
||
|
|
||
|
// who call ?
|
||
|
// DEL
|
||
|
void Infobar::refresh()
|
||
|
{
|
||
|
QString s;
|
||
|
|
||
|
if (rotate_str[++rotate_idx] == 0)
|
||
|
rotate_idx = 0;
|
||
|
rotate_char = rotate_str[rotate_idx];
|
||
|
|
||
|
if (Qps::show_load_graph)
|
||
|
update();
|
||
|
}
|
||
|
|
||
|
// DEL
|
||
|
// public : add point,, update Pixmap(graph)
|
||
|
// called by Qps::refresh()
|
||
|
void Infobar::update_load()
|
||
|
{
|
||
|
// add_history_point2(cpu_used);
|
||
|
// NEED SOLUTION!!!!!!!! draw graph before exposed
|
||
|
if (isVisible())
|
||
|
drawGraphOnPixmap();
|
||
|
// MouseCurosrCheck
|
||
|
}
|
||
|
|
||
|
void Infobar::drawGraphOnPixmap()
|
||
|
{
|
||
|
// if(isVisible()==false) return;
|
||
|
if (size() != pixmap.size())
|
||
|
{
|
||
|
/// printf("icon_pm changed!!\n");
|
||
|
pixmap = QPixmap(size()); // resize(w, h);
|
||
|
pixmap.setMask(QBitmap()); // clear the mask for drawing
|
||
|
}
|
||
|
|
||
|
QPainter p(&pixmap);
|
||
|
p.fillRect(rect(), QBrush(Qt::black)); // p.fill(Qt::black);
|
||
|
|
||
|
for (int i = 0; i < wlist.size(); i++)
|
||
|
wlist[i]->draw(&p);
|
||
|
|
||
|
make_graph(width(), height(), &p);
|
||
|
}
|
||
|
|
||
|
// if p, then show A and hide B; otherwise do the opposite
|
||
|
// DEL?
|
||
|
void Infobar::showup()
|
||
|
{
|
||
|
// if(cpubar->isVisible()) cpubar->raise();
|
||
|
}
|
||
|
|
||
|
// DEL?
|
||
|
void Infobar::show_and_hide(bool p, QWidget *a, QWidget *b)
|
||
|
{
|
||
|
if (!p)
|
||
|
{
|
||
|
QWidget *c = a;
|
||
|
a = b;
|
||
|
b = c;
|
||
|
}
|
||
|
if (!a->isVisible())
|
||
|
{
|
||
|
b->hide();
|
||
|
a->show();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define TOTAL_BAR 30
|
||
|
QColor total_color;
|
||
|
QColor part1_color;
|
||
|
QColor part2_color;
|
||
|
QColor part3_color;
|
||
|
// DRAFT CODE : DRAFT CODE !!
|
||
|
// return width
|
||
|
int drawSPECTRUM(QPainter *p, int x, int y, const char *name, int total,
|
||
|
int part1, int part2 = 0, int part3 = 0, int h = 0)
|
||
|
{
|
||
|
int total_width;
|
||
|
// bluelay 0,180,255
|
||
|
// Move to Infor::Inforbar()
|
||
|
total_color.setRgb(0, 65, 55);
|
||
|
part1_color.setRgb(0, 255, 210);
|
||
|
part2_color.setRgb(0, 185, 150);
|
||
|
part3_color.setRgb(0, 160, 120);
|
||
|
|
||
|
int i, w;
|
||
|
int tx, ty, bar_xoffset, bar_h;
|
||
|
int bar;
|
||
|
|
||
|
char buff[32] = "NO";
|
||
|
|
||
|
if (total == 0)
|
||
|
{
|
||
|
name = strcat(buff, name);
|
||
|
}
|
||
|
|
||
|
if (h == 0)
|
||
|
h = pf_char_height();
|
||
|
|
||
|
w = 2 + pf_write(p, x + 2, y + 2, name) + 3;
|
||
|
bar_xoffset = x + w;
|
||
|
|
||
|
if (total == 0)
|
||
|
return w; //**
|
||
|
|
||
|
// draw total_dark_null line
|
||
|
bar_h = h - 1;
|
||
|
ty = y + 2;
|
||
|
tx = 0;
|
||
|
p->setPen(total_color);
|
||
|
for (i = 0; i < TOTAL_BAR; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx++;
|
||
|
tx++;
|
||
|
}
|
||
|
total_width = w + tx;
|
||
|
|
||
|
if (total == 0)
|
||
|
total = 1;
|
||
|
tx = 0;
|
||
|
// draw part1
|
||
|
p->setPen(part1_color);
|
||
|
bar = part1 * TOTAL_BAR / total;
|
||
|
if (bar == 0 and part1 != 0)
|
||
|
bar = 1;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
// tx++;
|
||
|
}
|
||
|
|
||
|
if (part2 >= 0)
|
||
|
{
|
||
|
p->setPen(part2_color);
|
||
|
bar = part2 * TOTAL_BAR / total;
|
||
|
if (bar == 0 and part2 != 0)
|
||
|
bar = 1;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
// tx++;
|
||
|
}
|
||
|
}
|
||
|
if (part3 >= 0)
|
||
|
{
|
||
|
p->setPen(part3_color);
|
||
|
bar = part3 * (TOTAL_BAR) / total;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
}
|
||
|
}
|
||
|
// this occured by reporter.
|
||
|
// if(tx>TOTAL_BAR*2 ) printf("Error: %s total =%d, part1=%d, part2=%d
|
||
|
// part3=%d\n",name,total,part1,part2,part3);
|
||
|
return total_width;
|
||
|
}
|
||
|
|
||
|
int drawSPECTRUM2(QPainter *p, int x, int y, char *name, int total, int part1,
|
||
|
int part2 = 0, int part3 = 0, int bar_h = 9,
|
||
|
int bar_w = TOTAL_BAR)
|
||
|
{
|
||
|
// Notice:
|
||
|
// total=1, part1=1 occurs
|
||
|
|
||
|
int total_width;
|
||
|
// bluelay 0,180,255
|
||
|
// Move to Infor::Inforbar()
|
||
|
total_color.setRgb(0, 67, 75); // dark
|
||
|
part1_color.setRgb(0, 255, 210);
|
||
|
part2_color.setRgb(0, 220, 175);
|
||
|
part3_color.setRgb(0, 180, 150);
|
||
|
|
||
|
int i, w;
|
||
|
int tx, ty, bar_xoffset;
|
||
|
int bar;
|
||
|
|
||
|
char buff[32] = "NO";
|
||
|
|
||
|
if (total == 0)
|
||
|
{
|
||
|
// printf("total=0\n") ; //occur
|
||
|
name = strcat(buff, name);
|
||
|
}
|
||
|
|
||
|
w = 2 + pf_write(p, x + 2, y + 2, name) + 2;
|
||
|
bar_xoffset = x + w;
|
||
|
|
||
|
if (total == 0)
|
||
|
return w; //**
|
||
|
|
||
|
// draw total_dark_null line
|
||
|
bar_h = bar_h - 1; // if(h==0) h=pf_char_height(); //9
|
||
|
|
||
|
ty = y + 2;
|
||
|
tx = 0;
|
||
|
// draw Total_dark_bar
|
||
|
p->setPen(total_color);
|
||
|
for (i = 0; i < bar_w; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
}
|
||
|
total_width = w + tx;
|
||
|
|
||
|
if (total == 0)
|
||
|
total = 1; // safer divide error.
|
||
|
|
||
|
tx = 0;
|
||
|
// draw part1
|
||
|
p->setPen(part1_color);
|
||
|
bar = part1 * bar_w / total;
|
||
|
if (bar == 0 and part1 != 0)
|
||
|
bar = 1;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
// tx++;
|
||
|
}
|
||
|
|
||
|
if (part2 >= 0)
|
||
|
{
|
||
|
p->setPen(part2_color);
|
||
|
bar = part2 * bar_w / total;
|
||
|
if (bar == 0 and part2 != 0)
|
||
|
bar = 1;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
// tx++;
|
||
|
}
|
||
|
}
|
||
|
if (part3 >= 0)
|
||
|
{
|
||
|
p->setPen(part3_color);
|
||
|
bar = part3 * (bar_w) / total;
|
||
|
for (i = 0; i < bar; i++)
|
||
|
{
|
||
|
p->drawLine(bar_xoffset + tx, ty, bar_xoffset + tx, ty + bar_h);
|
||
|
tx += 2;
|
||
|
}
|
||
|
}
|
||
|
// this occured by reporter.
|
||
|
if (tx > TOTAL_BAR * 2)
|
||
|
{
|
||
|
printf("Error: TOTAL_BAR*2=%d, name= %s total =%d, part1=%d, "
|
||
|
"part2=%d "
|
||
|
"part3=%d\n",
|
||
|
TOTAL_BAR * 2, name, total, part1, part2, part3);
|
||
|
return -1;
|
||
|
}
|
||
|
// if(part1<0){ printf("total=%d part1=%d
|
||
|
// part2=%d\n",total,part1,part2);
|
||
|
// return -1;}
|
||
|
// printf("%s total =%d, part1=%d, part2=%d
|
||
|
// part3=%d\n",name,total,part1,part2,part3);
|
||
|
return total_width;
|
||
|
}
|
||
|
|
||
|
char str_buff[512];
|
||
|
#define TIMEDIFF(kind) \
|
||
|
procview->cpu_times(cpu_id, Proc::kind) - \
|
||
|
procview->old_cpu_times(cpu_id, Proc::kind)
|
||
|
class w_cpu : public gwidget
|
||
|
{
|
||
|
private:
|
||
|
int cpu_n;
|
||
|
long total, user, system, idle, nice, wait;
|
||
|
|
||
|
public:
|
||
|
virtual void draw(QPainter *p)
|
||
|
{
|
||
|
x = 0;
|
||
|
char buff[32];
|
||
|
int cpu_id;
|
||
|
int cpu_n;
|
||
|
int gheight = 10;
|
||
|
int w;
|
||
|
int mw;
|
||
|
|
||
|
user = 0, system = 0, idle = 0, nice = 0, wait = 0;
|
||
|
|
||
|
cpu_n = procview->num_cpus;
|
||
|
|
||
|
width = 0;
|
||
|
|
||
|
// if(cpubar->isVisible() and cpu_n>3)
|
||
|
if (true)
|
||
|
{
|
||
|
// show Total CPU
|
||
|
cpu_id = cpu_n;
|
||
|
user = TIMEDIFF(CPUTIME_USER);
|
||
|
#ifdef LINUX
|
||
|
nice = TIMEDIFF(CPUTIME_NICE);
|
||
|
#endif
|
||
|
system = TIMEDIFF(CPUTIME_SYSTEM);
|
||
|
#ifdef SOLARIS
|
||
|
wait = TIMEDIFF(CPUTIME_WAIT);
|
||
|
#endif
|
||
|
idle = TIMEDIFF(CPUTIME_IDLE);
|
||
|
total = user + system + wait + nice + idle;
|
||
|
width = drawSPECTRUM(p, 0, 0, "CPU", total, user, system, nice,
|
||
|
gheight - 1);
|
||
|
// width+=5;
|
||
|
}
|
||
|
|
||
|
for (cpu_id = 0; cpu_id < cpu_n; cpu_id++)
|
||
|
{
|
||
|
|
||
|
// if(procview->num_cpus == procview->old_num_cpus)
|
||
|
user = TIMEDIFF(CPUTIME_USER);
|
||
|
idle = TIMEDIFF(CPUTIME_IDLE);
|
||
|
system = TIMEDIFF(CPUTIME_SYSTEM);
|
||
|
#ifdef LINUX
|
||
|
nice = TIMEDIFF(CPUTIME_NICE);
|
||
|
#endif
|
||
|
#ifdef SOLARIS
|
||
|
wait = TIMEDIFF(CPUTIME_WAIT);
|
||
|
#endif
|
||
|
|
||
|
#ifdef LINUX
|
||
|
total = user + system + nice + idle;
|
||
|
#endif
|
||
|
#ifdef SOLARIS
|
||
|
total = user + system + wait + idle;
|
||
|
#endif
|
||
|
|
||
|
if (cpu_n > 1 and cpu_n < 129) // 9~16
|
||
|
{
|
||
|
int bar_w = 0;
|
||
|
if (cpu_n <= 2)
|
||
|
bar_w = TOTAL_BAR; // default
|
||
|
else if (cpu_n < 9)
|
||
|
bar_w = TOTAL_BAR / 2;
|
||
|
else // if(cpu_n<17)
|
||
|
bar_w = TOTAL_BAR / 3;
|
||
|
// else bar_w=13;
|
||
|
|
||
|
int r, c;
|
||
|
c = cpu_id / 2;
|
||
|
r = cpu_id % 2;
|
||
|
sprintf(buff, "%d", cpu_id);
|
||
|
mw = 4 * 3 + (bar_w * 2 + 8 * 2 - 1) * c;
|
||
|
if (c >= 1)
|
||
|
mw -= 6;
|
||
|
if (c >= 2)
|
||
|
mw -= 6;
|
||
|
|
||
|
if (0)
|
||
|
{
|
||
|
printf("cpuid %d , user %d , %d \n", 1,
|
||
|
procview->cpu_times(1, Proc::CPUTIME_USER),
|
||
|
procview->old_cpu_times(0, Proc::CPUTIME_USER));
|
||
|
}
|
||
|
|
||
|
#ifdef LINUX
|
||
|
int z = drawSPECTRUM2(p, mw, gheight + 1 + r * (gheight - 1),
|
||
|
buff, total, user, system, nice,
|
||
|
gheight - 2, bar_w);
|
||
|
#endif
|
||
|
|
||
|
#ifdef SOLARIS
|
||
|
int z = drawSPECTRUM2(p, mw, gheight + 1 + r * (gheight - 1),
|
||
|
buff, total, user, system, wait,
|
||
|
gheight - 2, bar_w);
|
||
|
// drawSPECTRUM(p,0,cpu_id*10,buff,total,user,system,wait);
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
p->fillRect(0, gheight + 2, 50 + mw + 100, gheight * 4,
|
||
|
QColor(0, 0, 0, 130));
|
||
|
height = gheight * 1;
|
||
|
}
|
||
|
|
||
|
virtual char *info()
|
||
|
{
|
||
|
char str[80];
|
||
|
float f_user, f_nice, f_system, f_wait;
|
||
|
|
||
|
f_user = (float)user / total * 100;
|
||
|
f_nice = (float)nice / total * 100;
|
||
|
f_wait = (float)wait / total * 100;
|
||
|
f_system = (float)system / total * 100;
|
||
|
#ifdef LINUX
|
||
|
sprintf(str_buff, "user: %1.1f%% system:%1.1f%% nice:%1.1f%% ",
|
||
|
f_user, f_system, f_nice);
|
||
|
#endif
|
||
|
|
||
|
#ifdef SOLARIS
|
||
|
sprintf(str_buff, "user: %1.1f%% system:%1.1f%% nice:%1.1f%% ",
|
||
|
f_user, f_system, f_wait);
|
||
|
#endif
|
||
|
return str_buff;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
class w_mem : public gwidget
|
||
|
{
|
||
|
private:
|
||
|
int used;
|
||
|
|
||
|
public:
|
||
|
virtual void draw(QPainter *p)
|
||
|
{
|
||
|
height = pf_char_height() + 4;
|
||
|
x = x_cpu->xpluswidth() + 10;
|
||
|
#ifdef LINUX
|
||
|
used = procview->mem_total - procview->mem_free -
|
||
|
procview->mem_buffers - procview->mem_cached;
|
||
|
width = drawSPECTRUM(p, x, 0, "MEM", procview->mem_total, used,
|
||
|
procview->mem_cached, procview->mem_buffers);
|
||
|
#endif
|
||
|
|
||
|
#ifdef SOLARIS
|
||
|
used = procview->mem_total - procview->mem_free;
|
||
|
width = drawSPECTRUM(p, x, 0, "MEM", procview->mem_total, used);
|
||
|
#endif
|
||
|
}
|
||
|
virtual char *info()
|
||
|
{
|
||
|
char str[80];
|
||
|
|
||
|
strcpy(str_buff, "Total: ");
|
||
|
mem_string(procview->mem_total, str);
|
||
|
strcat(str_buff, str);
|
||
|
|
||
|
strcat(str_buff, " used: ");
|
||
|
mem_string(used, str);
|
||
|
strcat(str_buff, str);
|
||
|
|
||
|
#ifdef LINUX
|
||
|
strcat(str_buff, " cached: ");
|
||
|
mem_string(procview->mem_cached, str);
|
||
|
strcat(str_buff, str);
|
||
|
strcat(str_buff, " buffer: ");
|
||
|
mem_string(procview->mem_buffers, str);
|
||
|
strcat(str_buff, str);
|
||
|
#endif
|
||
|
|
||
|
// sprintf(str_buff,"Total: %dKb , cache: %dKb , buffer:
|
||
|
//%dKb",
|
||
|
// procview->mem_total,procview->mem_cached,procview->mem_buffers);
|
||
|
return str_buff;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
class w_swap : public gwidget
|
||
|
{
|
||
|
private:
|
||
|
int used;
|
||
|
|
||
|
public:
|
||
|
virtual void draw(QPainter *p)
|
||
|
{
|
||
|
x = x_mem->xpluswidth() + 10;
|
||
|
used = procview->swap_total - procview->swap_free;
|
||
|
width = drawSPECTRUM(p, x, 0, "SWAP", procview->swap_total, used);
|
||
|
height = pf_char_height() + 4;
|
||
|
}
|
||
|
virtual char *info()
|
||
|
{
|
||
|
char str[80];
|
||
|
|
||
|
strcpy(str_buff, "Total: ");
|
||
|
mem_string(procview->swap_total, str);
|
||
|
strcat(str_buff, str);
|
||
|
strcat(str_buff, " Free: ");
|
||
|
mem_string(procview->swap_free, str);
|
||
|
strcat(str_buff, str);
|
||
|
strcat(str_buff, " Used: ");
|
||
|
mem_string(used, str);
|
||
|
strcat(str_buff, str);
|
||
|
|
||
|
// sprintf(str_buff,"Total: %d Kbyte , used %d Kbyte",
|
||
|
// procview->swap_total,procview->swap_free);
|
||
|
return str_buff;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// DRAFT CODE !!
|
||
|
int drawUTIME(QPainter *p, int x, int y, long boot_time)
|
||
|
{
|
||
|
char buff[1024];
|
||
|
// printf("size of long=%d, size of time_t=%d
|
||
|
// \n",sizeof(long),sizeof(time_t));
|
||
|
long u = (long)time(NULL) - (long)boot_time;
|
||
|
int up_days = u / (3600 * 24);
|
||
|
u %= (3600 * 24);
|
||
|
int up_hrs = u / 3600;
|
||
|
u %= 3600;
|
||
|
int up_mins = u / 60;
|
||
|
int sec = u % 60;
|
||
|
if (up_days == 0)
|
||
|
{
|
||
|
if (up_hrs == 0)
|
||
|
sprintf(buff, "UPTIME %d:%02d", up_mins, sec);
|
||
|
else
|
||
|
sprintf(buff, "UPTIME %d:%02d:%02d", up_hrs, up_mins, sec);
|
||
|
}
|
||
|
else
|
||
|
sprintf(buff, "UPTIME %dDAY%s,%d:%02d:%02d", up_days,
|
||
|
(up_days == 1) ? "" : "s", up_hrs, up_mins, sec);
|
||
|
return pf_write(p, x, y, buff);
|
||
|
}
|
||
|
|
||
|
class w_utime : public gwidget
|
||
|
{
|
||
|
public:
|
||
|
virtual void draw(QPainter *p)
|
||
|
{
|
||
|
height = pf_char_height() + 4;
|
||
|
x = x_swap->xpluswidth() + 10;
|
||
|
width = drawUTIME(p, x, 2, procview->boot_time);
|
||
|
}
|
||
|
virtual const char *info() { return "passed time after system booting"; };
|
||
|
};
|
||
|
|
||
|
class w_load_avg : public gwidget
|
||
|
{
|
||
|
virtual void draw(QPainter *p)
|
||
|
{
|
||
|
char buff[64];
|
||
|
// printf("w_load_avg\n");
|
||
|
// sprintf(buff,"QPS %3.02f%%", Procinfo::loadQps);
|
||
|
sprintf(buff, " 1m:%1.02f 5m:%1.02f 15m:%1.02f", procview->loadavg[0],
|
||
|
procview->loadavg[1], procview->loadavg[2]);
|
||
|
|
||
|
width = pf_str_width(buff);
|
||
|
|
||
|
x = parent->width() - width - 6;
|
||
|
|
||
|
int w = x_utime->xpluswidth() + 15;
|
||
|
if (x < w)
|
||
|
x = w;
|
||
|
|
||
|
pf_write(p, x, 2, buff);
|
||
|
|
||
|
//
|
||
|
x = parent->width() - 8;
|
||
|
y = parent->height() - 9;
|
||
|
|
||
|
char str[2] = {0, 0};
|
||
|
str[0] = rotate_char;
|
||
|
pf_write(p, x, y, str);
|
||
|
}
|
||
|
virtual const char *info()
|
||
|
{
|
||
|
return "Average CPU%% each 1, 5 ,15 minutes";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
GraphBase::GraphBase(QWidget *parent, Procview *pv)
|
||
|
{
|
||
|
procview = pv;
|
||
|
// setCursor ( QCursor(Qt::CrossCursor) ) ;
|
||
|
npoints = 0, peak = 0, h_index = 0, dirty = true;
|
||
|
official_height = 39;
|
||
|
|
||
|
hist_size = 1280;
|
||
|
history = new float[hist_size];
|
||
|
|
||
|
setMinimumHeight(24);
|
||
|
|
||
|
QWidget::setMouseTracking(true);
|
||
|
}
|
||
|
|
||
|
IO_Graph::IO_Graph(QWidget *parent, Procview *pv) : GraphBase(parent, pv)
|
||
|
{
|
||
|
setMinimumHeight(22);
|
||
|
}
|
||
|
|
||
|
void GraphBase::make_graph(int w, int h, QPainter *p)
|
||
|
{
|
||
|
float ratio = h;
|
||
|
|
||
|
int hsize = procview->history.size();
|
||
|
int start = hsize - w;
|
||
|
|
||
|
if (start < 0)
|
||
|
start = 0;
|
||
|
|
||
|
QPolygon pa(hsize - start); // QVector pa(npts);
|
||
|
|
||
|
int idx = 0;
|
||
|
for (int i = start; i < procview->history.size(); i++, idx++)
|
||
|
{
|
||
|
SysHistory *hist = procview->history[i];
|
||
|
// printf("[%d] hist =%f\n",i,hist->load_cpu);
|
||
|
pa[idx] = QPoint(idx, h - 1 - (int)(hist->load_cpu * ratio));
|
||
|
}
|
||
|
|
||
|
if (h == official_height)
|
||
|
{
|
||
|
history_start_idx = start; // for MousePointer!!
|
||
|
npoints = idx; // printf("x npoints=%d \n",npoints);
|
||
|
}
|
||
|
|
||
|
// draw scale lines
|
||
|
p->setPen(QColor(0, 210, 100)); // p.setPen(QColor(0,70,54));
|
||
|
p->drawPolyline(pa);
|
||
|
|
||
|
dirty = false;
|
||
|
}
|
||
|
|
||
|
void IO_Graph::make_graph(int w, int h, QPainter *p)
|
||
|
{
|
||
|
// p->fillRect(0,0,w,h,QBrush(Qt::black));
|
||
|
// p->fill(Qt::black);
|
||
|
float ratio = 1.3; // test
|
||
|
|
||
|
int hsize = procview->history.size();
|
||
|
int start = hsize - w;
|
||
|
|
||
|
if (start < 0)
|
||
|
start = 0;
|
||
|
|
||
|
p->setPen(QColor(80, 90, 254)); // BLUE color
|
||
|
|
||
|
int idx = 0;
|
||
|
for (int i = start; i < procview->history.size(); i++, idx++)
|
||
|
{
|
||
|
SysHistory *hist = procview->history[i];
|
||
|
// printf("[%d] hist =%f\n",i,hist->load_cpu);
|
||
|
p->drawLine(idx, h - 1, idx, h - 1 - (int)(hist->load_io * ratio));
|
||
|
}
|
||
|
|
||
|
// if(h==official_height) // jump not init!!!
|
||
|
{
|
||
|
history_start_idx = start; // for MousePointer!!
|
||
|
npoints = idx; // printf("x npoints=%d \n",npoints);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GraphBase::drawGraphOnPixmap()
|
||
|
{
|
||
|
//
|
||
|
if (rotate_str[++rotate_idx] == 0)
|
||
|
rotate_idx = 0;
|
||
|
rotate_char = rotate_str[rotate_idx];
|
||
|
|
||
|
// if(isVisible()==false) return;
|
||
|
if (size() != pixmap.size())
|
||
|
{
|
||
|
/// printf("icon_pm changed!!\n");
|
||
|
pixmap = QPixmap(size()); // resize(w, h);
|
||
|
pixmap.setMask(QBitmap()); // clear the mask for drawing
|
||
|
}
|
||
|
|
||
|
QPainter p(&pixmap);
|
||
|
p.fillRect(rect(), QBrush(Qt::black)); // p.fill(Qt::black);
|
||
|
|
||
|
make_graph(width(), height(), &p);
|
||
|
}
|
||
|
|
||
|
// DRAFT CODE !!!
|
||
|
void Infobar::paintEvent(QPaintEvent *e)
|
||
|
{
|
||
|
// printf("Infobar()::paintEvent\n");
|
||
|
QRect ur = e->rect(); // update rectangle
|
||
|
QPainter p(this);
|
||
|
|
||
|
// full re-draw! by update(); ???
|
||
|
// if( ur.width()==width() and ur.height()==height() )
|
||
|
{
|
||
|
/// drawGraphOnPixmap();
|
||
|
}
|
||
|
|
||
|
p.drawPixmap(ur, pixmap, ur);
|
||
|
|
||
|
return;
|
||
|
// drww VCursor
|
||
|
if (vcursor.enable)
|
||
|
{
|
||
|
int px = vcursor.px;
|
||
|
/// p.setPen(QColor(80,195,80));
|
||
|
/// p.drawLine (px,0,px,height());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GraphBase::paintEvent(QPaintEvent *e)
|
||
|
{
|
||
|
QRect ur = e->rect(); // update rectangle
|
||
|
QPainter p(this);
|
||
|
|
||
|
// full re-draw! by update();
|
||
|
if (ur.width() == width() and ur.height() == height())
|
||
|
{
|
||
|
drawGraphOnPixmap();
|
||
|
}
|
||
|
|
||
|
p.drawPixmap(ur, pixmap, ur);
|
||
|
|
||
|
return;
|
||
|
|
||
|
// if(vcursor.enable);
|
||
|
// ------- Cursor testing ---------
|
||
|
p.setPen(QColor(250, 159, 5));
|
||
|
int rel_x = x();
|
||
|
p.drawLine(vcursor.px - rel_x, 0, vcursor.px - rel_x, height());
|
||
|
}
|
||
|
|
||
|
/* DEL
|
||
|
void IO_Graph::paintEvent ( QPaintEvent *e )
|
||
|
{
|
||
|
GraphBase::paintEvent (e);
|
||
|
} */
|
||
|
|
||
|
// TODO: 1.sort 2. time(?)
|
||
|
QString doHistory(SysHistory *sysh)
|
||
|
{
|
||
|
QString str;
|
||
|
Procinfo *p;
|
||
|
int max = 0;
|
||
|
|
||
|
char buf[128];
|
||
|
// sprintf(buf,"miniHistory /* %.02f%%",sysh->load_cpu*100);
|
||
|
sprintf(buf, "miniHistory CPU");
|
||
|
str += QString::fromLatin1(buf);
|
||
|
|
||
|
// void linearize_tree(QVector<Procinfo *> *ps, int level, int prow,
|
||
|
// bool
|
||
|
// hide)
|
||
|
// qsort(ps->data(), ps->size(), sizeof(Procinfo *),(compare_func)
|
||
|
// compare_backwards);
|
||
|
|
||
|
foreach (p, sysh->procs)
|
||
|
{
|
||
|
if (p->pcpu == 0)
|
||
|
continue;
|
||
|
sprintf(buf, " (%.01f%%)", p->pcpu);
|
||
|
str += "\n" + p->command + QString::fromLatin1(buf);
|
||
|
}
|
||
|
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
// TODO: name change!
|
||
|
QString GraphBase::doHistoryTXT(SysHistory *sysh)
|
||
|
{
|
||
|
QString str;
|
||
|
Procinfo *p;
|
||
|
int max = 0;
|
||
|
|
||
|
char buf[128];
|
||
|
// sprintf(buf,"miniHistory /* %.02f%%",sysh->load_cpu*100);
|
||
|
sprintf(buf, "%%CPU miniHistory test");
|
||
|
str += QString::fromLatin1(buf);
|
||
|
foreach (p, sysh->procs)
|
||
|
{
|
||
|
if (p->pcpu == 0)
|
||
|
continue;
|
||
|
sprintf(buf, " (%.02f%%)", p->pcpu);
|
||
|
str += "\n" + p->command + QString::fromLatin1(buf);
|
||
|
}
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
void GraphBase::mouseMoveEvent(QMouseEvent *e)
|
||
|
{
|
||
|
int x = 0, y = 0;
|
||
|
int half_height = height() / 2;
|
||
|
int dy;
|
||
|
int gap;
|
||
|
|
||
|
px = e->pos().x(); // x in Infobar
|
||
|
py = e->pos().y(); // y in Infobar
|
||
|
|
||
|
dy = py - half_height; //
|
||
|
dy /= 2;
|
||
|
|
||
|
// printf("px=%d py=%d y=%d h=%d , dy=%d\n",px,py,y,height(),dy);
|
||
|
// gap=infobox->width() + px - width();
|
||
|
|
||
|
int i;
|
||
|
int setinfo = 0;
|
||
|
|
||
|
// printf("procview npoints=%d px=%d\n",npoints,px);
|
||
|
QString text;
|
||
|
int idx = px + history_start_idx;
|
||
|
// if(px<npoints) //h_index, npoints
|
||
|
if (idx < procview->history.size() and idx >= 0)
|
||
|
{
|
||
|
// printf("procview idx=%d px=%d\n",idx,px);
|
||
|
text += doHistoryTXT(procview->history[idx]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// text ="xxx";
|
||
|
}
|
||
|
|
||
|
if (setinfo == 0)
|
||
|
infobox->setText(text);
|
||
|
|
||
|
QPoint p = mapTo(qps, e->pos()); //??
|
||
|
|
||
|
// infobox->move(a.x()+16,a.y()+4);
|
||
|
// infobox->setPos(p.x()+16,p.y()+4);
|
||
|
infobox->setPos();
|
||
|
|
||
|
// PROBLEM : leaving old vcursor ...
|
||
|
vcursor.px = p.x();
|
||
|
vcursor.py = p.y();
|
||
|
int rel_x = GraphBase::x();
|
||
|
update(p.x() - 5 - rel_x, 0, p.x() + 5 - rel_x,
|
||
|
height()); // only Vcursor update
|
||
|
}
|
||
|
|
||
|
// TODO: 1.sort 2. time
|
||
|
QString IO_Graph::doHistoryTXT(SysHistory *sysh)
|
||
|
{
|
||
|
QString str;
|
||
|
Procinfo *p;
|
||
|
int max = 0;
|
||
|
|
||
|
char buf[64], mem_str[64];
|
||
|
// sprintf(buf,"miniHistory /* %.02f%%",sysh->load_cpu*100);
|
||
|
sprintf(buf, "miniHistory IO");
|
||
|
str += QString::fromLatin1(buf);
|
||
|
|
||
|
foreach (p, sysh->procs)
|
||
|
{
|
||
|
if (p->io_read_KBps == 0 and p->io_write_KBps == 0)
|
||
|
continue;
|
||
|
buf[0] = 0;
|
||
|
|
||
|
str += "\n" + p->command;
|
||
|
// str+="\n"+ p->command + QString::fromLatin1(buf);
|
||
|
str += " (";
|
||
|
|
||
|
if (p->io_read_KBps)
|
||
|
{
|
||
|
mem_string_k(p->io_read_KBps, mem_str);
|
||
|
sprintf(buf, "%s/s read", mem_str);
|
||
|
str += QString::fromLatin1(buf);
|
||
|
}
|
||
|
|
||
|
if (p->io_write_KBps)
|
||
|
{
|
||
|
mem_string_k(p->io_write_KBps, mem_str);
|
||
|
sprintf(buf, " %s/s write", mem_str);
|
||
|
str += QString::fromLatin1(buf);
|
||
|
}
|
||
|
str += ")";
|
||
|
}
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
void GraphBase::leaveEvent(QEvent *) { infobox->hide(); }
|
||
|
|
||
|
/*
|
||
|
void IO_Graph::mouseMoveEvent ( QMouseEvent *e ) {
|
||
|
GraphBase::mouseMoveEvent(e);
|
||
|
} */
|
||
|
|
||
|
void GraphBase::mousePressEvent(QMouseEvent *e) {}
|
||
|
|
||
|
Infobar::Infobar(QWidget *parent, Procview *pv) : QFrame(parent)
|
||
|
{
|
||
|
procview = pv;
|
||
|
official_height = 32;
|
||
|
|
||
|
// setCursor ( QCursor(Qt::CrossCursor) ) ;
|
||
|
{
|
||
|
npoints = 0, peak = 0, h_index = 0, dirty = true; //
|
||
|
|
||
|
hist_size = 1280;
|
||
|
history = new float[hist_size];
|
||
|
|
||
|
// setBackgroundRole (QPalette::WindowText);
|
||
|
setAutoFillBackground(false);
|
||
|
////check setAttribute(Qt::WA_OpaquePaintEvent);
|
||
|
// setFrameShape(QFrame::Panel);
|
||
|
setFrameShadow(QFrame::Sunken);
|
||
|
setMinimumHeight(official_height);
|
||
|
// setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||
|
// setStyleSheet("QFrame { background-color: yellow }");
|
||
|
x_cpu = new w_cpu();
|
||
|
x_cpu->setParent(this, pv);
|
||
|
x_mem = new w_mem();
|
||
|
x_mem->setParent(this, pv);
|
||
|
x_swap = new w_swap();
|
||
|
x_swap->setParent(this, pv);
|
||
|
x_utime = new w_utime();
|
||
|
x_utime->setParent(this, pv);
|
||
|
x_load_avg = new w_load_avg();
|
||
|
x_load_avg->setParent(this, pv);
|
||
|
|
||
|
wlist.append(x_cpu);
|
||
|
wlist.append(x_mem);
|
||
|
wlist.append(x_swap);
|
||
|
wlist.append(x_utime);
|
||
|
wlist.append(x_load_avg);
|
||
|
|
||
|
QWidget::setMouseTracking(true);
|
||
|
} //
|
||
|
|
||
|
int i = 0;
|
||
|
// is_vertical = Qps::vertical_cpu_bar; //DEL
|
||
|
|
||
|
// cpubar=new subcpuRack(parent,pv);
|
||
|
|
||
|
/* m_popup = new QMenu("popup",this);
|
||
|
QAction *act=new QAction("Under Development",this);
|
||
|
act->setDisabled(true);
|
||
|
m_popup->addAction(act);
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
Infobar::~Infobar() { delete[] history; }
|
||
|
|
||
|
// a System's Info bar
|
||
|
Infobar2::Infobar2(QWidget *parent, Procview *pv)
|
||
|
{
|
||
|
// procview=pv; //***
|
||
|
official_height = 35;
|
||
|
// setAutoFillBackground ( false );
|
||
|
// setAttribute(Qt::WA_OpaquePaintEvent);
|
||
|
// setFrameShape(QFrame::Panel);
|
||
|
setFrameShadow(QFrame::Sunken);
|
||
|
// setMinimumHeight(official_height);
|
||
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||
|
|
||
|
// if(layout()) delete layout();
|
||
|
|
||
|
QBoxLayout *layout = new QHBoxLayout();
|
||
|
|
||
|
setLayout(layout);
|
||
|
|
||
|
layout->setSpacing(1); // betweeen gap
|
||
|
layout->setMargin(0);
|
||
|
|
||
|
// BasicInfo *basic=new BasicInfo(this,pv);
|
||
|
// layout->addWidget(basic);
|
||
|
|
||
|
QVBoxLayout *vlayout = new QVBoxLayout();
|
||
|
vlayout->setSpacing(1); // betweeen gap
|
||
|
vlayout->setMargin(0);
|
||
|
|
||
|
layout->addLayout(vlayout);
|
||
|
// layout->setContentsMargins (1,1,1,1);
|
||
|
// layout->setContentsMargins ( int left, int top, int right, int bottom
|
||
|
// );
|
||
|
|
||
|
// GraphBase *gp=new GraphBase(this,pv); // %CPU
|
||
|
basic = new Infobar(this, pv);
|
||
|
vlayout->addWidget(basic);
|
||
|
|
||
|
// IO_Graph
|
||
|
io_graph = new IO_Graph(this, pv); // %IO
|
||
|
vlayout->addWidget(io_graph);
|
||
|
// basic-hide();
|
||
|
// io_graph->hide();
|
||
|
m_popup = new QMenu("popup", this);
|
||
|
QAction *act = new QAction("Under Development", this);
|
||
|
act->setDisabled(true);
|
||
|
m_popup->addAction(act);
|
||
|
}
|
||
|
|
||
|
void Infobar2::updatePixmap()
|
||
|
{
|
||
|
// NEED SOLUTION!!!!!!!! draw graph before exposed?
|
||
|
if (isVisible())
|
||
|
{
|
||
|
basic->drawGraphOnPixmap();
|
||
|
io_graph->drawGraphOnPixmap();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// old style : relative method
|
||
|
// add value to the history, updating peak.
|
||
|
// USING
|
||
|
void Infobar::add_history_point(unsigned int value)
|
||
|
{
|
||
|
// simul circular buffer
|
||
|
history[h_index++] = value; // float
|
||
|
if (h_index >= hist_size)
|
||
|
h_index = 0;
|
||
|
if (npoints < hist_size)
|
||
|
npoints++;
|
||
|
}
|
||
|
|
||
|
// BACKUP: add value to the history, updating peak.
|
||
|
void Infobar::add_history_point2(float value)
|
||
|
{
|
||
|
static float v[3] = {0, 0, 0};
|
||
|
static float last_val = 0;
|
||
|
|
||
|
float f;
|
||
|
f = last_val - value;
|
||
|
// if (f > 0)
|
||
|
// value+=f/1.15; // slow up ,slow down
|
||
|
// else
|
||
|
value += f / 1.5; // slow up ,slow down
|
||
|
history[h_index++] = value;
|
||
|
if (h_index >= hist_size)
|
||
|
h_index = 0;
|
||
|
if (npoints < hist_size)
|
||
|
npoints++;
|
||
|
if (value > peak)
|
||
|
peak = value;
|
||
|
else
|
||
|
{
|
||
|
peak = 0; // no negative values
|
||
|
for (int i = 0; i < npoints; i++)
|
||
|
if (history[i] > peak)
|
||
|
peak = history[i];
|
||
|
}
|
||
|
// printf("hist_size=%d h_index=%d val=%f\n",hist_size,h_index,value);
|
||
|
|
||
|
last_val = value;
|
||
|
}
|
||
|
|
||
|
// return updated pixmap for use as an icon
|
||
|
QPixmap *Infobar::make_icon(int w, int h)
|
||
|
{
|
||
|
if (w != icon_pm.width() or h != icon_pm.height())
|
||
|
{
|
||
|
/// printf("icon_pm changed!!!!!!!!!!!!!!!!!!11\n");
|
||
|
icon_pm = QPixmap(w, h); // pm.resize(w, h);
|
||
|
icon_pm.setMask(QBitmap()); // remove the mask for drawing
|
||
|
}
|
||
|
QPainter pt(&icon_pm);
|
||
|
pt.fillRect(0, 0, w, h, QBrush(Qt::black));
|
||
|
|
||
|
if (0)
|
||
|
{
|
||
|
/* int thick=h/10;
|
||
|
int bottom=h/4;
|
||
|
|
||
|
pt.setClipRect();
|
||
|
pt.translate(); */
|
||
|
}
|
||
|
|
||
|
make_graph(w, h, &pt, true);
|
||
|
return &icon_pm;
|
||
|
}
|
||
|
|
||
|
void Infobar::mousePressEvent(QMouseEvent *e)
|
||
|
{
|
||
|
emit clicked();
|
||
|
if (e->button() == Qt::LeftButton)
|
||
|
{
|
||
|
vcursor.enable = true;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (e->button() == Qt::RightButton)
|
||
|
m_popup->popup(e->globalPos());
|
||
|
}
|
||
|
|
||
|
// only works if mouse cursor in this area
|
||
|
void Infobar::mouseMoveEvent(QMouseEvent *e)
|
||
|
{
|
||
|
int x = 0, y = 0;
|
||
|
int half_height = height() / 2;
|
||
|
int dy;
|
||
|
int gap;
|
||
|
|
||
|
px = e->pos().x(); // x in Infobar
|
||
|
py = e->pos().y(); // y in Infobar
|
||
|
|
||
|
dy = py - half_height; //
|
||
|
dy /= 2;
|
||
|
|
||
|
// printf("px=%d py=%d y=%d h=%d , dy=%d\n",px,py,y,height(),dy);
|
||
|
// gap=infobox->width() + px - width();
|
||
|
|
||
|
int i;
|
||
|
int setinfo = 0;
|
||
|
for (i = 0; i < wlist.size(); i++)
|
||
|
if (wlist[i]->intersect(px, py))
|
||
|
{
|
||
|
setinfo = 1;
|
||
|
infobox->setText(wlist[i]->info());
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// printf("procview npoints=%d px=%d\n",npoints,px);
|
||
|
QString text;
|
||
|
int idx = px + history_start_idx;
|
||
|
// if(px<npoints) //h_index, npoints
|
||
|
if (idx < procview->history.size() and idx >= 0)
|
||
|
{
|
||
|
// printf("procview idx=%d px=%d\n",idx,px);
|
||
|
text += doHistory(procview->history[idx]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
text = "";
|
||
|
}
|
||
|
|
||
|
if (setinfo == 0)
|
||
|
infobox->setText(text);
|
||
|
|
||
|
QPoint p = mapTo(qps, e->pos()); //??
|
||
|
|
||
|
// infobox->move(a.x()+16,a.y()+4);
|
||
|
// infobox->setPos(p.x()+16,p.y()+4);
|
||
|
infobox->setPos();
|
||
|
|
||
|
// vcursor.px=p.x();
|
||
|
// update(p.x()-5,0,p.x()+5,height());
|
||
|
}
|
||
|
|
||
|
void Infobar::enterEvent(QEvent *)
|
||
|
{
|
||
|
// infobox->hide();
|
||
|
}
|
||
|
|
||
|
void Infobar::leaveEvent(QEvent *)
|
||
|
{
|
||
|
|
||
|
infobox->hide();
|
||
|
|
||
|
return;
|
||
|
/*
|
||
|
if(controlbar and controlbar->isHidden())
|
||
|
{
|
||
|
// controlbar->show();
|
||
|
setMinimumHeight(official_height);
|
||
|
} */
|
||
|
}
|
||
|
|
||
|
// DRAFT CODE
|
||
|
// draw the load graph on the internal pixmap, if needed
|
||
|
// called by
|
||
|
// 1.make_icon(int w, int h)
|
||
|
// 2.paintEvent()
|
||
|
// 3.update_load()
|
||
|
void Infobar::make_graph(int w, int h, QPainter *p, bool test)
|
||
|
{
|
||
|
// QPainter p(this);
|
||
|
// p.setBackgroundMode (Qt::OpaqueMode);
|
||
|
// p.setBackground(QBrush(Qt::black));
|
||
|
// p->fillRect(0,0,w,h,QBrush(Qt::black));
|
||
|
// p->fill(Qt::black);
|
||
|
float ratio = h;
|
||
|
int idx = 0;
|
||
|
|
||
|
if (h == official_height) // tmp
|
||
|
{
|
||
|
ratio = h - 11;
|
||
|
}
|
||
|
|
||
|
int hsize = procview->history.size();
|
||
|
int start = hsize - w;
|
||
|
|
||
|
if (start < 0)
|
||
|
start = 0;
|
||
|
p->setPen(QColor(0, 210, 100)); // p.setPen(QColor(0,70,54));
|
||
|
|
||
|
if (test == false)
|
||
|
{
|
||
|
QPolygon pa(hsize - start); // QVector pa(npts);
|
||
|
// QPolygon point_array_io(hsize-start);
|
||
|
|
||
|
for (int i = start; i < procview->history.size(); i++, idx++)
|
||
|
{
|
||
|
SysHistory *hist = procview->history[i];
|
||
|
// printf("[%d] hist =%f\n",i,hist->load_cpu);
|
||
|
pa[idx] = QPoint(idx, h - 1 - (int)(hist->load_cpu * ratio));
|
||
|
/// point_array_io[idx] = QPoint(idx, h - 1 -
|
||
|
///(int)(hist->load_io *
|
||
|
/// ratio));
|
||
|
}
|
||
|
// p->setPen(QColor(100,100,250));
|
||
|
////p.setPen(QColor(0,70,54));
|
||
|
// p->drawPolyline(point_array_io);
|
||
|
|
||
|
// draw scale lines
|
||
|
p->drawPolyline(pa);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int idx = 0;
|
||
|
for (int i = start; i < procview->history.size(); i++, idx++)
|
||
|
{
|
||
|
SysHistory *hist = procview->history[i];
|
||
|
p->drawLine(idx, h - 1, idx, h - 1 - (int)(hist->load_cpu * ratio));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if(h==official_height)
|
||
|
{
|
||
|
history_start_idx = start; // for MousePointer!!
|
||
|
npoints = idx; // printf("x npoints=%d \n",npoints);
|
||
|
}
|
||
|
|
||
|
dirty = false;
|
||
|
}
|
||
|
|
||
|
void Infobar::resizeEvent(QResizeEvent *e)
|
||
|
{
|
||
|
// static int first=0; if(first==0){ drawPixmap(); first=1;}
|
||
|
drawGraphOnPixmap();
|
||
|
}
|
||
|
subcpuRack::subcpuRack(QWidget *p, Procview *pv) : QWidget(p)
|
||
|
{
|
||
|
parent = p;
|
||
|
procview = pv;
|
||
|
// setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip);
|
||
|
// setWindowFlags(Qt::FramelessWindowHint |Qt::Tool );
|
||
|
setAttribute(Qt::WA_OpaquePaintEvent);
|
||
|
QPalette pal;
|
||
|
pal.setColor(QPalette::Window, QColor(0, 0, 0));
|
||
|
setPalette(pal);
|
||
|
QWidget::setMouseTracking(true);
|
||
|
setMinimumHeight(12);
|
||
|
}
|
||
|
|
||
|
void subcpuRack::refresh() {}
|
||
|
|
||
|
void subcpuRack::mousePressEvent(QMouseEvent *e)
|
||
|
{
|
||
|
m_popup->popup(e->globalPos());
|
||
|
// hide();
|
||
|
}
|
||
|
|
||
|
// DRAFT CODE !!!
|
||
|
void subcpuRack::paintEvent(QPaintEvent *e)
|
||
|
{
|
||
|
|
||
|
// static QPaint *p=// QPainter *p=new QPainter(this);
|
||
|
QPainter p(this);
|
||
|
char buff[128];
|
||
|
int w;
|
||
|
int width;
|
||
|
int x, y;
|
||
|
int i;
|
||
|
// QRect cr = contentsRect();
|
||
|
// QRect cr = p->viewport();
|
||
|
QRect cr = p.window(); // rect.
|
||
|
|
||
|
p.fillRect(rect(), QBrush(Qt::black));
|
||
|
|
||
|
// p->setPen(lineColor);
|
||
|
p.setPen(QColor(50, 50, 50));
|
||
|
p.drawLine(0, 0, QWidget::width(), 0);
|
||
|
// p.fillRect(cr,QBrush(QColor(255,255,255,50)));
|
||
|
|
||
|
unsigned long total = 0, user = 0, system = 0, idle = 0, nice = 0, wait = 0;
|
||
|
// if(procview->num_cpus>=4) // temporaly...
|
||
|
// else
|
||
|
int cpu_n = procview->num_cpus;
|
||
|
w = 2 + pf_write(&p, 2, 2, "SUB CPU");
|
||
|
width = w;
|
||
|
}
|
||
|
|
||
|
// GraphDisplay, miniDisplay
|
||
|
|
||
|
PDisplay::PDisplay(QWidget *parent) : QWidget(parent)
|
||
|
{
|
||
|
QVBoxLayout *vlayout = new QVBoxLayout;
|
||
|
vlayout->setMargin(0);
|
||
|
vlayout->setSpacing(1);
|
||
|
setLayout(vlayout);
|
||
|
|
||
|
// return;
|
||
|
// ** setBackgroundColor(color); **
|
||
|
QPalette pal;
|
||
|
pal = palette();
|
||
|
setAutoFillBackground(true);
|
||
|
// setBackgroundRole (QPalette::WindowText);
|
||
|
pal.setColor(backgroundRole(), QColor(80, 80, 80));
|
||
|
// palette.setColor(QPalette::Window, QColor(0,0,100));
|
||
|
setPalette(pal);
|
||
|
}
|
||
|
// a BAR in a RACK
|
||
|
//
|
||
|
|
||
|
Infobar2 *PDisplay::addSystem(Procview *pv)
|
||
|
{
|
||
|
// Infobar* bar= new Infobar(this,pv);
|
||
|
Infobar2 *bar2 = new Infobar2(this, pv);
|
||
|
layout()->addWidget(bar2);
|
||
|
|
||
|
/// pv->read_system(); //
|
||
|
|
||
|
if (0 and pv->num_cpus > 9)
|
||
|
{
|
||
|
QWidget *rack;
|
||
|
rack = new subcpuRack(this, pv);
|
||
|
layout()->addWidget(rack);
|
||
|
}
|
||
|
return bar2; //->basic;
|
||
|
}
|