도와주세요!!
글 수 15,339
2006.06.23 18:15:54 (*.141.98.17)
7382
안녕하세요..
죄송합니다.. qwsmanager_qws.cpp 가 아니라 qwsmouse_qws.cpp를 올려 주세요..
그럼 수고하세요..
>qwsmanager_qws.cpp입니다..
>/****************************************************************************
>** $Id: qt/src/kernel/qwsmanager_qws.cpp 2.3.7 edited 2003-06-30 $
>**
>** Implementation of Qt/Embedded window manager
>**
>** Created : 000101
>**
>** Copyright (C) 2000 Trolltech AS. All rights reserved.
>**
>** This file is part of the kernel module of the Qt GUI Toolkit.
>**
>** 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.
>**
>** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
>** licenses for Qt/Embedded may use this file in accordance with the
>** Qt Embedded Commercial License Agreement provided with the Software.
>**
>** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
>** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
>**
>** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
>** information about Qt Commercial License Agreements.
>** See http://www.trolltech.com/gpl/ for GPL licensing information.
>**
>** Contact info@trolltech.com if any conditions of this licensing are
>** not clear to you.
>**
>**********************************************************************/
>#include "qwsmanager_qws.h"
>
>#ifndef QT_NO_QWS_MANAGER
>
>#include "qdrawutil.h"
>#include "qapplication.h"
>#include "qaccel.h"
>#include "qstyle.h"
>#include "qwidget.h"
>#include "qpopupmenu.h"
>#include "qpainter.h"
>#include "qregion.h"
>#include "qevent.h"
>#include "qcursor.h"
>#include "qgfx_qws.h"
>#include "qwsdisplay_qws.h"
>#include "qwsregionmanager_qws.h"
>#include "qwsdefaultdecoration_qws.h"
>
>
>#ifndef QT_NO_CURSOR
>typedef QCursorShape CursorShape; // keep more source-compatible with qt/main
>#endif
>
>enum WMStyle {
> Default_WMStyle = 1, /* Starting at zero stuffs up menus */
> KDE_WMStyle,
> KDE2_WMStyle,
> BeOS_WMStyle,
> Windows_WMStyle,
> Hydro_WMStyle,
>};
>
>
>#ifndef QT_NO_QWS_WINDOWS_WM_STYLE
>#include "qwswindowsdecoration_qws.h"
>QWSDefaultDecoration *new_Windows_WMDecorations() { return new QWSWindowsDecoration(); }
>#endif // QT_NO_QWS_WINDOWS_WM_STYLE
>#ifndef QT_NO_QWS_KDE_WM_STYLE
>#include "qwskdedecoration_qws.h"
>QWSDefaultDecoration *new_KDE_WMDecorations() { return new QWSKDEDecoration(); }
>#endif // QT_NO_QWS_KDE_WM_STYLE
>#ifndef QT_NO_QWS_KDE2_WM_STYLE
>#include "qwskde2decoration_qws.h"
>QWSDefaultDecoration *new_KDE2_WMDecorations() { return new QWSKDE2Decoration(); }
>#endif // QT_NO_QWS_KDE2_WM_STYLE
>#ifndef QT_NO_QWS_BEOS_WM_STYLE
>#include "qwsbeosdecoration_qws.h"
>QWSDefaultDecoration *new_BeOS_WMDecorations() { return new QWSBeOSDecoration(); }
>#endif // QT_NO_QWS_BEOS_WM_STYLE
>#ifndef QT_NO_QWS_HYDRO_WM_STYLE
>#include "qwshydrodecoration_qws.h"
>QWSDefaultDecoration *new_Hydro_WMDecorations() { return new QWSHydroDecoration(); }
>#endif // QT_NO_QWS_HYDRO_WM_STYLE
>
>#include "qwsdefaultdecoration_qws.h"
>QWSDefaultDecoration *new_Default_WMDecorations() { return new QWSDefaultDecoration(); }
>
>
>struct WMStyleFactoryItem {
> WMStyle WMStyleType;
> QString WMStyleName;
> QWSDefaultDecoration *(*new_WMDecorations)();
>} WMStyleList[] = {
>#ifndef QT_NO_QWS_WINDOWS_WM_STYLE
> { Windows_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Windows"), new_Windows_WMDecorations },
>#endif // QT_NO_QWS_WINDOWS_WM_STYLE
>#ifndef QT_NO_QWS_KDE_WM_STYLE
> { KDE_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "KDE"), new_KDE_WMDecorations },
>#endif // QT_NO_QWS_KDE_WM_STYLE
>#ifndef QT_NO_QWS_KDE2_WM_STYLE
> { KDE2_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "KDE2"), new_KDE2_WMDecorations },
>#endif // QT_NO_QWS_KDE2_WM_STYLE
>#ifndef QT_NO_QWS_BEOS_WM_STYLE
> { BeOS_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "BEOS"), new_BeOS_WMDecorations },
>#endif // QT_NO_QWS_BEOS_WM_STYLE
>#ifndef QT_NO_QWS_HYDRO_WM_STYLE
> { Hydro_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Hydro"), new_Hydro_WMDecorations },
>#endif // QT_NO_QWS_HYDRO_WM_STYLE
>
> { Default_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Default"), new_Default_WMDecorations },
> { Default_WMStyle, NULL, NULL }
>};
>
>
>QWSDecoration *QWSManager::newDefaultDecoration()
>{
> return new QWSDefaultDecoration;
>}
>
>
>QWidget *QWSManager::active = 0;
>QPoint QWSManager::mousePos;
>
>QWSManager::QWSManager(QWidget *w)
> : QObject(), activeRegion(QWSDecoration::None), managed(w), popup(0)
>{
> dx = 0;
> dy = 0;
>
> menuBtn = new QWSButton(this, QWSDecoration::Menu);
> closeBtn = new QWSButton(this, QWSDecoration::Close);
> minimizeBtn = new QWSButton(this, QWSDecoration::Minimize);
> maximizeBtn = new QWSButton(this, QWSDecoration::Maximize, TRUE);
>}
>
>QWSManager::~QWSManager()
>{
>#ifndef QT_NO_POPUPMENU
> if (popup)
> delete popup;
>#endif
> delete menuBtn;
> delete closeBtn;
> delete minimizeBtn;
> delete maximizeBtn;
>
>}
>
>QRegion QWSManager::region()
>{
> return QApplication::qwsDecoration().region(managed, managed->geometry());
>}
>
>QWSDecoration::Region QWSManager::pointInRegion(const QPoint &p)
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QRect rect(managed->geometry());
>
> for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) {
> if (dec.region(managed, rect, (QWSDecoration::Region)i).contains(p))
> return (QWSDecoration::Region)i;
> }
>
> return QWSDecoration::None;
>}
>
>bool QWSManager::event(QEvent *e)
>{
> if ( QObject::event( e ) )
> return TRUE;
>
> switch (e->type()) {
> case QEvent::MouseMove:
> mouseMoveEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonPress:
> mousePressEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonRelease:
> mouseReleaseEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonDblClick:
> mouseDoubleClickEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::Paint:
> paintEvent( (QPaintEvent*)e );
> break;
>
> default:
> return FALSE;
> break;
> }
>
> return TRUE;
>}
>
>void QWSManager::mousePressEvent(QMouseEvent *e)
>{
> mousePos = e->globalPos();
> dx = 0;
> dy = 0;
> activeRegion = pointInRegion(mousePos);
> switch (activeRegion) {
> case QWSDecoration::Menu:
> menu(managed->geometry().topLeft());
> break;
> case QWSDecoration::Close:
> closeBtn->setClicked(TRUE);
> break;
> case QWSDecoration::Minimize:
> minimizeBtn->setClicked(TRUE);
> break;
> case QWSDecoration::Maximize:
> maximizeBtn->setClicked(TRUE);
> break;
> default:
> break;
> }
> if ( activeRegion != QWSDecoration::None &&
> activeRegion != QWSDecoration::Menu ) {
> active = managed;
> managed->grabMouse();
> }
> if ( activeRegion != QWSDecoration::None &&
> activeRegion != QWSDecoration::Close &&
> activeRegion != QWSDecoration::Minimize &&
> activeRegion != QWSDecoration::Menu) {
> managed->raise();
> managed->setActiveWindow();
> }
>
> if (e->button() == Qt::RightButton) {
> menu(e->globalPos());
> }
>}
>
>void QWSManager::mouseReleaseEvent(QMouseEvent *e)
>{
> managed->releaseMouse();
> if (e->button() == Qt::LeftButton) {
> handleMove();
> mousePos = e->globalPos();
> QWSDecoration::Region rgn = pointInRegion(e->globalPos());
> QWSDecoration::Region activatedRegion = activeRegion;
> activeRegion = QWSDecoration::None;
> active = 0;
> switch (activatedRegion) {
> case QWSDecoration::Close:
> closeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Close) {
> close();
> return;
> }
> break;
> case QWSDecoration::Minimize:
> minimizeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Minimize)
> minimize();
> break;
> case QWSDecoration::Maximize:
> maximizeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Maximize)
> toggleMaximize();
> break;
> default:
> break;
> }
> } else if (activeRegion == QWSDecoration::None) {
> active = 0;
> }
>}
>
>void QWSManager::mouseMoveEvent(QMouseEvent *e)
>{
>#ifndef QT_NO_CURSOR
> static CursorShape shape[] = { ArrowCursor, ArrowCursor, ArrowCursor,
> SizeVerCursor, SizeVerCursor, SizeHorCursor,
> SizeHorCursor, SizeFDiagCursor, SizeBDiagCursor,
> SizeBDiagCursor, SizeFDiagCursor, ArrowCursor,
> ArrowCursor, ArrowCursor, ArrowCursor, ArrowCursor};
>
> // cursor
> QWSDisplay *qwsd = QApplication::desktop()->qwsDisplay();
> if (activeRegion == QWSDecoration::None)
> {
> if ( !QWidget::mouseGrabber() ) {
> QWSDecoration::Region r = pointInRegion(e->globalPos());
> qwsd->selectCursor(managed, shape[r]);
> }
> } else
> qwsd->selectCursor(managed, shape[activeRegion]);
>#endif //QT_NO_CURSOR
> // resize/move regions
>
> // don't allow dragging to where the user probably cannot click!
> QPoint g = e->globalPos();
> extern Q_EXPORT QRect qt_maxWindowRect;
> if ( qt_maxWindowRect.isValid() ) {
> if ( g.x() < qt_maxWindowRect.x() )
> g.setX(qt_maxWindowRect.x());
> if ( g.y() < qt_maxWindowRect.y() )
> g.setY(qt_maxWindowRect.y());
> if ( g.x() > qt_maxWindowRect.right() )
> g.setX(qt_maxWindowRect.right());
> if ( g.y() > qt_maxWindowRect.bottom() )
> g.setY(qt_maxWindowRect.bottom());
> }
>
> dx = g.x() - mousePos.x();
> dy = g.y() - mousePos.y();
>
> handleMove();
>
> // button regions
> QWSDecoration::Region r = pointInRegion(e->globalPos());
> menuBtn->setMouseOver(r == QWSDecoration::Menu);
> closeBtn->setMouseOver(r == QWSDecoration::Close);
> minimizeBtn->setMouseOver(r == QWSDecoration::Minimize);
> maximizeBtn->setMouseOver(r == QWSDecoration::Maximize);
>}
>
>void QWSManager::handleMove()
>{
> if (!dx && !dy)
> return;
>
> int x = managed->geometry().x();
> int y = managed->geometry().y();
> int w = managed->width();
> int h = managed->height();
>
> QRect geom(managed->geometry());
>
> switch (activeRegion) {
> case QWSDecoration::Title:
> geom = QRect(x + dx, y + dy, w, h);
> break;
> case QWSDecoration::Top:
> geom = QRect(x, y + dy, w, h - dy);
> break;
> case QWSDecoration::Bottom:
> geom = QRect(x, y, w, h + dy);
> break;
> case QWSDecoration::Left:
> geom = QRect(x + dx, y, w - dx, h);
> break;
> case QWSDecoration::Right:
> geom = QRect(x, y, w + dx, h);
> break;
> case QWSDecoration::TopRight:
> geom = QRect(x, y + dy, w + dx, h - dy);
> break;
> case QWSDecoration::TopLeft:
> geom = QRect(x + dx, y + dy, w - dx, h - dy);
> break;
> case QWSDecoration::BottomLeft:
> geom = QRect(x + dx, y, w - dx, h + dy);
> break;
> case QWSDecoration::BottomRight:
> geom = QRect(x, y, w + dx, h + dy);
> break;
> default:
> return;
> }
>
> if (geom.width() >= managed->minimumWidth()
> && geom.width() <= managed->maximumWidth()) {
> mousePos.setX(mousePos.x() + dx);
> } else if (geom.width() < managed->minimumWidth()) {
> if ( x != geom.x() ) {
> geom.setX(x+(w-managed->minimumWidth()));
> mousePos.setX( geom.x() );
> } else {
> mousePos.setX( x+managed->minimumWidth() );
> }
> geom.setWidth(managed->minimumWidth());
> } else {
> geom.setX(x);
> geom.setWidth(w);
> }
> if (geom.height() >= managed->minimumHeight()
> && geom.height() <= managed->maximumHeight()) {
> mousePos.setY(mousePos.y() + dy);
> } else if (geom.height() < managed->minimumHeight()) {
> if ( y != geom.y() ) {
> geom.setY(y+(h-managed->minimumHeight()));
> mousePos.setY( mousePos.y()+(geom.y()-y) );
> } else {
> mousePos.setY( y+managed->minimumHeight() );
> }
> geom.setHeight(managed->minimumHeight());
> } else {
> geom.setY(y);
> geom.setHeight(h);
> }
>
> if (geom != managed->geometry()) {
> QApplication::sendPostedEvents();
> managed->setGeometry(geom);
> }
>
> dx = 0;
> dy = 0;
>}
>
>void QWSManager::paintEvent(QPaintEvent *)
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QPainter painter(managed);
>
> // Adjust our widget region to contain the window
> // manager decoration instead of the widget itself.
> QRegion r = managed->topData()->decor_allocated_region;
> int rgnIdx = managed->alloc_region_index;
> if ( rgnIdx >= 0 ) {
> QRegion newRegion;
> bool changed = FALSE;
> QWSDisplay::grab();
> const int *rgnRev = qt_fbdpy->regionManager()->revision( rgnIdx );
> if ( managed->alloc_region_revision != *rgnRev ) {
> newRegion = qt_fbdpy->regionManager()->region( rgnIdx );
> changed = TRUE;
> }
> painter.internalGfx()->setGlobalRegionIndex( rgnIdx );
> QWSDisplay::ungrab();
> if ( changed ) {
> r &= newRegion;
> }
> }
> painter.internalGfx()->setWidgetDeviceRegion( r );
>
> painter.setClipRegion(dec.region(managed, managed->rect()));
> dec.paint(&painter, managed);
> painter.setClipRegion(dec.region(managed, managed->rect()));
> dec.paintButton(&painter, managed, QWSDecoration::Menu, menuBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Close, closeBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Minimize, minimizeBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Maximize, maximizeBtn->state());
>}
>
>void QWSManager::menu(const QPoint &pos)
>{
>#ifndef QT_NO_POPUPMENU
> if (!popup) {
> popup = QApplication::qwsDecoration().menu(managed, managed->pos());
>
> // Add Style menu
> QPopupMenu *styleMenu = new QPopupMenu();
> for (int i = 0; WMStyleList[i].WMStyleName != NULL; i++)
> styleMenu->insertItem( qApp->translate("QWSDecoration", WMStyleList[i].WMStyleName), WMStyleList[i].WMStyleType );
> styleMenu->connect(styleMenu, SIGNAL(activated(int)), this, SLOT(styleMenuActivated(int)));
>// popup->insertSeparator();
>// popup->insertItem(QObject::tr("Style"), styleMenu);
>
> connect(popup, SIGNAL(activated(int)), SLOT(menuActivated(int)));
> }
> popup->setItemEnabled(QWSDecoration::Maximize, !managed->isMaximized());
> popup->setItemEnabled(QWSDecoration::Normalize, managed->isMaximized());
> popup->popup(pos);
>#endif
>}
>
>#include <qcdestyle.h>
>#include <qcommonstyle.h>
>#include <qcompactstyle.h>
>#include <qmotifplusstyle.h>
>#include <qmotifstyle.h>
>#include <qplatinumstyle.h>
>#include <qsgistyle.h>
>#include <qwindowsstyle.h>
>
>void QWSManager::styleMenuActivated(int id)
>{
> for (int i = 0; WMStyleList[i].WMStyleName != NULL; i++) {
> if (id == WMStyleList[i].WMStyleType) {
> qApp->qwsSetDecoration( WMStyleList[i].new_WMDecorations() );
> }
> }
>
> // Force a repaint of the WM regions
> const QSize s = managed->size();
> managed->resize( s.width() + 1, s.height() );
> managed->resize( s.width(), s.height() );
>}
>
>void QWSManager::menuActivated(int id)
>{
> switch (id) {
> case QWSDecoration::Close:
> close();
> return;
> case QWSDecoration::Minimize:
> minimize();
> break;
> case QWSDecoration::Maximize:
> case QWSDecoration::Normalize:
> toggleMaximize();
> break;
> case QWSDecoration::Title:
> mousePos = QCursor::pos();
> activeRegion = QWSDecoration::Title;
> active = managed;
> managed->grabMouse();
> break;
> case QWSDecoration::BottomRight:
> mousePos = QCursor::pos();
> activeRegion = QWSDecoration::BottomRight;
> active = managed;
> managed->grabMouse();
> break;
> default:
> break;
> }
>}
>
>void QWSManager::close()
>{
> active = 0;
> QApplication::qwsDecoration().close(managed);
>}
>
>void QWSManager::minimize()
>{
> QApplication::qwsDecoration().minimize(managed);
>}
>
>
>void QWSManager::maximize()
>{
> QApplication::qwsDecoration().maximize(managed);
> maximizeBtn->setOn(TRUE);
>}
>
>void QWSManager::toggleMaximize()
>{
> if ( !managed->isMaximized() ) {
> managed->showMaximized();
> maximizeBtn->setOn(TRUE);
> } else {
> managed->showNormal();
> maximizeBtn->setOn(FALSE);
> }
>}
>
>/*
>*/
>QWSButton::QWSButton(QWSManager *m, QWSDecoration::Region t, bool tb)
> : flags(0), toggle(tb), type(t), manager(m)
>{
>}
>
>void QWSButton::setMouseOver(bool m)
>{
> int s = state();
> if (m) flags |= MouseOver;
> else flags &= ~MouseOver;
> if (state() != s)
> paint();
>}
>
>void QWSButton::setClicked(bool c)
>{
> int s = state();
> if (c) flags |= Clicked;
> else flags &= ~Clicked;
> if (state() != s)
> paint();
>}
>
>void QWSButton::setOn(bool o)
>{
> int s = state();
> if (o) flags |= On;
> else flags &= ~On;
> if (state() != s)
> paint();
>}
>
>void QWSButton::paint()
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QPainter painter(manager->widget());
> painter.setClipRegion(dec.region(manager->widget(), manager->widget()->rect()));
> dec.paintButton(&painter, manager->widget(), type, state());
>}
>
>#endif //QT_NO_QWS_MANAGER
>
>그리고 mk712.c는 제가 pi용 커널 이미지밖에 없어서요...
>
>CD를 잃어버려서...
>
>저번에 전화드렸더니..
>
>zImage.x5.pi-no-ide 커널 이미지와..
>
>ramdisk.x5.pi-12M.gz 램디스크이미지를 메일로 보내주셔서..
>
>어떻게 소스를 볼 방법을 모르겠습니다...
>
>>안녕하세요...
>>
>>좌표 출력 메시지를 보면 linux-2.4.19-x5-v07 커널을 사용하셨다면 커널에서 보내는 메세지가 아닙니다.
>>
>>커널의 drivers/char/mk712.c 를 확인 해 보세요..
>>
>>381 if ( debug_proc )
>>382 {
>>383 printk( "[%04x:%04x]n", x, y );
>>384 }
>>
>>mk712.c 소스중 위의 부분에서 메세지를 출력하게 되어 있습니다. 그리고 이 디버깅 메세지의 출력은
>>
>>$ echo "1" > /proc/mk712 하셔야만 출력하게 되어 있습니다.
>>
>>
>>1. 커널의 mk721.c 소스를 올려 주세요.
>>2. QT/E의 qwsmanager_qws.cpp 소스를 올려 주세요.
>>
>>올려 주시면 한번 확인 해 보겠습니다.
>>
>>
>>그럼 수고하세요..
>>
>>
>>
>>>10632번에 질문올린사람인데요..
>>>
>>>답변이 없으셔서 다시 올립니다..
>>>
>>>제가 QT/E-2.3.7로 해서 터치패드를 구동했는데요..
>>>
>>>터치패드는 잘됩니다..
>>>
>>>하지만 어플리케이션을 띄우면
>>>
>>>처음에는 예제프로그램 잘 떴다가..
>>>
>>>커서를 움직이면 검은화면에 좌표값(?)이 뜨면서..
>>>
>>>예제 프로그램이 다 깨집니다..
>>>
>>>어떻게 해결해야되는지..ㅜ.ㅜ
>>>
>>>그리고 제가 구현한 프로그램이 MCU에 시리얼통신으로 신호를
>>>
>>>보내는 프로그램인데요...
>>>
>>>미니컴으로 연결해서 실행했는데..
>>>
>>>커서를 움직일때마다 시리얼로 연결되어 있는 MCU에
>>>
>>>계속 값을 보내더군요...
>>>
>>>ON이라는 버튼을 클릭하면 특정신호를 보내는 프로그램인데요...
>>>
>>>도와주세요..^^
>>>
>>>제가 보드 화면 캡쳐 방법을 잘몰라서...
>>>
>>>디카로 찍어서 사진 올렸습니다..
>>>
>>>현제 pi보드용 커널 이미지 사용하구 있구요...
>>>
>>>qt에서 수정한건 강좌에 올라와있는 파일
>>>
>>>mouse_qws.cpp를 그대로 카피해서 컴파일 한게 다입니다..
>>>
>>>그리고 게시판답변을 보니...
>>>
>>>마우스와 터치패드는 같이 못쓴다고 되있던데요...
>>>
>>>마우스를 안쓸려면 따로 명령어를 넣어줘야하나요??
>>>
>>>아니면 마우스를 그냥 포트에만 안꽂으면 되는거 아닌가요??
>>>
>>>보드에서 설정해준 부분입니다..
>>>
>>>export QTDIR=/app/qt
>>>export LD_LIBRARY_PATH=/app/qt/lib
>>
>
죄송합니다.. qwsmanager_qws.cpp 가 아니라 qwsmouse_qws.cpp를 올려 주세요..
그럼 수고하세요..
>qwsmanager_qws.cpp입니다..
>/****************************************************************************
>** $Id: qt/src/kernel/qwsmanager_qws.cpp 2.3.7 edited 2003-06-30 $
>**
>** Implementation of Qt/Embedded window manager
>**
>** Created : 000101
>**
>** Copyright (C) 2000 Trolltech AS. All rights reserved.
>**
>** This file is part of the kernel module of the Qt GUI Toolkit.
>**
>** 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.
>**
>** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
>** licenses for Qt/Embedded may use this file in accordance with the
>** Qt Embedded Commercial License Agreement provided with the Software.
>**
>** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
>** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
>**
>** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
>** information about Qt Commercial License Agreements.
>** See http://www.trolltech.com/gpl/ for GPL licensing information.
>**
>** Contact info@trolltech.com if any conditions of this licensing are
>** not clear to you.
>**
>**********************************************************************/
>#include "qwsmanager_qws.h"
>
>#ifndef QT_NO_QWS_MANAGER
>
>#include "qdrawutil.h"
>#include "qapplication.h"
>#include "qaccel.h"
>#include "qstyle.h"
>#include "qwidget.h"
>#include "qpopupmenu.h"
>#include "qpainter.h"
>#include "qregion.h"
>#include "qevent.h"
>#include "qcursor.h"
>#include "qgfx_qws.h"
>#include "qwsdisplay_qws.h"
>#include "qwsregionmanager_qws.h"
>#include "qwsdefaultdecoration_qws.h"
>
>
>#ifndef QT_NO_CURSOR
>typedef QCursorShape CursorShape; // keep more source-compatible with qt/main
>#endif
>
>enum WMStyle {
> Default_WMStyle = 1, /* Starting at zero stuffs up menus */
> KDE_WMStyle,
> KDE2_WMStyle,
> BeOS_WMStyle,
> Windows_WMStyle,
> Hydro_WMStyle,
>};
>
>
>#ifndef QT_NO_QWS_WINDOWS_WM_STYLE
>#include "qwswindowsdecoration_qws.h"
>QWSDefaultDecoration *new_Windows_WMDecorations() { return new QWSWindowsDecoration(); }
>#endif // QT_NO_QWS_WINDOWS_WM_STYLE
>#ifndef QT_NO_QWS_KDE_WM_STYLE
>#include "qwskdedecoration_qws.h"
>QWSDefaultDecoration *new_KDE_WMDecorations() { return new QWSKDEDecoration(); }
>#endif // QT_NO_QWS_KDE_WM_STYLE
>#ifndef QT_NO_QWS_KDE2_WM_STYLE
>#include "qwskde2decoration_qws.h"
>QWSDefaultDecoration *new_KDE2_WMDecorations() { return new QWSKDE2Decoration(); }
>#endif // QT_NO_QWS_KDE2_WM_STYLE
>#ifndef QT_NO_QWS_BEOS_WM_STYLE
>#include "qwsbeosdecoration_qws.h"
>QWSDefaultDecoration *new_BeOS_WMDecorations() { return new QWSBeOSDecoration(); }
>#endif // QT_NO_QWS_BEOS_WM_STYLE
>#ifndef QT_NO_QWS_HYDRO_WM_STYLE
>#include "qwshydrodecoration_qws.h"
>QWSDefaultDecoration *new_Hydro_WMDecorations() { return new QWSHydroDecoration(); }
>#endif // QT_NO_QWS_HYDRO_WM_STYLE
>
>#include "qwsdefaultdecoration_qws.h"
>QWSDefaultDecoration *new_Default_WMDecorations() { return new QWSDefaultDecoration(); }
>
>
>struct WMStyleFactoryItem {
> WMStyle WMStyleType;
> QString WMStyleName;
> QWSDefaultDecoration *(*new_WMDecorations)();
>} WMStyleList[] = {
>#ifndef QT_NO_QWS_WINDOWS_WM_STYLE
> { Windows_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Windows"), new_Windows_WMDecorations },
>#endif // QT_NO_QWS_WINDOWS_WM_STYLE
>#ifndef QT_NO_QWS_KDE_WM_STYLE
> { KDE_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "KDE"), new_KDE_WMDecorations },
>#endif // QT_NO_QWS_KDE_WM_STYLE
>#ifndef QT_NO_QWS_KDE2_WM_STYLE
> { KDE2_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "KDE2"), new_KDE2_WMDecorations },
>#endif // QT_NO_QWS_KDE2_WM_STYLE
>#ifndef QT_NO_QWS_BEOS_WM_STYLE
> { BeOS_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "BEOS"), new_BeOS_WMDecorations },
>#endif // QT_NO_QWS_BEOS_WM_STYLE
>#ifndef QT_NO_QWS_HYDRO_WM_STYLE
> { Hydro_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Hydro"), new_Hydro_WMDecorations },
>#endif // QT_NO_QWS_HYDRO_WM_STYLE
>
> { Default_WMStyle, QT_TRANSLATE_NOOP("QWSDecoration", "Default"), new_Default_WMDecorations },
> { Default_WMStyle, NULL, NULL }
>};
>
>
>QWSDecoration *QWSManager::newDefaultDecoration()
>{
> return new QWSDefaultDecoration;
>}
>
>
>QWidget *QWSManager::active = 0;
>QPoint QWSManager::mousePos;
>
>QWSManager::QWSManager(QWidget *w)
> : QObject(), activeRegion(QWSDecoration::None), managed(w), popup(0)
>{
> dx = 0;
> dy = 0;
>
> menuBtn = new QWSButton(this, QWSDecoration::Menu);
> closeBtn = new QWSButton(this, QWSDecoration::Close);
> minimizeBtn = new QWSButton(this, QWSDecoration::Minimize);
> maximizeBtn = new QWSButton(this, QWSDecoration::Maximize, TRUE);
>}
>
>QWSManager::~QWSManager()
>{
>#ifndef QT_NO_POPUPMENU
> if (popup)
> delete popup;
>#endif
> delete menuBtn;
> delete closeBtn;
> delete minimizeBtn;
> delete maximizeBtn;
>
>}
>
>QRegion QWSManager::region()
>{
> return QApplication::qwsDecoration().region(managed, managed->geometry());
>}
>
>QWSDecoration::Region QWSManager::pointInRegion(const QPoint &p)
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QRect rect(managed->geometry());
>
> for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) {
> if (dec.region(managed, rect, (QWSDecoration::Region)i).contains(p))
> return (QWSDecoration::Region)i;
> }
>
> return QWSDecoration::None;
>}
>
>bool QWSManager::event(QEvent *e)
>{
> if ( QObject::event( e ) )
> return TRUE;
>
> switch (e->type()) {
> case QEvent::MouseMove:
> mouseMoveEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonPress:
> mousePressEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonRelease:
> mouseReleaseEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::MouseButtonDblClick:
> mouseDoubleClickEvent( (QMouseEvent*)e );
> break;
>
> case QEvent::Paint:
> paintEvent( (QPaintEvent*)e );
> break;
>
> default:
> return FALSE;
> break;
> }
>
> return TRUE;
>}
>
>void QWSManager::mousePressEvent(QMouseEvent *e)
>{
> mousePos = e->globalPos();
> dx = 0;
> dy = 0;
> activeRegion = pointInRegion(mousePos);
> switch (activeRegion) {
> case QWSDecoration::Menu:
> menu(managed->geometry().topLeft());
> break;
> case QWSDecoration::Close:
> closeBtn->setClicked(TRUE);
> break;
> case QWSDecoration::Minimize:
> minimizeBtn->setClicked(TRUE);
> break;
> case QWSDecoration::Maximize:
> maximizeBtn->setClicked(TRUE);
> break;
> default:
> break;
> }
> if ( activeRegion != QWSDecoration::None &&
> activeRegion != QWSDecoration::Menu ) {
> active = managed;
> managed->grabMouse();
> }
> if ( activeRegion != QWSDecoration::None &&
> activeRegion != QWSDecoration::Close &&
> activeRegion != QWSDecoration::Minimize &&
> activeRegion != QWSDecoration::Menu) {
> managed->raise();
> managed->setActiveWindow();
> }
>
> if (e->button() == Qt::RightButton) {
> menu(e->globalPos());
> }
>}
>
>void QWSManager::mouseReleaseEvent(QMouseEvent *e)
>{
> managed->releaseMouse();
> if (e->button() == Qt::LeftButton) {
> handleMove();
> mousePos = e->globalPos();
> QWSDecoration::Region rgn = pointInRegion(e->globalPos());
> QWSDecoration::Region activatedRegion = activeRegion;
> activeRegion = QWSDecoration::None;
> active = 0;
> switch (activatedRegion) {
> case QWSDecoration::Close:
> closeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Close) {
> close();
> return;
> }
> break;
> case QWSDecoration::Minimize:
> minimizeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Minimize)
> minimize();
> break;
> case QWSDecoration::Maximize:
> maximizeBtn->setClicked(FALSE);
> if (rgn == QWSDecoration::Maximize)
> toggleMaximize();
> break;
> default:
> break;
> }
> } else if (activeRegion == QWSDecoration::None) {
> active = 0;
> }
>}
>
>void QWSManager::mouseMoveEvent(QMouseEvent *e)
>{
>#ifndef QT_NO_CURSOR
> static CursorShape shape[] = { ArrowCursor, ArrowCursor, ArrowCursor,
> SizeVerCursor, SizeVerCursor, SizeHorCursor,
> SizeHorCursor, SizeFDiagCursor, SizeBDiagCursor,
> SizeBDiagCursor, SizeFDiagCursor, ArrowCursor,
> ArrowCursor, ArrowCursor, ArrowCursor, ArrowCursor};
>
> // cursor
> QWSDisplay *qwsd = QApplication::desktop()->qwsDisplay();
> if (activeRegion == QWSDecoration::None)
> {
> if ( !QWidget::mouseGrabber() ) {
> QWSDecoration::Region r = pointInRegion(e->globalPos());
> qwsd->selectCursor(managed, shape[r]);
> }
> } else
> qwsd->selectCursor(managed, shape[activeRegion]);
>#endif //QT_NO_CURSOR
> // resize/move regions
>
> // don't allow dragging to where the user probably cannot click!
> QPoint g = e->globalPos();
> extern Q_EXPORT QRect qt_maxWindowRect;
> if ( qt_maxWindowRect.isValid() ) {
> if ( g.x() < qt_maxWindowRect.x() )
> g.setX(qt_maxWindowRect.x());
> if ( g.y() < qt_maxWindowRect.y() )
> g.setY(qt_maxWindowRect.y());
> if ( g.x() > qt_maxWindowRect.right() )
> g.setX(qt_maxWindowRect.right());
> if ( g.y() > qt_maxWindowRect.bottom() )
> g.setY(qt_maxWindowRect.bottom());
> }
>
> dx = g.x() - mousePos.x();
> dy = g.y() - mousePos.y();
>
> handleMove();
>
> // button regions
> QWSDecoration::Region r = pointInRegion(e->globalPos());
> menuBtn->setMouseOver(r == QWSDecoration::Menu);
> closeBtn->setMouseOver(r == QWSDecoration::Close);
> minimizeBtn->setMouseOver(r == QWSDecoration::Minimize);
> maximizeBtn->setMouseOver(r == QWSDecoration::Maximize);
>}
>
>void QWSManager::handleMove()
>{
> if (!dx && !dy)
> return;
>
> int x = managed->geometry().x();
> int y = managed->geometry().y();
> int w = managed->width();
> int h = managed->height();
>
> QRect geom(managed->geometry());
>
> switch (activeRegion) {
> case QWSDecoration::Title:
> geom = QRect(x + dx, y + dy, w, h);
> break;
> case QWSDecoration::Top:
> geom = QRect(x, y + dy, w, h - dy);
> break;
> case QWSDecoration::Bottom:
> geom = QRect(x, y, w, h + dy);
> break;
> case QWSDecoration::Left:
> geom = QRect(x + dx, y, w - dx, h);
> break;
> case QWSDecoration::Right:
> geom = QRect(x, y, w + dx, h);
> break;
> case QWSDecoration::TopRight:
> geom = QRect(x, y + dy, w + dx, h - dy);
> break;
> case QWSDecoration::TopLeft:
> geom = QRect(x + dx, y + dy, w - dx, h - dy);
> break;
> case QWSDecoration::BottomLeft:
> geom = QRect(x + dx, y, w - dx, h + dy);
> break;
> case QWSDecoration::BottomRight:
> geom = QRect(x, y, w + dx, h + dy);
> break;
> default:
> return;
> }
>
> if (geom.width() >= managed->minimumWidth()
> && geom.width() <= managed->maximumWidth()) {
> mousePos.setX(mousePos.x() + dx);
> } else if (geom.width() < managed->minimumWidth()) {
> if ( x != geom.x() ) {
> geom.setX(x+(w-managed->minimumWidth()));
> mousePos.setX( geom.x() );
> } else {
> mousePos.setX( x+managed->minimumWidth() );
> }
> geom.setWidth(managed->minimumWidth());
> } else {
> geom.setX(x);
> geom.setWidth(w);
> }
> if (geom.height() >= managed->minimumHeight()
> && geom.height() <= managed->maximumHeight()) {
> mousePos.setY(mousePos.y() + dy);
> } else if (geom.height() < managed->minimumHeight()) {
> if ( y != geom.y() ) {
> geom.setY(y+(h-managed->minimumHeight()));
> mousePos.setY( mousePos.y()+(geom.y()-y) );
> } else {
> mousePos.setY( y+managed->minimumHeight() );
> }
> geom.setHeight(managed->minimumHeight());
> } else {
> geom.setY(y);
> geom.setHeight(h);
> }
>
> if (geom != managed->geometry()) {
> QApplication::sendPostedEvents();
> managed->setGeometry(geom);
> }
>
> dx = 0;
> dy = 0;
>}
>
>void QWSManager::paintEvent(QPaintEvent *)
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QPainter painter(managed);
>
> // Adjust our widget region to contain the window
> // manager decoration instead of the widget itself.
> QRegion r = managed->topData()->decor_allocated_region;
> int rgnIdx = managed->alloc_region_index;
> if ( rgnIdx >= 0 ) {
> QRegion newRegion;
> bool changed = FALSE;
> QWSDisplay::grab();
> const int *rgnRev = qt_fbdpy->regionManager()->revision( rgnIdx );
> if ( managed->alloc_region_revision != *rgnRev ) {
> newRegion = qt_fbdpy->regionManager()->region( rgnIdx );
> changed = TRUE;
> }
> painter.internalGfx()->setGlobalRegionIndex( rgnIdx );
> QWSDisplay::ungrab();
> if ( changed ) {
> r &= newRegion;
> }
> }
> painter.internalGfx()->setWidgetDeviceRegion( r );
>
> painter.setClipRegion(dec.region(managed, managed->rect()));
> dec.paint(&painter, managed);
> painter.setClipRegion(dec.region(managed, managed->rect()));
> dec.paintButton(&painter, managed, QWSDecoration::Menu, menuBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Close, closeBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Minimize, minimizeBtn->state());
> dec.paintButton(&painter, managed, QWSDecoration::Maximize, maximizeBtn->state());
>}
>
>void QWSManager::menu(const QPoint &pos)
>{
>#ifndef QT_NO_POPUPMENU
> if (!popup) {
> popup = QApplication::qwsDecoration().menu(managed, managed->pos());
>
> // Add Style menu
> QPopupMenu *styleMenu = new QPopupMenu();
> for (int i = 0; WMStyleList[i].WMStyleName != NULL; i++)
> styleMenu->insertItem( qApp->translate("QWSDecoration", WMStyleList[i].WMStyleName), WMStyleList[i].WMStyleType );
> styleMenu->connect(styleMenu, SIGNAL(activated(int)), this, SLOT(styleMenuActivated(int)));
>// popup->insertSeparator();
>// popup->insertItem(QObject::tr("Style"), styleMenu);
>
> connect(popup, SIGNAL(activated(int)), SLOT(menuActivated(int)));
> }
> popup->setItemEnabled(QWSDecoration::Maximize, !managed->isMaximized());
> popup->setItemEnabled(QWSDecoration::Normalize, managed->isMaximized());
> popup->popup(pos);
>#endif
>}
>
>#include <qcdestyle.h>
>#include <qcommonstyle.h>
>#include <qcompactstyle.h>
>#include <qmotifplusstyle.h>
>#include <qmotifstyle.h>
>#include <qplatinumstyle.h>
>#include <qsgistyle.h>
>#include <qwindowsstyle.h>
>
>void QWSManager::styleMenuActivated(int id)
>{
> for (int i = 0; WMStyleList[i].WMStyleName != NULL; i++) {
> if (id == WMStyleList[i].WMStyleType) {
> qApp->qwsSetDecoration( WMStyleList[i].new_WMDecorations() );
> }
> }
>
> // Force a repaint of the WM regions
> const QSize s = managed->size();
> managed->resize( s.width() + 1, s.height() );
> managed->resize( s.width(), s.height() );
>}
>
>void QWSManager::menuActivated(int id)
>{
> switch (id) {
> case QWSDecoration::Close:
> close();
> return;
> case QWSDecoration::Minimize:
> minimize();
> break;
> case QWSDecoration::Maximize:
> case QWSDecoration::Normalize:
> toggleMaximize();
> break;
> case QWSDecoration::Title:
> mousePos = QCursor::pos();
> activeRegion = QWSDecoration::Title;
> active = managed;
> managed->grabMouse();
> break;
> case QWSDecoration::BottomRight:
> mousePos = QCursor::pos();
> activeRegion = QWSDecoration::BottomRight;
> active = managed;
> managed->grabMouse();
> break;
> default:
> break;
> }
>}
>
>void QWSManager::close()
>{
> active = 0;
> QApplication::qwsDecoration().close(managed);
>}
>
>void QWSManager::minimize()
>{
> QApplication::qwsDecoration().minimize(managed);
>}
>
>
>void QWSManager::maximize()
>{
> QApplication::qwsDecoration().maximize(managed);
> maximizeBtn->setOn(TRUE);
>}
>
>void QWSManager::toggleMaximize()
>{
> if ( !managed->isMaximized() ) {
> managed->showMaximized();
> maximizeBtn->setOn(TRUE);
> } else {
> managed->showNormal();
> maximizeBtn->setOn(FALSE);
> }
>}
>
>/*
>*/
>QWSButton::QWSButton(QWSManager *m, QWSDecoration::Region t, bool tb)
> : flags(0), toggle(tb), type(t), manager(m)
>{
>}
>
>void QWSButton::setMouseOver(bool m)
>{
> int s = state();
> if (m) flags |= MouseOver;
> else flags &= ~MouseOver;
> if (state() != s)
> paint();
>}
>
>void QWSButton::setClicked(bool c)
>{
> int s = state();
> if (c) flags |= Clicked;
> else flags &= ~Clicked;
> if (state() != s)
> paint();
>}
>
>void QWSButton::setOn(bool o)
>{
> int s = state();
> if (o) flags |= On;
> else flags &= ~On;
> if (state() != s)
> paint();
>}
>
>void QWSButton::paint()
>{
> QWSDecoration &dec = QApplication::qwsDecoration();
> QPainter painter(manager->widget());
> painter.setClipRegion(dec.region(manager->widget(), manager->widget()->rect()));
> dec.paintButton(&painter, manager->widget(), type, state());
>}
>
>#endif //QT_NO_QWS_MANAGER
>
>그리고 mk712.c는 제가 pi용 커널 이미지밖에 없어서요...
>
>CD를 잃어버려서...
>
>저번에 전화드렸더니..
>
>zImage.x5.pi-no-ide 커널 이미지와..
>
>ramdisk.x5.pi-12M.gz 램디스크이미지를 메일로 보내주셔서..
>
>어떻게 소스를 볼 방법을 모르겠습니다...
>
>>안녕하세요...
>>
>>좌표 출력 메시지를 보면 linux-2.4.19-x5-v07 커널을 사용하셨다면 커널에서 보내는 메세지가 아닙니다.
>>
>>커널의 drivers/char/mk712.c 를 확인 해 보세요..
>>
>>381 if ( debug_proc )
>>382 {
>>383 printk( "[%04x:%04x]n", x, y );
>>384 }
>>
>>mk712.c 소스중 위의 부분에서 메세지를 출력하게 되어 있습니다. 그리고 이 디버깅 메세지의 출력은
>>
>>$ echo "1" > /proc/mk712 하셔야만 출력하게 되어 있습니다.
>>
>>
>>1. 커널의 mk721.c 소스를 올려 주세요.
>>2. QT/E의 qwsmanager_qws.cpp 소스를 올려 주세요.
>>
>>올려 주시면 한번 확인 해 보겠습니다.
>>
>>
>>그럼 수고하세요..
>>
>>
>>
>>>10632번에 질문올린사람인데요..
>>>
>>>답변이 없으셔서 다시 올립니다..
>>>
>>>제가 QT/E-2.3.7로 해서 터치패드를 구동했는데요..
>>>
>>>터치패드는 잘됩니다..
>>>
>>>하지만 어플리케이션을 띄우면
>>>
>>>처음에는 예제프로그램 잘 떴다가..
>>>
>>>커서를 움직이면 검은화면에 좌표값(?)이 뜨면서..
>>>
>>>예제 프로그램이 다 깨집니다..
>>>
>>>어떻게 해결해야되는지..ㅜ.ㅜ
>>>
>>>그리고 제가 구현한 프로그램이 MCU에 시리얼통신으로 신호를
>>>
>>>보내는 프로그램인데요...
>>>
>>>미니컴으로 연결해서 실행했는데..
>>>
>>>커서를 움직일때마다 시리얼로 연결되어 있는 MCU에
>>>
>>>계속 값을 보내더군요...
>>>
>>>ON이라는 버튼을 클릭하면 특정신호를 보내는 프로그램인데요...
>>>
>>>도와주세요..^^
>>>
>>>제가 보드 화면 캡쳐 방법을 잘몰라서...
>>>
>>>디카로 찍어서 사진 올렸습니다..
>>>
>>>현제 pi보드용 커널 이미지 사용하구 있구요...
>>>
>>>qt에서 수정한건 강좌에 올라와있는 파일
>>>
>>>mouse_qws.cpp를 그대로 카피해서 컴파일 한게 다입니다..
>>>
>>>그리고 게시판답변을 보니...
>>>
>>>마우스와 터치패드는 같이 못쓴다고 되있던데요...
>>>
>>>마우스를 안쓸려면 따로 명령어를 넣어줘야하나요??
>>>
>>>아니면 마우스를 그냥 포트에만 안꽂으면 되는거 아닌가요??
>>>
>>>보드에서 설정해준 부분입니다..
>>>
>>>export QTDIR=/app/qt
>>>export LD_LIBRARY_PATH=/app/qt/lib
>>
>