|
|
/*
|
|
|
* misc.cpp
|
|
|
* This file is part of qps -- Qt-based visual process status monitor
|
|
|
*
|
|
|
* Copyright 2014 dae hyun, yang <daehyun.yang@gmail.com>
|
|
|
* Copyright 2015 Paulo Lieuthier <paulolieuthier@gmail.com>
|
|
|
*
|
|
|
* This program 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; either version 2 of the License, or
|
|
|
* (at your option) any later version.
|
|
|
*
|
|
|
* 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; if not, write to the Free Software
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
|
* MA 02110-1301, USA.
|
|
|
*/
|
|
|
|
|
|
|
|
|
#include "misc.h"
|
|
|
#include "proc.h"
|
|
|
|
|
|
extern SearchBox *search_box;
|
|
|
extern bool flag_show_thread;
|
|
|
extern int flag_thread_ok;
|
|
|
extern bool flag_devel;
|
|
|
|
|
|
#include "../icon/x1.xpm"
|
|
|
#include "../icon/x2.xpm"
|
|
|
|
|
|
#include <stdio.h>
|
|
|
#include <time.h>
|
|
|
#include <errno.h>
|
|
|
|
|
|
// 300% faster than glibc (by fasthyun@magicn.com)
|
|
|
int x_atoi(const char *sstr)
|
|
|
{
|
|
|
const char *str = sstr;
|
|
|
int val = 0;
|
|
|
while (*str)
|
|
|
{
|
|
|
val *= 10;
|
|
|
val += *str - 48;
|
|
|
str++;
|
|
|
}
|
|
|
return val;
|
|
|
}
|
|
|
|
|
|
#include <QApplication>
|
|
|
QWidget *getQpsWidget()
|
|
|
{
|
|
|
QWidgetList list = QApplication::topLevelWidgets();
|
|
|
for (int i = 0; i < list.size(); ++i)
|
|
|
{
|
|
|
QWidget *w = list.at(i);
|
|
|
if (w->objectName() == "qps")
|
|
|
return w;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
#include <stdarg.h>
|
|
|
#include <string.h>
|
|
|
/*
|
|
|
ver 0.2
|
|
|
A simplified vsscanf implementation from Internet
|
|
|
|
|
|
%S can read char_string_has_spaces.
|
|
|
ex. "(%S)" == (foo bar) or (foo bar )
|
|
|
|
|
|
|
|
|
%s %d %ld %u %x? %lu %*s %f
|
|
|
%S: (%S)
|
|
|
|
|
|
Only recognizes %s %f,%d, %u, %ld, %lu, %lg and whitespace. ...terminates
|
|
|
scanning.
|
|
|
space* same tab*
|
|
|
|
|
|
*/
|
|
|
|
|
|
// Description:
|
|
|
// mini_sscanf() == strstr() + sscanf() + %S
|
|
|
//
|
|
|
// there is test_sample_code in init_misc()
|
|
|
// fixed : invalid conversion from ‘const char*’ to ‘char*’
|
|
|
//
|
|
|
// TOO COMPLEX !!!!!! -> simple code
|
|
|
char *strchar(const char *s, int k);
|
|
|
int mini_sscanf(const char *s1, const char *fmt, ...)
|
|
|
{
|
|
|
|
|
|
va_list va;
|
|
|
va_start(va, fmt);
|
|
|
char *s = (char *)s1; // *** for gcc 4.4
|
|
|
char *p;
|
|
|
int k = 0; // count
|
|
|
while (*fmt and *s) // if (*fmt==0 or *s==0) break;
|
|
|
{
|
|
|
if (*fmt == '%')
|
|
|
{
|
|
|
int n;
|
|
|
if (fmt[1] == 'S')
|
|
|
{
|
|
|
// if(fmt[2]!=0)
|
|
|
p = strchr(s, fmt[2]); // get the token
|
|
|
int len = p - s;
|
|
|
p = va_arg(va, char *);
|
|
|
strncpy(p, s, len);
|
|
|
p[len] = 0;
|
|
|
s += len + 1;
|
|
|
fmt += 3;
|
|
|
k++;
|
|
|
}
|
|
|
else if (fmt[1] == 's') // extract string
|
|
|
{
|
|
|
// printf("%s : %%s =%s \n",__FUNCTION__,s);
|
|
|
k += sscanf(s, "%s%n", va_arg(va, char *), &n);
|
|
|
s += n;
|
|
|
fmt += 2;
|
|
|
}
|
|
|
else if (fmt[1] == '*' && fmt[2] == 's') // skip
|
|
|
{
|
|
|
p = strchr(s, ' '); // 0x20,0x00,0x0A, 123 435 54054
|
|
|
if (p == 0)
|
|
|
{
|
|
|
// printf("%s : %c [%s]
|
|
|
//\n",__FUNCTION__,fmt[1],s);
|
|
|
break;
|
|
|
}
|
|
|
s = p;
|
|
|
fmt += 3;
|
|
|
}
|
|
|
else if (fmt[1] == 'c')
|
|
|
{
|
|
|
p = va_arg(va, char *);
|
|
|
// printf("%s : %c [%c]
|
|
|
//\n",__FUNCTION__,fmt[1],*s);
|
|
|
*p = *s;
|
|
|
s++;
|
|
|
k++;
|
|
|
fmt += 2;
|
|
|
}
|
|
|
else if (fmt[1] == 'f')
|
|
|
{
|
|
|
k += sscanf(s, "%f%n", va_arg(va, float *), &n);
|
|
|
s += n;
|
|
|
fmt += 2;
|
|
|
}
|
|
|
else if (fmt[1] == 'd')
|
|
|
{
|
|
|
k += sscanf(s, "%d%n", va_arg(va, int *), &n);
|
|
|
s += n;
|
|
|
fmt += 2;
|
|
|
}
|
|
|
else if (fmt[1] == 'u')
|
|
|
{
|
|
|
k += sscanf(s, "%u%n", va_arg(va, int *), &n);
|
|
|
s += n;
|
|
|
fmt += 2;
|
|
|
}
|
|
|
else if (fmt[1] == 'l' && fmt[2] == 'd')
|
|
|
{
|
|
|
k += sscanf(s, "%ld%n", va_arg(va, long *), &n);
|
|
|
s += n;
|
|
|
fmt += 3;
|
|
|
}
|
|
|
else if (fmt[1] == 'l' && fmt[2] == 'u')
|
|
|
{
|
|
|
k += sscanf(s, "%lu%n", va_arg(va, long *), &n);
|
|
|
s += n;
|
|
|
fmt += 3;
|
|
|
}
|
|
|
else if (fmt[1] == 'l' && fmt[2] == 'g')
|
|
|
{
|
|
|
k += sscanf(s, "%lg%n", va_arg(va, double *), &n);
|
|
|
s += n;
|
|
|
fmt += 3;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("%s: unsupported"
|
|
|
" format '%c'",
|
|
|
__FUNCTION__, fmt[1]);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (isspace(*fmt)) // isblank
|
|
|
{
|
|
|
while (isspace(*s))
|
|
|
s++;
|
|
|
fmt++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
char sstr[32];
|
|
|
int n = strcspn(fmt, " %\n"); // find delimiters noSEGFAULT
|
|
|
strncpy(sstr, fmt, n);
|
|
|
sstr[n] = 0;
|
|
|
p = strstr(s, sstr);
|
|
|
if (p == 0)
|
|
|
{
|
|
|
if (0 and flag_devel)
|
|
|
printf("%s : can't found [%s] "
|
|
|
"in %s\n",
|
|
|
__FUNCTION__, sstr, s);
|
|
|
break;
|
|
|
}
|
|
|
s = p + n;
|
|
|
fmt += n;
|
|
|
// ddd at %s, at%s
|
|
|
// printf("opp_vsscanf: unexpected ""char in
|
|
|
// format '%s'",fmt);
|
|
|
// break;
|
|
|
// return k;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (*fmt == '\0' || *fmt == '#' or *s == 0)
|
|
|
break;
|
|
|
}
|
|
|
va_end(va);
|
|
|
return k;
|
|
|
}
|
|
|
|
|
|
#include <sys/stat.h>
|
|
|
#include <fcntl.h>
|
|
|
#include <sys/types.h>
|
|
|
#include <unistd.h>
|
|
|
|
|
|
// return /proc/* file size
|
|
|
int fsize(char *fname)
|
|
|
{
|
|
|
int size = 0;
|
|
|
if (0)
|
|
|
{
|
|
|
// !!! important !! not works with [/proc] , because [/proc/*]
|
|
|
// always zero
|
|
|
int fd = open(fname, O_RDONLY);
|
|
|
if (fd < 0)
|
|
|
return -1;
|
|
|
size = lseek(fd, 0, SEEK_END);
|
|
|
printf("size=%d\n", size);
|
|
|
close(fd);
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
int buf[1024];
|
|
|
int r;
|
|
|
int fd = open(fname, O_RDONLY);
|
|
|
if (fd < 0)
|
|
|
return -1;
|
|
|
do
|
|
|
{
|
|
|
r = read(fd, buf, 1024);
|
|
|
size += r;
|
|
|
// printf("r_size=%d\n",size);
|
|
|
} while (r);
|
|
|
// printf("size=%d\n",size);
|
|
|
close(fd);
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
// sleep for mili seconds
|
|
|
void msleep(long msec)
|
|
|
{
|
|
|
#ifdef LINUX
|
|
|
timespec req, remain;
|
|
|
timeval tv;
|
|
|
req.tv_sec = 0;
|
|
|
req.tv_nsec = msec * 1000000;
|
|
|
// int nanosleep(const struct timespec *req, struct timespec
|
|
|
// *remain)
|
|
|
/*while (nanosleep(&req, &req))
|
|
|
{
|
|
|
if (errno != EINTR)
|
|
|
break;
|
|
|
} */
|
|
|
|
|
|
tv.tv_sec = 0;
|
|
|
tv.tv_usec = msec * 1000;
|
|
|
select(0, NULL, NULL, NULL, &tv);
|
|
|
return;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
void mem_string_k(int kbytes, char *buf)
|
|
|
{
|
|
|
if (kbytes >= 1024)
|
|
|
{
|
|
|
int mb = kbytes >> 10;
|
|
|
if (mb >= 1024 * 100)
|
|
|
sprintf(buf, "%uGB", mb >> 10);
|
|
|
else
|
|
|
sprintf(buf, "%uMB", mb);
|
|
|
}
|
|
|
else
|
|
|
sprintf(buf, "%uKB", kbytes);
|
|
|
}
|
|
|
void mem_string(int kbytes, char *buf)
|
|
|
{
|
|
|
if (kbytes >= 1024)
|
|
|
{
|
|
|
int meg = kbytes >> 10;
|
|
|
if (meg >= 1024 * 100)
|
|
|
sprintf(buf, "%uGb", meg >> 10);
|
|
|
else
|
|
|
sprintf(buf, "%uMb", meg);
|
|
|
}
|
|
|
else
|
|
|
sprintf(buf, "%uKb", kbytes);
|
|
|
}
|
|
|
|
|
|
// DEL
|
|
|
CheckMenu::CheckMenu(QWidget *parent) : QMenu(parent) {}
|
|
|
|
|
|
// ???
|
|
|
CrossBox::CrossBox(const char *text, QWidget *parent) : QCheckBox(text, parent)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
void CrossBox::drawButton(QPainter *p)
|
|
|
{
|
|
|
///// QCheckBox::drawButton(p);
|
|
|
}
|
|
|
|
|
|
TBloon::TBloon(QWidget *parent) : QLabel(parent)
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
paren = parent;
|
|
|
setStyleSheet("QLabel { "
|
|
|
//"border-width: 1px; border-style: solid; border-color:
|
|
|
// rgb(150,45,100); border-radius: 5px ;"
|
|
|
"border-width: 1px; border-style: solid; border-color: "
|
|
|
"rgb(150,180,180); border-radius: 5px ;"
|
|
|
"background-color : rgba(0,0,0,48%); padding: 3px; color: "
|
|
|
"rgb(255,120,60); }");
|
|
|
// COLOR orange FF5d00
|
|
|
|
|
|
setText( tr( " This is unstable Alpha feature\n You maybe see a SEGFAULT..." ) );
|
|
|
resize(sizeHint());
|
|
|
// parent->installEventFilter(this);
|
|
|
// parent->setMouseTracking(true);
|
|
|
hide();
|
|
|
|
|
|
// Construct a 1-second timeline with a frame range of 0 - 100
|
|
|
timeLine = new QTimeLine(100000, this);
|
|
|
timeLine->setFrameRange(0, 20000);
|
|
|
timeLine->setCurveShape(QTimeLine::EaseOutCurve);
|
|
|
// timeLine->set(0, 20000);
|
|
|
connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(update(int)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
void TBloon::start_ani()
|
|
|
{
|
|
|
|
|
|
} */
|
|
|
|
|
|
void TBloon::update(int val)
|
|
|
{
|
|
|
//`QPoint p=QCursor::pos();
|
|
|
// qDebug("pos %d %d", p.x(),p.y());
|
|
|
QPoint p2 = paren->mapFromGlobal(QCursor::pos());
|
|
|
|
|
|
// qDebug("wpos %d %d", p2.x(),p2.y());
|
|
|
int tx = p2.x();
|
|
|
int ty = p2.y();
|
|
|
int sx = pos().x();
|
|
|
int sy = pos().y();
|
|
|
float dx = tx - sx;
|
|
|
float dy = ty - sy;
|
|
|
dx = dx / 1.35;
|
|
|
dy = dy / 1.35;
|
|
|
move(tx + dx + 8, ty + dy + 14);
|
|
|
}
|
|
|
|
|
|
bool TBloon::eventFilter(QObject *obj, QEvent *event)
|
|
|
{
|
|
|
if (event->type() == QEvent::Enter)
|
|
|
{
|
|
|
QPoint p = paren->mapFromGlobal(QCursor::pos());
|
|
|
move(p);
|
|
|
// qDebug("Enter parent");
|
|
|
timeLine->start();
|
|
|
show();
|
|
|
return true;
|
|
|
}
|
|
|
else if (event->type() == QEvent::Leave)
|
|
|
{
|
|
|
// qDebug("Leave parent");
|
|
|
timeLine->stop();
|
|
|
hide();
|
|
|
return true;
|
|
|
}
|
|
|
else if (event->type() == QEvent::MouseMove)
|
|
|
{
|
|
|
QMouseEvent *me = static_cast<QMouseEvent *>(event);
|
|
|
// qDebug("Ate key press %d %d", me->x(),me->y());
|
|
|
// move(me->x()+5,me->y()+4);
|
|
|
return false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// standard event processing
|
|
|
return QObject::eventFilter(obj, event);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
void TBloon::paintEvent( QPaintEvent * event )
|
|
|
{
|
|
|
QLabel::paintEvent(event);
|
|
|
} */
|
|
|
|
|
|
TFrame::TFrame(QWidget *parent) : QLabel(parent)
|
|
|
// TFrame::TFrame(QWidget *parent):QFrame(parent)
|
|
|
{
|
|
|
text = tr( "this is Tframe widget" );
|
|
|
// setAutoFillBackground(false);
|
|
|
// setGeometry(50,50,100,100);
|
|
|
// setAttribute(Qt::WA_OpaquePaintEvent);
|
|
|
// setFrameShape(QFrame::StyledPanel);
|
|
|
// setFrameShadow(QFrame::Sunken);
|
|
|
// setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
|
|
|
// setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
|
|
|
// setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
|
|
|
// setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
|
|
|
|
|
|
//"border-width: 1px; border-style: solid; border-color:
|
|
|
// rgb(150,45,100);
|
|
|
// border-radius: 5px ;"
|
|
|
setStyleSheet("QLabel { "
|
|
|
"border-width: 1px; border-style: solid; border-color: "
|
|
|
"rgb(210,50,130); border-radius: 5px ;"
|
|
|
"background-color : rgba(0,0,0,69%); padding: 3px; color: "
|
|
|
"rgb(0,255,150); }");
|
|
|
// setStyleSheet( "QLabel { " "border-width: 1px; border-style:
|
|
|
// solid;
|
|
|
// border-radius: 5px ; padding: 3px; }");
|
|
|
hide();
|
|
|
|
|
|
timeLine = new QTimeLine(2000, this);
|
|
|
timeLine->setFrameRange(0, 100);
|
|
|
connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(setValue(int)));
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
void TFrame::showText(QPoint glob_pos,QString str)
|
|
|
{
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
void TFrame::move(int x,int y)
|
|
|
{
|
|
|
|
|
|
|
|
|
} */
|
|
|
|
|
|
// QToolTip::showText(e->globalPos(), s);
|
|
|
void TFrame::showText(QPoint glob_pos, QString str) {}
|
|
|
|
|
|
void TFrame::setText(QString str)
|
|
|
{
|
|
|
text = str;
|
|
|
|
|
|
QLabel::setText(str);
|
|
|
|
|
|
// resize(minimumSizeHint());
|
|
|
resize(sizeHint()); // **** before show !! *****
|
|
|
|
|
|
if (str.size() == 0)
|
|
|
{
|
|
|
hide();
|
|
|
return;
|
|
|
}
|
|
|
show();
|
|
|
}
|
|
|
|
|
|
// to avoid ~
|
|
|
void TFrame::draw(QPainter &p)
|
|
|
{
|
|
|
// if(!isVisible()) return;
|
|
|
return;
|
|
|
int h = fontMetrics().height() + 3;
|
|
|
int w = fontMetrics().width(text) + 9;
|
|
|
setFixedSize(w, h);
|
|
|
// QFont font("Adobe Helvetica"); // helvetica & No-Antialias
|
|
|
// font.setPixelSize(10);
|
|
|
// setFont(font);
|
|
|
// p.drawRoundRect(rect(),10,10);
|
|
|
// p.fillRect ( cr,QColor(0,0,0));
|
|
|
QColor bg = QColor(0, 0, 0, 120);
|
|
|
#if QT_VERSION < 0x040400
|
|
|
p.fillRect(rect(), QColor(0, 0, 0, 120));
|
|
|
#else
|
|
|
// p.fillRect(rect(),QColor(0,0,0,90));
|
|
|
|
|
|
// p.setPen(QColor(0,255,155)); // less visually obtrusive than
|
|
|
// black
|
|
|
// p.setBrush(QBrush(bg));
|
|
|
// p.drawRoundedRect(0,0,w,h, 4, 4);
|
|
|
p.fillRect(rect(), bg);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
p.setPen(QColor(0, 255, 155)); // less visually obtrusive than black
|
|
|
p.drawText(0, 0, w, h, Qt::AlignVCenter | Qt::AlignHCenter, text);
|
|
|
}
|
|
|
|
|
|
void TFrame::setPos()
|
|
|
{
|
|
|
QWidget *parent = QWidget::parentWidget();
|
|
|
|
|
|
QPoint p = parent->mapFromGlobal(QCursor::pos());
|
|
|
|
|
|
setPos(p.x(), p.y());
|
|
|
}
|
|
|
|
|
|
void TFrame::setPos(int x, int y)
|
|
|
{
|
|
|
QWidget *parent = QWidget::parentWidget();
|
|
|
int pwidth = parent->width();
|
|
|
|
|
|
if (width() + x > pwidth)
|
|
|
{
|
|
|
x = pwidth - width();
|
|
|
}
|
|
|
move(x + 16, y + 4);
|
|
|
}
|
|
|
|
|
|
void TFrame::moveEvent(QMoveEvent *e)
|
|
|
{
|
|
|
// int x=e->pos().x();
|
|
|
// printf("pos (%d %d) \n",e->pos().x(),e->pos().y());
|
|
|
// event->oldPos();
|
|
|
}
|
|
|
|
|
|
void TFrame::setValue(int val)
|
|
|
{
|
|
|
opacity += ((float)val / 100);
|
|
|
update();
|
|
|
}
|
|
|
|
|
|
void TFrame::showEvent(QShowEvent *event)
|
|
|
{
|
|
|
opacity = 0.2;
|
|
|
// timeLine->start();
|
|
|
}
|
|
|
|
|
|
// Maybe SEGFAULT
|
|
|
void setPaletteBlend(QPalette &p)
|
|
|
{
|
|
|
for (int i = 0; i < (QPalette::NoRole); i++)
|
|
|
{
|
|
|
QColor c = p.color(QPalette::ColorRole(i));
|
|
|
c.alpha();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void TFrame::paintEvent(QPaintEvent *event)
|
|
|
{
|
|
|
QLabel::paintEvent(event);
|
|
|
return;
|
|
|
|
|
|
QCursor::pos();
|
|
|
// if(x()+width() > ) ;
|
|
|
QPalette np = palette();
|
|
|
setPaletteBlend(np);
|
|
|
|
|
|
QPainter p(this); // why?
|
|
|
|
|
|
// if(opacity>1) timeLine->stop(); //
|
|
|
// p.setOpacity(opacity);
|
|
|
// p.setOpacity(0.01);
|
|
|
// setWindowOpacity (0.1 );
|
|
|
// QFrame::paintEvent(event);
|
|
|
// p.scale(0.5,0.5);
|
|
|
|
|
|
// draw(p);
|
|
|
// p.setBackgroundMode (Qt::TransparentMode);
|
|
|
// p.setRenderHint(QPainter::Antialiasing);
|
|
|
// painter.translate(width() / 2, height() / 2);
|
|
|
}
|
|
|
|
|
|
UFrame::UFrame(QWidget *parent) : QFrame(parent)
|
|
|
// TFrame::TFrame(QWidget *parent):QFrame(parent)
|
|
|
{
|
|
|
// setAttribute(Qt::WA_OpaquePaintEvent);
|
|
|
// setFrameShape(QFrame::StyledPanel);
|
|
|
// setFrameShadow(QFrame::Sunken);
|
|
|
// setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
|
|
|
|
|
|
//"border-width: 1px; border-style: solid; border-color:
|
|
|
// rgb(150,45,100);
|
|
|
// border-radius: 5px ;"
|
|
|
|
|
|
// setStyleSheet( "QLabel { " "border-width: 1px; border-style:
|
|
|
// solid;
|
|
|
// border-color: rgb(210,50,130); border-radius: 5px ;"
|
|
|
// "background-color :
|
|
|
// rgba(0,0,0,70%); padding: 3px; color: rgb(0,255,150); }");
|
|
|
hide();
|
|
|
|
|
|
QVBoxLayout *vlayout = new QVBoxLayout;
|
|
|
QLabel *label = new QLabel( tr( "title" ) );
|
|
|
vlayout->addWidget(label);
|
|
|
|
|
|
setLayout(vlayout);
|
|
|
QWidget *qps = getQpsWidget();
|
|
|
if (qps)
|
|
|
{
|
|
|
int w = qps->width();
|
|
|
int h = qps->height();
|
|
|
printf("qps w=%d h=%d\n", qps->width(), qps->height());
|
|
|
move(w / 2, h / 2);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
FaderWidget::FaderWidget(QWidget *parent) : QWidget(parent)
|
|
|
{
|
|
|
if (parent)
|
|
|
startBrush = parent->palette().window();
|
|
|
else
|
|
|
startBrush = Qt::white;
|
|
|
|
|
|
timeLine = new QTimeLine(333, this);
|
|
|
timeLine->setFrameRange(1000, 0);
|
|
|
connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(update()));
|
|
|
|
|
|
setAttribute(Qt::WA_DeleteOnClose);
|
|
|
resize(parent->size());
|
|
|
}
|
|
|
|
|
|
void FaderWidget::start()
|
|
|
{
|
|
|
timeLine->start();
|
|
|
show();
|
|
|
}
|
|
|
|
|
|
void FaderWidget::paintEvent(QPaintEvent * /* event */)
|
|
|
{
|
|
|
QPainter painter(this);
|
|
|
qreal frame = timeLine->currentFrame();
|
|
|
painter.setOpacity(frame / 1000.);
|
|
|
painter.fillRect(rect(), startBrush);
|
|
|
|
|
|
if (frame <= 0.)
|
|
|
close();
|
|
|
}
|
|
|
|
|
|
void UFrame::setTitle(QString str)
|
|
|
{
|
|
|
// QLabel::setText(str);
|
|
|
title = str;
|
|
|
}
|
|
|
|
|
|
void UFrame::paintEvent(QPaintEvent *event) {}
|
|
|
/*
|
|
|
//void SearchBox::event_cursor_moved(QMouseEvent *e)
|
|
|
{
|
|
|
move(e->x(),e->y());
|
|
|
//printf("xxxxxxxxxxxxxk\n");
|
|
|
}
|
|
|
|
|
|
*/
|
|
|
|
|
|
QPixmap *letters;
|
|
|
int pf_height = 9;
|
|
|
int pf_width = 6;
|
|
|
|
|
|
void init_xpm()
|
|
|
{
|
|
|
letters = new QPixmap(":/icon/letters.png");
|
|
|
pf_height = 9;
|
|
|
pf_width = 6;
|
|
|
}
|
|
|
|
|
|
#ifdef LINUX
|
|
|
#include <sys/prctl.h>
|
|
|
#include <QThread>
|
|
|
char strong_buff[128];
|
|
|
class MyThread : public QThread
|
|
|
{
|
|
|
public:
|
|
|
void run()
|
|
|
{
|
|
|
prctl(PR_SET_NAME, "thread_test123456789");
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
int m = 0;
|
|
|
for (int i = 0; i < 20000; i++)
|
|
|
{
|
|
|
int p = rand() % 120;
|
|
|
strong_buff[p] = p;
|
|
|
}
|
|
|
msleep(40);
|
|
|
}
|
|
|
exec();
|
|
|
}
|
|
|
};
|
|
|
class MyThread2 : public QThread
|
|
|
{
|
|
|
public:
|
|
|
void run()
|
|
|
{
|
|
|
prctl(PR_SET_NAME, "thread_test987654321");
|
|
|
|
|
|
while (true)
|
|
|
{
|
|
|
int m = 0;
|
|
|
int i;
|
|
|
for (i = 0; i < 100000; i++)
|
|
|
{
|
|
|
int p = rand() % 120;
|
|
|
// strong_buff[p]=p;
|
|
|
m = i * p;
|
|
|
}
|
|
|
m += i;
|
|
|
msleep(60);
|
|
|
}
|
|
|
exec();
|
|
|
}
|
|
|
};
|
|
|
#endif
|
|
|
|
|
|
int pf_str_width(char *str)
|
|
|
{
|
|
|
int len;
|
|
|
len = strlen(str) * pf_width;
|
|
|
return len;
|
|
|
}
|
|
|
int pf_char_height() { return pf_height; }
|
|
|
|
|
|
int pf_write(QPainter *p, int x, int y, const char *str)
|
|
|
{
|
|
|
int i, len, n;
|
|
|
int ch;
|
|
|
int sx, sy;
|
|
|
int x0 = x;
|
|
|
len = strlen(str);
|
|
|
for (i = 0; i < len; i++)
|
|
|
{
|
|
|
ch = str[i];
|
|
|
|
|
|
if (ch == '\n')
|
|
|
{
|
|
|
// y+=pf_height;
|
|
|
continue;
|
|
|
}
|
|
|
// if(ch>96) ch-=(97-65);
|
|
|
n = ch - 32;
|
|
|
p->drawPixmap(x, y, *letters, n * pf_width, 0, pf_width + 1, pf_height);
|
|
|
x += pf_width;
|
|
|
}
|
|
|
return x - x0;
|
|
|
}
|
|
|
|
|
|
QPixmap *x1, *x2;
|
|
|
XButton::XButton(QWidget *parent) : QAbstractButton(parent)
|
|
|
{
|
|
|
setFocusPolicy(Qt::NoFocus);
|
|
|
x1 = new QPixmap((const char **)x1_xpm);
|
|
|
x2 = new QPixmap((const char **)x2_xpm);
|
|
|
int w = x1->width();
|
|
|
setGeometry(0, 0, w, w);
|
|
|
}
|
|
|
|
|
|
void XButton::resizeEvent(QResizeEvent *p)
|
|
|
{
|
|
|
int i, h;
|
|
|
i = height() % 2;
|
|
|
|
|
|
if (i != 0)
|
|
|
h = height() + 1;
|
|
|
else
|
|
|
h = height();
|
|
|
setFixedSize(h, h);
|
|
|
}
|
|
|
|
|
|
void XButton::paintEvent(QPaintEvent *event)
|
|
|
{
|
|
|
QPainter p(this);
|
|
|
int w, h, m;
|
|
|
|
|
|
if (isDown())
|
|
|
p.drawPixmap(0, 0, *x2);
|
|
|
else
|
|
|
p.drawPixmap(0, 0, *x1);
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
SearchBox::SearchBox(QWidget *parent) : QLineEdit(parent)
|
|
|
{
|
|
|
setToolTip( tr( "PID,COMMAND,USER..." ) );
|
|
|
left_time = 0;
|
|
|
setMaximumWidth(300);
|
|
|
setMinimumWidth(20);
|
|
|
|
|
|
// setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
|
|
|
// setContentsMargins(0,3,1,0);
|
|
|
// setLineWidth( 1 );
|
|
|
// setMargin(2);
|
|
|
|
|
|
/// xb=new XButton(this);
|
|
|
/// connect(xb, SIGNAL(clicked()), SLOT(event_xbutton_clicked()));
|
|
|
setFocus(Qt::ActiveWindowFocusReason); // good
|
|
|
}
|
|
|
|
|
|
void SearchBox::event_cursor_moved(QMouseEvent *e) { move(e->x(), e->y()); }
|
|
|
|
|
|
void SearchBox::resizeEvent(QResizeEvent *p)
|
|
|
{
|
|
|
int w, h, margin;
|
|
|
// setMinimumHeight(height()-4);
|
|
|
// setMaximumHeight(p->size().height()-1);
|
|
|
// setFixedHeight(p->size().height()-5);
|
|
|
// setMaximumHeight(height()-2);
|
|
|
w = width();
|
|
|
h = height();
|
|
|
/// margin=(h - xb->width())/2;
|
|
|
/// xb->move(w-h+margin-1,margin);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void SearchBox::event_xbutton_clicked()
|
|
|
{
|
|
|
QKeyEvent ke(QEvent::KeyPress, Qt::Key_Escape, 0); // temp..
|
|
|
keyPressEvent(&ke);
|
|
|
}
|
|
|
|
|
|
// public
|
|
|
/*void SearchBox::keyPress( QKeyEvent * e )
|
|
|
{
|
|
|
|
|
|
} */
|
|
|
|
|
|
void SearchBox::timerEvent(QTimerEvent *e)
|
|
|
{
|
|
|
// qDebug( "timer event, id %d", e->timerId() );
|
|
|
}
|
|
|
|
|
|
LogBox::LogBox(QWidget *p) : QLabel(p)
|
|
|
{
|
|
|
text = new QTextEdit(p);
|
|
|
text->setFocusPolicy(Qt::NoFocus);
|
|
|
}
|
|
|
|
|
|
// Location: bottom
|
|
|
StatusBar::StatusBar(QWidget *parent) : QStatusBar(parent)
|
|
|
{
|
|
|
setSizeGripEnabled(true);
|
|
|
// QWidget *le = new QLabel(this);//QButton *button = new
|
|
|
// QButton(this);
|
|
|
// QLineEdit *le=new QLineEdit(this);
|
|
|
|
|
|
// showMessage ( const QString & message, int timeout = 0 )
|
|
|
// showMessage("aaaaaa");
|
|
|
label = new QLabel(this); // QButton *button = new QButton(this);
|
|
|
// label->setText ("") ;
|
|
|
label->setFrameShape(QFrame::NoFrame);
|
|
|
// label->setFrameShape (QFrame::StyledPanel);
|
|
|
// label->setFrameShape (QFrame::Panel);
|
|
|
// label->setFrameShape (QFrame::WinPanel);
|
|
|
// label->setFrameShadow(QFrame::Sunken);
|
|
|
// button2 = new QToolButton(this);//QButton *button = new
|
|
|
// QButton(this);
|
|
|
// button2->setTextLabel ("") ;
|
|
|
// button2->setUsesTextLabel ( true );
|
|
|
// button2->setAutoRaise(true);
|
|
|
// button3 = new QLabel(this);//QButton *button = new
|
|
|
// QButton(this);
|
|
|
// button3->setText ("") ;
|
|
|
// addPermanentWidget(label);
|
|
|
addWidget(label);
|
|
|
// addPermanentWidget(le,1);
|
|
|
}
|
|
|
|
|
|
void StatusBar::refresh() {}
|
|
|
|
|
|
extern int num_opened_files;
|
|
|
void StatusBar::update(int total_n)
|
|
|
{
|
|
|
label->setText(tr( "Process count: %1" ).arg( total_n ) );
|
|
|
// button2->setTextLabel ("Network Process(testing): "+
|
|
|
// str.setNum(Procinfo::num_network_process));
|
|
|
// button3->setText ("Opened files : "+
|
|
|
// str.setNum(num_opened_files));
|
|
|
}
|
|
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
|
// Pstable or Procview
|
|
|
// Location :
|
|
|
QSpacerItem *stretch;
|
|
|
ControlBar::ControlBar(QWidget *parent) : QFrame(parent)
|
|
|
{
|
|
|
int h;
|
|
|
// setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding);
|
|
|
setFrameStyle(QFrame::NoFrame);
|
|
|
// setFrameStyle(Panel | Raised);//bad
|
|
|
// setFrameStyle(Panel ); //bad
|
|
|
layout = new QHBoxLayout(this);
|
|
|
layout->addSpacing(4); // left gap
|
|
|
layout->setMargin(0);
|
|
|
|
|
|
// setStyleSheet(" QFrame,QCheckBox,QRadioButton { color: rgb(244, 244, 244);\
|
|
|
border-image: url(:/icon/vista.png); } ");
|
|
|
/* Frame { background-color: yellow }
|
|
|
* border: 2px solid #8f8f91;
|
|
|
min-width: 80px; */
|
|
|
/* image: url(:/icon/vista.png);*/
|
|
|
|
|
|
b_linear = new QRadioButton(tr( "Linear" ), this);
|
|
|
b_linear->setFocusPolicy(Qt::NoFocus);
|
|
|
|
|
|
b_tree = new QRadioButton( tr( "Tree" ), this);
|
|
|
b_tree->setFocusPolicy(Qt::NoFocus);
|
|
|
|
|
|
search_box = new SearchBox(this);
|
|
|
connect(b_linear, SIGNAL(clicked()), SLOT(linear_clicked()));
|
|
|
connect(b_tree, SIGNAL(clicked()), SLOT(tree_clicked()));
|
|
|
connect(search_box, SIGNAL(textChanged(const QString &)),
|
|
|
SLOT(event_search_box_changed()));
|
|
|
// search_box->setFocusPolicy(Qt::NoFocus);
|
|
|
// search_box->setFocus (Qt::ActiveWindowFocusReason);
|
|
|
// search_box->setFocusProxy ( parent );
|
|
|
|
|
|
if (flag_thread_ok)
|
|
|
{
|
|
|
check_thread = new QCheckBox( ( "Thread" ), this);
|
|
|
check_thread->setFocusPolicy(Qt::NoFocus);
|
|
|
connect(check_thread, SIGNAL(clicked()), SLOT(show_thread_clicked()));
|
|
|
check_thread->setChecked(flag_show_thread);
|
|
|
}
|
|
|
|
|
|
view = new QComboBox(this);
|
|
|
view->insertItem(0, tr( "All Processes" ), Procview::ALL);
|
|
|
view->insertItem(1, tr( "Your Processes" ), Procview::OWNED);
|
|
|
view->insertItem(2, tr( "Non-Root Processes" ), Procview::NROOT);
|
|
|
view->insertItem(3, tr( "Running Processes" ), Procview::RUNNING);
|
|
|
connect(view, SIGNAL(activated(int)), SLOT(view_changed(int)));
|
|
|
view->setFocusPolicy(Qt::NoFocus);
|
|
|
// PAUSED view->insertItem("Hidden Processes", Procview::HIDDEN);
|
|
|
|
|
|
layout->addWidget(b_linear);
|
|
|
layout->addWidget(b_tree);
|
|
|
if (flag_thread_ok)
|
|
|
layout->addWidget(check_thread);
|
|
|
layout->addWidget(search_box);
|
|
|
layout->addWidget(view);
|
|
|
|
|
|
// stretch=new QSpacerItem(0,0,QSizePolicy::Expanding);
|
|
|
// layout->addItem(stretch);
|
|
|
layout->addStretch();
|
|
|
|
|
|
/*
|
|
|
QPushButton *mb=new QPushButton;
|
|
|
mb->setContentsMargins(0,0,0,0);
|
|
|
//mb->setDown(true);
|
|
|
mb->setCheckable(true);
|
|
|
mb->setText("pause");
|
|
|
mb->setFixedWidth(32);
|
|
|
mb->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
|
|
|
layout->addWidget(mb);
|
|
|
*/
|
|
|
|
|
|
pauseButton = new QToolButton;
|
|
|
// QPushButton *pauseButton = new QPushButton;
|
|
|
pauseButton->setCheckable(true);
|
|
|
pauseButton->setIcon(QIcon(":/icon/pause.png"));
|
|
|
pauseButton->setIconSize(QSize(19, 19));
|
|
|
pauseButton->setToolTip(tr("Pause (Ctrl+Space)"));
|
|
|
pauseButton->setFocusPolicy(Qt::NoFocus);
|
|
|
// pauseButton->setFlat(true);
|
|
|
pauseButton->setAutoRaise(true);
|
|
|
connect(pauseButton, SIGNAL(clicked(bool)), SLOT(setPaused(bool)));
|
|
|
|
|
|
layout->addWidget(pauseButton);
|
|
|
|
|
|
setLayout(layout);
|
|
|
}
|
|
|
|
|
|
void PSTABLE_SETTREEMODE(bool mode);
|
|
|
void ControlBar::setMode(bool treemode) // just.. interface function
|
|
|
{
|
|
|
b_linear->setChecked(!treemode);
|
|
|
b_tree->setChecked(treemode);
|
|
|
|
|
|
PSTABLE_SETTREEMODE(treemode); // pstable->setTreeMode(treemode);
|
|
|
}
|
|
|
|
|
|
#include <QAction>
|
|
|
void ControlBar::view_changed(int idx)
|
|
|
{
|
|
|
QAction act(this);
|
|
|
act.setData(QVariant(idx));
|
|
|
emit viewChange(&act);
|
|
|
}
|
|
|
|
|
|
extern bool flag_refresh;
|
|
|
void ControlBar::setPaused(bool b)
|
|
|
{
|
|
|
flag_refresh = !b;
|
|
|
// if(!pauseButton->isDown()) pauseButton->setDown(true);
|
|
|
}
|
|
|
|
|
|
void ControlBar::linear_clicked()
|
|
|
{
|
|
|
setMode(false);
|
|
|
// emit modeChange(FALSE);
|
|
|
}
|
|
|
|
|
|
void ControlBar::tree_clicked()
|
|
|
{
|
|
|
setMode(true);
|
|
|
// emit modeChange(TRUE);
|
|
|
}
|
|
|
|
|
|
void ControlBar::show_thread_clicked()
|
|
|
{
|
|
|
flag_show_thread = check_thread->isChecked();
|
|
|
emit need_refresh();
|
|
|
}
|
|
|
|
|
|
void ControlBar::event_search_box_changed()
|
|
|
{
|
|
|
// printf("search_box changed!\n");
|
|
|
}
|
|
|
|
|
|
void ControlBar::event_command_pressed()
|
|
|
{
|
|
|
// printf("command!\n");
|
|
|
}
|
|
|
|
|
|
// not used
|
|
|
void ControlBar::update_bar() // trick for Command
|
|
|
{
|
|
|
}
|
|
|
|
|
|
// called after resize()
|
|
|
// simplified by fasthyun@magicn.com
|
|
|
|
|
|
extern bool flag_smallscreen;
|
|
|
|
|
|
void ControlBar::resizeEvent(QResizeEvent *e)
|
|
|
{
|
|
|
return;
|
|
|
// QLayoutItem *item=layout->takeAt (layout->count()-1);
|
|
|
// return;
|
|
|
if (flag_smallscreen)
|
|
|
{
|
|
|
search_box->hide();
|
|
|
pauseButton->hide();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
search_box->show();
|
|
|
pauseButton->show();
|
|
|
}
|
|
|
|
|
|
// printf("size=%d\n",stretch->geometry().width());
|
|
|
// printf("hsize=%d\n",stretch->sizeHint().height());
|
|
|
// QSize s=e->size();
|
|
|
return;
|
|
|
/*
|
|
|
if(stretch->geometry().width()==0)
|
|
|
search_box->hide();
|
|
|
else
|
|
|
search_box->show();
|
|
|
*/
|
|
|
|
|
|
/* setMaximumHeight (b_tree->sizeHint().height()+2);
|
|
|
search_box->setMaximumHeight(height()-4);
|
|
|
//search_box->setMinimumHeight(height()-5);
|
|
|
|
|
|
for(i=0;i< commands.size();i++)
|
|
|
{
|
|
|
QToolButton *b;
|
|
|
b=commands[i]->toolbutton;
|
|
|
if(commands[i]->toolbar==true)
|
|
|
{
|
|
|
if (layout->findWidget(b)<0)
|
|
|
layout->addWidget(b);
|
|
|
b->show();
|
|
|
}
|
|
|
else
|
|
|
if(b!=NULL)
|
|
|
b->hide();
|
|
|
} */
|
|
|
}
|
|
|
|
|
|
void ServerAdaptor::accelerate() {}
|
|
|
|
|
|
//#include <QtDBus>
|
|
|
//#include <QDBusServer>
|
|
|
//#include <QtDBus/QDBusConnection>
|
|
|
#include <QDBusConnection>
|
|
|
// ServerAdaptor::ServerAdaptor(){ }
|
|
|
// ServerAdaptor::~ServerAdaptor(){}
|
|
|
|
|
|
#define SERVICE_NAME "com.trolltech.qps"
|
|
|
void dbus_register_server()
|
|
|
{
|
|
|
ServerAdaptor *sv = new ServerAdaptor();
|
|
|
QDBusConnection connection = QDBusConnection::sessionBus(); // user only??
|
|
|
// QDBusConnection connection = QDBusConnection::systemBus(); //user
|
|
|
// only??
|
|
|
connection.registerObject("/QPS_OBJ", sv);
|
|
|
connection.registerService(SERVICE_NAME); //
|
|
|
}
|
|
|
|
|
|
#include <QtDebug>
|
|
|
void qdbus_client()
|
|
|
{
|
|
|
// connection.connect ( SERVICE_NAME,"path", "interface","name",
|
|
|
// QObject *
|
|
|
// receiver, const char * slot );
|
|
|
|
|
|
// QDBusConnection conn =
|
|
|
// QDBusConnection::connectToBus(SERVICE_NAME,"hyun");
|
|
|
|
|
|
QDBusConnection conn = QDBusConnection::sessionBus(); // owner-user
|
|
|
// only, hang..
|
|
|
// blocked !!!
|
|
|
|
|
|
QDBusReply<QStringList> reply = conn.interface()->registeredServiceNames();
|
|
|
|
|
|
if (!reply.isValid())
|
|
|
{
|
|
|
qDebug() << "qdbus_client Error:" << reply.error().message();
|
|
|
// exit(1);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
foreach (QString name, reply.value())
|
|
|
{
|
|
|
qDebug() << name;
|
|
|
//printf("name %s, value %s \n",qPrintable(name),
|
|
|
} */
|
|
|
|
|
|
if (conn.interface()->isServiceRegistered(SERVICE_NAME))
|
|
|
{
|
|
|
printf("Qps: Already another QPS is running...\n");
|
|
|
exit(1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void check_qps_running()
|
|
|
{
|
|
|
// QDBusServer *server=QDBusServer("xaddr"); //peer2peer mode
|
|
|
// service,path,interface,name
|
|
|
// connect(server, SIGNAL(clicked()), SLOT(event_xbutton_clicked()));
|
|
|
// SIGNAL(newConnection ( const QDBusConnection & connection ))
|
|
|
// QDBusConnection::connectToBus ("xaddr", "name" );
|
|
|
|
|
|
// glib_dbus_getlist();
|
|
|
// glib_dbus_server();
|
|
|
|
|
|
qdbus_client(); // hang... on root-user
|
|
|
// printf("D1-1-3\n");
|
|
|
dbus_register_server();
|
|
|
// printf("D1-1-6\n");
|
|
|
}
|
|
|
|
|
|
char *read_proc_file(const char *fname, int pid = -1, int tgid = -1); // Temp
|
|
|
void init_misc(QWidget *main)
|
|
|
{
|
|
|
|
|
|
init_xpm(); // xpm image file load
|
|
|
|
|
|
if (true) // TESTING
|
|
|
{
|
|
|
}
|
|
|
|
|
|
#ifdef LINUX
|
|
|
if (false or flag_devel) // thread's Name Change test
|
|
|
{
|
|
|
QThread *task = new MyThread();
|
|
|
task->start();
|
|
|
task = new MyThread2();
|
|
|
task->start();
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
if (false) // test mini_sscanf()
|
|
|
{
|
|
|
char *buf;
|
|
|
int val;
|
|
|
char sstr[32] = "pu%s";
|
|
|
char buffer[128];
|
|
|
|
|
|
if ((buf = read_proc_file("stat", 1)) == 0)
|
|
|
{
|
|
|
printf("cant open [%s]\n", "sss");
|
|
|
}
|
|
|
if (mini_sscanf(buf, sstr, &val) != 0)
|
|
|
printf("found [%s] val=%d \n", sstr, val);
|
|
|
if (mini_sscanf(buf, "(%s)", &buffer) != 0)
|
|
|
printf("found str=%s \n", buffer);
|
|
|
|
|
|
abort();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
QTabWidgetX::QTabWidgetX(QWidget *parent) {}
|
|
|
|
|
|
void QTabWidgetX::showTab(bool flag)
|
|
|
{
|
|
|
|
|
|
QTabBar *tb = tabBar();
|
|
|
// tb->setDrawBase(false); //??
|
|
|
|
|
|
if (flag)
|
|
|
tb->show();
|
|
|
else
|
|
|
tb->hide();
|
|
|
// if flag_useTabView == false
|
|
|
#if QT_VERSION > 0x040500
|
|
|
// setDocumentMode (true); // QT 4.5
|
|
|
#endif
|
|
|
}
|