-rw-r--r-- | core/applets/screenshotapplet/screenshot.cpp | 229 | ||||
-rw-r--r-- | core/applets/screenshotapplet/screenshot.h | 26 |
2 files changed, 136 insertions, 119 deletions
diff --git a/core/applets/screenshotapplet/screenshot.cpp b/core/applets/screenshotapplet/screenshot.cpp index 266d6d8..fab4044 100644 --- a/core/applets/screenshotapplet/screenshot.cpp +++ b/core/applets/screenshotapplet/screenshot.cpp @@ -1,308 +1,337 @@ /********************************************************************** ** Copyright (C) 2002 L.J. Potter ljp@llornkcor.com ** All rights reserved. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #include "screenshot.h" #include "inputDialog.h" #include <qapplication.h> #include <stdlib.h> - +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> +#include <unistd.h> #include <qpe/resource.h> #include <qpe/qpeapplication.h> #include <qpe/timestring.h> #include <qpe/resource.h> #include <qpe/config.h> #include <qpe/applnk.h> #include <qpe/config.h> -#include <qsocket.h> #include <qlineedit.h> #include <qdir.h> #include <qfileinfo.h> -#include <qpoint.h> +#include <qlabel.h> #include <qpushbutton.h> #include <qpainter.h> #include <qcombobox.h> #include <qspinbox.h> #include <qslider.h> #include <qlayout.h> #include <qframe.h> #include <qpixmap.h> #include <qregexp.h> #include <qstring.h> #include <qfile.h> #include <qtimer.h> #include <qfile.h> #include <qdatastream.h> #include <qcheckbox.h> +#include <qmessagebox.h> static char * snapshot_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #00C000", "@ c #585858", "# c #808080", "$ c #00FF00", "% c #008000", "& c #00FFFF", "* c #FF0000", "= c #FFC0C0", " ", " ... ", " ..+++..@#. ", " .$++++++.#. ", " .%$$++++++. ", " .&%%$$++@***. ", " .$&$++$=**@+. ", " .+$$+++@*$%%. ", " .+++++%+++%%. ", " .%%++++..+%%. ", " ..%%+++++%%. ", " ..%%+++%%. ", " ..%%+%%. ", " ..%%.. ", " .. ", " "}; +static const char *SCAP_hostname = "www.handhelds.org"; +static const int SCAP_port = 80; + ScreenshotControl::ScreenshotControl( QWidget *parent, const char *name ) : QFrame( parent, name, WDestructiveClose | WStyle_StaysOnTop | WType_Popup ) { setFrameStyle( QFrame::PopupPanel | QFrame::Raised ); -// qDebug("screenshot control"); - QVBoxLayout *vbox = new QVBoxLayout( this ); - QHBoxLayout *hbox = new QHBoxLayout( this ); -// qDebug("new layout"); - delaySpin = new QSpinBox( 0,60,1, this, "Spinner" ); -// qDebug("new spinbox"); - delaySpin->setFocusPolicy( QWidget::NoFocus ); - - - grabItButton= new QPushButton( this, "GrabButton" ); -// qDebug("new pushbutton"); - - grabItButton ->setFocusPolicy( QWidget::TabFocus ); - grabItButton->setText(tr("Snapshot")); - + QVBoxLayout *vbox = new QVBoxLayout ( this, 5, 3 ); + QHBoxLayout *hbox; - vbox->setMargin( 6 ); - vbox->setSpacing( 3 ); + hbox = new QHBoxLayout ( vbox ); - vbox->addWidget( delaySpin); + QLabel *l = new QLabel ( tr( "Delay" ), this ); + hbox-> addWidget ( l ); - vbox->setMargin( 6 ); - vbox->setSpacing( 3 ); - QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); - vbox->addItem( spacer ); + delaySpin = new QSpinBox( 0, 60, 1, this, "Spinner" ); + delaySpin-> setButtonSymbols ( QSpinBox::PlusMinus ); + delaySpin-> setSuffix ( tr( "sec" )); + delaySpin-> setFocusPolicy( QWidget::NoFocus ); + delaySpin-> setValue ( 1 ); + hbox-> addWidget ( delaySpin ); - saveNamedCheck= new QCheckBox ( "name it", this); + saveNamedCheck = new QCheckBox ( tr( "Save named" ), this); saveNamedCheck-> setFocusPolicy ( QWidget::NoFocus ); vbox->addWidget( saveNamedCheck); + vbox-> addSpacing ( 3 ); - scapButton = new QPushButton( this, "ScapButton" ); + l = new QLabel ( tr( "Save screenshot as..." ), this ); + vbox-> addWidget ( l, AlignCenter ); - scapButton ->setFocusPolicy( QWidget::TabFocus ); - scapButton ->setText(tr("scap")); - if( !QFile("/usr/bin/nc").exists()) - scapButton->hide(); + hbox = new QHBoxLayout ( vbox ); + grabItButton = new QPushButton( tr( "File" ), this, "GrabButton" ); + grabItButton ->setFocusPolicy( QWidget::TabFocus ); hbox->addWidget( grabItButton); - QSpacerItem* spacer2 = new QSpacerItem( 4, 4, QSizePolicy::Minimum, QSizePolicy::Expanding ); - hbox->addItem( spacer2 ); - hbox->addWidget( scapButton); - vbox->addItem(hbox); + scapButton = new QPushButton( tr( "Scap" ), this, "ScapButton" ); + scapButton ->setFocusPolicy( QWidget::TabFocus ); + hbox-> addWidget ( scapButton ); - setFixedHeight( 100 ); - setFixedWidth( sizeHint().width() ); + setFixedSize ( sizeHint ( )); setFocusPolicy(QWidget::NoFocus); + grabTimer= new QTimer(this,"grab timer"); - connect( grabTimer, SIGNAL( timeout() ), this, SLOT( grabTimerDone() ) ); - delaySpin->setValue(1); - connect( grabItButton, SIGNAL(released()), SLOT(slotGrab()) ); - connect( scapButton, SIGNAL(released()), SLOT(slotScap()) ); - connect(saveNamedCheck, SIGNAL(toggled( bool)), this, SLOT( nameScreenshot(bool)) ); + connect ( grabTimer, SIGNAL( timeout ( )), this, SLOT( performGrab ( ))); + connect ( grabItButton, SIGNAL( clicked ( )), SLOT( slotGrab ( ))); + connect ( scapButton, SIGNAL( clicked ( )), SLOT( slotScap ( ))); } -void ScreenshotControl::slotGrab() { -// qDebug("SlotGrab"); +void ScreenshotControl::slotGrab() +{ buttonPushed=1; hide(); + setFileName=FALSE; if( saveNamedCheck->isChecked()) { setFileName=TRUE; -// qDebug("checked"); InputDialog *fileDlg; fileDlg = new InputDialog( 0 ,tr("Name of screenshot "),TRUE, 0); fileDlg->exec(); fileDlg->raise(); QString fileName,list; if( fileDlg->result() == 1 ) { fileName = fileDlg->LineEdit1->text(); if(fileName.find("/",0,TRUE)==-1) FileNamePath = QDir::homeDirPath()+"/Documents/image/png/"+fileName; else FileNamePath = fileName; -// qDebug(fileName); } delete fileDlg; } - if ( delaySpin->value() ) { + + if ( delaySpin->value() ) grabTimer->start( delaySpin->value() * 1000, true ); - } else { + else show(); } -} -void ScreenshotControl::slotScap() { +void ScreenshotControl::slotScap() +{ buttonPushed=2; hide(); - if ( delaySpin->value() ) { + + if ( delaySpin->value() ) grabTimer->start( delaySpin->value() * 1000, true ); - } else { + else show(); } -} - -void ScreenshotControl::grabTimerDone() { - performGrab(); -} -void ScreenshotControl::savePixmap() { +void ScreenshotControl::savePixmap() +{ DocLnk lnk; QString fileName; if( setFileName) { fileName=FileNamePath; //not sure why this is needed here, but it forgets fileName // if this is below the braces if(fileName.right(3)!="png") fileName=fileName+".png"; lnk.setFile(fileName); //sets File property qDebug("saving file "+fileName); snapshot.save( fileName,"PNG"); QFileInfo fi( fileName); lnk.setName( fi.fileName()); //sets file name if(!lnk.writeLink()) qDebug("Writing doclink did not work"); - } else { + } + else { fileName = "sc_"+TimeString::dateString( QDateTime::currentDateTime(),false,true); - fileName.replace(QRegExp("'"),""); fileName.replace(QRegExp(" "),"_"); fileName.replace(QRegExp(":"),"."); fileName.replace(QRegExp(","),""); + fileName.replace(QRegExp("'"), ""); + fileName.replace(QRegExp(" "), "_"); + fileName.replace(QRegExp(":"), "."); + fileName.replace(QRegExp(","), ""); QString dirName = QDir::homeDirPath()+"/Documents/image/png/"; if( !QDir( dirName).exists() ) { qDebug("making dir "+dirName); QString msg = "mkdir -p "+dirName; system(msg.latin1()); } fileName=dirName+fileName; if(fileName.right(3)!="png") fileName=fileName+".png"; lnk.setFile(fileName); //sets File property qDebug("saving file "+fileName); snapshot.save( fileName,"PNG"); QFileInfo fi( fileName); lnk.setName( fi.fileName()); //sets file name if(!lnk.writeLink()) qDebug("Writing doclink did not work"); } QPEApplication::beep(); } -void ScreenshotControl::performGrab() { +void ScreenshotControl::performGrab() +{ + snapshot = QPixmap::grabWindow( QPEApplication::desktop()->winId(), 0, 0, QApplication::desktop()->width(), QApplication::desktop()->height() ); if(buttonPushed ==1) { qDebug("grabbing screen"); grabTimer->stop(); - snapshot = QPixmap::grabWindow( QPEApplication::desktop()->winId(),0,0,QApplication::desktop()->width(),QApplication::desktop()->height() ); show(); qApp->processEvents(); savePixmap(); - } else { - qDebug("scap"); - grabTimer->stop(); -// do scap here - QString cmd; - cmd="cat /dev/fd0 > /tmp/cap"; - system(cmd.latin1()); -// qDebug("echo \"POST /scap/capture.cgi http1.1\" -// echo \"Content-length: 153600\" -// echo \"Content-Type: image/gif\" -// echo \"HOST: www.handhelds.org\" -// echo \"\" -// cat /tmp/cap | nc h1.handhelds.org 80"); - cmd="nc h1.handhelds.org 1011 </tmp/cap"; - qDebug("running command "+cmd); - - system(cmd.latin1()); - show(); } + else { + grabTimer->stop(); -} + struct sockaddr_in raddr; + struct hostent *rhost_info; + int sock = -1; + bool ok = false; + + if (( rhost_info = (struct hostent *) ::gethostbyname ((char *) SCAP_hostname )) != 0 ) { + ::memset ( &raddr, 0, sizeof (struct sockaddr_in)); + ::memcpy ( &raddr. sin_addr, rhost_info-> h_addr, rhost_info-> h_length ); + raddr. sin_family = rhost_info-> h_addrtype; + raddr. sin_port = htons ( SCAP_port ); + + if (( sock = ::socket ( AF_INET, SOCK_STREAM, 0 )) >= 0 ) + { + if ( ::connect ( sock, (struct sockaddr *) & raddr, sizeof (struct sockaddr)) >= 0 ) { + QString header; -void ScreenshotControl::setTime(int newTime) { - delaySpin->setValue(newTime); + header = "POST /scap/capture.cgi?%1+%2 HTTP/1.1\n" // 1: model / 2: user + "Content-length: 153600\n" + "Content-Type: image/gif\n" + "Host: %4\n" // 3: scap host + "\n"; + + header = header. arg ( "" ). arg ( ::getenv ( "USER" )). arg ( SCAP_hostname ); + + QPixmap pix; + + if ( snapshot. width ( ) == 320 && snapshot. height ( ) == 240 ) + { + pix = snapshot; } + else if ( snapshot. width ( ) == 240 && snapshot. height ( ) == 320 ) + { + pix = snapshot. xForm ( QWMatrix ( ). rotate ( 90 )); + } + + if ( !pix. isNull ( )) + { + const char *ascii = header. latin1 ( ); + uint ascii_len = ::strlen ( ascii ); -void ScreenshotControl::nameScreenshot(bool b) { + ::write ( sock, ascii, ascii_len ); + QImage img = pix. convertToImage ( ). convertDepth ( 16 ); + ::write ( sock, img. bits ( ), img.numBytes ( )); + ok = true; } + } + ::close ( sock ); + } + } + if ( ok ) + QMessageBox::information ( 0, tr( "Success" ), QString ( "<p>%1</p>" ). arg ( tr( "Screenshot was uploaded to %1" )). arg ( SCAP_hostname )); + else + QMessageBox::warning ( 0, tr( "Error" ), QString ( "<p>%1</p>" ). arg ( tr( "Connection to %1 failed." )). arg ( SCAP_hostname )); + } + +} + + //=========================================================================== ScreenshotApplet::ScreenshotApplet( QWidget *parent, const char *name ) - : QWidget( parent, name ) { -// qDebug("beginning applet"); + : QWidget( parent, name ) +{ setFixedHeight( 18 ); setFixedWidth( 14 ); - vc = new ScreenshotControl(this,"ScreenshotApplet");; -// qDebug("new screenshotapplet"); -} -ScreenshotApplet::~ScreenshotApplet() { + m_icon = QPixmap ((const char **) snapshot_xpm ); } -void ScreenshotApplet::mousePressEvent( QMouseEvent *) { -// if(!vc) - vc = new ScreenshotControl; - QPoint curPos = mapToGlobal( rect().topLeft() ); - vc->move( curPos.x()-(vc->sizeHint().width()-width())/2, curPos.y() - 100 ); - vc->show(); +ScreenshotApplet::~ScreenshotApplet() +{ +} +void ScreenshotApplet::mousePressEvent( QMouseEvent *) +{ + ScreenshotControl *sc = new ScreenshotControl ( ); + QPoint curPos = mapToGlobal ( QPoint ( 0, 0 )); + sc-> move ( curPos. x ( ) - ( sc-> sizeHint ( ). width ( ) - width ( )) / 2, + curPos. y ( ) - sc-> sizeHint ( ). height ( )); + sc-> show ( ); } -void ScreenshotApplet::paintEvent( QPaintEvent* ) { +void ScreenshotApplet::paintEvent( QPaintEvent* ) +{ QPainter p(this); - qDebug("paint pixmap"); - p.drawPixmap( 0, 1, ( const char** ) snapshot_xpm ); - + p. drawPixmap ( 0, 1, m_icon ); } diff --git a/core/applets/screenshotapplet/screenshot.h b/core/applets/screenshotapplet/screenshot.h index c8dfeaa..74cc5e6 100644 --- a/core/applets/screenshotapplet/screenshot.h +++ b/core/applets/screenshotapplet/screenshot.h @@ -1,82 +1,70 @@ /********************************************************************** ** Copyright (C) 2002 L.J. Potter ljp@llornkcor.com ** All rights reserved. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #ifndef __SCREENSHOT_APPLET_H__ #define __SCREENSHOT_APPLET_H__ #include <qwidget.h> #include <qframe.h> #include <qpixmap.h> #include <qguardedptr.h> #include <qtimer.h> class QComboBox; class QCheckBox; class QSpinBox; class QPushButton; //class QImage; class ScreenshotControl : public QFrame { Q_OBJECT public: ScreenshotControl( QWidget *parent=0, const char *name=0 ); - void performGrab(); -public: +private: QPushButton *grabItButton, *scapButton; QPixmap snapshot; QTimer* grabTimer; QCheckBox *saveNamedCheck; QString FileNamePath; bool setFileName; - void slotSave(); - void slotCopy(); - void setTime(int newTime); - QSpinBox *delaySpin; -private: int buttonPushed; + private slots: void slotGrab(); void slotScap(); void savePixmap(); - void grabTimerDone(); - void nameScreenshot(bool); + void performGrab(); }; -class ScreenshotApplet : public QWidget -{ - Q_OBJECT +class ScreenshotApplet : public QWidget { public: ScreenshotApplet( QWidget *parent = 0, const char *name=0 ); ~ScreenshotApplet(); - ScreenshotControl *vc; -public slots: -private: + +protected: void mousePressEvent( QMouseEvent * ); void paintEvent( QPaintEvent* ); private: - QPixmap snapshotPixmap; -private slots: - - + QPixmap m_icon; }; #endif // __SCREENSHOT_APPLET_H__ |